diff --git a/org.eclipse.bpmn2.edit/src/org/eclipse/bpmn2/provider/CallActivityItemProvider.java b/org.eclipse.bpmn2.edit/src/org/eclipse/bpmn2/provider/CallActivityItemProvider.java
index 5ff49dc..1fef3e9 100644
--- a/org.eclipse.bpmn2.edit/src/org/eclipse/bpmn2/provider/CallActivityItemProvider.java
+++ b/org.eclipse.bpmn2.edit/src/org/eclipse/bpmn2/provider/CallActivityItemProvider.java
@@ -60,12 +60,46 @@
         if (itemPropertyDescriptors == null) {
             super.getPropertyDescriptors(object);
 
+            addIncomingConversationLinksPropertyDescriptor(object);
+            addOutgoingConversationLinksPropertyDescriptor(object);
             addCalledElementRefPropertyDescriptor(object);
         }
         return itemPropertyDescriptors;
     }
 
     /**
+     * This adds a property descriptor for the Incoming Conversation Links feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected void addIncomingConversationLinksPropertyDescriptor(Object object) {
+        itemPropertyDescriptors.add(createItemPropertyDescriptor(
+                ((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
+                getResourceLocator(),
+                getString("_UI_InteractionNode_incomingConversationLinks_feature"),
+                getString("_UI_InteractionNode_incomingConversationLinks_description"),
+                Bpmn2Package.Literals.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS, false, false,
+                true, null, null, null));
+    }
+
+    /**
+     * This adds a property descriptor for the Outgoing Conversation Links feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected void addOutgoingConversationLinksPropertyDescriptor(Object object) {
+        itemPropertyDescriptors.add(createItemPropertyDescriptor(
+                ((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
+                getResourceLocator(),
+                getString("_UI_InteractionNode_outgoingConversationLinks_feature"),
+                getString("_UI_InteractionNode_outgoingConversationLinks_description"),
+                Bpmn2Package.Literals.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS, false, false,
+                true, null, null, null));
+    }
+
+    /**
      * This adds a property descriptor for the Called Element Ref feature.
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
diff --git a/org.eclipse.bpmn2.edit/src/org/eclipse/bpmn2/provider/SubProcessItemProvider.java b/org.eclipse.bpmn2.edit/src/org/eclipse/bpmn2/provider/SubProcessItemProvider.java
index 1ef5a00..f98ca46 100644
--- a/org.eclipse.bpmn2.edit/src/org/eclipse/bpmn2/provider/SubProcessItemProvider.java
+++ b/org.eclipse.bpmn2.edit/src/org/eclipse/bpmn2/provider/SubProcessItemProvider.java
@@ -1,320 +1,354 @@
-/**
- * <copyright>
- * 
- * Copyright (c) 2010 SAP AG.
- * 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:
- *    Reiner Hille-Doering (SAP AG) - initial API and implementation and/or initial documentation
- * 
- * </copyright>
- *
- */
-package org.eclipse.bpmn2.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.bpmn2.Bpmn2Factory;
-import org.eclipse.bpmn2.Bpmn2Package;
-import org.eclipse.bpmn2.SubProcess;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.bpmn2.SubProcess} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class SubProcessItemProvider extends ActivityItemProvider implements
-        IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider,
-        IItemLabelProvider, IItemPropertySource {
-    /**
-     * This constructs an instance from a factory and a notifier.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public SubProcessItemProvider(AdapterFactory adapterFactory) {
-        super(adapterFactory);
-    }
-
-    /**
-     * This returns the property descriptors for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
-        if (itemPropertyDescriptors == null) {
-            super.getPropertyDescriptors(object);
-
-            addTriggeredByEventPropertyDescriptor(object);
-        }
-        return itemPropertyDescriptors;
-    }
-
-    /**
-     * This adds a property descriptor for the Triggered By Event feature.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    protected void addTriggeredByEventPropertyDescriptor(Object object) {
-        itemPropertyDescriptors.add(createItemPropertyDescriptor(
-                ((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
-                getResourceLocator(),
-                getString("_UI_SubProcess_triggeredByEvent_feature"),
-                getString("_UI_PropertyDescriptor_description",
-                        "_UI_SubProcess_triggeredByEvent_feature", "_UI_SubProcess_type"),
-                Bpmn2Package.Literals.SUB_PROCESS__TRIGGERED_BY_EVENT, true, false, false,
-                ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE, null, null));
-    }
-
-    /**
-     * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
-        if (childrenFeatures == null) {
-            super.getChildrenFeatures(object);
-            childrenFeatures.add(Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__LANE_SETS);
-            childrenFeatures.add(Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS);
-            childrenFeatures.add(Bpmn2Package.Literals.SUB_PROCESS__ARTIFACTS);
-        }
-        return childrenFeatures;
-    }
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected EStructuralFeature getChildFeature(Object object, Object child) {
-        // Check the type of the specified child object and return the proper feature to use for
-        // adding (see {@link AddCommand}) it as a child.
-
-        return super.getChildFeature(object, child);
-    }
-
-    /**
-     * This returns SubProcess.png.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public Object getImage(Object object) {
-        try {
-            return overlayImage(object, getResourceLocator().getImage("full/obj16/SubProcess.png"));
-        } catch (java.util.MissingResourceException e) {
-            return overlayImage(object, getResourceLocator().getImage("full/obj16/SubProcess.gif"));
-        }
-    }
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public String getText(Object object) {
-        String label = ((SubProcess) object).getName();
-        return label == null || label.length() == 0 ? getString("_UI_SubProcess_type")
-                : getString("_UI_SubProcess_type") + " " + label;
-    }
-
-    /**
-     * This handles model notifications by calling {@link #updateChildren} to update any cached
-     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    public void notifyChanged(Notification notification) {
-        updateChildren(notification);
-
-        switch (notification.getFeatureID(SubProcess.class)) {
-        case Bpmn2Package.SUB_PROCESS__TRIGGERED_BY_EVENT:
-            fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(),
-                    false, true));
-            return;
-        case Bpmn2Package.SUB_PROCESS__LANE_SETS:
-        case Bpmn2Package.SUB_PROCESS__FLOW_ELEMENTS:
-        case Bpmn2Package.SUB_PROCESS__ARTIFACTS:
-            fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(),
-                    true, false));
-            return;
-        }
-        super.notifyChanged(notification);
-    }
-
-    /**
-     * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-     * that can be created under this object.
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    @Override
-    protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
-        super.collectNewChildDescriptors(newChildDescriptors, object);
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__LANE_SETS,
-                Bpmn2Factory.eINSTANCE.createLaneSet()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createSubProcess()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createAdHocSubProcess()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createBoundaryEvent()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createTask()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createBusinessRuleTask()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createCallActivity()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createCallChoreography()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createChoreographyTask()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createComplexGateway()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createDataObject()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createDataObjectReference()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createDataStoreReference()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createEndEvent()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createEventBasedGateway()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createExclusiveGateway()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createImplicitThrowEvent()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createInclusiveGateway()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createIntermediateCatchEvent()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createIntermediateThrowEvent()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createManualTask()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createParallelGateway()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createReceiveTask()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createScriptTask()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createSendTask()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createSequenceFlow()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createServiceTask()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createStartEvent()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createSubChoreography()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createTransaction()));
-
-        newChildDescriptors.add(createChildParameter(
-                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
-                Bpmn2Factory.eINSTANCE.createUserTask()));
-
-        newChildDescriptors.add(createChildParameter(Bpmn2Package.Literals.SUB_PROCESS__ARTIFACTS,
-                Bpmn2Factory.eINSTANCE.createAssociation()));
-
-        newChildDescriptors.add(createChildParameter(Bpmn2Package.Literals.SUB_PROCESS__ARTIFACTS,
-                Bpmn2Factory.eINSTANCE.createGroup()));
-
-        newChildDescriptors.add(createChildParameter(Bpmn2Package.Literals.SUB_PROCESS__ARTIFACTS,
-                Bpmn2Factory.eINSTANCE.createTextAnnotation()));
-    }
-
-}
+/**
+ * <copyright>
+ * 
+ * Copyright (c) 2010 SAP AG.
+ * 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:
+ *    Reiner Hille-Doering (SAP AG) - initial API and implementation and/or initial documentation
+ * 
+ * </copyright>
+ *
+ */
+package org.eclipse.bpmn2.provider;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.bpmn2.Bpmn2Factory;
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.bpmn2.SubProcess} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class SubProcessItemProvider extends ActivityItemProvider implements
+        IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider,
+        IItemLabelProvider, IItemPropertySource {
+    /**
+     * This constructs an instance from a factory and a notifier.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public SubProcessItemProvider(AdapterFactory adapterFactory) {
+        super(adapterFactory);
+    }
+
+    /**
+     * This returns the property descriptors for the adapted class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+        if (itemPropertyDescriptors == null) {
+            super.getPropertyDescriptors(object);
+
+            addIncomingConversationLinksPropertyDescriptor(object);
+            addOutgoingConversationLinksPropertyDescriptor(object);
+            addTriggeredByEventPropertyDescriptor(object);
+        }
+        return itemPropertyDescriptors;
+    }
+
+    /**
+     * This adds a property descriptor for the Incoming Conversation Links feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected void addIncomingConversationLinksPropertyDescriptor(Object object) {
+        itemPropertyDescriptors.add(createItemPropertyDescriptor(
+                ((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
+                getResourceLocator(),
+                getString("_UI_InteractionNode_incomingConversationLinks_feature"),
+                getString("_UI_InteractionNode_incomingConversationLinks_description"),
+                Bpmn2Package.Literals.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS, false, false,
+                true, null, null, null));
+    }
+
+    /**
+     * This adds a property descriptor for the Outgoing Conversation Links feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected void addOutgoingConversationLinksPropertyDescriptor(Object object) {
+        itemPropertyDescriptors.add(createItemPropertyDescriptor(
+                ((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
+                getResourceLocator(),
+                getString("_UI_InteractionNode_outgoingConversationLinks_feature"),
+                getString("_UI_InteractionNode_outgoingConversationLinks_description"),
+                Bpmn2Package.Literals.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS, false, false,
+                true, null, null, null));
+    }
+
+    /**
+     * This adds a property descriptor for the Triggered By Event feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected void addTriggeredByEventPropertyDescriptor(Object object) {
+        itemPropertyDescriptors.add(createItemPropertyDescriptor(
+                ((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
+                getResourceLocator(),
+                getString("_UI_SubProcess_triggeredByEvent_feature"),
+                getString("_UI_PropertyDescriptor_description",
+                        "_UI_SubProcess_triggeredByEvent_feature", "_UI_SubProcess_type"),
+                Bpmn2Package.Literals.SUB_PROCESS__TRIGGERED_BY_EVENT, true, false, false,
+                ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE, null, null));
+    }
+
+    /**
+     * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+     * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+     * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+        if (childrenFeatures == null) {
+            super.getChildrenFeatures(object);
+            childrenFeatures.add(Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__LANE_SETS);
+            childrenFeatures.add(Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS);
+            childrenFeatures.add(Bpmn2Package.Literals.SUB_PROCESS__ARTIFACTS);
+        }
+        return childrenFeatures;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EStructuralFeature getChildFeature(Object object, Object child) {
+        // Check the type of the specified child object and return the proper feature to use for
+        // adding (see {@link AddCommand}) it as a child.
+
+        return super.getChildFeature(object, child);
+    }
+
+    /**
+     * This returns SubProcess.png.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object getImage(Object object) {
+        try {
+            return overlayImage(object, getResourceLocator().getImage("full/obj16/SubProcess.png"));
+        } catch (java.util.MissingResourceException e) {
+            return overlayImage(object, getResourceLocator().getImage("full/obj16/SubProcess.gif"));
+        }
+    }
+
+    /**
+     * This returns the label text for the adapted class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String getText(Object object) {
+        String label = ((SubProcess) object).getName();
+        return label == null || label.length() == 0 ? getString("_UI_SubProcess_type")
+                : getString("_UI_SubProcess_type") + " " + label;
+    }
+
+    /**
+     * This handles model notifications by calling {@link #updateChildren} to update any cached
+     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void notifyChanged(Notification notification) {
+        updateChildren(notification);
+
+        switch (notification.getFeatureID(SubProcess.class)) {
+        case Bpmn2Package.SUB_PROCESS__TRIGGERED_BY_EVENT:
+            fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(),
+                    false, true));
+            return;
+        case Bpmn2Package.SUB_PROCESS__LANE_SETS:
+        case Bpmn2Package.SUB_PROCESS__FLOW_ELEMENTS:
+        case Bpmn2Package.SUB_PROCESS__ARTIFACTS:
+            fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(),
+                    true, false));
+            return;
+        }
+        super.notifyChanged(notification);
+    }
+
+    /**
+     * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+     * that can be created under this object.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+        super.collectNewChildDescriptors(newChildDescriptors, object);
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__LANE_SETS,
+                Bpmn2Factory.eINSTANCE.createLaneSet()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createSubProcess()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createAdHocSubProcess()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createBoundaryEvent()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createTask()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createBusinessRuleTask()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createCallActivity()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createCallChoreography()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createChoreographyTask()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createComplexGateway()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createDataObject()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createDataObjectReference()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createDataStoreReference()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createEndEvent()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createEventBasedGateway()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createExclusiveGateway()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createImplicitThrowEvent()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createInclusiveGateway()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createIntermediateCatchEvent()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createIntermediateThrowEvent()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createManualTask()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createParallelGateway()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createReceiveTask()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createScriptTask()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createSendTask()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createSequenceFlow()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createServiceTask()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createStartEvent()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createSubChoreography()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createTransaction()));
+
+        newChildDescriptors.add(createChildParameter(
+                Bpmn2Package.Literals.FLOW_ELEMENTS_CONTAINER__FLOW_ELEMENTS,
+                Bpmn2Factory.eINSTANCE.createUserTask()));
+
+        newChildDescriptors.add(createChildParameter(Bpmn2Package.Literals.SUB_PROCESS__ARTIFACTS,
+                Bpmn2Factory.eINSTANCE.createAssociation()));
+
+        newChildDescriptors.add(createChildParameter(Bpmn2Package.Literals.SUB_PROCESS__ARTIFACTS,
+                Bpmn2Factory.eINSTANCE.createGroup()));
+
+        newChildDescriptors.add(createChildParameter(Bpmn2Package.Literals.SUB_PROCESS__ARTIFACTS,
+                Bpmn2Factory.eINSTANCE.createTextAnnotation()));
+    }
+
+}
diff --git a/org.eclipse.bpmn2/model/BPMN20.ecore b/org.eclipse.bpmn2/model/BPMN20.ecore
index 7c4bbbb..05384ec 100644
--- a/org.eclipse.bpmn2/model/BPMN20.ecore
+++ b/org.eclipse.bpmn2/model/BPMN20.ecore
@@ -1588,7 +1588,7 @@
       </eAnnotations>
     </eStructuralFeatures>
   </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CallActivity" eSuperTypes="#//Activity">
+  <eClassifiers xsi:type="ecore:EClass" name="CallActivity" eSuperTypes="#//Activity #//InteractionNode">
     <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
       <details key="name" value="tCallActivity"/>
       <details key="kind" value="elementOnly"/>
@@ -4300,7 +4300,7 @@
       </eAnnotations>
     </eStructuralFeatures>
   </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SubProcess" eSuperTypes="#//Activity #//FlowElementsContainer">
+  <eClassifiers xsi:type="ecore:EClass" name="SubProcess" eSuperTypes="#//Activity #//FlowElementsContainer #//InteractionNode">
     <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
       <details key="name" value="tSubProcess"/>
       <details key="kind" value="elementOnly"/>
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/Bpmn2Package.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/Bpmn2Package.java
index abd9b7a..3c297f4 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/Bpmn2Package.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/Bpmn2Package.java
@@ -2082,13 +2082,31 @@
     int SUB_PROCESS__FLOW_ELEMENTS = ACTIVITY_FEATURE_COUNT + 1;
 
     /**
+     * The feature id for the '<em><b>Incoming Conversation Links</b></em>' reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int SUB_PROCESS__INCOMING_CONVERSATION_LINKS = ACTIVITY_FEATURE_COUNT + 2;
+
+    /**
+     * The feature id for the '<em><b>Outgoing Conversation Links</b></em>' reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int SUB_PROCESS__OUTGOING_CONVERSATION_LINKS = ACTIVITY_FEATURE_COUNT + 3;
+
+    /**
      * The feature id for the '<em><b>Artifacts</b></em>' containment reference list.
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
      * @generated
      * @ordered
      */
-    int SUB_PROCESS__ARTIFACTS = ACTIVITY_FEATURE_COUNT + 2;
+    int SUB_PROCESS__ARTIFACTS = ACTIVITY_FEATURE_COUNT + 4;
 
     /**
      * The feature id for the '<em><b>Triggered By Event</b></em>' attribute.
@@ -2097,7 +2115,7 @@
      * @generated
      * @ordered
      */
-    int SUB_PROCESS__TRIGGERED_BY_EVENT = ACTIVITY_FEATURE_COUNT + 3;
+    int SUB_PROCESS__TRIGGERED_BY_EVENT = ACTIVITY_FEATURE_COUNT + 5;
 
     /**
      * The number of structural features of the '<em>Sub Process</em>' class.
@@ -2106,7 +2124,7 @@
      * @generated
      * @ordered
      */
-    int SUB_PROCESS_FEATURE_COUNT = ACTIVITY_FEATURE_COUNT + 4;
+    int SUB_PROCESS_FEATURE_COUNT = ACTIVITY_FEATURE_COUNT + 6;
 
     /**
      * The meta object id for the '{@link org.eclipse.bpmn2.impl.AdHocSubProcessImpl <em>Ad Hoc Sub Process</em>}' class.
@@ -2344,6 +2362,24 @@
     int AD_HOC_SUB_PROCESS__FLOW_ELEMENTS = SUB_PROCESS__FLOW_ELEMENTS;
 
     /**
+     * The feature id for the '<em><b>Incoming Conversation Links</b></em>' reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int AD_HOC_SUB_PROCESS__INCOMING_CONVERSATION_LINKS = SUB_PROCESS__INCOMING_CONVERSATION_LINKS;
+
+    /**
+     * The feature id for the '<em><b>Outgoing Conversation Links</b></em>' reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int AD_HOC_SUB_PROCESS__OUTGOING_CONVERSATION_LINKS = SUB_PROCESS__OUTGOING_CONVERSATION_LINKS;
+
+    /**
      * The feature id for the '<em><b>Artifacts</b></em>' containment reference list.
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
@@ -4001,13 +4037,31 @@
     int CALL_ACTIVITY__START_QUANTITY = ACTIVITY__START_QUANTITY;
 
     /**
+     * The feature id for the '<em><b>Incoming Conversation Links</b></em>' reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CALL_ACTIVITY__INCOMING_CONVERSATION_LINKS = ACTIVITY_FEATURE_COUNT + 0;
+
+    /**
+     * The feature id for the '<em><b>Outgoing Conversation Links</b></em>' reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CALL_ACTIVITY__OUTGOING_CONVERSATION_LINKS = ACTIVITY_FEATURE_COUNT + 1;
+
+    /**
      * The feature id for the '<em><b>Called Element Ref</b></em>' reference.
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
      * @generated
      * @ordered
      */
-    int CALL_ACTIVITY__CALLED_ELEMENT_REF = ACTIVITY_FEATURE_COUNT + 0;
+    int CALL_ACTIVITY__CALLED_ELEMENT_REF = ACTIVITY_FEATURE_COUNT + 2;
 
     /**
      * The number of structural features of the '<em>Call Activity</em>' class.
@@ -4016,7 +4070,7 @@
      * @generated
      * @ordered
      */
-    int CALL_ACTIVITY_FEATURE_COUNT = ACTIVITY_FEATURE_COUNT + 1;
+    int CALL_ACTIVITY_FEATURE_COUNT = ACTIVITY_FEATURE_COUNT + 3;
 
     /**
      * The meta object id for the '{@link org.eclipse.bpmn2.impl.ChoreographyActivityImpl <em>Choreography Activity</em>}' class.
@@ -17810,6 +17864,24 @@
     int TRANSACTION__FLOW_ELEMENTS = SUB_PROCESS__FLOW_ELEMENTS;
 
     /**
+     * The feature id for the '<em><b>Incoming Conversation Links</b></em>' reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TRANSACTION__INCOMING_CONVERSATION_LINKS = SUB_PROCESS__INCOMING_CONVERSATION_LINKS;
+
+    /**
+     * The feature id for the '<em><b>Outgoing Conversation Links</b></em>' reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TRANSACTION__OUTGOING_CONVERSATION_LINKS = SUB_PROCESS__OUTGOING_CONVERSATION_LINKS;
+
+    /**
      * The feature id for the '<em><b>Artifacts</b></em>' containment reference list.
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/CallActivity.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/CallActivity.java
index d4ce569..29b8094 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/CallActivity.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/CallActivity.java
@@ -30,7 +30,7 @@
  * @model extendedMetaData="name='tCallActivity' kind='elementOnly'"
  * @generated
  */
-public interface CallActivity extends Activity {
+public interface CallActivity extends Activity, InteractionNode {
     /**
      * Returns the value of the '<em><b>Called Element Ref</b></em>' reference.
      * <!-- begin-user-doc -->
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/SubProcess.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/SubProcess.java
index e4ae2a4..e2155cf 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/SubProcess.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/SubProcess.java
@@ -33,7 +33,7 @@
  * @model extendedMetaData="name='tSubProcess' kind='elementOnly'"
  * @generated
  */
-public interface SubProcess extends Activity, FlowElementsContainer {
+public interface SubProcess extends Activity, FlowElementsContainer, InteractionNode {
     /**
      * Returns the value of the '<em><b>Artifacts</b></em>' containment reference list.
      * The list contents are of type {@link org.eclipse.bpmn2.Artifact}.
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/CallActivityImpl.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/CallActivityImpl.java
index 87d1a04..20e58af 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/CallActivityImpl.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/CallActivityImpl.java
@@ -14,9 +14,14 @@
  */
 package org.eclipse.bpmn2.impl;
 
+import java.util.List;
+
 import org.eclipse.bpmn2.Bpmn2Package;
 import org.eclipse.bpmn2.CallActivity;
 import org.eclipse.bpmn2.CallableElement;
+import org.eclipse.bpmn2.ConversationLink;
+import org.eclipse.bpmn2.InteractionNode;
+import org.eclipse.bpmn2.util.Bpmn2Resource;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
@@ -29,6 +34,8 @@
  * <p>
  * The following features are implemented:
  * <ul>
+ *   <li>{@link org.eclipse.bpmn2.impl.CallActivityImpl#getIncomingConversationLinks <em>Incoming Conversation Links</em>}</li>
+ *   <li>{@link org.eclipse.bpmn2.impl.CallActivityImpl#getOutgoingConversationLinks <em>Outgoing Conversation Links</em>}</li>
  *   <li>{@link org.eclipse.bpmn2.impl.CallActivityImpl#getCalledElementRef <em>Called Element Ref</em>}</li>
  * </ul>
  * </p>
@@ -68,6 +75,34 @@
     /**
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
+     * @generated NOT
+     */
+    public List<ConversationLink> getIncomingConversationLinks() {
+        if (eResource() instanceof Bpmn2Resource) {
+            return ((Bpmn2Resource) eResource()).getOppositeReferenceAdapter().getOppositeList(
+                    ConversationLink.class, this,
+                    Bpmn2Package.Literals.CONVERSATION_LINK__TARGET_REF);
+        }
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated NOT
+     */
+    public List<ConversationLink> getOutgoingConversationLinks() {
+        if (eResource() instanceof Bpmn2Resource) {
+            return ((Bpmn2Resource) eResource()).getOppositeReferenceAdapter().getOppositeList(
+                    ConversationLink.class, this,
+                    Bpmn2Package.Literals.CONVERSATION_LINK__SOURCE_REF);
+        }
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
      * @generated
      */
     public CallableElement getCalledElementRef() {
@@ -115,6 +150,10 @@
     @Override
     public Object eGet(int featureID, boolean resolve, boolean coreType) {
         switch (featureID) {
+        case Bpmn2Package.CALL_ACTIVITY__INCOMING_CONVERSATION_LINKS:
+            return getIncomingConversationLinks();
+        case Bpmn2Package.CALL_ACTIVITY__OUTGOING_CONVERSATION_LINKS:
+            return getOutgoingConversationLinks();
         case Bpmn2Package.CALL_ACTIVITY__CALLED_ELEMENT_REF:
             if (resolve)
                 return getCalledElementRef();
@@ -161,10 +200,54 @@
     @Override
     public boolean eIsSet(int featureID) {
         switch (featureID) {
+        case Bpmn2Package.CALL_ACTIVITY__INCOMING_CONVERSATION_LINKS:
+            return !getIncomingConversationLinks().isEmpty();
+        case Bpmn2Package.CALL_ACTIVITY__OUTGOING_CONVERSATION_LINKS:
+            return !getOutgoingConversationLinks().isEmpty();
         case Bpmn2Package.CALL_ACTIVITY__CALLED_ELEMENT_REF:
             return calledElementRef != null;
         }
         return super.eIsSet(featureID);
     }
 
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == InteractionNode.class) {
+            switch (derivedFeatureID) {
+            case Bpmn2Package.CALL_ACTIVITY__INCOMING_CONVERSATION_LINKS:
+                return Bpmn2Package.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS;
+            case Bpmn2Package.CALL_ACTIVITY__OUTGOING_CONVERSATION_LINKS:
+                return Bpmn2Package.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS;
+            default:
+                return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == InteractionNode.class) {
+            switch (baseFeatureID) {
+            case Bpmn2Package.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS:
+                return Bpmn2Package.CALL_ACTIVITY__INCOMING_CONVERSATION_LINKS;
+            case Bpmn2Package.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS:
+                return Bpmn2Package.CALL_ACTIVITY__OUTGOING_CONVERSATION_LINKS;
+            default:
+                return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
 } //CallActivityImpl
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/SubProcessImpl.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/SubProcessImpl.java
index 77fbd75..6f38b03 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/SubProcessImpl.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/SubProcessImpl.java
@@ -19,10 +19,13 @@
 
 import org.eclipse.bpmn2.Artifact;
 import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.ConversationLink;
 import org.eclipse.bpmn2.FlowElement;
 import org.eclipse.bpmn2.FlowElementsContainer;
+import org.eclipse.bpmn2.InteractionNode;
 import org.eclipse.bpmn2.LaneSet;
 import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.util.Bpmn2Resource;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 import org.eclipse.emf.common.util.EList;
@@ -41,6 +44,8 @@
  * <ul>
  *   <li>{@link org.eclipse.bpmn2.impl.SubProcessImpl#getLaneSets <em>Lane Sets</em>}</li>
  *   <li>{@link org.eclipse.bpmn2.impl.SubProcessImpl#getFlowElements <em>Flow Elements</em>}</li>
+ *   <li>{@link org.eclipse.bpmn2.impl.SubProcessImpl#getIncomingConversationLinks <em>Incoming Conversation Links</em>}</li>
+ *   <li>{@link org.eclipse.bpmn2.impl.SubProcessImpl#getOutgoingConversationLinks <em>Outgoing Conversation Links</em>}</li>
  *   <li>{@link org.eclipse.bpmn2.impl.SubProcessImpl#getArtifacts <em>Artifacts</em>}</li>
  *   <li>{@link org.eclipse.bpmn2.impl.SubProcessImpl#isTriggeredByEvent <em>Triggered By Event</em>}</li>
  * </ul>
@@ -147,6 +152,34 @@
     /**
      * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
+     * @generated NOT
+     */
+    public List<ConversationLink> getIncomingConversationLinks() {
+        if (eResource() instanceof Bpmn2Resource) {
+            return ((Bpmn2Resource) eResource()).getOppositeReferenceAdapter().getOppositeList(
+                    ConversationLink.class, this,
+                    Bpmn2Package.Literals.CONVERSATION_LINK__TARGET_REF);
+        }
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated NOT
+     */
+    public List<ConversationLink> getOutgoingConversationLinks() {
+        if (eResource() instanceof Bpmn2Resource) {
+            return ((Bpmn2Resource) eResource()).getOppositeReferenceAdapter().getOppositeList(
+                    ConversationLink.class, this,
+                    Bpmn2Package.Literals.CONVERSATION_LINK__SOURCE_REF);
+        }
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
      * @generated
      */
     public List<Artifact> getArtifacts() {
@@ -211,6 +244,10 @@
             return getLaneSets();
         case Bpmn2Package.SUB_PROCESS__FLOW_ELEMENTS:
             return getFlowElements();
+        case Bpmn2Package.SUB_PROCESS__INCOMING_CONVERSATION_LINKS:
+            return getIncomingConversationLinks();
+        case Bpmn2Package.SUB_PROCESS__OUTGOING_CONVERSATION_LINKS:
+            return getOutgoingConversationLinks();
         case Bpmn2Package.SUB_PROCESS__ARTIFACTS:
             return getArtifacts();
         case Bpmn2Package.SUB_PROCESS__TRIGGERED_BY_EVENT:
@@ -283,6 +320,10 @@
             return laneSets != null && !laneSets.isEmpty();
         case Bpmn2Package.SUB_PROCESS__FLOW_ELEMENTS:
             return flowElements != null && !flowElements.isEmpty();
+        case Bpmn2Package.SUB_PROCESS__INCOMING_CONVERSATION_LINKS:
+            return !getIncomingConversationLinks().isEmpty();
+        case Bpmn2Package.SUB_PROCESS__OUTGOING_CONVERSATION_LINKS:
+            return !getOutgoingConversationLinks().isEmpty();
         case Bpmn2Package.SUB_PROCESS__ARTIFACTS:
             return artifacts != null && !artifacts.isEmpty();
         case Bpmn2Package.SUB_PROCESS__TRIGGERED_BY_EVENT:
@@ -308,6 +349,16 @@
                 return -1;
             }
         }
+        if (baseClass == InteractionNode.class) {
+            switch (derivedFeatureID) {
+            case Bpmn2Package.SUB_PROCESS__INCOMING_CONVERSATION_LINKS:
+                return Bpmn2Package.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS;
+            case Bpmn2Package.SUB_PROCESS__OUTGOING_CONVERSATION_LINKS:
+                return Bpmn2Package.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS;
+            default:
+                return -1;
+            }
+        }
         return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
     }
 
@@ -328,6 +379,16 @@
                 return -1;
             }
         }
+        if (baseClass == InteractionNode.class) {
+            switch (baseFeatureID) {
+            case Bpmn2Package.INTERACTION_NODE__INCOMING_CONVERSATION_LINKS:
+                return Bpmn2Package.SUB_PROCESS__INCOMING_CONVERSATION_LINKS;
+            case Bpmn2Package.INTERACTION_NODE__OUTGOING_CONVERSATION_LINKS:
+                return Bpmn2Package.SUB_PROCESS__OUTGOING_CONVERSATION_LINKS;
+            default:
+                return -1;
+            }
+        }
         return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
     }
 
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 aae858c..5b7cc6c 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/bpmn2.ecore
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/impl/bpmn2.ecore
@@ -1588,7 +1588,7 @@
       </eAnnotations>
     </eStructuralFeatures>
   </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CallActivity" eSuperTypes="#//Activity">
+  <eClassifiers xsi:type="ecore:EClass" name="CallActivity" eSuperTypes="#//Activity #//InteractionNode">
     <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
       <details key="name" value="tCallActivity"/>
       <details key="kind" value="elementOnly"/>
@@ -4301,7 +4301,7 @@
       </eAnnotations>
     </eStructuralFeatures>
   </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SubProcess" eSuperTypes="#//Activity #//FlowElementsContainer">
+  <eClassifiers xsi:type="ecore:EClass" name="SubProcess" eSuperTypes="#//Activity #//FlowElementsContainer #//InteractionNode">
     <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
       <details key="name" value="tSubProcess"/>
       <details key="kind" value="elementOnly"/>
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/util/Bpmn2Switch.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/util/Bpmn2Switch.java
index 83c9db5..2ca4c73 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/util/Bpmn2Switch.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/util/Bpmn2Switch.java
@@ -257,6 +257,8 @@
             if (result == null)
                 result = caseFlowElementsContainer(adHocSubProcess);
             if (result == null)
+                result = caseInteractionNode(adHocSubProcess);
+            if (result == null)
                 result = caseFlowNode(adHocSubProcess);
             if (result == null)
                 result = caseFlowElement(adHocSubProcess);
@@ -355,6 +357,8 @@
             if (result == null)
                 result = caseActivity(callActivity);
             if (result == null)
+                result = caseInteractionNode(callActivity);
+            if (result == null)
                 result = caseFlowNode(callActivity);
             if (result == null)
                 result = caseFlowElement(callActivity);
@@ -1783,6 +1787,8 @@
             if (result == null)
                 result = caseFlowElementsContainer(subProcess);
             if (result == null)
+                result = caseInteractionNode(subProcess);
+            if (result == null)
                 result = caseFlowNode(subProcess);
             if (result == null)
                 result = caseFlowElement(subProcess);
@@ -1873,6 +1879,8 @@
             if (result == null)
                 result = caseFlowElementsContainer(transaction);
             if (result == null)
+                result = caseInteractionNode(transaction);
+            if (result == null)
                 result = caseFlowNode(transaction);
             if (result == null)
                 result = caseFlowElement(transaction);
