Set resolveProxies=true for remaining cross-file references

Some references intended to be cross-file by the spec did not
have resolveProxies set (ConversationLink.source/targetRef, 
FlowElement.categoryValueRef).

Their opposite references had to be removed due to requirements 
by EMF and will have to be implemented manually later. This 
concerns InteractionNode.incoming/outgoingConversationLinks
(implemented in subclasses) and 
CategoryValue.categorizedFlowElements.

See discussion on mailing list from 19th August.
diff --git a/org.eclipse.bpmn2/model/BPMN20.ecore b/org.eclipse.bpmn2/model/BPMN20.ecore
index 192810d..c701bab 100644
--- a/org.eclipse.bpmn2/model/BPMN20.ecore
+++ b/org.eclipse.bpmn2/model/BPMN20.ecore
@@ -1762,8 +1762,8 @@
       </eAnnotations>
     </eStructuralFeatures>
     <eStructuralFeatures xsi:type="ecore:EReference" name="categorizedFlowElements"
-        ordered="false" upperBound="-1" eType="#//FlowElement" transient="true" derived="true"
-        resolveProxies="false" eOpposite="#//FlowElement/categoryValueRef"/>
+        ordered="false" upperBound="-1" eType="#//FlowElement" changeable="false"
+        volatile="true" transient="true" derived="true" resolveProxies="false"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="Choreography" eSuperTypes="#//Collaboration #//FlowElementsContainer">
     <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
@@ -2045,14 +2045,14 @@
       </eAnnotations>
     </eStructuralFeatures>
     <eStructuralFeatures xsi:type="ecore:EReference" name="sourceRef" ordered="false"
-        lowerBound="1" eType="#//InteractionNode" resolveProxies="false" eOpposite="#//InteractionNode/outgoingConversationLinks">
+        lowerBound="1" eType="#//InteractionNode">
       <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
         <details key="kind" value="attribute"/>
         <details key="name" value="sourceRef"/>
       </eAnnotations>
     </eStructuralFeatures>
     <eStructuralFeatures xsi:type="ecore:EReference" name="targetRef" ordered="false"
-        lowerBound="1" eType="#//InteractionNode" resolveProxies="false" eOpposite="#//InteractionNode/incomingConversationLinks">
+        lowerBound="1" eType="#//InteractionNode">
       <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
         <details key="kind" value="attribute"/>
         <details key="name" value="targetRef"/>
@@ -2742,7 +2742,7 @@
       </eAnnotations>
     </eStructuralFeatures>
     <eStructuralFeatures xsi:type="ecore:EReference" name="categoryValueRef" ordered="false"
-        upperBound="-1" eType="#//CategoryValue" resolveProxies="false" eOpposite="#//CategoryValue/categorizedFlowElements">
+        upperBound="-1" eType="#//CategoryValue">
       <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
         <details key="kind" value="element"/>
         <details key="name" value="categoryValueRef"/>
@@ -3116,11 +3116,11 @@
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="InteractionNode" abstract="true">
     <eStructuralFeatures xsi:type="ecore:EReference" name="incomingConversationLinks"
-        ordered="false" upperBound="-1" eType="#//ConversationLink" transient="true"
-        derived="true" resolveProxies="false" eOpposite="#//ConversationLink/targetRef"/>
+        ordered="false" upperBound="-1" eType="#//ConversationLink" changeable="false"
+        volatile="true" transient="true" derived="true" resolveProxies="false"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="outgoingConversationLinks"
-        ordered="false" upperBound="-1" eType="#//ConversationLink" transient="true"
-        derived="true" eOpposite="#//ConversationLink/sourceRef"/>
+        ordered="false" upperBound="-1" eType="#//ConversationLink" changeable="false"
+        volatile="true" transient="true" derived="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="Interface" eSuperTypes="#//RootElement">
     <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/CategoryValue.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/CategoryValue.java
index 34f1850..49a43b6 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/CategoryValue.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/CategoryValue.java
@@ -64,7 +64,6 @@
     /**
      * Returns the value of the '<em><b>Categorized Flow Elements</b></em>' reference list.
      * The list contents are of type {@link org.eclipse.bpmn2.FlowElement}.
-     * It is bidirectional and its opposite is '{@link org.eclipse.bpmn2.FlowElement#getCategoryValueRef <em>Category Value Ref</em>}'.
      * <!-- begin-user-doc -->
      * <p>
      * If the meaning of the '<em>Categorized Flow Elements</em>' reference list isn't clear,
@@ -73,8 +72,7 @@
      * <!-- end-user-doc -->
      * @return the value of the '<em>Categorized Flow Elements</em>' reference list.
      * @see org.eclipse.bpmn2.Bpmn2Package#getCategoryValue_CategorizedFlowElements()
-     * @see org.eclipse.bpmn2.FlowElement#getCategoryValueRef
-     * @model opposite="categoryValueRef" resolveProxies="false" transient="true" derived="true" ordered="false"
+     * @model resolveProxies="false" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
      * @generated
      */
     List<FlowElement> getCategorizedFlowElements();
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/ConversationLink.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/ConversationLink.java
index f38e138..bdfa1ba 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/ConversationLink.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/ConversationLink.java
@@ -62,7 +62,6 @@
 
     /**
      * Returns the value of the '<em><b>Source Ref</b></em>' reference.
-     * It is bidirectional and its opposite is '{@link org.eclipse.bpmn2.InteractionNode#getOutgoingConversationLinks <em>Outgoing Conversation Links</em>}'.
      * <!-- begin-user-doc -->
      * <p>
      * If the meaning of the '<em>Source Ref</em>' reference isn't clear,
@@ -72,8 +71,7 @@
      * @return the value of the '<em>Source Ref</em>' reference.
      * @see #setSourceRef(InteractionNode)
      * @see org.eclipse.bpmn2.Bpmn2Package#getConversationLink_SourceRef()
-     * @see org.eclipse.bpmn2.InteractionNode#getOutgoingConversationLinks
-     * @model opposite="outgoingConversationLinks" resolveProxies="false" required="true" ordered="false"
+     * @model required="true" ordered="false"
      *        extendedMetaData="kind='attribute' name='sourceRef'"
      * @generated
      */
@@ -91,7 +89,6 @@
 
     /**
      * Returns the value of the '<em><b>Target Ref</b></em>' reference.
-     * It is bidirectional and its opposite is '{@link org.eclipse.bpmn2.InteractionNode#getIncomingConversationLinks <em>Incoming Conversation Links</em>}'.
      * <!-- begin-user-doc -->
      * <p>
      * If the meaning of the '<em>Target Ref</em>' reference isn't clear,
@@ -101,8 +98,7 @@
      * @return the value of the '<em>Target Ref</em>' reference.
      * @see #setTargetRef(InteractionNode)
      * @see org.eclipse.bpmn2.Bpmn2Package#getConversationLink_TargetRef()
-     * @see org.eclipse.bpmn2.InteractionNode#getIncomingConversationLinks
-     * @model opposite="incomingConversationLinks" resolveProxies="false" required="true" ordered="false"
+     * @model required="true" ordered="false"
      *        extendedMetaData="kind='attribute' name='targetRef'"
      * @generated
      */
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/FlowElement.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/FlowElement.java
index dd343fa..0ab16c6 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/FlowElement.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/FlowElement.java
@@ -94,7 +94,6 @@
     /**
      * Returns the value of the '<em><b>Category Value Ref</b></em>' reference list.
      * The list contents are of type {@link org.eclipse.bpmn2.CategoryValue}.
-     * It is bidirectional and its opposite is '{@link org.eclipse.bpmn2.CategoryValue#getCategorizedFlowElements <em>Categorized Flow Elements</em>}'.
      * <!-- begin-user-doc -->
      * <p>
      * If the meaning of the '<em>Category Value Ref</em>' reference list isn't clear,
@@ -103,8 +102,7 @@
      * <!-- end-user-doc -->
      * @return the value of the '<em>Category Value Ref</em>' reference list.
      * @see org.eclipse.bpmn2.Bpmn2Package#getFlowElement_CategoryValueRef()
-     * @see org.eclipse.bpmn2.CategoryValue#getCategorizedFlowElements
-     * @model opposite="categorizedFlowElements" resolveProxies="false" ordered="false"
+     * @model ordered="false"
      *        extendedMetaData="kind='element' name='categoryValueRef' namespace='http://www.omg.org/spec/BPMN/20100524/MODEL'"
      * @generated
      */
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/InteractionNode.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/InteractionNode.java
index ad15c42..0f95190 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/InteractionNode.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/InteractionNode.java
@@ -39,7 +39,6 @@
     /**
      * Returns the value of the '<em><b>Incoming Conversation Links</b></em>' reference list.
      * The list contents are of type {@link org.eclipse.bpmn2.ConversationLink}.
-     * It is bidirectional and its opposite is '{@link org.eclipse.bpmn2.ConversationLink#getTargetRef <em>Target Ref</em>}'.
      * <!-- begin-user-doc -->
      * <p>
      * If the meaning of the '<em>Incoming Conversation Links</em>' reference list isn't clear,
@@ -48,8 +47,7 @@
      * <!-- end-user-doc -->
      * @return the value of the '<em>Incoming Conversation Links</em>' reference list.
      * @see org.eclipse.bpmn2.Bpmn2Package#getInteractionNode_IncomingConversationLinks()
-     * @see org.eclipse.bpmn2.ConversationLink#getTargetRef
-     * @model opposite="targetRef" resolveProxies="false" transient="true" derived="true" ordered="false"
+     * @model resolveProxies="false" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
      * @generated
      */
     List<ConversationLink> getIncomingConversationLinks();
@@ -57,7 +55,6 @@
     /**
      * Returns the value of the '<em><b>Outgoing Conversation Links</b></em>' reference list.
      * The list contents are of type {@link org.eclipse.bpmn2.ConversationLink}.
-     * It is bidirectional and its opposite is '{@link org.eclipse.bpmn2.ConversationLink#getSourceRef <em>Source Ref</em>}'.
      * <!-- begin-user-doc -->
      * <p>
      * If the meaning of the '<em>Outgoing Conversation Links</em>' reference list isn't clear,
@@ -66,8 +63,7 @@
      * <!-- end-user-doc -->
      * @return the value of the '<em>Outgoing Conversation Links</em>' reference list.
      * @see org.eclipse.bpmn2.Bpmn2Package#getInteractionNode_OutgoingConversationLinks()
-     * @see org.eclipse.bpmn2.ConversationLink#getSourceRef
-     * @model opposite="sourceRef" transient="true" derived="true" ordered="false"
+     * @model transient="true" changeable="false" volatile="true" derived="true" ordered="false"
      * @generated
      */
     List<ConversationLink> getOutgoingConversationLinks();
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/CategoryValueImpl.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/CategoryValueImpl.java
index a4d8ae6..4ad26af 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/CategoryValueImpl.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/CategoryValueImpl.java
@@ -65,16 +65,6 @@
     protected String value = VALUE_EDEFAULT;
 
     /**
-     * The cached value of the '{@link #getCategorizedFlowElements() <em>Categorized Flow Elements</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getCategorizedFlowElements()
-     * @generated
-     * @ordered
-     */
-    protected EList<FlowElement> categorizedFlowElements;
-
-    /**
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
      * @generated
@@ -117,49 +107,16 @@
 
     /**
      * <!-- begin-user-doc -->
+     * TODO: Implement as virtual opposite to Bpmn2Package.FLOW_ELEMENT__CATEGORY_VALUE_REF
      * <!-- end-user-doc -->
      * @generated
      */
     public List<FlowElement> getCategorizedFlowElements() {
-        if (categorizedFlowElements == null) {
-            categorizedFlowElements = new EObjectWithInverseEList.ManyInverse<FlowElement>(
-                    FlowElement.class, this,
-                    Bpmn2Package.CATEGORY_VALUE__CATEGORIZED_FLOW_ELEMENTS,
-                    Bpmn2Package.FLOW_ELEMENT__CATEGORY_VALUE_REF);
-        }
-        return categorizedFlowElements;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID,
-            NotificationChain msgs) {
-        switch (featureID) {
-        case Bpmn2Package.CATEGORY_VALUE__CATEGORIZED_FLOW_ELEMENTS:
-            return ((InternalEList<InternalEObject>) (InternalEList<?>) getCategorizedFlowElements())
-                    .basicAdd(otherEnd, msgs);
-        }
-        return super.eInverseAdd(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID,
-            NotificationChain msgs) {
-        switch (featureID) {
-        case Bpmn2Package.CATEGORY_VALUE__CATEGORIZED_FLOW_ELEMENTS:
-            return ((InternalEList<?>) getCategorizedFlowElements()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
+        // TODO: implement this method to return the 'Categorized Flow Elements' reference list
+        // Ensure that you remove @generated or mark it @generated NOT
+        // The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
+        // so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.EcoreEList should be used.
+        throw new UnsupportedOperationException();
     }
 
     /**
@@ -190,10 +147,6 @@
         case Bpmn2Package.CATEGORY_VALUE__VALUE:
             setValue((String) newValue);
             return;
-        case Bpmn2Package.CATEGORY_VALUE__CATEGORIZED_FLOW_ELEMENTS:
-            getCategorizedFlowElements().clear();
-            getCategorizedFlowElements().addAll((Collection<? extends FlowElement>) newValue);
-            return;
         }
         super.eSet(featureID, newValue);
     }
@@ -209,9 +162,6 @@
         case Bpmn2Package.CATEGORY_VALUE__VALUE:
             setValue(VALUE_EDEFAULT);
             return;
-        case Bpmn2Package.CATEGORY_VALUE__CATEGORIZED_FLOW_ELEMENTS:
-            getCategorizedFlowElements().clear();
-            return;
         }
         super.eUnset(featureID);
     }
@@ -227,7 +177,7 @@
         case Bpmn2Package.CATEGORY_VALUE__VALUE:
             return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
         case Bpmn2Package.CATEGORY_VALUE__CATEGORIZED_FLOW_ELEMENTS:
-            return categorizedFlowElements != null && !categorizedFlowElements.isEmpty();
+            return !getCategorizedFlowElements().isEmpty();
         }
         return super.eIsSet(featureID);
     }
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/ConversationLinkImpl.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/ConversationLinkImpl.java
index 44972db..b7b706d 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/ConversationLinkImpl.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/ConversationLinkImpl.java
@@ -126,6 +126,15 @@
      * @generated
      */
     public InteractionNode getSourceRef() {
+        if (sourceRef != null && sourceRef.eIsProxy()) {
+            InternalEObject oldSourceRef = (InternalEObject) sourceRef;
+            sourceRef = (InteractionNode) eResolveProxy(oldSourceRef);
+            if (sourceRef != oldSourceRef) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+                            Bpmn2Package.CONVERSATION_LINK__SOURCE_REF, oldSourceRef, sourceRef));
+            }
+        }
         return sourceRef;
     }
 
@@ -134,18 +143,8 @@
      * <!-- end-user-doc -->
      * @generated
      */
-    public NotificationChain basicSetSourceRef(InteractionNode newSourceRef, NotificationChain msgs) {
-        InteractionNode oldSourceRef = sourceRef;
-        sourceRef = newSourceRef;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET,
-                    Bpmn2Package.CONVERSATION_LINK__SOURCE_REF, oldSourceRef, newSourceRef);
-            if (msgs == null)
-                msgs = notification;
-            else
-                msgs.add(notification);
-        }
-        return msgs;
+    public InteractionNode basicGetSourceRef() {
+        return sourceRef;
     }
 
     /**
@@ -154,22 +153,11 @@
      * @generated
      */
     public void setSourceRef(InteractionNode newSourceRef) {
-        if (newSourceRef != sourceRef) {
-            NotificationChain msgs = null;
-            if (sourceRef != null)
-                msgs = ((InternalEObject) sourceRef).eInverseRemove(this,
-                        Bpmn2Package.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS,
-                        InteractionNode.class, msgs);
-            if (newSourceRef != null)
-                msgs = ((InternalEObject) newSourceRef).eInverseAdd(this,
-                        Bpmn2Package.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS,
-                        InteractionNode.class, msgs);
-            msgs = basicSetSourceRef(newSourceRef, msgs);
-            if (msgs != null)
-                msgs.dispatch();
-        } else if (eNotificationRequired())
+        InteractionNode oldSourceRef = sourceRef;
+        sourceRef = newSourceRef;
+        if (eNotificationRequired())
             eNotify(new ENotificationImpl(this, Notification.SET,
-                    Bpmn2Package.CONVERSATION_LINK__SOURCE_REF, newSourceRef, newSourceRef));
+                    Bpmn2Package.CONVERSATION_LINK__SOURCE_REF, oldSourceRef, sourceRef));
     }
 
     /**
@@ -178,6 +166,15 @@
      * @generated
      */
     public InteractionNode getTargetRef() {
+        if (targetRef != null && targetRef.eIsProxy()) {
+            InternalEObject oldTargetRef = (InternalEObject) targetRef;
+            targetRef = (InteractionNode) eResolveProxy(oldTargetRef);
+            if (targetRef != oldTargetRef) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+                            Bpmn2Package.CONVERSATION_LINK__TARGET_REF, oldTargetRef, targetRef));
+            }
+        }
         return targetRef;
     }
 
@@ -186,18 +183,8 @@
      * <!-- end-user-doc -->
      * @generated
      */
-    public NotificationChain basicSetTargetRef(InteractionNode newTargetRef, NotificationChain msgs) {
-        InteractionNode oldTargetRef = targetRef;
-        targetRef = newTargetRef;
-        if (eNotificationRequired()) {
-            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET,
-                    Bpmn2Package.CONVERSATION_LINK__TARGET_REF, oldTargetRef, newTargetRef);
-            if (msgs == null)
-                msgs = notification;
-            else
-                msgs.add(notification);
-        }
-        return msgs;
+    public InteractionNode basicGetTargetRef() {
+        return targetRef;
     }
 
     /**
@@ -206,64 +193,11 @@
      * @generated
      */
     public void setTargetRef(InteractionNode newTargetRef) {
-        if (newTargetRef != targetRef) {
-            NotificationChain msgs = null;
-            if (targetRef != null)
-                msgs = ((InternalEObject) targetRef).eInverseRemove(this,
-                        Bpmn2Package.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS,
-                        InteractionNode.class, msgs);
-            if (newTargetRef != null)
-                msgs = ((InternalEObject) newTargetRef).eInverseAdd(this,
-                        Bpmn2Package.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS,
-                        InteractionNode.class, msgs);
-            msgs = basicSetTargetRef(newTargetRef, msgs);
-            if (msgs != null)
-                msgs.dispatch();
-        } else if (eNotificationRequired())
+        InteractionNode oldTargetRef = targetRef;
+        targetRef = newTargetRef;
+        if (eNotificationRequired())
             eNotify(new ENotificationImpl(this, Notification.SET,
-                    Bpmn2Package.CONVERSATION_LINK__TARGET_REF, newTargetRef, newTargetRef));
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID,
-            NotificationChain msgs) {
-        switch (featureID) {
-        case Bpmn2Package.CONVERSATION_LINK__SOURCE_REF:
-            if (sourceRef != null)
-                msgs = ((InternalEObject) sourceRef).eInverseRemove(this,
-                        Bpmn2Package.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS,
-                        InteractionNode.class, msgs);
-            return basicSetSourceRef((InteractionNode) otherEnd, msgs);
-        case Bpmn2Package.CONVERSATION_LINK__TARGET_REF:
-            if (targetRef != null)
-                msgs = ((InternalEObject) targetRef).eInverseRemove(this,
-                        Bpmn2Package.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS,
-                        InteractionNode.class, msgs);
-            return basicSetTargetRef((InteractionNode) otherEnd, msgs);
-        }
-        return super.eInverseAdd(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID,
-            NotificationChain msgs) {
-        switch (featureID) {
-        case Bpmn2Package.CONVERSATION_LINK__SOURCE_REF:
-            return basicSetSourceRef(null, msgs);
-        case Bpmn2Package.CONVERSATION_LINK__TARGET_REF:
-            return basicSetTargetRef(null, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
+                    Bpmn2Package.CONVERSATION_LINK__TARGET_REF, oldTargetRef, targetRef));
     }
 
     /**
@@ -277,9 +211,13 @@
         case Bpmn2Package.CONVERSATION_LINK__NAME:
             return getName();
         case Bpmn2Package.CONVERSATION_LINK__SOURCE_REF:
-            return getSourceRef();
+            if (resolve)
+                return getSourceRef();
+            return basicGetSourceRef();
         case Bpmn2Package.CONVERSATION_LINK__TARGET_REF:
-            return getTargetRef();
+            if (resolve)
+                return getTargetRef();
+            return basicGetTargetRef();
         }
         return super.eGet(featureID, resolve, coreType);
     }
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/ConversationNodeImpl.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/ConversationNodeImpl.java
index 64ab203..91f5177 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/ConversationNodeImpl.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/ConversationNodeImpl.java
@@ -56,26 +56,6 @@
  */
 public abstract class ConversationNodeImpl extends BaseElementImpl implements ConversationNode {
     /**
-     * The cached value of the '{@link #getIncomingConversationLinks() <em>Incoming Conversation Links</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getIncomingConversationLinks()
-     * @generated
-     * @ordered
-     */
-    protected EList<ConversationLink> incomingConversationLinks;
-
-    /**
-     * The cached value of the '{@link #getOutgoingConversationLinks() <em>Outgoing Conversation Links</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getOutgoingConversationLinks()
-     * @generated
-     * @ordered
-     */
-    protected EList<ConversationLink> outgoingConversationLinks;
-
-    /**
      * The cached value of the '{@link #getParticipantRefs() <em>Participant Refs</em>}' reference list.
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
@@ -146,32 +126,30 @@
 
     /**
      * <!-- begin-user-doc -->
+     * TODO: implement as virtual opposite to Bpmn2Package.CONVERSATION_LINK__TARGET_REF
      * <!-- end-user-doc -->
      * @generated
      */
     public List<ConversationLink> getIncomingConversationLinks() {
-        if (incomingConversationLinks == null) {
-            incomingConversationLinks = new EObjectWithInverseEList<ConversationLink>(
-                    ConversationLink.class, this,
-                    Bpmn2Package.CONVERSATION_NODE__INCOMING_CONVERSATION_LINKS,
-                    Bpmn2Package.CONVERSATION_LINK__TARGET_REF);
-        }
-        return incomingConversationLinks;
+        // TODO: implement this method to return the 'Incoming Conversation Links' reference list
+        // Ensure that you remove @generated or mark it @generated NOT
+        // The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
+        // so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.EcoreEList should be used.
+        throw new UnsupportedOperationException();
     }
 
     /**
      * <!-- begin-user-doc -->
+     * TODO: implement as virtual opposite to Bpmn2Package.CONVERSATION_LINK__SOURCE_REF
      * <!-- end-user-doc -->
      * @generated
      */
     public List<ConversationLink> getOutgoingConversationLinks() {
-        if (outgoingConversationLinks == null) {
-            outgoingConversationLinks = new EObjectWithInverseResolvingEList<ConversationLink>(
-                    ConversationLink.class, this,
-                    Bpmn2Package.CONVERSATION_NODE__OUTGOING_CONVERSATION_LINKS,
-                    Bpmn2Package.CONVERSATION_LINK__SOURCE_REF);
-        }
-        return outgoingConversationLinks;
+        // TODO: implement this method to return the 'Outgoing Conversation Links' reference list
+        // Ensure that you remove @generated or mark it @generated NOT
+        // The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
+        // so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.EcoreEList should be used.
+        throw new UnsupportedOperationException();
     }
 
     /**
@@ -240,34 +218,10 @@
      * <!-- end-user-doc -->
      * @generated
      */
-    @SuppressWarnings("unchecked")
-    @Override
-    public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID,
-            NotificationChain msgs) {
-        switch (featureID) {
-        case Bpmn2Package.CONVERSATION_NODE__INCOMING_CONVERSATION_LINKS:
-            return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomingConversationLinks())
-                    .basicAdd(otherEnd, msgs);
-        case Bpmn2Package.CONVERSATION_NODE__OUTGOING_CONVERSATION_LINKS:
-            return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoingConversationLinks())
-                    .basicAdd(otherEnd, msgs);
-        }
-        return super.eInverseAdd(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
     @Override
     public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID,
             NotificationChain msgs) {
         switch (featureID) {
-        case Bpmn2Package.CONVERSATION_NODE__INCOMING_CONVERSATION_LINKS:
-            return ((InternalEList<?>) getIncomingConversationLinks()).basicRemove(otherEnd, msgs);
-        case Bpmn2Package.CONVERSATION_NODE__OUTGOING_CONVERSATION_LINKS:
-            return ((InternalEList<?>) getOutgoingConversationLinks()).basicRemove(otherEnd, msgs);
         case Bpmn2Package.CONVERSATION_NODE__CORRELATION_KEYS:
             return ((InternalEList<?>) getCorrelationKeys()).basicRemove(otherEnd, msgs);
         }
@@ -307,16 +261,6 @@
     @Override
     public void eSet(int featureID, Object newValue) {
         switch (featureID) {
-        case Bpmn2Package.CONVERSATION_NODE__INCOMING_CONVERSATION_LINKS:
-            getIncomingConversationLinks().clear();
-            getIncomingConversationLinks()
-                    .addAll((Collection<? extends ConversationLink>) newValue);
-            return;
-        case Bpmn2Package.CONVERSATION_NODE__OUTGOING_CONVERSATION_LINKS:
-            getOutgoingConversationLinks().clear();
-            getOutgoingConversationLinks()
-                    .addAll((Collection<? extends ConversationLink>) newValue);
-            return;
         case Bpmn2Package.CONVERSATION_NODE__PARTICIPANT_REFS:
             getParticipantRefs().clear();
             getParticipantRefs().addAll((Collection<? extends Participant>) newValue);
@@ -344,12 +288,6 @@
     @Override
     public void eUnset(int featureID) {
         switch (featureID) {
-        case Bpmn2Package.CONVERSATION_NODE__INCOMING_CONVERSATION_LINKS:
-            getIncomingConversationLinks().clear();
-            return;
-        case Bpmn2Package.CONVERSATION_NODE__OUTGOING_CONVERSATION_LINKS:
-            getOutgoingConversationLinks().clear();
-            return;
         case Bpmn2Package.CONVERSATION_NODE__PARTICIPANT_REFS:
             getParticipantRefs().clear();
             return;
@@ -375,9 +313,9 @@
     public boolean eIsSet(int featureID) {
         switch (featureID) {
         case Bpmn2Package.CONVERSATION_NODE__INCOMING_CONVERSATION_LINKS:
-            return incomingConversationLinks != null && !incomingConversationLinks.isEmpty();
+            return !getIncomingConversationLinks().isEmpty();
         case Bpmn2Package.CONVERSATION_NODE__OUTGOING_CONVERSATION_LINKS:
-            return outgoingConversationLinks != null && !outgoingConversationLinks.isEmpty();
+            return !getOutgoingConversationLinks().isEmpty();
         case Bpmn2Package.CONVERSATION_NODE__PARTICIPANT_REFS:
             return participantRefs != null && !participantRefs.isEmpty();
         case Bpmn2Package.CONVERSATION_NODE__MESSAGE_FLOW_REFS:
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/EventImpl.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/EventImpl.java
index 9f47ad8..e856d74 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/EventImpl.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/EventImpl.java
@@ -48,26 +48,6 @@
  */
 public abstract class EventImpl extends FlowNodeImpl implements Event {
     /**
-     * The cached value of the '{@link #getIncomingConversationLinks() <em>Incoming Conversation Links</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getIncomingConversationLinks()
-     * @generated
-     * @ordered
-     */
-    protected EList<ConversationLink> incomingConversationLinks;
-
-    /**
-     * The cached value of the '{@link #getOutgoingConversationLinks() <em>Outgoing Conversation Links</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getOutgoingConversationLinks()
-     * @generated
-     * @ordered
-     */
-    protected EList<ConversationLink> outgoingConversationLinks;
-
-    /**
      * The cached value of the '{@link #getProperties() <em>Properties</em>}' containment reference list.
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
@@ -98,30 +78,30 @@
 
     /**
      * <!-- begin-user-doc -->
+     * TODO: implement as virtual opposite to Bpmn2Package.CONVERSATION_LINK__TARGET_REF
      * <!-- end-user-doc -->
      * @generated
      */
     public List<ConversationLink> getIncomingConversationLinks() {
-        if (incomingConversationLinks == null) {
-            incomingConversationLinks = new EObjectWithInverseEList<ConversationLink>(
-                    ConversationLink.class, this, Bpmn2Package.EVENT__INCOMING_CONVERSATION_LINKS,
-                    Bpmn2Package.CONVERSATION_LINK__TARGET_REF);
-        }
-        return incomingConversationLinks;
+        // TODO: implement this method to return the 'Incoming Conversation Links' reference list
+        // Ensure that you remove @generated or mark it @generated NOT
+        // The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
+        // so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.EcoreEList should be used.
+        throw new UnsupportedOperationException();
     }
 
     /**
      * <!-- begin-user-doc -->
+     * TODO: implement as virtual opposite to Bpmn2Package.CONVERSATION_LINK__SOURCE_REF
      * <!-- end-user-doc -->
      * @generated
      */
     public List<ConversationLink> getOutgoingConversationLinks() {
-        if (outgoingConversationLinks == null) {
-            outgoingConversationLinks = new EObjectWithInverseResolvingEList<ConversationLink>(
-                    ConversationLink.class, this, Bpmn2Package.EVENT__OUTGOING_CONVERSATION_LINKS,
-                    Bpmn2Package.CONVERSATION_LINK__SOURCE_REF);
-        }
-        return outgoingConversationLinks;
+        // TODO: implement this method to return the 'Outgoing Conversation Links' reference list
+        // Ensure that you remove @generated or mark it @generated NOT
+        // The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
+        // so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.EcoreEList should be used.
+        throw new UnsupportedOperationException();
     }
 
     /**
@@ -142,34 +122,10 @@
      * <!-- end-user-doc -->
      * @generated
      */
-    @SuppressWarnings("unchecked")
-    @Override
-    public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID,
-            NotificationChain msgs) {
-        switch (featureID) {
-        case Bpmn2Package.EVENT__INCOMING_CONVERSATION_LINKS:
-            return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomingConversationLinks())
-                    .basicAdd(otherEnd, msgs);
-        case Bpmn2Package.EVENT__OUTGOING_CONVERSATION_LINKS:
-            return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoingConversationLinks())
-                    .basicAdd(otherEnd, msgs);
-        }
-        return super.eInverseAdd(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
     @Override
     public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID,
             NotificationChain msgs) {
         switch (featureID) {
-        case Bpmn2Package.EVENT__INCOMING_CONVERSATION_LINKS:
-            return ((InternalEList<?>) getIncomingConversationLinks()).basicRemove(otherEnd, msgs);
-        case Bpmn2Package.EVENT__OUTGOING_CONVERSATION_LINKS:
-            return ((InternalEList<?>) getOutgoingConversationLinks()).basicRemove(otherEnd, msgs);
         case Bpmn2Package.EVENT__PROPERTIES:
             return ((InternalEList<?>) getProperties()).basicRemove(otherEnd, msgs);
         }
@@ -203,16 +159,6 @@
     @Override
     public void eSet(int featureID, Object newValue) {
         switch (featureID) {
-        case Bpmn2Package.EVENT__INCOMING_CONVERSATION_LINKS:
-            getIncomingConversationLinks().clear();
-            getIncomingConversationLinks()
-                    .addAll((Collection<? extends ConversationLink>) newValue);
-            return;
-        case Bpmn2Package.EVENT__OUTGOING_CONVERSATION_LINKS:
-            getOutgoingConversationLinks().clear();
-            getOutgoingConversationLinks()
-                    .addAll((Collection<? extends ConversationLink>) newValue);
-            return;
         case Bpmn2Package.EVENT__PROPERTIES:
             getProperties().clear();
             getProperties().addAll((Collection<? extends Property>) newValue);
@@ -229,12 +175,6 @@
     @Override
     public void eUnset(int featureID) {
         switch (featureID) {
-        case Bpmn2Package.EVENT__INCOMING_CONVERSATION_LINKS:
-            getIncomingConversationLinks().clear();
-            return;
-        case Bpmn2Package.EVENT__OUTGOING_CONVERSATION_LINKS:
-            getOutgoingConversationLinks().clear();
-            return;
         case Bpmn2Package.EVENT__PROPERTIES:
             getProperties().clear();
             return;
@@ -251,9 +191,9 @@
     public boolean eIsSet(int featureID) {
         switch (featureID) {
         case Bpmn2Package.EVENT__INCOMING_CONVERSATION_LINKS:
-            return incomingConversationLinks != null && !incomingConversationLinks.isEmpty();
+            return !getIncomingConversationLinks().isEmpty();
         case Bpmn2Package.EVENT__OUTGOING_CONVERSATION_LINKS:
-            return outgoingConversationLinks != null && !outgoingConversationLinks.isEmpty();
+            return !getOutgoingConversationLinks().isEmpty();
         case Bpmn2Package.EVENT__PROPERTIES:
             return properties != null && !properties.isEmpty();
         }
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/FlowElementImpl.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/FlowElementImpl.java
index 6e14b38..24b3ad9 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/FlowElementImpl.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/FlowElementImpl.java
@@ -28,9 +28,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.util.EObjectWithInverseResolvingEList;
-import org.eclipse.emf.ecore.util.EObjectWithInverseEList;
-import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 
 /**
  * <!-- begin-user-doc -->
@@ -225,9 +223,8 @@
      */
     public List<CategoryValue> getCategoryValueRef() {
         if (categoryValueRef == null) {
-            categoryValueRef = new EObjectWithInverseEList.ManyInverse<CategoryValue>(
-                    CategoryValue.class, this, Bpmn2Package.FLOW_ELEMENT__CATEGORY_VALUE_REF,
-                    Bpmn2Package.CATEGORY_VALUE__CATEGORIZED_FLOW_ELEMENTS);
+            categoryValueRef = new EObjectResolvingEList<CategoryValue>(CategoryValue.class, this,
+                    Bpmn2Package.FLOW_ELEMENT__CATEGORY_VALUE_REF);
         }
         return categoryValueRef;
     }
@@ -259,23 +256,6 @@
      * <!-- end-user-doc -->
      * @generated
      */
-    @SuppressWarnings("unchecked")
-    @Override
-    public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID,
-            NotificationChain msgs) {
-        switch (featureID) {
-        case Bpmn2Package.FLOW_ELEMENT__CATEGORY_VALUE_REF:
-            return ((InternalEList<InternalEObject>) (InternalEList<?>) getCategoryValueRef())
-                    .basicAdd(otherEnd, msgs);
-        }
-        return super.eInverseAdd(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
     @Override
     public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID,
             NotificationChain msgs) {
@@ -284,8 +264,6 @@
             return basicSetAuditing(null, msgs);
         case Bpmn2Package.FLOW_ELEMENT__MONITORING:
             return basicSetMonitoring(null, msgs);
-        case Bpmn2Package.FLOW_ELEMENT__CATEGORY_VALUE_REF:
-            return ((InternalEList<?>) getCategoryValueRef()).basicRemove(otherEnd, msgs);
         }
         return super.eInverseRemove(otherEnd, featureID, msgs);
     }
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/InteractionNodeImpl.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/InteractionNodeImpl.java
index 78e57dc..832e7a6 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/InteractionNodeImpl.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/InteractionNodeImpl.java
@@ -45,26 +45,6 @@
  */
 public abstract class InteractionNodeImpl extends EObjectImpl implements InteractionNode {
     /**
-     * The cached value of the '{@link #getIncomingConversationLinks() <em>Incoming Conversation Links</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getIncomingConversationLinks()
-     * @generated
-     * @ordered
-     */
-    protected EList<ConversationLink> incomingConversationLinks;
-
-    /**
-     * The cached value of the '{@link #getOutgoingConversationLinks() <em>Outgoing Conversation Links</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getOutgoingConversationLinks()
-     * @generated
-     * @ordered
-     */
-    protected EList<ConversationLink> outgoingConversationLinks;
-
-    /**
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
      * @generated
@@ -85,69 +65,30 @@
 
     /**
      * <!-- begin-user-doc -->
+     * TODO: implement as virtual opposite to Bpmn2Package.CONVERSATION_LINK__TARGET_REF
      * <!-- end-user-doc -->
      * @generated
      */
     public List<ConversationLink> getIncomingConversationLinks() {
-        if (incomingConversationLinks == null) {
-            incomingConversationLinks = new EObjectWithInverseEList<ConversationLink>(
-                    ConversationLink.class, this,
-                    Bpmn2Package.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS,
-                    Bpmn2Package.CONVERSATION_LINK__TARGET_REF);
-        }
-        return incomingConversationLinks;
+        // TODO: implement this method to return the 'Incoming Conversation Links' reference list
+        // Ensure that you remove @generated or mark it @generated NOT
+        // The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
+        // so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.EcoreEList should be used.
+        throw new UnsupportedOperationException();
     }
 
     /**
      * <!-- begin-user-doc -->
+     * TODO: implement as virtual opposite to Bpmn2Package.CONVERSATION_LINK__SOURCE_REF
      * <!-- end-user-doc -->
      * @generated
      */
     public List<ConversationLink> getOutgoingConversationLinks() {
-        if (outgoingConversationLinks == null) {
-            outgoingConversationLinks = new EObjectWithInverseResolvingEList<ConversationLink>(
-                    ConversationLink.class, this,
-                    Bpmn2Package.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS,
-                    Bpmn2Package.CONVERSATION_LINK__SOURCE_REF);
-        }
-        return outgoingConversationLinks;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID,
-            NotificationChain msgs) {
-        switch (featureID) {
-        case Bpmn2Package.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS:
-            return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomingConversationLinks())
-                    .basicAdd(otherEnd, msgs);
-        case Bpmn2Package.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS:
-            return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoingConversationLinks())
-                    .basicAdd(otherEnd, msgs);
-        }
-        return super.eInverseAdd(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID,
-            NotificationChain msgs) {
-        switch (featureID) {
-        case Bpmn2Package.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS:
-            return ((InternalEList<?>) getIncomingConversationLinks()).basicRemove(otherEnd, msgs);
-        case Bpmn2Package.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS:
-            return ((InternalEList<?>) getOutgoingConversationLinks()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
+        // TODO: implement this method to return the 'Outgoing Conversation Links' reference list
+        // Ensure that you remove @generated or mark it @generated NOT
+        // The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
+        // so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.EcoreEList should be used.
+        throw new UnsupportedOperationException();
     }
 
     /**
@@ -171,54 +112,13 @@
      * <!-- end-user-doc -->
      * @generated
      */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-        case Bpmn2Package.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS:
-            getIncomingConversationLinks().clear();
-            getIncomingConversationLinks()
-                    .addAll((Collection<? extends ConversationLink>) newValue);
-            return;
-        case Bpmn2Package.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS:
-            getOutgoingConversationLinks().clear();
-            getOutgoingConversationLinks()
-                    .addAll((Collection<? extends ConversationLink>) newValue);
-            return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID) {
-        switch (featureID) {
-        case Bpmn2Package.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS:
-            getIncomingConversationLinks().clear();
-            return;
-        case Bpmn2Package.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS:
-            getOutgoingConversationLinks().clear();
-            return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
     @Override
     public boolean eIsSet(int featureID) {
         switch (featureID) {
         case Bpmn2Package.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS:
-            return incomingConversationLinks != null && !incomingConversationLinks.isEmpty();
+            return !getIncomingConversationLinks().isEmpty();
         case Bpmn2Package.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS:
-            return outgoingConversationLinks != null && !outgoingConversationLinks.isEmpty();
+            return !getOutgoingConversationLinks().isEmpty();
         }
         return super.eIsSet(featureID);
     }
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/ParticipantImpl.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/ParticipantImpl.java
index a34b4b5..ea28b77 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/ParticipantImpl.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/ParticipantImpl.java
@@ -56,26 +56,6 @@
  */
 public class ParticipantImpl extends BaseElementImpl implements Participant {
     /**
-     * The cached value of the '{@link #getIncomingConversationLinks() <em>Incoming Conversation Links</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getIncomingConversationLinks()
-     * @generated
-     * @ordered
-     */
-    protected EList<ConversationLink> incomingConversationLinks;
-
-    /**
-     * The cached value of the '{@link #getOutgoingConversationLinks() <em>Outgoing Conversation Links</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getOutgoingConversationLinks()
-     * @generated
-     * @ordered
-     */
-    protected EList<ConversationLink> outgoingConversationLinks;
-
-    /**
      * The cached value of the '{@link #getInterfaceRefs() <em>Interface Refs</em>}' reference list.
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
@@ -156,32 +136,30 @@
 
     /**
      * <!-- begin-user-doc -->
+     * TODO: implement as virtual opposite to Bpmn2Package.CONVERSATION_LINK__TARGET_REF
      * <!-- end-user-doc -->
      * @generated
      */
     public List<ConversationLink> getIncomingConversationLinks() {
-        if (incomingConversationLinks == null) {
-            incomingConversationLinks = new EObjectWithInverseEList<ConversationLink>(
-                    ConversationLink.class, this,
-                    Bpmn2Package.PARTICIPANT__INCOMING_CONVERSATION_LINKS,
-                    Bpmn2Package.CONVERSATION_LINK__TARGET_REF);
-        }
-        return incomingConversationLinks;
+        // TODO: implement this method to return the 'Incoming Conversation Links' reference list
+        // Ensure that you remove @generated or mark it @generated NOT
+        // The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
+        // so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.EcoreEList should be used.
+        throw new UnsupportedOperationException();
     }
 
     /**
      * <!-- begin-user-doc -->
+     * TODO: implement as virtual opposite to Bpmn2Package.CONVERSATION_LINK__SOURCE_REF
      * <!-- end-user-doc -->
      * @generated
      */
     public List<ConversationLink> getOutgoingConversationLinks() {
-        if (outgoingConversationLinks == null) {
-            outgoingConversationLinks = new EObjectWithInverseResolvingEList<ConversationLink>(
-                    ConversationLink.class, this,
-                    Bpmn2Package.PARTICIPANT__OUTGOING_CONVERSATION_LINKS,
-                    Bpmn2Package.CONVERSATION_LINK__SOURCE_REF);
-        }
-        return outgoingConversationLinks;
+        // TODO: implement this method to return the 'Outgoing Conversation Links' reference list
+        // Ensure that you remove @generated or mark it @generated NOT
+        // The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
+        // so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.EcoreEList should be used.
+        throw new UnsupportedOperationException();
     }
 
     /**
@@ -332,34 +310,10 @@
      * <!-- end-user-doc -->
      * @generated
      */
-    @SuppressWarnings("unchecked")
-    @Override
-    public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID,
-            NotificationChain msgs) {
-        switch (featureID) {
-        case Bpmn2Package.PARTICIPANT__INCOMING_CONVERSATION_LINKS:
-            return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomingConversationLinks())
-                    .basicAdd(otherEnd, msgs);
-        case Bpmn2Package.PARTICIPANT__OUTGOING_CONVERSATION_LINKS:
-            return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoingConversationLinks())
-                    .basicAdd(otherEnd, msgs);
-        }
-        return super.eInverseAdd(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
     @Override
     public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID,
             NotificationChain msgs) {
         switch (featureID) {
-        case Bpmn2Package.PARTICIPANT__INCOMING_CONVERSATION_LINKS:
-            return ((InternalEList<?>) getIncomingConversationLinks()).basicRemove(otherEnd, msgs);
-        case Bpmn2Package.PARTICIPANT__OUTGOING_CONVERSATION_LINKS:
-            return ((InternalEList<?>) getOutgoingConversationLinks()).basicRemove(otherEnd, msgs);
         case Bpmn2Package.PARTICIPANT__PARTICIPANT_MULTIPLICITY:
             return basicSetParticipantMultiplicity(null, msgs);
         }
@@ -403,16 +357,6 @@
     @Override
     public void eSet(int featureID, Object newValue) {
         switch (featureID) {
-        case Bpmn2Package.PARTICIPANT__INCOMING_CONVERSATION_LINKS:
-            getIncomingConversationLinks().clear();
-            getIncomingConversationLinks()
-                    .addAll((Collection<? extends ConversationLink>) newValue);
-            return;
-        case Bpmn2Package.PARTICIPANT__OUTGOING_CONVERSATION_LINKS:
-            getOutgoingConversationLinks().clear();
-            getOutgoingConversationLinks()
-                    .addAll((Collection<? extends ConversationLink>) newValue);
-            return;
         case Bpmn2Package.PARTICIPANT__INTERFACE_REFS:
             getInterfaceRefs().clear();
             getInterfaceRefs().addAll((Collection<? extends Interface>) newValue);
@@ -442,12 +386,6 @@
     @Override
     public void eUnset(int featureID) {
         switch (featureID) {
-        case Bpmn2Package.PARTICIPANT__INCOMING_CONVERSATION_LINKS:
-            getIncomingConversationLinks().clear();
-            return;
-        case Bpmn2Package.PARTICIPANT__OUTGOING_CONVERSATION_LINKS:
-            getOutgoingConversationLinks().clear();
-            return;
         case Bpmn2Package.PARTICIPANT__INTERFACE_REFS:
             getInterfaceRefs().clear();
             return;
@@ -476,9 +414,9 @@
     public boolean eIsSet(int featureID) {
         switch (featureID) {
         case Bpmn2Package.PARTICIPANT__INCOMING_CONVERSATION_LINKS:
-            return incomingConversationLinks != null && !incomingConversationLinks.isEmpty();
+            return !getIncomingConversationLinks().isEmpty();
         case Bpmn2Package.PARTICIPANT__OUTGOING_CONVERSATION_LINKS:
-            return outgoingConversationLinks != null && !outgoingConversationLinks.isEmpty();
+            return !getOutgoingConversationLinks().isEmpty();
         case Bpmn2Package.PARTICIPANT__INTERFACE_REFS:
             return interfaceRefs != null && !interfaceRefs.isEmpty();
         case Bpmn2Package.PARTICIPANT__END_POINT_REFS:
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/TaskImpl.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/TaskImpl.java
index 27b8533..f3dae09 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/TaskImpl.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/TaskImpl.java
@@ -45,26 +45,6 @@
  */
 public class TaskImpl extends ActivityImpl implements Task {
     /**
-     * The cached value of the '{@link #getIncomingConversationLinks() <em>Incoming Conversation Links</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getIncomingConversationLinks()
-     * @generated
-     * @ordered
-     */
-    protected EList<ConversationLink> incomingConversationLinks;
-
-    /**
-     * The cached value of the '{@link #getOutgoingConversationLinks() <em>Outgoing Conversation Links</em>}' reference list.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @see #getOutgoingConversationLinks()
-     * @generated
-     * @ordered
-     */
-    protected EList<ConversationLink> outgoingConversationLinks;
-
-    /**
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
      * @generated
@@ -85,67 +65,30 @@
 
     /**
      * <!-- begin-user-doc -->
+     * TODO: implement as virtual opposite to Bpmn2Package.CONVERSATION_LINK__TARGET_REF
      * <!-- end-user-doc -->
      * @generated
      */
     public List<ConversationLink> getIncomingConversationLinks() {
-        if (incomingConversationLinks == null) {
-            incomingConversationLinks = new EObjectWithInverseEList<ConversationLink>(
-                    ConversationLink.class, this, Bpmn2Package.TASK__INCOMING_CONVERSATION_LINKS,
-                    Bpmn2Package.CONVERSATION_LINK__TARGET_REF);
-        }
-        return incomingConversationLinks;
+        // TODO: implement this method to return the 'Incoming Conversation Links' reference list
+        // Ensure that you remove @generated or mark it @generated NOT
+        // The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
+        // so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.EcoreEList should be used.
+        throw new UnsupportedOperationException();
     }
 
     /**
      * <!-- begin-user-doc -->
+     * TODO: implement as virtual opposite to Bpmn2Package.CONVERSATION_LINK__SOURCE_REF
      * <!-- end-user-doc -->
      * @generated
      */
     public List<ConversationLink> getOutgoingConversationLinks() {
-        if (outgoingConversationLinks == null) {
-            outgoingConversationLinks = new EObjectWithInverseResolvingEList<ConversationLink>(
-                    ConversationLink.class, this, Bpmn2Package.TASK__OUTGOING_CONVERSATION_LINKS,
-                    Bpmn2Package.CONVERSATION_LINK__SOURCE_REF);
-        }
-        return outgoingConversationLinks;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID,
-            NotificationChain msgs) {
-        switch (featureID) {
-        case Bpmn2Package.TASK__INCOMING_CONVERSATION_LINKS:
-            return ((InternalEList<InternalEObject>) (InternalEList<?>) getIncomingConversationLinks())
-                    .basicAdd(otherEnd, msgs);
-        case Bpmn2Package.TASK__OUTGOING_CONVERSATION_LINKS:
-            return ((InternalEList<InternalEObject>) (InternalEList<?>) getOutgoingConversationLinks())
-                    .basicAdd(otherEnd, msgs);
-        }
-        return super.eInverseAdd(otherEnd, featureID, msgs);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID,
-            NotificationChain msgs) {
-        switch (featureID) {
-        case Bpmn2Package.TASK__INCOMING_CONVERSATION_LINKS:
-            return ((InternalEList<?>) getIncomingConversationLinks()).basicRemove(otherEnd, msgs);
-        case Bpmn2Package.TASK__OUTGOING_CONVERSATION_LINKS:
-            return ((InternalEList<?>) getOutgoingConversationLinks()).basicRemove(otherEnd, msgs);
-        }
-        return super.eInverseRemove(otherEnd, featureID, msgs);
+        // TODO: implement this method to return the 'Outgoing Conversation Links' reference list
+        // Ensure that you remove @generated or mark it @generated NOT
+        // The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
+        // so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.EcoreEList should be used.
+        throw new UnsupportedOperationException();
     }
 
     /**
@@ -169,54 +112,13 @@
      * <!-- end-user-doc -->
      * @generated
      */
-    @SuppressWarnings("unchecked")
-    @Override
-    public void eSet(int featureID, Object newValue) {
-        switch (featureID) {
-        case Bpmn2Package.TASK__INCOMING_CONVERSATION_LINKS:
-            getIncomingConversationLinks().clear();
-            getIncomingConversationLinks()
-                    .addAll((Collection<? extends ConversationLink>) newValue);
-            return;
-        case Bpmn2Package.TASK__OUTGOING_CONVERSATION_LINKS:
-            getOutgoingConversationLinks().clear();
-            getOutgoingConversationLinks()
-                    .addAll((Collection<? extends ConversationLink>) newValue);
-            return;
-        }
-        super.eSet(featureID, newValue);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void eUnset(int featureID) {
-        switch (featureID) {
-        case Bpmn2Package.TASK__INCOMING_CONVERSATION_LINKS:
-            getIncomingConversationLinks().clear();
-            return;
-        case Bpmn2Package.TASK__OUTGOING_CONVERSATION_LINKS:
-            getOutgoingConversationLinks().clear();
-            return;
-        }
-        super.eUnset(featureID);
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
     @Override
     public boolean eIsSet(int featureID) {
         switch (featureID) {
         case Bpmn2Package.TASK__INCOMING_CONVERSATION_LINKS:
-            return incomingConversationLinks != null && !incomingConversationLinks.isEmpty();
+            return !getIncomingConversationLinks().isEmpty();
         case Bpmn2Package.TASK__OUTGOING_CONVERSATION_LINKS:
-            return outgoingConversationLinks != null && !outgoingConversationLinks.isEmpty();
+            return !getOutgoingConversationLinks().isEmpty();
         }
         return super.eIsSet(featureID);
     }
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/bpmn2.ecore b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/bpmn2.ecore
index 848340b..1091d05 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/bpmn2.ecore
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/bpmn2.ecore
@@ -1762,8 +1762,8 @@
       </eAnnotations>
     </eStructuralFeatures>
     <eStructuralFeatures xsi:type="ecore:EReference" name="categorizedFlowElements"
-        ordered="false" upperBound="-1" eType="#//FlowElement" transient="true" derived="true"
-        resolveProxies="false" eOpposite="#//FlowElement/categoryValueRef"/>
+        ordered="false" upperBound="-1" eType="#//FlowElement" changeable="false"
+        volatile="true" transient="true" derived="true" resolveProxies="false"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="Choreography" eSuperTypes="#//Collaboration #//FlowElementsContainer">
     <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
@@ -2045,14 +2045,14 @@
       </eAnnotations>
     </eStructuralFeatures>
     <eStructuralFeatures xsi:type="ecore:EReference" name="sourceRef" ordered="false"
-        lowerBound="1" eType="#//InteractionNode" resolveProxies="false" eOpposite="#//InteractionNode/outgoingConversationLinks">
+        lowerBound="1" eType="#//InteractionNode">
       <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
         <details key="kind" value="attribute"/>
         <details key="name" value="sourceRef"/>
       </eAnnotations>
     </eStructuralFeatures>
     <eStructuralFeatures xsi:type="ecore:EReference" name="targetRef" ordered="false"
-        lowerBound="1" eType="#//InteractionNode" resolveProxies="false" eOpposite="#//InteractionNode/incomingConversationLinks">
+        lowerBound="1" eType="#//InteractionNode">
       <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
         <details key="kind" value="attribute"/>
         <details key="name" value="targetRef"/>
@@ -2743,7 +2743,7 @@
       </eAnnotations>
     </eStructuralFeatures>
     <eStructuralFeatures xsi:type="ecore:EReference" name="categoryValueRef" ordered="false"
-        upperBound="-1" eType="#//CategoryValue" resolveProxies="false" eOpposite="#//CategoryValue/categorizedFlowElements">
+        upperBound="-1" eType="#//CategoryValue">
       <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
         <details key="kind" value="element"/>
         <details key="name" value="categoryValueRef"/>
@@ -3117,11 +3117,11 @@
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="InteractionNode" abstract="true">
     <eStructuralFeatures xsi:type="ecore:EReference" name="incomingConversationLinks"
-        ordered="false" upperBound="-1" eType="#//ConversationLink" transient="true"
-        derived="true" resolveProxies="false" eOpposite="#//ConversationLink/targetRef"/>
+        ordered="false" upperBound="-1" eType="#//ConversationLink" changeable="false"
+        volatile="true" transient="true" derived="true" resolveProxies="false"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="outgoingConversationLinks"
-        ordered="false" upperBound="-1" eType="#//ConversationLink" transient="true"
-        derived="true" eOpposite="#//ConversationLink/sourceRef"/>
+        ordered="false" upperBound="-1" eType="#//ConversationLink" changeable="false"
+        volatile="true" transient="true" derived="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="Interface" eSuperTypes="#//RootElement">
     <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">