[464702] Correcting standard XMI (de)serialization of composite subsets.
diff --git a/plugins/org.eclipse.uml2.uml.edit-feature/feature.xml b/plugins/org.eclipse.uml2.uml.edit-feature/feature.xml
index c5a9bef..3826b2a 100644
--- a/plugins/org.eclipse.uml2.uml.edit-feature/feature.xml
+++ b/plugins/org.eclipse.uml2.uml.edit-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.uml2.uml.edit"
       label="%feature.label"
-      version="5.2.0.qualifier"
+      version="5.2.1.qualifier"
       provider-name="%feature.provider-name"
       image="eclipse_update_120.jpg"
       license-feature="org.eclipse.uml2.license"
@@ -13,7 +13,7 @@
    </description>
 
    <copyright url="http://www.eclipse.org/legal/epl-v10.html">
-      Copyright (c) 2003, 2015 IBM Corporation, Embarcadero Technologies, CEA, and others.
+      Copyright (c) 2003, 2016 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
diff --git a/plugins/org.eclipse.uml2.uml.edit/META-INF/MANIFEST.MF b/plugins/org.eclipse.uml2.uml.edit/META-INF/MANIFEST.MF
index b3c4aa8..7043f34 100644
--- a/plugins/org.eclipse.uml2.uml.edit/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.uml2.uml.edit/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.uml2.uml.edit; singleton:=true
-Bundle-Version: 5.1.100.qualifier
+Bundle-Version: 5.2.1.qualifier
 Bundle-ClassPath: .
 Bundle-Activator: org.eclipse.uml2.uml.edit.UMLEditPlugin$Implementation
 Bundle-Vendor: %providerName
diff --git a/plugins/org.eclipse.uml2.uml.edit/src/org/eclipse/uml2/uml/edit/providers/StateItemProvider.java b/plugins/org.eclipse.uml2.uml.edit/src/org/eclipse/uml2/uml/edit/providers/StateItemProvider.java
index 45cdbba..a2a0787 100644
--- a/plugins/org.eclipse.uml2.uml.edit/src/org/eclipse/uml2/uml/edit/providers/StateItemProvider.java
+++ b/plugins/org.eclipse.uml2.uml.edit/src/org/eclipse/uml2/uml/edit/providers/StateItemProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2005, 2016 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
@@ -9,7 +9,7 @@
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 215418, 204200
  *   Kenn Hussey - 323181
- *   Kenn Hussey (CEA) - 327039, 418466, 414970, 370089, 459723
+ *   Kenn Hussey (CEA) - 327039, 418466, 414970, 370089, 459723, 464702
  *
  */
 package org.eclipse.uml2.uml.edit.providers;
@@ -519,7 +519,6 @@
 			childrenFeatures.add(UMLPackage.Literals.STATE__DO_ACTIVITY);
 			childrenFeatures.add(UMLPackage.Literals.STATE__ENTRY);
 			childrenFeatures.add(UMLPackage.Literals.STATE__EXIT);
-			childrenFeatures.add(UMLPackage.Literals.STATE__STATE_INVARIANT);
 			childrenFeatures.add(UMLPackage.Literals.STATE__REGION);
 		}
 		return childrenFeatures;
diff --git a/plugins/org.eclipse.uml2.uml/model/UML.genmodel b/plugins/org.eclipse.uml2.uml/model/UML.genmodel
index e9f282e..83e6bc4 100644
--- a/plugins/org.eclipse.uml2.uml/model/UML.genmodel
+++ b/plugins/org.eclipse.uml2.uml/model/UML.genmodel
@@ -1893,8 +1893,8 @@
       </genFeatures>
       <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
           propertySortChoices="true" ecoreFeature="ecore:EReference UML.ecore#//State/redefinedState"/>
-      <genFeatures xsi:type="genmodel:GenFeature" children="true" createChild="true"
-          propertySortChoices="true" ecoreFeature="ecore:EReference UML.ecore#//State/stateInvariant">
+      <genFeatures xsi:type="genmodel:GenFeature" createChild="true" propertySortChoices="true"
+          ecoreFeature="ecore:EReference UML.ecore#//State/stateInvariant">
         <propertyFilterFlags>org.eclipse.ui.views.properties.expert</propertyFilterFlags>
       </genFeatures>
       <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLHandler.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLHandler.java
index ac55794..c44fd18 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLHandler.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLHandler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2014 IBM Corporation, Embarcadero Technologies, CEA, and others.
+ * Copyright (c) 2006, 2016 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
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - initial API and implementation
  *   Kenn Hussey (Embarcadero Technologies) - 199624, 204202
- *   Kenn Hussey (CEA) - 327039, 359964, 351774, 299527, 418466
+ *   Kenn Hussey (CEA) - 327039, 359964, 351774, 299527, 418466, 464702
  *
  */
 package org.eclipse.uml2.uml.internal.resource;
@@ -154,6 +154,30 @@
 			return;
 		}
 
+		if (feature == UMLPackage.Literals.BEHAVIOR__POSTCONDITION
+			|| feature == UMLPackage.Literals.BEHAVIOR__PRECONDITION
+			|| feature == UMLPackage.Literals.OPERATION__BODY_CONDITION
+			|| feature == UMLPackage.Literals.OPERATION__POSTCONDITION
+			|| feature == UMLPackage.Literals.OPERATION__PRECONDITION
+			|| feature == UMLPackage.Literals.PROTOCOL_TRANSITION__POST_CONDITION
+			|| feature == UMLPackage.Literals.PROTOCOL_TRANSITION__PRE_CONDITION
+			|| feature == UMLPackage.Literals.STATE__STATE_INVARIANT
+			|| feature == UMLPackage.Literals.TRANSITION__GUARD) {
+
+			super.setFeatureValue(object,
+				UMLPackage.Literals.NAMESPACE__OWNED_RULE, value, position);
+		}
+
+		if (feature == UMLPackage.Literals.PROFILE__METACLASS_REFERENCE) {
+			super.setFeatureValue(object,
+				UMLPackage.Literals.NAMESPACE__ELEMENT_IMPORT, value, position);
+		}
+
+		if (feature == UMLPackage.Literals.PROFILE__METAMODEL_REFERENCE) {
+			super.setFeatureValue(object,
+				UMLPackage.Literals.NAMESPACE__PACKAGE_IMPORT, value, position);
+		}
+
 		super.setFeatureValue(object, feature, value, position);
 	}
 
diff --git a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLSaveImpl.java b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLSaveImpl.java
index 32fbbbc..4acc9f8 100644
--- a/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLSaveImpl.java
+++ b/plugins/org.eclipse.uml2.uml/src/org/eclipse/uml2/uml/internal/resource/XMI2UMLSaveImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2011 IBM Corporation, CEA, and others.
+ * Copyright (c) 2006, 2016 IBM Corporation, CEA, and others.
  * All rights reserved.   This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *   IBM - initial API and implementation
- *   Kenn Hussey (CEA) - 327039, 351774
+ *   Kenn Hussey (CEA) - 327039, 351774, 464702
  *
  */
 package org.eclipse.uml2.uml.internal.resource;
@@ -21,15 +21,22 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.ExtendedMetaData;
+import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.emf.ecore.xmi.XMLHelper;
 import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecore.xmi.impl.EMOFExtendedMetaData;
 
 import org.eclipse.uml2.common.util.UML2Util;
+import org.eclipse.uml2.uml.Behavior;
 import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.Operation;
 import org.eclipse.uml2.uml.Profile;
+import org.eclipse.uml2.uml.ProtocolTransition;
+import org.eclipse.uml2.uml.State;
+import org.eclipse.uml2.uml.Transition;
 import org.eclipse.uml2.uml.UMLPackage;
 import org.eclipse.uml2.uml.resource.CMOF2UMLExtendedMetaData;
 import org.eclipse.uml2.uml.resource.CMOF2UMLResource;
@@ -47,15 +54,35 @@
 
 		@Override
 		protected int featureKind(EStructuralFeature f) {
+
+			if (f == UMLPackage.Literals.BEHAVIOR__POSTCONDITION
+				|| f == UMLPackage.Literals.BEHAVIOR__PRECONDITION
+				|| f == UMLPackage.Literals.CONSTRAINT__CONTEXT
+				|| f == UMLPackage.Literals.ELEMENT_IMPORT__IMPORTING_NAMESPACE
+				|| f == UMLPackage.Literals.OPERATION__BODY_CONDITION
+				|| f == UMLPackage.Literals.OPERATION__POSTCONDITION
+				|| f == UMLPackage.Literals.OPERATION__PRECONDITION
+				|| f == UMLPackage.Literals.PACKAGE_IMPORT__IMPORTING_NAMESPACE
+				|| f == UMLPackage.Literals.PROFILE__METACLASS_REFERENCE
+				|| f == UMLPackage.Literals.PROFILE__METAMODEL_REFERENCE
+				|| f == UMLPackage.Literals.PROTOCOL_TRANSITION__POST_CONDITION
+				|| f == UMLPackage.Literals.PROTOCOL_TRANSITION__PRE_CONDITION
+				|| f == UMLPackage.Literals.STATE__STATE_INVARIANT
+				|| f == UMLPackage.Literals.TRANSITION__GUARD) {
+
+				return TRANSIENT;
+			}
+
 			return !f.isTransient()
 				&& ((EStructuralFeature.Internal) f).isContainer()
-				? (f.isUnsettable()
-					? OBJECT_HREF_SINGLE_UNSETTABLE
-					: OBJECT_HREF_SINGLE)
-				: ((f == UMLPackage.Literals.CONNECTABLE_ELEMENT__END
-					|| f == UMLPackage.Literals.VERTEX__INCOMING || f == UMLPackage.Literals.VERTEX__OUTGOING)
-					? OBJECT_HREF_MANY
-					: super.featureKind(f));
+					? (f.isUnsettable()
+						? OBJECT_HREF_SINGLE_UNSETTABLE
+						: OBJECT_HREF_SINGLE)
+					: ((f == UMLPackage.Literals.CONNECTABLE_ELEMENT__END
+						|| f == UMLPackage.Literals.VERTEX__INCOMING
+						|| f == UMLPackage.Literals.VERTEX__OUTGOING)
+							? OBJECT_HREF_MANY
+							: super.featureKind(f));
 		}
 
 	}
@@ -97,6 +124,190 @@
 				EcorePackage.eNS_URI);
 			super.saveContainedMany(eObject, eStructuralFeature);
 			doc.endElement();
+		} else if (eStructuralFeature == UMLPackage.Literals.NAMESPACE__ELEMENT_IMPORT) {
+
+			if (eObject instanceof Profile) {
+				@SuppressWarnings("unchecked")
+				List<? extends InternalEObject> metaclassReferences = ((InternalEList<? extends InternalEObject>) helper
+					.getValue(eObject,
+						UMLPackage.Literals.PROFILE__METACLASS_REFERENCE))
+							.basicList();
+
+				@SuppressWarnings("unchecked")
+				List<? extends InternalEObject> values = ((InternalEList<? extends InternalEObject>) helper
+					.getValue(eObject, eStructuralFeature)).basicList();
+				int size = values.size();
+
+				for (int i = 0; i < size; i++) {
+					InternalEObject value = values.get(i);
+
+					if (value != null) {
+						saveElement(value, metaclassReferences.contains(value)
+							? UMLPackage.Literals.PROFILE__METACLASS_REFERENCE
+							: UMLPackage.Literals.NAMESPACE__ELEMENT_IMPORT);
+					}
+				}
+			} else {
+				super.saveContainedMany(eObject, eStructuralFeature);
+			}
+		} else if (eStructuralFeature == UMLPackage.Literals.NAMESPACE__OWNED_RULE) {
+
+			if (eObject instanceof Behavior) {
+				@SuppressWarnings("unchecked")
+				List<? extends InternalEObject> postcondition = ((InternalEList<? extends InternalEObject>) helper
+					.getValue(eObject,
+						UMLPackage.Literals.BEHAVIOR__POSTCONDITION))
+							.basicList();
+
+				@SuppressWarnings("unchecked")
+				List<? extends InternalEObject> precondition = ((InternalEList<? extends InternalEObject>) helper
+					.getValue(eObject,
+						UMLPackage.Literals.BEHAVIOR__PRECONDITION))
+							.basicList();
+
+				@SuppressWarnings("unchecked")
+				List<? extends InternalEObject> values = ((InternalEList<? extends InternalEObject>) helper
+					.getValue(eObject, eStructuralFeature)).basicList();
+				int size = values.size();
+
+				for (int i = 0; i < size; i++) {
+					InternalEObject value = values.get(i);
+
+					if (value != null) {
+						saveElement(value, postcondition.contains(value)
+							? UMLPackage.Literals.BEHAVIOR__POSTCONDITION
+							: (precondition.contains(value)
+								? UMLPackage.Literals.BEHAVIOR__PRECONDITION
+								: UMLPackage.Literals.NAMESPACE__OWNED_RULE));
+					}
+				}
+			} else if (eObject instanceof Operation) {
+				Object bodyCondition = helper.getValue(eObject,
+					UMLPackage.Literals.OPERATION__BODY_CONDITION);
+
+				@SuppressWarnings("unchecked")
+				List<? extends InternalEObject> postcondition = ((InternalEList<? extends InternalEObject>) helper
+					.getValue(eObject,
+						UMLPackage.Literals.OPERATION__POSTCONDITION))
+							.basicList();
+
+				@SuppressWarnings("unchecked")
+				List<? extends InternalEObject> precondition = ((InternalEList<? extends InternalEObject>) helper
+					.getValue(eObject,
+						UMLPackage.Literals.OPERATION__PRECONDITION))
+							.basicList();
+
+				@SuppressWarnings("unchecked")
+				List<? extends InternalEObject> values = ((InternalEList<? extends InternalEObject>) helper
+					.getValue(eObject, eStructuralFeature)).basicList();
+				int size = values.size();
+
+				for (int i = 0; i < size; i++) {
+					InternalEObject value = values.get(i);
+
+					if (value != null) {
+						saveElement(value, bodyCondition == value
+							? UMLPackage.Literals.OPERATION__BODY_CONDITION
+							: (postcondition.contains(value)
+								? UMLPackage.Literals.OPERATION__POSTCONDITION
+								: (precondition.contains(value)
+									? UMLPackage.Literals.OPERATION__PRECONDITION
+									: UMLPackage.Literals.NAMESPACE__OWNED_RULE)));
+					}
+				}
+			} else if (eObject instanceof ProtocolTransition) {
+				Object postCondition = helper.getValue(eObject,
+					UMLPackage.Literals.PROTOCOL_TRANSITION__POST_CONDITION);
+
+				Object preCondition = helper.getValue(eObject,
+					UMLPackage.Literals.PROTOCOL_TRANSITION__PRE_CONDITION);
+
+				Object guard = helper.getValue(eObject,
+					UMLPackage.Literals.TRANSITION__GUARD);
+
+				@SuppressWarnings("unchecked")
+				List<? extends InternalEObject> values = ((InternalEList<? extends InternalEObject>) helper
+					.getValue(eObject, eStructuralFeature)).basicList();
+				int size = values.size();
+
+				for (int i = 0; i < size; i++) {
+					InternalEObject value = values.get(i);
+
+					if (value != null) {
+						saveElement(value, postCondition == value
+							? UMLPackage.Literals.PROTOCOL_TRANSITION__POST_CONDITION
+							: (preCondition == value
+								? UMLPackage.Literals.PROTOCOL_TRANSITION__PRE_CONDITION
+								: (guard == value
+									? UMLPackage.Literals.TRANSITION__GUARD
+									: UMLPackage.Literals.NAMESPACE__OWNED_RULE)));
+					}
+				}
+			} else if (eObject instanceof State) {
+				Object stateInvariant = helper.getValue(eObject,
+					UMLPackage.Literals.STATE__STATE_INVARIANT);
+
+				@SuppressWarnings("unchecked")
+				List<? extends InternalEObject> values = ((InternalEList<? extends InternalEObject>) helper
+					.getValue(eObject, eStructuralFeature)).basicList();
+				int size = values.size();
+
+				for (int i = 0; i < size; i++) {
+					InternalEObject value = values.get(i);
+
+					if (value != null) {
+						saveElement(value, stateInvariant == value
+							? UMLPackage.Literals.STATE__STATE_INVARIANT
+							: UMLPackage.Literals.NAMESPACE__OWNED_RULE);
+					}
+				}
+			} else if (eObject instanceof Transition) {
+				Object guard = helper.getValue(eObject,
+					UMLPackage.Literals.TRANSITION__GUARD);
+
+				@SuppressWarnings("unchecked")
+				List<? extends InternalEObject> values = ((InternalEList<? extends InternalEObject>) helper
+					.getValue(eObject, eStructuralFeature)).basicList();
+				int size = values.size();
+
+				for (int i = 0; i < size; i++) {
+					InternalEObject value = values.get(i);
+
+					if (value != null) {
+						saveElement(value, guard == value
+							? UMLPackage.Literals.TRANSITION__GUARD
+							: UMLPackage.Literals.NAMESPACE__OWNED_RULE);
+					}
+				}
+			} else {
+				super.saveContainedMany(eObject, eStructuralFeature);
+			}
+		} else if (eStructuralFeature == UMLPackage.Literals.NAMESPACE__PACKAGE_IMPORT) {
+
+			if (eObject instanceof Profile) {
+				@SuppressWarnings("unchecked")
+				List<? extends InternalEObject> metamodelReferences = ((InternalEList<? extends InternalEObject>) helper
+					.getValue(eObject,
+						UMLPackage.Literals.PROFILE__METAMODEL_REFERENCE))
+							.basicList();
+
+				@SuppressWarnings("unchecked")
+				List<? extends InternalEObject> values = ((InternalEList<? extends InternalEObject>) helper
+					.getValue(eObject, eStructuralFeature)).basicList();
+				int size = values.size();
+
+				for (int i = 0; i < size; i++) {
+					InternalEObject value = values.get(i);
+
+					if (value != null) {
+						saveElement(value, metamodelReferences.contains(value)
+							? UMLPackage.Literals.PROFILE__METAMODEL_REFERENCE
+							: UMLPackage.Literals.NAMESPACE__PACKAGE_IMPORT);
+					}
+				}
+			} else {
+				super.saveContainedMany(eObject, eStructuralFeature);
+			}
 		} else {
 			super.saveContainedMany(eObject, eStructuralFeature);
 		}