Trying to make sense of expandable activities and flownodes
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/AbstractActivityFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/AbstractActivityFeatureContainer.java
index a9e047c..0d29d82 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/AbstractActivityFeatureContainer.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/AbstractActivityFeatureContainer.java
@@ -1,96 +1,96 @@
-/******************************************************************************* 

- * Copyright (c) 2011 Red Hat, Inc. 

- *  All rights reserved. 

- * This program is 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: 

- * Red Hat, Inc. - initial API and implementation 

- *

- * @author Innar Made

- ******************************************************************************/

-package org.eclipse.bpmn2.modeler.ui.features.activity;

-

-import java.util.ArrayList;

-import java.util.List;

-

-import org.eclipse.bpmn2.Activity;

-import org.eclipse.bpmn2.modeler.core.features.BaseElementFeatureContainer;

-import org.eclipse.bpmn2.modeler.core.features.DefaultResizeBPMNShapeFeature;

-import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;

-import org.eclipse.bpmn2.modeler.core.features.activity.MoveActivityFeature;

-import org.eclipse.bpmn2.modeler.core.features.activity.UpdateActivityCompensateMarkerFeature;

-import org.eclipse.bpmn2.modeler.core.features.activity.UpdateActivityLoopAndMultiInstanceMarkerFeature;

-import org.eclipse.bpmn2.modeler.core.features.event.AbstractBoundaryEventOperation;

-import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;

-import org.eclipse.bpmn2.modeler.ui.features.AbstractDefaultDeleteFeature;

-import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.CollapseSubProcessFeature;

-import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.ExpandSubProcessFeature;

-import org.eclipse.bpmn2.modeler.ui.features.event.AppendEventFeature;

-import org.eclipse.bpmn2.modeler.ui.features.gateway.AppendGatewayFeature;

-import org.eclipse.graphiti.features.IDeleteFeature;

-import org.eclipse.graphiti.features.IFeatureProvider;

-import org.eclipse.graphiti.features.IMoveShapeFeature;

-import org.eclipse.graphiti.features.IResizeShapeFeature;

-import org.eclipse.graphiti.features.context.IDeleteContext;

-import org.eclipse.graphiti.features.context.impl.DeleteContext;

-import org.eclipse.graphiti.features.custom.ICustomFeature;

-import org.eclipse.graphiti.mm.pictograms.ContainerShape;

-

-public abstract class AbstractActivityFeatureContainer extends BaseElementFeatureContainer {

-

-	@Override

-	public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {

-		UpdateActivityCompensateMarkerFeature compensateMarkerUpdateFeature = new UpdateActivityCompensateMarkerFeature(

-				fp);

-		UpdateActivityLoopAndMultiInstanceMarkerFeature loopAndMultiInstanceUpdateFeature = new UpdateActivityLoopAndMultiInstanceMarkerFeature(

-				fp);

-		MultiUpdateFeature multiUpdate = new MultiUpdateFeature(fp);

-		multiUpdate.addUpdateFeature(compensateMarkerUpdateFeature);

-		multiUpdate.addUpdateFeature(loopAndMultiInstanceUpdateFeature);

-		return multiUpdate;

-	}

-

-	@Override

-	public IResizeShapeFeature getResizeFeature(IFeatureProvider fp) {

-		return new DefaultResizeBPMNShapeFeature(fp);

-	}

-

-	@Override

-	public IMoveShapeFeature getMoveFeature(IFeatureProvider fp) {

-		return new MoveActivityFeature(fp);

-	}

-

-	@Override

-	public IDeleteFeature getDeleteFeature(IFeatureProvider fp) {

-		return new AbstractDefaultDeleteFeature(fp) {

-			@Override

-			public void delete(final IDeleteContext context) {

-				Activity activity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),

-						Activity.class);

-				new AbstractBoundaryEventOperation() {

-					@Override

-					protected void doWorkInternal(ContainerShape container) {

-						IDeleteContext delete = new DeleteContext(container);

-						getFeatureProvider().getDeleteFeature(delete).delete(delete);

-					}

-				}.doWork(activity, getDiagram());

-				super.delete(context);

-			}

-		};

-	}

-

-	@Override

-	public ICustomFeature[] getCustomFeatures(IFeatureProvider fp) {

-		ICustomFeature[] superFeatures = super.getCustomFeatures(fp);

-		ICustomFeature[] thisFeatures = new ICustomFeature[3 + superFeatures.length];

-		int i;

-		for (i=0; i<superFeatures.length; ++i)

-			thisFeatures[i] = superFeatures[i];

-		thisFeatures[i++] = new AppendActivityFeature(fp);

-		thisFeatures[i++] = new AppendGatewayFeature(fp);

-		thisFeatures[i++] = new AppendEventFeature(fp);

-		return thisFeatures;

-	}

+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ *  All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.bpmn2.Activity;
+import org.eclipse.bpmn2.modeler.core.features.BaseElementFeatureContainer;
+import org.eclipse.bpmn2.modeler.core.features.DefaultResizeBPMNShapeFeature;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.MoveActivityFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.UpdateActivityCompensateMarkerFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.UpdateActivityLoopAndMultiInstanceMarkerFeature;
+import org.eclipse.bpmn2.modeler.core.features.event.AbstractBoundaryEventOperation;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
+import org.eclipse.bpmn2.modeler.ui.features.AbstractDefaultDeleteFeature;
+import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.CollapseFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.ExpandFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.ui.features.event.AppendEventFeature;
+import org.eclipse.bpmn2.modeler.ui.features.gateway.AppendGatewayFeature;
+import org.eclipse.graphiti.features.IDeleteFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.IMoveShapeFeature;
+import org.eclipse.graphiti.features.IResizeShapeFeature;
+import org.eclipse.graphiti.features.context.IDeleteContext;
+import org.eclipse.graphiti.features.context.impl.DeleteContext;
+import org.eclipse.graphiti.features.custom.ICustomFeature;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+
+public abstract class AbstractActivityFeatureContainer extends BaseElementFeatureContainer {
+
+	@Override
+	public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+		UpdateActivityCompensateMarkerFeature compensateMarkerUpdateFeature = new UpdateActivityCompensateMarkerFeature(
+				fp);
+		UpdateActivityLoopAndMultiInstanceMarkerFeature loopAndMultiInstanceUpdateFeature = new UpdateActivityLoopAndMultiInstanceMarkerFeature(
+				fp);
+		MultiUpdateFeature multiUpdate = new MultiUpdateFeature(fp);
+		multiUpdate.addUpdateFeature(compensateMarkerUpdateFeature);
+		multiUpdate.addUpdateFeature(loopAndMultiInstanceUpdateFeature);
+		return multiUpdate;
+	}
+
+	@Override
+	public IResizeShapeFeature getResizeFeature(IFeatureProvider fp) {
+		return new DefaultResizeBPMNShapeFeature(fp);
+	}
+
+	@Override
+	public IMoveShapeFeature getMoveFeature(IFeatureProvider fp) {
+		return new MoveActivityFeature(fp);
+	}
+
+	@Override
+	public IDeleteFeature getDeleteFeature(IFeatureProvider fp) {
+		return new AbstractDefaultDeleteFeature(fp) {
+			@Override
+			public void delete(final IDeleteContext context) {
+				Activity activity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),
+						Activity.class);
+				new AbstractBoundaryEventOperation() {
+					@Override
+					protected void doWorkInternal(ContainerShape container) {
+						IDeleteContext delete = new DeleteContext(container);
+						getFeatureProvider().getDeleteFeature(delete).delete(delete);
+					}
+				}.doWork(activity, getDiagram());
+				super.delete(context);
+			}
+		};
+	}
+
+	@Override
+	public ICustomFeature[] getCustomFeatures(IFeatureProvider fp) {
+		ICustomFeature[] superFeatures = super.getCustomFeatures(fp);
+		ICustomFeature[] thisFeatures = new ICustomFeature[3 + superFeatures.length];
+		int i;
+		for (i=0; i<superFeatures.length; ++i)
+			thisFeatures[i] = superFeatures[i];
+		thisFeatures[i++] = new AppendActivityFeature(fp);
+		thisFeatures[i++] = new AppendGatewayFeature(fp);
+		thisFeatures[i++] = new AppendEventFeature(fp);
+		return thisFeatures;
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AbstractSubProcessFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AbstractExpandableActivityFeatureContainer.java
similarity index 64%
rename from org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AbstractSubProcessFeatureContainer.java
rename to org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AbstractExpandableActivityFeatureContainer.java
index 073d9b1..9055bbe 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AbstractSubProcessFeatureContainer.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AbstractExpandableActivityFeatureContainer.java
@@ -1,55 +1,78 @@
-/******************************************************************************* 

- * Copyright (c) 2011 Red Hat, Inc. 

- *  All rights reserved. 

- * This program is 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: 

- * Red Hat, Inc. - initial API and implementation 

- *

- * @author Innar Made

- ******************************************************************************/

-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;

-

-import org.eclipse.bpmn2.BaseElement;

-import org.eclipse.bpmn2.modeler.core.features.AbstractUpdateBaseElementFeature;

-import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;

-import org.eclipse.bpmn2.modeler.ui.features.activity.AbstractActivityFeatureContainer;

-import org.eclipse.graphiti.features.IDirectEditingFeature;

-import org.eclipse.graphiti.features.IFeatureProvider;

-import org.eclipse.graphiti.features.ILayoutFeature;

-import org.eclipse.graphiti.features.IResizeShapeFeature;

-import org.eclipse.graphiti.features.context.IUpdateContext;

-

-public abstract class AbstractSubProcessFeatureContainer extends AbstractActivityFeatureContainer {

-

-	@Override

-	public IDirectEditingFeature getDirectEditingFeature(IFeatureProvider fp) {

-		return null;

-	}

-

-	@Override

-	public ILayoutFeature getLayoutFeature(IFeatureProvider fp) {

-		return new LayoutSubProcessFeature(fp);

-	}

-

-	@Override

-	public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {

-		MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);

-		AbstractUpdateBaseElementFeature nameUpdateFeature = new AbstractUpdateBaseElementFeature(fp) {

-			@Override

-			public boolean canUpdate(IUpdateContext context) {

-				Object bo = getBusinessObjectForPictogramElement(context.getPictogramElement());

-				return bo != null && bo instanceof BaseElement && canApplyTo((BaseElement) bo);

-			}

-		};

-		multiUpdate.addUpdateFeature(nameUpdateFeature);

-		return multiUpdate;

-	}

-

-	@Override

-	public IResizeShapeFeature getResizeFeature(IFeatureProvider fp) {

-		return new ResizeSubProcessFeature(fp);

-	}

+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ *  All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.BaseElement;
+import org.eclipse.bpmn2.CallActivity;
+import org.eclipse.bpmn2.CallChoreography;
+import org.eclipse.bpmn2.SubChoreography;
+import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.modeler.core.features.AbstractUpdateBaseElementFeature;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.ui.features.activity.AbstractActivityFeatureContainer;
+import org.eclipse.graphiti.features.IDirectEditingFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.ILayoutFeature;
+import org.eclipse.graphiti.features.IResizeShapeFeature;
+import org.eclipse.graphiti.features.context.IUpdateContext;
+import org.eclipse.graphiti.features.custom.ICustomFeature;
+
+public abstract class AbstractExpandableActivityFeatureContainer extends AbstractActivityFeatureContainer {
+
+	@Override
+	public IDirectEditingFeature getDirectEditingFeature(IFeatureProvider fp) {
+		return null;
+	}
+
+	@Override
+	public ILayoutFeature getLayoutFeature(IFeatureProvider fp) {
+		return new LayoutExpandableActivityFeature(fp);
+	}
+
+	@Override
+	public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+		MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
+		AbstractUpdateBaseElementFeature nameUpdateFeature = new AbstractUpdateBaseElementFeature(fp) {
+			@Override
+			public boolean canUpdate(IUpdateContext context) {
+				Object bo = getBusinessObjectForPictogramElement(context.getPictogramElement());
+				return bo != null && bo instanceof BaseElement && canApplyTo((BaseElement) bo);
+			}
+		};
+		multiUpdate.addUpdateFeature(nameUpdateFeature);
+		return multiUpdate;
+	}
+
+	@Override
+	public IResizeShapeFeature getResizeFeature(IFeatureProvider fp) {
+		return new ResizeExpandableActivityFeature(fp);
+	}
+	
+	@Override
+	public ICustomFeature[] getCustomFeatures(IFeatureProvider fp) {
+		ICustomFeature[] superFeatures = super.getCustomFeatures(fp);
+		ICustomFeature[] thisFeatures = new ICustomFeature[2 + superFeatures.length];
+		thisFeatures[0] = new ExpandFlowNodeFeature(fp);
+		thisFeatures[1] = new CollapseFlowNodeFeature(fp);
+		for (int i=0; i<superFeatures.length; ++i)
+			thisFeatures[2+i] = superFeatures[i];
+		return thisFeatures;
+	}
+	
+	public static boolean isExpandableElement(Object be) {
+		return be instanceof SubProcess
+				|| be instanceof CallActivity
+				|| be instanceof SubChoreography
+				|| be instanceof CallChoreography;
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AdHocSubProcessFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AdHocSubProcessFeatureContainer.java
index 21693a5..7dd32c3 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AdHocSubProcessFeatureContainer.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AdHocSubProcessFeatureContainer.java
@@ -1,89 +1,98 @@
-/******************************************************************************* 

- * Copyright (c) 2011 Red Hat, Inc. 

- *  All rights reserved. 

- * This program is 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: 

- * Red Hat, Inc. - initial API and implementation 

- *

- * @author Innar Made

- ******************************************************************************/

-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;

-

-import java.util.Iterator;

-

-import org.eclipse.bpmn2.Activity;

-import org.eclipse.bpmn2.AdHocSubProcess;

-import org.eclipse.bpmn2.Bpmn2Package;

-import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;

-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;

-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;

-import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;

-import org.eclipse.bpmn2.modeler.ui.ImageProvider;

-import org.eclipse.emf.ecore.EClass;

-import org.eclipse.graphiti.features.IAddFeature;

-import org.eclipse.graphiti.features.ICreateFeature;

-import org.eclipse.graphiti.features.IFeatureProvider;

-import org.eclipse.graphiti.features.context.IAddContext;

-import org.eclipse.graphiti.features.context.ICreateContext;

-import org.eclipse.graphiti.mm.algorithms.Polyline;

-import org.eclipse.graphiti.mm.pictograms.ContainerShape;

-import org.eclipse.graphiti.mm.pictograms.Shape;

-import org.eclipse.graphiti.services.Graphiti;

-import org.eclipse.graphiti.services.IPeService;

-

-public class AdHocSubProcessFeatureContainer extends AbstractSubProcessFeatureContainer {

-

-	@Override

-	public boolean canApplyTo(Object o) {

-		return super.canApplyTo(o) && o instanceof AdHocSubProcess;

-	}

-

-	@Override

-	public ICreateFeature getCreateFeature(IFeatureProvider fp) {

-		return new CreateAdHocSubProcessFeature(fp);

-	}

-

-	@Override

-	public IAddFeature getAddFeature(IFeatureProvider fp) {

-		return new AddExpandedActivityFeature<AdHocSubProcess>(fp) {

-			@Override

-			protected void hook(AdHocSubProcess activity, ContainerShape container, IAddContext context, int width, int height) {

-				super.hook(activity, container, context, width, height);

-				IPeService peService = Graphiti.getPeService();

-				Iterator<Shape> iterator = peService.getAllContainedShapes(container).iterator();

-				while (iterator.hasNext()) {

-					Shape shape = iterator.next();

-					String property = peService.getPropertyValue(shape, GraphicsUtil.ACTIVITY_MARKER_CONTAINER);

-					if (property != null && new Boolean(property)) {

-						Polyline tilde = GraphicsUtil.createActivityMarkerAdHoc((ContainerShape) shape);

-						tilde.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));

-					}

-				}

-			}

-		};

-	}

-

-	public static class CreateAdHocSubProcessFeature extends AbstractCreateExpandableFlowNodeFeature<AdHocSubProcess> {

-

-		public CreateAdHocSubProcessFeature(IFeatureProvider fp) {

-			super(fp, "Ad-Hoc Sub-Process",

-					"A specialized description of Sub-Process that is a group of Activities that have no REQUIRED sequence relationships");

-		}

-

-		@Override

-		protected String getStencilImageId() {

-			return ImageProvider.IMG_16_AD_HOC_SUB_PROCESS;

-		}

-

-		/* (non-Javadoc)

-		 * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()

-		 */

-		@Override

-		public EClass getBusinessObjectClass() {

-			return Bpmn2Package.eINSTANCE.getAdHocSubProcess();

-		}

-	}

+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ *  All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import java.util.Iterator;
+
+import org.eclipse.bpmn2.Activity;
+import org.eclipse.bpmn2.AdHocSubProcess;
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
+import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
+import org.eclipse.bpmn2.modeler.ui.ImageProvider;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.graphiti.features.IAddFeature;
+import org.eclipse.graphiti.features.ICreateFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.features.context.ICreateContext;
+import org.eclipse.graphiti.mm.algorithms.Polyline;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.services.IPeService;
+
+public class AdHocSubProcessFeatureContainer extends AbstractExpandableActivityFeatureContainer {
+
+	@Override
+	public boolean canApplyTo(Object o) {
+		return super.canApplyTo(o) && o instanceof AdHocSubProcess;
+	}
+
+	@Override
+	public ICreateFeature getCreateFeature(IFeatureProvider fp) {
+		return new CreateAdHocSubProcessFeature(fp);
+	}
+
+	@Override
+	public IAddFeature getAddFeature(IFeatureProvider fp) {
+		return new AddExpandableActivityFeature<AdHocSubProcess>(fp) {
+			@Override
+			protected void hook(AdHocSubProcess activity, ContainerShape container, IAddContext context, int width, int height) {
+				super.hook(activity, container, context, width, height);
+				IPeService peService = Graphiti.getPeService();
+				Iterator<Shape> iterator = peService.getAllContainedShapes(container).iterator();
+				while (iterator.hasNext()) {
+					Shape shape = iterator.next();
+					String property = peService.getPropertyValue(shape, GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
+					if (property != null && new Boolean(property)) {
+						Polyline tilde = GraphicsUtil.createActivityMarkerAdHoc((ContainerShape) shape);
+						tilde.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+					}
+				}
+			}
+		};
+	}
+
+	@Override
+	public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+		MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
+		UpdateExpandableActivityFeature updateFeature = new UpdateExpandableActivityFeature(fp);
+		multiUpdate.addUpdateFeature(updateFeature);
+		return multiUpdate;
+	}
+
+	public static class CreateAdHocSubProcessFeature extends AbstractCreateExpandableFlowNodeFeature<AdHocSubProcess> {
+
+		public CreateAdHocSubProcessFeature(IFeatureProvider fp) {
+			super(fp, "Ad-Hoc Sub-Process",
+					"A specialized sub-process in which the Activities have no required sequence relationships");
+		}
+
+		@Override
+		protected String getStencilImageId() {
+			return ImageProvider.IMG_16_AD_HOC_SUB_PROCESS;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
+		 */
+		@Override
+		public EClass getBusinessObjectClass() {
+			return Bpmn2Package.eINSTANCE.getAdHocSubProcess();
+		}
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandedActivityFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandableActivityFeature.java
similarity index 97%
rename from org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandedActivityFeature.java
rename to org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandableActivityFeature.java
index 0f77939..eb1304d 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandedActivityFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandableActivityFeature.java
@@ -1,103 +1,103 @@
-/******************************************************************************* 

- * Copyright (c) 2011 Red Hat, Inc. 

- *  All rights reserved. 

- * This program is 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: 

- * Red Hat, Inc. - initial API and implementation 

- *

- * @author Innar Made

- ******************************************************************************/

-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;

-

-import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.IS_EXPANDED;

-import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.TRIGGERED_BY_EVENT;

-

-import java.io.IOException;

-

-import org.eclipse.bpmn2.Activity;

-import org.eclipse.bpmn2.SubProcess;

-import org.eclipse.bpmn2.di.BPMNShape;

-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;

-import org.eclipse.bpmn2.modeler.core.features.activity.AbstractAddActivityFeature;

-import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;

-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;

-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.Expand;

-import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;

-import org.eclipse.graphiti.features.IFeatureProvider;

-import org.eclipse.graphiti.features.context.IAddContext;

-import org.eclipse.graphiti.mm.algorithms.Text;

-import org.eclipse.graphiti.mm.algorithms.styles.Orientation;

-import org.eclipse.graphiti.mm.pictograms.ContainerShape;

-import org.eclipse.graphiti.mm.pictograms.Shape;

-import org.eclipse.graphiti.services.Graphiti;

-import org.eclipse.graphiti.services.IGaService;

-import org.eclipse.graphiti.services.IPeService;

-

-public class AddExpandedActivityFeature<T extends Activity>

-	extends AbstractAddActivityFeature<T> {

-

-	public AddExpandedActivityFeature(IFeatureProvider fp) {

-		super(fp);

-	}

-

-	@Override

-	protected void hook(T activity, ContainerShape container, IAddContext context, int width, int height) {

-		super.hook(activity, container, context, width, height);

-		IPeService peService = Graphiti.getPeService();

-		IGaService gaService = Graphiti.getGaService();

-

-		boolean isTriggeredByEvent = false;

-		boolean isExpanded = true;

-		

-		if (activity instanceof SubProcess) {

-			SubProcess subprocess = (SubProcess) activity;

-			isTriggeredByEvent = subprocess.isTriggeredByEvent();

-			try {

-				BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(subprocess);

-				if (bpmnShape != null) {

-					isExpanded = bpmnShape.isIsExpanded();

-				}

-			} catch (IOException e) {

-				throw new IllegalStateException("Could not get DI shape for subprocess:"+subprocess);

-			}

-		}

-		peService.setPropertyValue(container, TRIGGERED_BY_EVENT, Boolean.toString(isTriggeredByEvent));

-		peService.setPropertyValue(container, IS_EXPANDED, Boolean.toString(isExpanded));

-

-		Shape textShape = peService.createShape(container, false);

-		Text text = gaService.createDefaultText(getDiagram(), textShape, activity.getName());

-		gaService.setLocationAndSize(text, 5, 5, width - 10, 15);

-		StyleUtil.applyStyle(text, activity);

-		text.setHorizontalAlignment(Orientation.ALIGNMENT_CENTER);

-		text.setVerticalAlignment(Orientation.ALIGNMENT_CENTER);

-//		text.setFont(gaService.manageFont(getDiagram(), GaServiceImpl.DEFAULT_FONT, 8, false, true));

-		link(textShape, activity);

-		

-		ContainerShape markerContainer = (ContainerShape) GraphicsUtil.getShape(container,

-				GraphicsUtil.ACTIVITY_MARKER_CONTAINER);

-		

-		if (!isExpanded){

-			Expand expand = GraphicsUtil.createActivityMarkerExpand(markerContainer);

-			expand.rect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));

-			expand.horizontal.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));

-			expand.vertical.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));

-		}

-	}

-

-	@Override

-	public int getWidth() {

-		if (Bpmn2Preferences.getInstance().isExpandedDefault())

-			return GraphicsUtil.SUB_PROCEESS_DEFAULT_WIDTH;

-		return GraphicsUtil.TASK_DEFAULT_WIDTH;

-	}

-

-	@Override

-	public int getHeight() {

-		if (Bpmn2Preferences.getInstance().isExpandedDefault())

-			return GraphicsUtil.SUB_PROCESS_DEFAULT_HEIGHT;

-		return GraphicsUtil.TASK_DEFAULT_HEIGHT;

-	}

+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ *  All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.IS_EXPANDED;
+import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.TRIGGERED_BY_EVENT;
+
+import java.io.IOException;
+
+import org.eclipse.bpmn2.Activity;
+import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.di.BPMNShape;
+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
+import org.eclipse.bpmn2.modeler.core.features.activity.AbstractAddActivityFeature;
+import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.Expand;
+import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.mm.algorithms.Text;
+import org.eclipse.graphiti.mm.algorithms.styles.Orientation;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.services.IGaService;
+import org.eclipse.graphiti.services.IPeService;
+
+public class AddExpandableActivityFeature<T extends Activity>
+	extends AbstractAddActivityFeature<T> {
+
+	public AddExpandableActivityFeature(IFeatureProvider fp) {
+		super(fp);
+	}
+
+	@Override
+	protected void hook(T activity, ContainerShape container, IAddContext context, int width, int height) {
+		super.hook(activity, container, context, width, height);
+		IPeService peService = Graphiti.getPeService();
+		IGaService gaService = Graphiti.getGaService();
+
+		boolean isTriggeredByEvent = false;
+		boolean isExpanded = true;
+		
+		if (activity instanceof SubProcess) {
+			SubProcess subprocess = (SubProcess) activity;
+			isTriggeredByEvent = subprocess.isTriggeredByEvent();
+			try {
+				BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(subprocess);
+				if (bpmnShape != null) {
+					isExpanded = bpmnShape.isIsExpanded();
+				}
+			} catch (IOException e) {
+				throw new IllegalStateException("Could not get DI shape for subprocess:"+subprocess);
+			}
+		}
+		peService.setPropertyValue(container, TRIGGERED_BY_EVENT, Boolean.toString(isTriggeredByEvent));
+		peService.setPropertyValue(container, IS_EXPANDED, Boolean.toString(isExpanded));
+
+		Shape textShape = peService.createShape(container, false);
+		Text text = gaService.createDefaultText(getDiagram(), textShape, activity.getName());
+		gaService.setLocationAndSize(text, 5, 5, width - 10, 15);
+		StyleUtil.applyStyle(text, activity);
+		text.setHorizontalAlignment(Orientation.ALIGNMENT_CENTER);
+		text.setVerticalAlignment(Orientation.ALIGNMENT_CENTER);
+//		text.setFont(gaService.manageFont(getDiagram(), GaServiceImpl.DEFAULT_FONT, 8, false, true));
+		link(textShape, activity);
+		
+		ContainerShape markerContainer = (ContainerShape) GraphicsUtil.getShape(container,
+				GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
+		
+		if (!isExpanded){
+			Expand expand = GraphicsUtil.createActivityMarkerExpand(markerContainer);
+			expand.rect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+			expand.horizontal.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+			expand.vertical.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+		}
+	}
+
+	@Override
+	public int getWidth() {
+		if (Bpmn2Preferences.getInstance().isExpandedDefault())
+			return GraphicsUtil.SUB_PROCEESS_DEFAULT_WIDTH;
+		return GraphicsUtil.TASK_DEFAULT_WIDTH;
+	}
+
+	@Override
+	public int getHeight() {
+		if (Bpmn2Preferences.getInstance().isExpandedDefault())
+			return GraphicsUtil.SUB_PROCESS_DEFAULT_HEIGHT;
+		return GraphicsUtil.TASK_DEFAULT_HEIGHT;
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CallActivityFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CallActivityFeatureContainer.java
index 7b8b10e..d8ee2c4 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CallActivityFeatureContainer.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CallActivityFeatureContainer.java
@@ -1,262 +1,262 @@
-/******************************************************************************* 

- * Copyright (c) 2011 Red Hat, Inc. 

- *  All rights reserved. 

- * This program is 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: 

- * Red Hat, Inc. - initial API and implementation 

- *

- * @author Innar Made

- ******************************************************************************/

-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;

-

-import org.eclipse.bpmn2.Activity;

-import org.eclipse.bpmn2.Bpmn2Package;

-import org.eclipse.bpmn2.CallActivity;

-import org.eclipse.bpmn2.CallableElement;

-import org.eclipse.bpmn2.GlobalBusinessRuleTask;

-import org.eclipse.bpmn2.GlobalManualTask;

-import org.eclipse.bpmn2.GlobalScriptTask;

-import org.eclipse.bpmn2.GlobalTask;

-import org.eclipse.bpmn2.GlobalUserTask;

-import org.eclipse.bpmn2.Process;

-import org.eclipse.bpmn2.modeler.core.features.DefaultResizeBPMNShapeFeature;

-import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;

-import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;

-import org.eclipse.bpmn2.modeler.core.features.activity.LayoutActivityFeature;

-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;

-import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;

-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;

-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.Expand;

-import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;

-import org.eclipse.bpmn2.modeler.ui.ImageProvider;

-import org.eclipse.emf.ecore.EClass;

-import org.eclipse.graphiti.features.IAddFeature;

-import org.eclipse.graphiti.features.ICreateFeature;

-import org.eclipse.graphiti.features.IFeatureProvider;

-import org.eclipse.graphiti.features.ILayoutFeature;

-import org.eclipse.graphiti.features.IReason;

-import org.eclipse.graphiti.features.IResizeShapeFeature;

-import org.eclipse.graphiti.features.context.IAddContext;

-import org.eclipse.graphiti.features.context.ICreateContext;

-import org.eclipse.graphiti.features.context.IUpdateContext;

-import org.eclipse.graphiti.features.impl.AbstractUpdateFeature;

-import org.eclipse.graphiti.features.impl.Reason;

-import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;

-import org.eclipse.graphiti.mm.algorithms.Image;

-import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;

-import org.eclipse.graphiti.mm.algorithms.Text;

-import org.eclipse.graphiti.mm.pictograms.ContainerShape;

-import org.eclipse.graphiti.mm.pictograms.PictogramElement;

-import org.eclipse.graphiti.mm.pictograms.Shape;

-import org.eclipse.graphiti.services.Graphiti;

-import org.eclipse.graphiti.services.IGaService;

-import org.eclipse.graphiti.services.IPeService;

-

-public class CallActivityFeatureContainer extends AbstractSubProcessFeatureContainer {

-

-	private static final int MARKER_OFFSET = 4;

-	private static final String CALL_ACTIVITY_REF_PROPERTY = "call.activity.ref";

-	private static final String GLOBAL_TASK_SHAPE_PROPERTY = "global.task.shape";

-

-	@Override

-	public boolean canApplyTo(Object o) {

-		return super.canApplyTo(o) && o instanceof CallActivity;

-	}

-

-	@Override

-	public ICreateFeature getCreateFeature(IFeatureProvider fp) {

-		return new CreateCallActivityFeature(fp);

-	}

-

-	@Override

-	public IAddFeature getAddFeature(IFeatureProvider fp) {

-		return new AddExpandedActivityFeature<CallActivity>(fp) {

-			@Override

-			protected void hook(CallActivity activity, ContainerShape container, IAddContext context, int width, int height) {

-				super.hook(activity, container, context, width, height);

-				Graphiti.getPeService().setPropertyValue(container, CALL_ACTIVITY_REF_PROPERTY,

-						getCallableElementStringValue(activity.getCalledElementRef()));

-			}

-

-			@Override

-			protected void decorateActivityRectangle(RoundedRectangle rect) {

-				rect.setLineWidth(4);

-			}

-

-			@Override

-			protected int getMarkerContainerOffset() {

-				return MARKER_OFFSET;

-			}

-

-			@Override

-			public int getWidth() {

-				return GraphicsUtil.getActivitySize(getDiagram()).getWidth();

-			}

-

-			@Override

-			public int getHeight() {

-				return GraphicsUtil.getActivitySize(getDiagram()).getHeight();

-			}

-		};

-	}

-

-	@Override

-	public ILayoutFeature getLayoutFeature(IFeatureProvider fp) {

-		return new LayoutActivityFeature(fp) {

-			protected int getMarkerContainerOffset() {

-				return MARKER_OFFSET;

-			}

-			

-			@Override

-			protected boolean layoutHook(Shape shape, GraphicsAlgorithm ga, Object bo, int newWidth, int newHeight) {

-				if (bo != null && bo instanceof Activity && ga instanceof Text) {

-					Graphiti.getGaService().setLocationAndSize(ga, 5, 5, newWidth - 10, 15);

-					return true;

-				}

-				return false;

-			}

-			

-		};

-	}

-

-	@Override

-	public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {

-		MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);

-		multiUpdate.addUpdateFeature(new UpdateCallActivityFeature(fp));

-		return multiUpdate;

-	}

-	

-	@Override

-	public IResizeShapeFeature getResizeFeature(IFeatureProvider fp) {

-		return new DefaultResizeBPMNShapeFeature(fp);

-	}

-

-	public static class CreateCallActivityFeature extends AbstractCreateExpandableFlowNodeFeature<CallActivity> {

-

-		// NOTE: Even though the Call Activity is an expandable figure, the contents for its "innards"

-		// are (usually) defined somewhere else, so it doesn't make much sense to be able to expand it in the

-		// same sense that a SubProcess would be expanded and rendered. When the "expand" button is clicked

-		// we should probably locate the process where this thing is defined (if possible) and open an

-		// editor to display its contents.

-		

-		public CreateCallActivityFeature(IFeatureProvider fp) {

-			super(fp, "Call Activity",

-					"Identifies a point in the Process where a global Process or a Global Task is used");

-		}

-

-		@Override

-		public String getStencilImageId() {

-			return ImageProvider.IMG_16_CALL_ACTIVITY;

-		}

-

-		/* (non-Javadoc)

-		 * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()

-		 */

-		@Override

-		public EClass getBusinessObjectClass() {

-			return Bpmn2Package.eINSTANCE.getCallActivity();

-		}

-	}

-

-	private class UpdateCallActivityFeature extends AbstractUpdateFeature {

-

-		public UpdateCallActivityFeature(IFeatureProvider fp) {

-			super(fp);

-		}

-

-		@Override

-		public boolean canUpdate(IUpdateContext context) {

-			CallActivity callActivity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),

-					CallActivity.class);

-			return callActivity != null && context.getPictogramElement() instanceof ContainerShape;

-		}

-

-		@Override

-		public IReason updateNeeded(IUpdateContext context) {

-			IPeService peService = Graphiti.getPeService();

-			PictogramElement element = context.getPictogramElement();

-			String property = peService.getPropertyValue(element, CALL_ACTIVITY_REF_PROPERTY);

-			if (property == null) {

-				return Reason.createFalseReason();

-			}

-			CallActivity callActivity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),

-					CallActivity.class);

-			String value = getCallableElementStringValue(callActivity.getCalledElementRef());

-			boolean changed = !value.equals(property);

-			return changed ? Reason.createTrueReason() : Reason.createFalseReason();

-		}

-

-		@Override

-		public boolean update(IUpdateContext context) {

-			IPeService peService = Graphiti.getPeService();

-			IGaService gaService = Graphiti.getGaService();

-

-			ContainerShape container = (ContainerShape) context.getPictogramElement();

-			CallActivity callActivity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),

-					CallActivity.class);

-

-			ContainerShape markerContainer = (ContainerShape) GraphicsUtil.getShapeForProperty(container,

-					GraphicsUtil.ACTIVITY_MARKER_CONTAINER);

-			Shape globalTaskShape = GraphicsUtil.getShapeForProperty(container, GLOBAL_TASK_SHAPE_PROPERTY);

-

-			if (callActivity.getCalledElementRef() == null) {

-				GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);

-				if (globalTaskShape != null) {

-					peService.deletePictogramElement(globalTaskShape);

-				}

-			}

-

-			else if (callActivity.getCalledElementRef() instanceof GlobalTask) {

-				GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);

-				GlobalTask t = (GlobalTask) callActivity.getCalledElementRef();

-				if (globalTaskShape == null) {

-					globalTaskShape = peService.createShape(container, false);

-					peService.setPropertyValue(globalTaskShape, GLOBAL_TASK_SHAPE_PROPERTY, Boolean.toString(true));

-				}

-				String imageId = getImageId(t);

-				if (imageId != null) {

-					Image image = gaService.createImage(globalTaskShape, imageId);

-					gaService.setLocationAndSize(image, MARKER_OFFSET + 2, MARKER_OFFSET + 2, 16, 16);

-				}

-			}

-

-			else if (callActivity.getCalledElementRef() instanceof Process) {

-				if (globalTaskShape != null) {

-					peService.deletePictogramElement(globalTaskShape);

-				}

-				Expand expand = GraphicsUtil.createActivityMarkerExpand(markerContainer);

-				expand.rect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));

-				expand.horizontal.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));

-				expand.vertical.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));

-			}

-

-			peService.setPropertyValue(container, CALL_ACTIVITY_REF_PROPERTY,

-					getCallableElementStringValue(callActivity.getCalledElementRef()));

-			return true;

-		}

-	}

-

-	private String getCallableElementStringValue(CallableElement element) {

-		if (element == null) {

-			return "null";

-		}

-		return element.getClass().getSimpleName();

-	}

-

-	private String getImageId(GlobalTask task) {

-		if (task instanceof GlobalBusinessRuleTask) {

-			return ImageProvider.IMG_16_BUSINESS_RULE_TASK;

-		} else if (task instanceof GlobalManualTask) {

-			return ImageProvider.IMG_16_MANUAL_TASK;

-		} else if (task instanceof GlobalScriptTask) {

-			return ImageProvider.IMG_16_SCRIPT_TASK;

-		} else if (task instanceof GlobalUserTask) {

-			return ImageProvider.IMG_16_USER_TASK;

-		} else {

-			return null;

-		}

-	}

+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ *  All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.Activity;
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.CallActivity;
+import org.eclipse.bpmn2.CallableElement;
+import org.eclipse.bpmn2.GlobalBusinessRuleTask;
+import org.eclipse.bpmn2.GlobalManualTask;
+import org.eclipse.bpmn2.GlobalScriptTask;
+import org.eclipse.bpmn2.GlobalTask;
+import org.eclipse.bpmn2.GlobalUserTask;
+import org.eclipse.bpmn2.Process;
+import org.eclipse.bpmn2.modeler.core.features.DefaultResizeBPMNShapeFeature;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.LayoutActivityFeature;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.Expand;
+import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
+import org.eclipse.bpmn2.modeler.ui.ImageProvider;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.graphiti.features.IAddFeature;
+import org.eclipse.graphiti.features.ICreateFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.ILayoutFeature;
+import org.eclipse.graphiti.features.IReason;
+import org.eclipse.graphiti.features.IResizeShapeFeature;
+import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.features.context.ICreateContext;
+import org.eclipse.graphiti.features.context.IUpdateContext;
+import org.eclipse.graphiti.features.impl.AbstractUpdateFeature;
+import org.eclipse.graphiti.features.impl.Reason;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.algorithms.Image;
+import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;
+import org.eclipse.graphiti.mm.algorithms.Text;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.services.IGaService;
+import org.eclipse.graphiti.services.IPeService;
+
+public class CallActivityFeatureContainer extends AbstractExpandableActivityFeatureContainer {
+
+	private static final int MARKER_OFFSET = 4;
+	private static final String CALL_ACTIVITY_REF_PROPERTY = "call.activity.ref";
+	private static final String GLOBAL_TASK_SHAPE_PROPERTY = "global.task.shape";
+
+	@Override
+	public boolean canApplyTo(Object o) {
+		return super.canApplyTo(o) && o instanceof CallActivity;
+	}
+
+	@Override
+	public ICreateFeature getCreateFeature(IFeatureProvider fp) {
+		return new CreateCallActivityFeature(fp);
+	}
+
+	@Override
+	public IAddFeature getAddFeature(IFeatureProvider fp) {
+		return new AddExpandableActivityFeature<CallActivity>(fp) {
+			@Override
+			protected void hook(CallActivity activity, ContainerShape container, IAddContext context, int width, int height) {
+				super.hook(activity, container, context, width, height);
+				Graphiti.getPeService().setPropertyValue(container, CALL_ACTIVITY_REF_PROPERTY,
+						getCallableElementStringValue(activity.getCalledElementRef()));
+			}
+
+			@Override
+			protected void decorateActivityRectangle(RoundedRectangle rect) {
+				rect.setLineWidth(4);
+			}
+
+			@Override
+			protected int getMarkerContainerOffset() {
+				return MARKER_OFFSET;
+			}
+
+			@Override
+			public int getWidth() {
+				return GraphicsUtil.getActivitySize(getDiagram()).getWidth();
+			}
+
+			@Override
+			public int getHeight() {
+				return GraphicsUtil.getActivitySize(getDiagram()).getHeight();
+			}
+		};
+	}
+
+	@Override
+	public ILayoutFeature getLayoutFeature(IFeatureProvider fp) {
+		return new LayoutExpandableActivityFeature(fp) {
+			protected int getMarkerContainerOffset() {
+				return MARKER_OFFSET;
+			}
+			
+			@Override
+			protected boolean layoutHook(Shape shape, GraphicsAlgorithm ga, Object bo, int newWidth, int newHeight) {
+				if (bo != null && bo instanceof Activity && ga instanceof Text) {
+					Graphiti.getGaService().setLocationAndSize(ga, 5, 5, newWidth - 10, 15);
+					return true;
+				}
+				return false;
+			}
+			
+		};
+	}
+
+	@Override
+	public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+		MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
+		multiUpdate.addUpdateFeature(new UpdateCallActivityFeature(fp));
+		return multiUpdate;
+	}
+	
+	@Override
+	public IResizeShapeFeature getResizeFeature(IFeatureProvider fp) {
+		return new DefaultResizeBPMNShapeFeature(fp);
+	}
+
+	public static class CreateCallActivityFeature extends AbstractCreateExpandableFlowNodeFeature<CallActivity> {
+
+		// NOTE: Even though the Call Activity is an expandable figure, the contents for its "innards"
+		// are (usually) defined somewhere else, so it doesn't make much sense to be able to expand it in the
+		// same sense that a SubProcess would be expanded and rendered. When the "expand" button is clicked
+		// we should probably locate the process where this thing is defined (if possible) and open an
+		// editor to display its contents.
+		
+		public CreateCallActivityFeature(IFeatureProvider fp) {
+			super(fp, "Call Activity",
+					"Identifies a point in the Process where a global Process or a Global Task is called");
+		}
+
+		@Override
+		public String getStencilImageId() {
+			return ImageProvider.IMG_16_CALL_ACTIVITY;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
+		 */
+		@Override
+		public EClass getBusinessObjectClass() {
+			return Bpmn2Package.eINSTANCE.getCallActivity();
+		}
+	}
+
+	private class UpdateCallActivityFeature extends AbstractUpdateFeature {
+
+		public UpdateCallActivityFeature(IFeatureProvider fp) {
+			super(fp);
+		}
+
+		@Override
+		public boolean canUpdate(IUpdateContext context) {
+			CallActivity callActivity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),
+					CallActivity.class);
+			return callActivity != null && context.getPictogramElement() instanceof ContainerShape;
+		}
+
+		@Override
+		public IReason updateNeeded(IUpdateContext context) {
+			IPeService peService = Graphiti.getPeService();
+			PictogramElement element = context.getPictogramElement();
+			String property = peService.getPropertyValue(element, CALL_ACTIVITY_REF_PROPERTY);
+			if (property == null) {
+				return Reason.createFalseReason();
+			}
+			CallActivity callActivity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),
+					CallActivity.class);
+			String value = getCallableElementStringValue(callActivity.getCalledElementRef());
+			boolean changed = !value.equals(property);
+			return changed ? Reason.createTrueReason() : Reason.createFalseReason();
+		}
+
+		@Override
+		public boolean update(IUpdateContext context) {
+			IPeService peService = Graphiti.getPeService();
+			IGaService gaService = Graphiti.getGaService();
+
+			ContainerShape container = (ContainerShape) context.getPictogramElement();
+			CallActivity callActivity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),
+					CallActivity.class);
+
+			ContainerShape markerContainer = (ContainerShape) GraphicsUtil.getShapeForProperty(container,
+					GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
+			Shape globalTaskShape = GraphicsUtil.getShapeForProperty(container, GLOBAL_TASK_SHAPE_PROPERTY);
+
+			if (callActivity.getCalledElementRef() == null) {
+				GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
+				if (globalTaskShape != null) {
+					peService.deletePictogramElement(globalTaskShape);
+				}
+			}
+
+			else if (callActivity.getCalledElementRef() instanceof GlobalTask) {
+				GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
+				GlobalTask t = (GlobalTask) callActivity.getCalledElementRef();
+				if (globalTaskShape == null) {
+					globalTaskShape = peService.createShape(container, false);
+					peService.setPropertyValue(globalTaskShape, GLOBAL_TASK_SHAPE_PROPERTY, Boolean.toString(true));
+				}
+				String imageId = getImageId(t);
+				if (imageId != null) {
+					Image image = gaService.createImage(globalTaskShape, imageId);
+					gaService.setLocationAndSize(image, MARKER_OFFSET + 2, MARKER_OFFSET + 2, 16, 16);
+				}
+			}
+
+			else if (callActivity.getCalledElementRef() instanceof Process) {
+				if (globalTaskShape != null) {
+					peService.deletePictogramElement(globalTaskShape);
+				}
+				Expand expand = GraphicsUtil.createActivityMarkerExpand(markerContainer);
+				expand.rect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+				expand.horizontal.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+				expand.vertical.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+			}
+
+			peService.setPropertyValue(container, CALL_ACTIVITY_REF_PROPERTY,
+					getCallableElementStringValue(callActivity.getCalledElementRef()));
+			return true;
+		}
+	}
+
+	private String getCallableElementStringValue(CallableElement element) {
+		if (element == null) {
+			return "null";
+		}
+		return element.getClass().getSimpleName();
+	}
+
+	private String getImageId(GlobalTask task) {
+		if (task instanceof GlobalBusinessRuleTask) {
+			return ImageProvider.IMG_16_BUSINESS_RULE_TASK;
+		} else if (task instanceof GlobalManualTask) {
+			return ImageProvider.IMG_16_MANUAL_TASK;
+		} else if (task instanceof GlobalScriptTask) {
+			return ImageProvider.IMG_16_SCRIPT_TASK;
+		} else if (task instanceof GlobalUserTask) {
+			return ImageProvider.IMG_16_USER_TASK;
+		} else {
+			return null;
+		}
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CollapseSubProcessFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CollapseFlowNodeFeature.java
similarity index 85%
rename from org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CollapseSubProcessFeature.java
rename to org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CollapseFlowNodeFeature.java
index 1d6f9b1..ab51f2a 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CollapseSubProcessFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CollapseFlowNodeFeature.java
@@ -1,118 +1,118 @@
-/******************************************************************************* 

- * Copyright (c) 2011 Red Hat, Inc. 

- *  All rights reserved. 

- * This program is 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: 

- * Red Hat, Inc. - initial API and implementation 

- *

- * @author Bob Brodt

- ******************************************************************************/

-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;

-

-import org.eclipse.bpmn2.SubProcess;

-import org.eclipse.bpmn2.di.BPMNShape;

-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;

-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;

-import org.eclipse.bpmn2.modeler.ui.ImageProvider;

-import org.eclipse.graphiti.features.IFeatureProvider;

-import org.eclipse.graphiti.features.IResizeShapeFeature;

-import org.eclipse.graphiti.features.context.IContext;

-import org.eclipse.graphiti.features.context.ICustomContext;

-import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;

-import org.eclipse.graphiti.features.custom.AbstractCustomFeature;

-import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;

-import org.eclipse.graphiti.mm.pictograms.ContainerShape;

-import org.eclipse.graphiti.mm.pictograms.PictogramElement;

-

-public class CollapseSubProcessFeature extends AbstractCustomFeature {

-

-	public CollapseSubProcessFeature(IFeatureProvider fp) {

-		super(fp);

-		// TODO Auto-generated constructor stub

-	}

-

-	@Override

-	public String getName() {

-		return "Collapse"; //$NON-NLS-1$

-	}

-

-	@Override

-	public String getDescription() {

-

-		return "Collapse the Sub-Process and hide contents"; //$NON-NLS-1$

-	}

-

-	@Override

-	public String getImageId() {

-		return ImageProvider.IMG_16_COLLAPSE;

-	}

-

-	@Override

-	public boolean isAvailable(IContext context) {

-		return true;

-	}

-

-	@Override

-	public boolean canExecute(ICustomContext context) {

-		boolean ret = false;

-		PictogramElement[] pes = context.getPictogramElements();

-		if (pes != null && pes.length == 1) {

-			Object bo = getBusinessObjectForPictogramElement(pes[0]);

-			if (bo instanceof SubProcess) {

-				try {

-					BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement((SubProcess)bo);

-					if (bpmnShape.isIsExpanded())

-						ret = true;

-				} catch (Exception e) {

-					e.printStackTrace();

-				}

-			}

-		}

-		return ret;

-	}

-

-	@Override

-	public void execute(ICustomContext context) {

-		PictogramElement[] pes = context.getPictogramElements();

-		if (pes != null && pes.length == 1) {

-			PictogramElement pe0 = pes[0];

-			Object bo = getBusinessObjectForPictogramElement(pe0);

-			if (pe0 instanceof ContainerShape && bo instanceof SubProcess) {

-				ContainerShape containerShape = (ContainerShape)pe0;

-				SubProcess subProcess = (SubProcess)bo;

-				try {

-					BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(subProcess);

-					if (bpmnShape.isIsExpanded()) {

-						

-						// SubProcess is collapsed - resize to standard modelObject size

-						// NOTE: children tasks will be set not-visible in LayoutSubProcessFeature

-						

-						bpmnShape.setIsExpanded(false);

-

-						GraphicsAlgorithm ga = containerShape.getGraphicsAlgorithm();

-						ResizeShapeContext resizeContext = new ResizeShapeContext(containerShape);

-						IResizeShapeFeature resizeFeature = getFeatureProvider().getResizeShapeFeature(resizeContext);

-						int oldWidth = ga.getWidth();

-						int oldHeight = ga.getHeight();

-						int newWidth = GraphicsUtil.getActivitySize(getDiagram()).getWidth();

-						int newHeight = GraphicsUtil.getActivitySize(getDiagram()).getHeight();

-						resizeContext.setX(ga.getX() + oldWidth/2 - newWidth/2);

-						resizeContext.setY(ga.getY() + oldHeight/2 - newHeight/2);

-						resizeContext.setWidth(newWidth);

-						resizeContext.setHeight(newHeight);

-						resizeFeature.resizeShape(resizeContext);

-						

-						getDiagramEditor().selectPictogramElements(new PictogramElement[] {});

-					}

-					

-				} catch (Exception e) {

-					// TODO Auto-generated catch block

-					e.printStackTrace();

-				}

-			}

-		}

-	}

-}

+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ *  All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.FlowNode;
+import org.eclipse.bpmn2.di.BPMNShape;
+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
+import org.eclipse.bpmn2.modeler.ui.ImageProvider;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.IResizeShapeFeature;
+import org.eclipse.graphiti.features.context.IContext;
+import org.eclipse.graphiti.features.context.ICustomContext;
+import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;
+import org.eclipse.graphiti.features.custom.AbstractCustomFeature;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+
+public class CollapseFlowNodeFeature extends AbstractCustomFeature {
+
+	public CollapseFlowNodeFeature(IFeatureProvider fp) {
+		super(fp);
+		// TODO Auto-generated constructor stub
+	}
+
+	@Override
+	public String getName() {
+		return "Collapse"; //$NON-NLS-1$
+	}
+
+	@Override
+	public String getDescription() {
+
+		return "Collapse the Activity and hide contents"; //$NON-NLS-1$
+	}
+
+	@Override
+	public String getImageId() {
+		return ImageProvider.IMG_16_COLLAPSE;
+	}
+
+	@Override
+	public boolean isAvailable(IContext context) {
+		return true;
+	}
+
+	@Override
+	public boolean canExecute(ICustomContext context) {
+		boolean ret = false;
+		PictogramElement[] pes = context.getPictogramElements();
+		if (pes != null && pes.length == 1) {
+			Object bo = getBusinessObjectForPictogramElement(pes[0]);
+			if (AbstractExpandableActivityFeatureContainer.isExpandableElement(bo)) {
+				try {
+					BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement((FlowNode)bo);
+					if (bpmnShape.isIsExpanded())
+						ret = true;
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return ret;
+	}
+
+	@Override
+	public void execute(ICustomContext context) {
+		PictogramElement[] pes = context.getPictogramElements();
+		if (pes != null && pes.length == 1) {
+			PictogramElement pe0 = pes[0];
+			Object bo = getBusinessObjectForPictogramElement(pe0);
+			if (pe0 instanceof ContainerShape && bo instanceof FlowNode) {
+				ContainerShape containerShape = (ContainerShape)pe0;
+				FlowNode flowNode = (FlowNode)bo;
+				try {
+					BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(flowNode);
+					if (bpmnShape.isIsExpanded()) {
+						
+						// SubProcess is collapsed - resize to standard modelObject size
+						// NOTE: children tasks will be set not-visible in LayoutExpandableActivityFeature
+						
+						bpmnShape.setIsExpanded(false);
+
+						GraphicsAlgorithm ga = containerShape.getGraphicsAlgorithm();
+						ResizeShapeContext resizeContext = new ResizeShapeContext(containerShape);
+						IResizeShapeFeature resizeFeature = getFeatureProvider().getResizeShapeFeature(resizeContext);
+						int oldWidth = ga.getWidth();
+						int oldHeight = ga.getHeight();
+						int newWidth = GraphicsUtil.getActivitySize(getDiagram()).getWidth();
+						int newHeight = GraphicsUtil.getActivitySize(getDiagram()).getHeight();
+						resizeContext.setX(ga.getX() + oldWidth/2 - newWidth/2);
+						resizeContext.setY(ga.getY() + oldHeight/2 - newHeight/2);
+						resizeContext.setWidth(newWidth);
+						resizeContext.setHeight(newHeight);
+						resizeFeature.resizeShape(resizeContext);
+						
+						getDiagramEditor().selectPictogramElements(new PictogramElement[] {});
+					}
+					
+				} catch (Exception e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ExpandSubProcessFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ExpandFlowNodeFeature.java
similarity index 82%
rename from org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ExpandSubProcessFeature.java
rename to org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ExpandFlowNodeFeature.java
index 761fcfa..8ef3af6 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ExpandSubProcessFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ExpandFlowNodeFeature.java
@@ -1,116 +1,116 @@
-/******************************************************************************* 

- * Copyright (c) 2011 Red Hat, Inc. 

- *  All rights reserved. 

- * This program is 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: 

- * Red Hat, Inc. - initial API and implementation 

- *

- * @author Bob Brodt

- ******************************************************************************/

-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;

-

-import org.eclipse.bpmn2.SubProcess;

-import org.eclipse.bpmn2.di.BPMNShape;

-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;

-import org.eclipse.bpmn2.modeler.ui.ImageProvider;

-import org.eclipse.graphiti.features.IFeatureProvider;

-import org.eclipse.graphiti.features.IResizeShapeFeature;

-import org.eclipse.graphiti.features.context.IContext;

-import org.eclipse.graphiti.features.context.ICustomContext;

-import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;

-import org.eclipse.graphiti.features.custom.AbstractCustomFeature;

-import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;

-import org.eclipse.graphiti.mm.pictograms.ContainerShape;

-import org.eclipse.graphiti.mm.pictograms.PictogramElement;

-

-// NOT USED YET

-public class ExpandSubProcessFeature extends AbstractCustomFeature {

-

-	public ExpandSubProcessFeature(IFeatureProvider fp) {

-	    super(fp);

-    }

-	

-	@Override

-	public String getName() {

-	    return "Expand";

-	}

-	

-	@Override

-	public String getDescription() {

-	    return "Expand the Sub-Process and show contents";

-	}

-

-	@Override

-	public String getImageId() {

-		return ImageProvider.IMG_16_EXPAND;

-	}

-

-	@Override

-	public boolean isAvailable(IContext context) {

-		return true;

-	}

-

-	@Override

-	public boolean canExecute(ICustomContext context) {

-		boolean ret = false;

-		PictogramElement[] pes = context.getPictogramElements();

-		if (pes != null && pes.length == 1) {

-			Object bo = getBusinessObjectForPictogramElement(pes[0]);

-			if (bo instanceof SubProcess) {

-				try {

-					BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement((SubProcess)bo);

-					if (!bpmnShape.isIsExpanded())

-						ret = true;

-				} catch (Exception e) {

-					// TODO Auto-generated catch block

-					e.printStackTrace();

-				}

-			}

-		}

-		return ret;

-	}

-

-	@Override

-	public void execute(ICustomContext context) {

-		PictogramElement[] pes = context.getPictogramElements();

-		if (pes != null && pes.length == 1) {

-			PictogramElement pe0 = pes[0];

-			Object bo = getBusinessObjectForPictogramElement(pe0);

-			if (pe0 instanceof ContainerShape && bo instanceof SubProcess) {

-				ContainerShape containerShape = (ContainerShape)pe0;

-				SubProcess subProcess = (SubProcess)bo;

-				try {

-					BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(subProcess);

-					if (!bpmnShape.isIsExpanded()) {

-						

-						// SubProcess is collapsed - resize to minimum size such that all children are visible

-						// NOTE: children tasks will be set visible in LayoutSubProcessFeature

-

-						bpmnShape.setIsExpanded(true);

-						

-						GraphicsAlgorithm ga = containerShape.getGraphicsAlgorithm();

-						ResizeShapeContext resizeContext = new ResizeShapeContext(containerShape);

-						IResizeShapeFeature resizeFeature = getFeatureProvider().getResizeShapeFeature(resizeContext);

-						int oldWidth = ga.getWidth();

-						int oldHeight = ga.getHeight();

-						ResizeSubProcessFeature.SizeCalculator newSize = new ResizeSubProcessFeature.SizeCalculator(containerShape);

-						int newWidth = newSize.getWidth();

-						int newHeight = newSize.getHeight();

-						resizeContext.setX(ga.getX() + oldWidth/2 - newWidth/2);

-						resizeContext.setY(ga.getY() + oldHeight/2 - newHeight/2);

-						resizeContext.setWidth(newWidth);

-						resizeContext.setHeight(newHeight);

-						resizeFeature.resizeShape(resizeContext);

-					}

-					

-				} catch (Exception e) {

-					// TODO Auto-generated catch block

-					e.printStackTrace();

-				}

-			}

-		}

-	}

+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ *  All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.FlowNode;
+import org.eclipse.bpmn2.di.BPMNShape;
+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
+import org.eclipse.bpmn2.modeler.ui.ImageProvider;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.IResizeShapeFeature;
+import org.eclipse.graphiti.features.context.IContext;
+import org.eclipse.graphiti.features.context.ICustomContext;
+import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;
+import org.eclipse.graphiti.features.custom.AbstractCustomFeature;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+
+// NOT USED YET
+public class ExpandFlowNodeFeature extends AbstractCustomFeature {
+
+	public ExpandFlowNodeFeature(IFeatureProvider fp) {
+	    super(fp);
+    }
+	
+	@Override
+	public String getName() {
+	    return "Expand";
+	}
+	
+	@Override
+	public String getDescription() {
+	    return "Expand the Activity and show contents";
+	}
+
+	@Override
+	public String getImageId() {
+		return ImageProvider.IMG_16_EXPAND;
+	}
+
+	@Override
+	public boolean isAvailable(IContext context) {
+		return true;
+	}
+
+	@Override
+	public boolean canExecute(ICustomContext context) {
+		boolean ret = false;
+		PictogramElement[] pes = context.getPictogramElements();
+		if (pes != null && pes.length == 1) {
+			Object bo = getBusinessObjectForPictogramElement(pes[0]);
+			if (AbstractExpandableActivityFeatureContainer.isExpandableElement(bo)) {
+				try {
+					BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement((FlowNode)bo);
+					if (!bpmnShape.isIsExpanded())
+						ret = true;
+				} catch (Exception e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+		}
+		return ret;
+	}
+
+	@Override
+	public void execute(ICustomContext context) {
+		PictogramElement[] pes = context.getPictogramElements();
+		if (pes != null && pes.length == 1) {
+			PictogramElement pe0 = pes[0];
+			Object bo = getBusinessObjectForPictogramElement(pe0);
+			if (pe0 instanceof ContainerShape && bo instanceof FlowNode) {
+				ContainerShape containerShape = (ContainerShape)pe0;
+				FlowNode flowNode = (FlowNode)bo;
+				try {
+					BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(flowNode);
+					if (!bpmnShape.isIsExpanded()) {
+						
+						// SubProcess is collapsed - resize to minimum size such that all children are visible
+						// NOTE: children tasks will be set visible in LayoutExpandableActivityFeature
+
+						bpmnShape.setIsExpanded(true);
+						
+						GraphicsAlgorithm ga = containerShape.getGraphicsAlgorithm();
+						ResizeShapeContext resizeContext = new ResizeShapeContext(containerShape);
+						IResizeShapeFeature resizeFeature = getFeatureProvider().getResizeShapeFeature(resizeContext);
+						int oldWidth = ga.getWidth();
+						int oldHeight = ga.getHeight();
+						ResizeExpandableActivityFeature.SizeCalculator newSize = new ResizeExpandableActivityFeature.SizeCalculator(containerShape);
+						int newWidth = newSize.getWidth();
+						int newHeight = newSize.getHeight();
+						resizeContext.setX(ga.getX() + oldWidth/2 - newWidth/2);
+						resizeContext.setY(ga.getY() + oldHeight/2 - newHeight/2);
+						resizeContext.setWidth(newWidth);
+						resizeContext.setHeight(newHeight);
+						resizeFeature.resizeShape(resizeContext);
+					}
+					
+				} catch (Exception e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+		}
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutSubProcessFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutExpandableActivityFeature.java
similarity index 95%
rename from org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutSubProcessFeature.java
rename to org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutExpandableActivityFeature.java
index fa67804..45688a0 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutSubProcessFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutExpandableActivityFeature.java
@@ -1,103 +1,103 @@
-/******************************************************************************* 

- * Copyright (c) 2011 Red Hat, Inc. 

- *  All rights reserved. 

- * This program is 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: 

- * Red Hat, Inc. - initial API and implementation 

- *

- * @author Innar Made

- ******************************************************************************/

-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;

-

-import org.eclipse.bpmn2.SubProcess;

-import org.eclipse.bpmn2.di.BPMNShape;

-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;

-import org.eclipse.bpmn2.modeler.core.features.activity.LayoutActivityFeature;

-import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;

-import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport;

-import org.eclipse.graphiti.features.IFeatureProvider;

-import org.eclipse.graphiti.features.IResizeShapeFeature;

-import org.eclipse.graphiti.features.context.ILayoutContext;

-import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;

-import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;

-import org.eclipse.graphiti.mm.pictograms.ContainerShape;

-import org.eclipse.graphiti.mm.pictograms.PictogramElement;

-import org.eclipse.graphiti.mm.pictograms.Shape;

-

-public class LayoutSubProcessFeature extends LayoutActivityFeature {

-

-	public LayoutSubProcessFeature(IFeatureProvider fp) {

-		super(fp);

-	}

-

-	@Override

-	protected boolean layoutHook(Shape shape, GraphicsAlgorithm ga, Object bo, int newWidth, int newHeight) {

-//		FIXME whats that supposed to do? it will move label of children to positions where they are not visible

-//		if (bo != null && bo instanceof Activity && ga instanceof Text) {

-//			Graphiti.getGaService().setLocationAndSize(ga, 5, 5, newWidth - 10, 15);

-//			return true;

-//		}

-		return true;

-	}

-	

-	@Override

-	public boolean layout(ILayoutContext context) {

-		ContainerShape containerShape = (ContainerShape) context.getPictogramElement();

-		SubProcess subProcess = BusinessObjectUtil.getFirstElementOfType(containerShape, SubProcess.class);

-		try {

-			BPMNShape shape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(subProcess);

-			

-			if (shape.isIsExpanded()) {

-				

-				// SubProcess is expanded

-				

-				boolean needResize = false;

-				GraphicsAlgorithm parentGa = containerShape.getGraphicsAlgorithm();

-				

-				for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {

-					GraphicsAlgorithm ga = pe.getGraphicsAlgorithm();

-					if (ga!=null) {

-						if (ga.getX() < 0 || ga.getY() < 0) {

-							needResize = true;

-							break;

-						}

-						if (ga.getX() + ga.getWidth() > parentGa.getWidth()) {

-							needResize = true;

-							break;

-						}

-						if (ga.getY() + ga.getHeight() > parentGa.getHeight()) {

-							needResize = true;

-							break;

-						}

-					}

-				}

-				if (needResize) {

-					ResizeShapeContext resizeContext = new ResizeShapeContext(containerShape);

-					resizeContext.setX(parentGa.getX());

-					resizeContext.setY(parentGa.getY());

-					resizeContext.setWidth(parentGa.getWidth());

-					resizeContext.setHeight(parentGa.getHeight());

-					IResizeShapeFeature resizeFeature = getFeatureProvider().getResizeShapeFeature(resizeContext);

-					resizeFeature.resizeShape(resizeContext);

-				}

-				

-				FeatureSupport.setContainerChildrenVisible(containerShape, true);

-			}

-			else {

-				

-				// SubProcess is collapsed

-				

-				FeatureSupport.setContainerChildrenVisible(containerShape, false);

-			}

-			

-		} catch (Exception e) {

-			// It's OK, I've played a programmer before...

-			// e.printStackTrace();

-		}

-		

-		return super.layout(context);

-	}

-}

+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ *  All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.di.BPMNShape;
+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
+import org.eclipse.bpmn2.modeler.core.features.activity.LayoutActivityFeature;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
+import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.IResizeShapeFeature;
+import org.eclipse.graphiti.features.context.ILayoutContext;
+import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+
+public class LayoutExpandableActivityFeature extends LayoutActivityFeature {
+
+	public LayoutExpandableActivityFeature(IFeatureProvider fp) {
+		super(fp);
+	}
+
+	@Override
+	protected boolean layoutHook(Shape shape, GraphicsAlgorithm ga, Object bo, int newWidth, int newHeight) {
+//		FIXME whats that supposed to do? it will move label of children to positions where they are not visible
+//		if (bo != null && bo instanceof Activity && ga instanceof Text) {
+//			Graphiti.getGaService().setLocationAndSize(ga, 5, 5, newWidth - 10, 15);
+//			return true;
+//		}
+		return true;
+	}
+	
+	@Override
+	public boolean layout(ILayoutContext context) {
+		ContainerShape containerShape = (ContainerShape) context.getPictogramElement();
+		SubProcess subProcess = BusinessObjectUtil.getFirstElementOfType(containerShape, SubProcess.class);
+		try {
+			BPMNShape shape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(subProcess);
+			
+			if (shape.isIsExpanded()) {
+				
+				// SubProcess is expanded
+				
+				boolean needResize = false;
+				GraphicsAlgorithm parentGa = containerShape.getGraphicsAlgorithm();
+				
+				for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
+					GraphicsAlgorithm ga = pe.getGraphicsAlgorithm();
+					if (ga!=null) {
+						if (ga.getX() < 0 || ga.getY() < 0) {
+							needResize = true;
+							break;
+						}
+						if (ga.getX() + ga.getWidth() > parentGa.getWidth()) {
+							needResize = true;
+							break;
+						}
+						if (ga.getY() + ga.getHeight() > parentGa.getHeight()) {
+							needResize = true;
+							break;
+						}
+					}
+				}
+				if (needResize) {
+					ResizeShapeContext resizeContext = new ResizeShapeContext(containerShape);
+					resizeContext.setX(parentGa.getX());
+					resizeContext.setY(parentGa.getY());
+					resizeContext.setWidth(parentGa.getWidth());
+					resizeContext.setHeight(parentGa.getHeight());
+					IResizeShapeFeature resizeFeature = getFeatureProvider().getResizeShapeFeature(resizeContext);
+					resizeFeature.resizeShape(resizeContext);
+				}
+				
+				FeatureSupport.setContainerChildrenVisible(containerShape, true);
+			}
+			else {
+				
+				// SubProcess is collapsed
+				
+				FeatureSupport.setContainerChildrenVisible(containerShape, false);
+			}
+			
+		} catch (Exception e) {
+			// It's OK, I've played a programmer before...
+			// e.printStackTrace();
+		}
+		
+		return super.layout(context);
+	}
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ResizeSubProcessFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ResizeExpandableActivityFeature.java
similarity index 97%
rename from org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ResizeSubProcessFeature.java
rename to org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ResizeExpandableActivityFeature.java
index ba9f6cb..334227b 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ResizeSubProcessFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ResizeExpandableActivityFeature.java
@@ -1,229 +1,229 @@
-/******************************************************************************* 

- * Copyright (c) 2011 Red Hat, Inc. 

- *  All rights reserved. 

- * This program is 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: 

- * Red Hat, Inc. - initial API and implementation 

- *

- * @author Bob Brodt

- ******************************************************************************/

-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;

-

-import org.eclipse.bpmn2.Activity;

-import org.eclipse.bpmn2.di.BPMNShape;

-import org.eclipse.bpmn2.modeler.core.Activator;

-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;

-import org.eclipse.bpmn2.modeler.core.features.DefaultResizeBPMNShapeFeature;

-import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;

-import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport;

-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;

-import org.eclipse.graphiti.features.IFeatureProvider;

-import org.eclipse.graphiti.features.context.IResizeShapeContext;

-import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;

-import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;

-import org.eclipse.graphiti.mm.pictograms.ContainerShape;

-import org.eclipse.graphiti.mm.pictograms.PictogramElement;

-import org.eclipse.graphiti.services.Graphiti;

-

-public class ResizeSubProcessFeature extends DefaultResizeBPMNShapeFeature {

-	public final static int MARGIN = 20;

-	

-	public ResizeSubProcessFeature(IFeatureProvider fp) {

-		super(fp);

-	}

-	

-	@Override

-	public void resizeShape(IResizeShapeContext context) {

-

-		ResizeShapeContext resizeShapeContext = (ResizeShapeContext)context;

-

-		ContainerShape containerShape = (ContainerShape) context.getPictogramElement();

-		Activity activity = BusinessObjectUtil.getFirstElementOfType(containerShape, Activity.class);

-		try {

-			BPMNShape shape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(activity);

-			

-			if (shape.isIsExpanded()) {

-

-				// SubProcess is expanded

-				

-				GraphicsAlgorithm parentGa = containerShape.getGraphicsAlgorithm();

-				int newWidth = resizeShapeContext.getWidth();

-				int newHeight = resizeShapeContext.getHeight();

-				SizeCalculator sizeCalc = new SizeCalculator(containerShape);

-				int shiftX = sizeCalc.shiftX;

-				int shiftY = sizeCalc.shiftY;

-				int minWidth = sizeCalc.minWidth;

-				int minHeight = sizeCalc.minHeight;

-				

-				if (shiftX < 0) {

-					for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {

-						GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();

-						if (childGa!=null) {

-							int x = childGa.getX() - shiftX + MARGIN;

-							childGa.setX(x);

-						}

-					}

-					resizeShapeContext.setX(resizeShapeContext.getX() + shiftX - MARGIN);

-					shiftX = MARGIN;

-				}

-				

-				if (shiftY < 0) {

-					for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {

-						GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();

-						if (childGa!=null) {

-							int y = childGa.getY() - shiftY + MARGIN;

-							childGa.setY(y);

-						}

-					}

-					resizeShapeContext.setY(resizeShapeContext.getY() + shiftY - MARGIN);

-					shiftX = MARGIN;

-				}

-

-				if (shiftX < MARGIN)

-					shiftX = MARGIN;

-				if (shiftY < MARGIN)

-					shiftY = MARGIN;

-				minWidth += 2 * MARGIN;

-				minHeight += 2 * MARGIN;

-

-				if (newWidth < minWidth) {

-					parentGa.setWidth(minWidth);

-				}

-				if (newWidth < shiftX + minWidth) {

-					int shift = shiftX + minWidth - newWidth;

-					if (shift>shiftX-MARGIN) {

-						shift = shiftX-MARGIN;

-					}

-					if (shift>0) {

-						for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {

-							GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();

-							if (childGa!=null) {

-								int x = childGa.getX() - shift;

-								childGa.setX(x);

-							}

-						}

-					}

-				}

-				if (newHeight < minHeight) {

-					parentGa.setHeight(minHeight);

-				}

-				if (newHeight < shiftY + minHeight) {

-					int shift = shiftY + minHeight - newHeight;

-					if (shift>shiftY-MARGIN) {

-						shift = shiftY-MARGIN;

-					}

-					if (shift>0) {

-						for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {

-							GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();

-							if (childGa!=null) {

-								int y = childGa.getY() - shift;

-								childGa.setY(y);

-							}

-						}

-					}

-				}

-				

-				if (resizeShapeContext.getWidth() < minWidth)

-					resizeShapeContext.setWidth(minWidth);

-				if (resizeShapeContext.getHeight() < minHeight)

-					resizeShapeContext.setHeight(minHeight);

-			}

-			else {

-				

-				// SubProcess is collapsed

-				

-				for (PictogramElement pe : FeatureSupport.getContainerDecorators(containerShape)) {

-					GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();

-					if (childGa!=null) {

-						childGa.setWidth(GraphicsUtil.getActivitySize(getDiagram()).getWidth());

-						childGa.setHeight(GraphicsUtil.getActivitySize(getDiagram()).getHeight());

-					}

-				}

-				

-				resizeShapeContext.setWidth(GraphicsUtil.getActivitySize(getDiagram()).getWidth());

-				resizeShapeContext.setHeight(GraphicsUtil.getActivitySize(getDiagram()).getHeight());

-			}

-			

-		} catch (Exception e) {

-			Activator.logError(e);

-		}

-		Graphiti.getPeService().sendToBack(containerShape);

-		

-		super.resizeShape(context);

-	}

-	

-	public static class SizeCalculator {

-		

-		int shiftX;

-		int shiftY;

-		int minWidth;

-		int minHeight;

-		ContainerShape containerShape;

-		

-		public SizeCalculator(ContainerShape containerShape) {

-			setShape(containerShape);

-		}

-		

-		public void setShape(ContainerShape containerShape) {

-			this.containerShape = containerShape;

-			calculate();

-		}

-		

-		private void calculate() {

-			int minX = Integer.MAX_VALUE;

-			int minY = Integer.MAX_VALUE;

-			minWidth = 0;

-			minHeight = 0;

-

-			for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {

-				GraphicsAlgorithm ga = pe.getGraphicsAlgorithm();

-				if (ga!=null) {

-					int x = ga.getX();

-					int y = ga.getY();

-					if (x < minX)

-						minX = x;

-					if (y < minY)

-						minY = y;

-				}

-			}

-			

-			shiftX = minX;

-			shiftY = minY;

-			

-			for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {

-				GraphicsAlgorithm ga = pe.getGraphicsAlgorithm();

-				if (ga!=null) {

-					int w = ga.getX() - minX + ga.getWidth();

-					int h = ga.getY() - minY + ga.getHeight();

-					if (w > minWidth)

-						minWidth = w;

-					if (h > minHeight)

-						minHeight = h;

-				}

-			}

-			if (minWidth<=0)

-				minWidth = GraphicsUtil.TASK_DEFAULT_WIDTH;

-			if (minHeight<=0)

-				minHeight = GraphicsUtil.TASK_DEFAULT_HEIGHT;

-		}

-

-		public int getShiftX() {

-			return shiftX;

-		}

-

-		public int getShiftY() {

-			return shiftY;

-		}

-		

-		public int getWidth() {

-			return minWidth;

-		}

-		

-		public int getHeight() {

-			return minHeight;

-		}

-	}

-}

+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ *  All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.Activity;
+import org.eclipse.bpmn2.di.BPMNShape;
+import org.eclipse.bpmn2.modeler.core.Activator;
+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
+import org.eclipse.bpmn2.modeler.core.features.DefaultResizeBPMNShapeFeature;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
+import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.IResizeShapeContext;
+import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+
+public class ResizeExpandableActivityFeature extends DefaultResizeBPMNShapeFeature {
+	public final static int MARGIN = 20;
+	
+	public ResizeExpandableActivityFeature(IFeatureProvider fp) {
+		super(fp);
+	}
+	
+	@Override
+	public void resizeShape(IResizeShapeContext context) {
+
+		ResizeShapeContext resizeShapeContext = (ResizeShapeContext)context;
+
+		ContainerShape containerShape = (ContainerShape) context.getPictogramElement();
+		Activity activity = BusinessObjectUtil.getFirstElementOfType(containerShape, Activity.class);
+		try {
+			BPMNShape shape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(activity);
+			
+			if (shape.isIsExpanded()) {
+
+				// SubProcess is expanded
+				
+				GraphicsAlgorithm parentGa = containerShape.getGraphicsAlgorithm();
+				int newWidth = resizeShapeContext.getWidth();
+				int newHeight = resizeShapeContext.getHeight();
+				SizeCalculator sizeCalc = new SizeCalculator(containerShape);
+				int shiftX = sizeCalc.shiftX;
+				int shiftY = sizeCalc.shiftY;
+				int minWidth = sizeCalc.minWidth;
+				int minHeight = sizeCalc.minHeight;
+				
+				if (shiftX < 0) {
+					for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
+						GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
+						if (childGa!=null) {
+							int x = childGa.getX() - shiftX + MARGIN;
+							childGa.setX(x);
+						}
+					}
+					resizeShapeContext.setX(resizeShapeContext.getX() + shiftX - MARGIN);
+					shiftX = MARGIN;
+				}
+				
+				if (shiftY < 0) {
+					for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
+						GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
+						if (childGa!=null) {
+							int y = childGa.getY() - shiftY + MARGIN;
+							childGa.setY(y);
+						}
+					}
+					resizeShapeContext.setY(resizeShapeContext.getY() + shiftY - MARGIN);
+					shiftX = MARGIN;
+				}
+
+				if (shiftX < MARGIN)
+					shiftX = MARGIN;
+				if (shiftY < MARGIN)
+					shiftY = MARGIN;
+				minWidth += 2 * MARGIN;
+				minHeight += 2 * MARGIN;
+
+				if (newWidth < minWidth) {
+					parentGa.setWidth(minWidth);
+				}
+				if (newWidth < shiftX + minWidth) {
+					int shift = shiftX + minWidth - newWidth;
+					if (shift>shiftX-MARGIN) {
+						shift = shiftX-MARGIN;
+					}
+					if (shift>0) {
+						for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
+							GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
+							if (childGa!=null) {
+								int x = childGa.getX() - shift;
+								childGa.setX(x);
+							}
+						}
+					}
+				}
+				if (newHeight < minHeight) {
+					parentGa.setHeight(minHeight);
+				}
+				if (newHeight < shiftY + minHeight) {
+					int shift = shiftY + minHeight - newHeight;
+					if (shift>shiftY-MARGIN) {
+						shift = shiftY-MARGIN;
+					}
+					if (shift>0) {
+						for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
+							GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
+							if (childGa!=null) {
+								int y = childGa.getY() - shift;
+								childGa.setY(y);
+							}
+						}
+					}
+				}
+				
+				if (resizeShapeContext.getWidth() < minWidth)
+					resizeShapeContext.setWidth(minWidth);
+				if (resizeShapeContext.getHeight() < minHeight)
+					resizeShapeContext.setHeight(minHeight);
+			}
+			else {
+				
+				// SubProcess is collapsed
+				
+				for (PictogramElement pe : FeatureSupport.getContainerDecorators(containerShape)) {
+					GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
+					if (childGa!=null) {
+						childGa.setWidth(GraphicsUtil.getActivitySize(getDiagram()).getWidth());
+						childGa.setHeight(GraphicsUtil.getActivitySize(getDiagram()).getHeight());
+					}
+				}
+				
+				resizeShapeContext.setWidth(GraphicsUtil.getActivitySize(getDiagram()).getWidth());
+				resizeShapeContext.setHeight(GraphicsUtil.getActivitySize(getDiagram()).getHeight());
+			}
+			
+		} catch (Exception e) {
+			Activator.logError(e);
+		}
+		Graphiti.getPeService().sendToBack(containerShape);
+		
+		super.resizeShape(context);
+	}
+	
+	public static class SizeCalculator {
+		
+		int shiftX;
+		int shiftY;
+		int minWidth;
+		int minHeight;
+		ContainerShape containerShape;
+		
+		public SizeCalculator(ContainerShape containerShape) {
+			setShape(containerShape);
+		}
+		
+		public void setShape(ContainerShape containerShape) {
+			this.containerShape = containerShape;
+			calculate();
+		}
+		
+		private void calculate() {
+			int minX = Integer.MAX_VALUE;
+			int minY = Integer.MAX_VALUE;
+			minWidth = 0;
+			minHeight = 0;
+
+			for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
+				GraphicsAlgorithm ga = pe.getGraphicsAlgorithm();
+				if (ga!=null) {
+					int x = ga.getX();
+					int y = ga.getY();
+					if (x < minX)
+						minX = x;
+					if (y < minY)
+						minY = y;
+				}
+			}
+			
+			shiftX = minX;
+			shiftY = minY;
+			
+			for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
+				GraphicsAlgorithm ga = pe.getGraphicsAlgorithm();
+				if (ga!=null) {
+					int w = ga.getX() - minX + ga.getWidth();
+					int h = ga.getY() - minY + ga.getHeight();
+					if (w > minWidth)
+						minWidth = w;
+					if (h > minHeight)
+						minHeight = h;
+				}
+			}
+			if (minWidth<=0)
+				minWidth = GraphicsUtil.TASK_DEFAULT_WIDTH;
+			if (minHeight<=0)
+				minHeight = GraphicsUtil.TASK_DEFAULT_HEIGHT;
+		}
+
+		public int getShiftX() {
+			return shiftX;
+		}
+
+		public int getShiftY() {
+			return shiftY;
+		}
+		
+		public int getWidth() {
+			return minWidth;
+		}
+		
+		public int getHeight() {
+			return minHeight;
+		}
+	}
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/SubProcessFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/SubProcessFeatureContainer.java
index 4602c9a..0cc9133 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/SubProcessFeatureContainer.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/SubProcessFeatureContainer.java
@@ -1,90 +1,79 @@
-/******************************************************************************* 

- * Copyright (c) 2011 Red Hat, Inc. 

- *  All rights reserved. 

- * This program is 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: 

- * Red Hat, Inc. - initial API and implementation 

- *

- * @author Innar Made

- ******************************************************************************/

-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;

-

-import org.eclipse.bpmn2.AdHocSubProcess;

-import org.eclipse.bpmn2.Bpmn2Package;

-import org.eclipse.bpmn2.SubChoreography;

-import org.eclipse.bpmn2.SubProcess;

-import org.eclipse.bpmn2.Transaction;

-import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;

-import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;

-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;

-import org.eclipse.bpmn2.modeler.ui.ImageProvider;

-import org.eclipse.emf.ecore.EClass;

-import org.eclipse.graphiti.features.IAddFeature;

-import org.eclipse.graphiti.features.ICreateFeature;

-import org.eclipse.graphiti.features.IFeatureProvider;

-import org.eclipse.graphiti.features.context.ICreateContext;

-import org.eclipse.graphiti.features.custom.ICustomFeature;

-

-public class SubProcessFeatureContainer extends AbstractSubProcessFeatureContainer {

-

-	public static final String TRIGGERED_BY_EVENT = "triggered-by-event-key";

-	public static final String IS_EXPANDED = "is-expanded-key";

-

-	@Override

-	public boolean canApplyTo(Object o) {

-		return super.canApplyTo(o) && o instanceof SubProcess &&

-				 !(o instanceof AdHocSubProcess ||  o instanceof Transaction);

-	}

-

-	@Override

-	public ICreateFeature getCreateFeature(IFeatureProvider fp) {

-		return new CreateSubProcessFeature(fp);

-	}

-

-	@Override

-	public IAddFeature getAddFeature(IFeatureProvider fp) {

-		return new AddExpandedActivityFeature<SubProcess>(fp);

-	}

-

-	@Override

-	public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {

-		MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);

-		UpdateSubProcessFeature updateSubProcessFeature = new UpdateSubProcessFeature(fp);

-		multiUpdate.addUpdateFeature(updateSubProcessFeature);

-		return multiUpdate;

-	}

-	

-	@Override

-	public ICustomFeature[] getCustomFeatures(IFeatureProvider fp) {

-		ICustomFeature[] superFeatures = super.getCustomFeatures(fp);

-		ICustomFeature[] thisFeatures = new ICustomFeature[2 + superFeatures.length];

-		thisFeatures[0] = new ExpandSubProcessFeature(fp);

-		thisFeatures[1] = new CollapseSubProcessFeature(fp);

-		for (int i=0; i<superFeatures.length; ++i)

-			thisFeatures[2+i] = superFeatures[i];

-		return thisFeatures;

-	}

-

-	public static class CreateSubProcessFeature extends AbstractCreateExpandableFlowNodeFeature<SubProcess> {

-

-		public CreateSubProcessFeature(IFeatureProvider fp) {

-			super(fp, "Sub-Process", "Inner activity");

-		}

-

-		@Override

-		protected String getStencilImageId() {

-			return ImageProvider.IMG_16_SUB_PROCESS;

-		}

-

-		/* (non-Javadoc)

-		 * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()

-		 */

-		@Override

-		public EClass getBusinessObjectClass() {

-			return Bpmn2Package.eINSTANCE.getSubProcess();

-		}

-	}

+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ *  All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.AdHocSubProcess;
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.SubChoreography;
+import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.Transaction;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
+import org.eclipse.bpmn2.modeler.ui.ImageProvider;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.graphiti.features.IAddFeature;
+import org.eclipse.graphiti.features.ICreateFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.ICreateContext;
+import org.eclipse.graphiti.features.custom.ICustomFeature;
+
+public class SubProcessFeatureContainer extends AbstractExpandableActivityFeatureContainer {
+
+	public static final String TRIGGERED_BY_EVENT = "triggered-by-event-key";
+	public static final String IS_EXPANDED = "is-expanded-key";
+
+	@Override
+	public boolean canApplyTo(Object o) {
+		return super.canApplyTo(o) && o instanceof SubProcess &&
+				 !(o instanceof AdHocSubProcess ||  o instanceof Transaction);
+	}
+
+	@Override
+	public ICreateFeature getCreateFeature(IFeatureProvider fp) {
+		return new CreateSubProcessFeature(fp);
+	}
+
+	@Override
+	public IAddFeature getAddFeature(IFeatureProvider fp) {
+		return new AddExpandableActivityFeature<SubProcess>(fp);
+	}
+
+	@Override
+	public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+		MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
+		UpdateExpandableActivityFeature updateFeature = new UpdateExpandableActivityFeature(fp);
+		multiUpdate.addUpdateFeature(updateFeature);
+		return multiUpdate;
+	}
+
+	public static class CreateSubProcessFeature extends AbstractCreateExpandableFlowNodeFeature<SubProcess> {
+
+		public CreateSubProcessFeature(IFeatureProvider fp) {
+			super(fp, "Sub-Process", "Inner activity");
+		}
+
+		@Override
+		protected String getStencilImageId() {
+			return ImageProvider.IMG_16_SUB_PROCESS;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
+		 */
+		@Override
+		public EClass getBusinessObjectClass() {
+			return Bpmn2Package.eINSTANCE.getSubProcess();
+		}
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/TransactionFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/TransactionFeatureContainer.java
index 0d7a338..c315fed 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/TransactionFeatureContainer.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/TransactionFeatureContainer.java
@@ -1,103 +1,112 @@
-/******************************************************************************* 

- * Copyright (c) 2011 Red Hat, Inc. 

- *  All rights reserved. 

- * This program is 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: 

- * Red Hat, Inc. - initial API and implementation 

- *

- * @author Innar Made

- ******************************************************************************/

-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;

-

-import org.eclipse.bpmn2.Bpmn2Package;

-import org.eclipse.bpmn2.Transaction;

-import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;

-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;

-import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;

-import org.eclipse.bpmn2.modeler.ui.ImageProvider;

-import org.eclipse.emf.ecore.EClass;

-import org.eclipse.graphiti.features.IAddFeature;

-import org.eclipse.graphiti.features.ICreateFeature;

-import org.eclipse.graphiti.features.IFeatureProvider;

-import org.eclipse.graphiti.features.ILayoutFeature;

-import org.eclipse.graphiti.features.context.ICreateContext;

-import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;

-import org.eclipse.graphiti.services.Graphiti;

-import org.eclipse.graphiti.services.IGaService;

-

-public class TransactionFeatureContainer extends AbstractSubProcessFeatureContainer {

-

-	private static final int offset = 3;

-

-	@Override

-	public boolean canApplyTo(Object o) {

-		return super.canApplyTo(o) && o instanceof Transaction;

-	}

-

-	@Override

-	public ICreateFeature getCreateFeature(IFeatureProvider fp) {

-		return new CreateTransactionFeature(fp);

-	}

-

-	@Override

-	public IAddFeature getAddFeature(IFeatureProvider fp) {

-		return new AddExpandedActivityFeature<Transaction>(fp) {

-

-			@Override

-			protected void decorateActivityRectangle(RoundedRectangle rect) {

-				IGaService gaService = Graphiti.getGaService();

-				RoundedRectangle innerRect = gaService.createRoundedRectangle(rect, 5, 5);

-				innerRect.setFilled(false);

-				innerRect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));

-				gaService.setLocationAndSize(innerRect, offset, offset, rect.getWidth() - (2 * offset),

-						rect.getHeight() - (2 * offset));

-			}

-

-			@Override

-			protected int getMarkerContainerOffset() {

-				return offset;

-			}

-		};

-	}

-

-	@Override

-	public ILayoutFeature getLayoutFeature(IFeatureProvider fp) {

-		return new LayoutSubProcessFeature(fp) {

-			@Override

-			protected void layoutInRectangle(RoundedRectangle rect) {

-				IGaService gaService = Graphiti.getGaService();

-				RoundedRectangle innerRect = (RoundedRectangle) rect.getGraphicsAlgorithmChildren().get(0);

-				gaService.setSize(innerRect, rect.getWidth() - 6, rect.getHeight() - 6);

-			}

-

-			@Override

-			protected int getMarkerContainerOffset() {

-				return offset;

-			}

-		};

-	}

-

-	public static class CreateTransactionFeature extends AbstractCreateExpandableFlowNodeFeature<Transaction> {

-

-		public CreateTransactionFeature(IFeatureProvider fp) {

-			super(fp, "Transaction",

-					"Specialized description of sub-process that will have behavior controlled by transaction protocol");

-		}

-

-		@Override

-		protected String getStencilImageId() {

-			return ImageProvider.IMG_16_TRANSACTION;

-		}

-

-		/* (non-Javadoc)

-		 * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()

-		 */

-		@Override

-		public EClass getBusinessObjectClass() {

-			return Bpmn2Package.eINSTANCE.getTransaction();

-		}

-	}

+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ *  All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.Transaction;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
+import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
+import org.eclipse.bpmn2.modeler.ui.ImageProvider;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.graphiti.features.IAddFeature;
+import org.eclipse.graphiti.features.ICreateFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.ILayoutFeature;
+import org.eclipse.graphiti.features.context.ICreateContext;
+import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.services.IGaService;
+
+public class TransactionFeatureContainer extends AbstractExpandableActivityFeatureContainer {
+
+	private static final int offset = 3;
+
+	@Override
+	public boolean canApplyTo(Object o) {
+		return super.canApplyTo(o) && o instanceof Transaction;
+	}
+
+	@Override
+	public ICreateFeature getCreateFeature(IFeatureProvider fp) {
+		return new CreateTransactionFeature(fp);
+	}
+
+	@Override
+	public IAddFeature getAddFeature(IFeatureProvider fp) {
+		return new AddExpandableActivityFeature<Transaction>(fp) {
+
+			@Override
+			protected void decorateActivityRectangle(RoundedRectangle rect) {
+				IGaService gaService = Graphiti.getGaService();
+				RoundedRectangle innerRect = gaService.createRoundedRectangle(rect, 5, 5);
+				innerRect.setFilled(false);
+				innerRect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+				gaService.setLocationAndSize(innerRect, offset, offset, rect.getWidth() - (2 * offset),
+						rect.getHeight() - (2 * offset));
+			}
+
+			@Override
+			protected int getMarkerContainerOffset() {
+				return offset;
+			}
+		};
+	}
+
+	@Override
+	public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+		MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
+		UpdateExpandableActivityFeature updateFeature = new UpdateExpandableActivityFeature(fp);
+		multiUpdate.addUpdateFeature(updateFeature);
+		return multiUpdate;
+	}
+
+	@Override
+	public ILayoutFeature getLayoutFeature(IFeatureProvider fp) {
+		return new LayoutExpandableActivityFeature(fp) {
+			@Override
+			protected void layoutInRectangle(RoundedRectangle rect) {
+				IGaService gaService = Graphiti.getGaService();
+				RoundedRectangle innerRect = (RoundedRectangle) rect.getGraphicsAlgorithmChildren().get(0);
+				gaService.setSize(innerRect, rect.getWidth() - 6, rect.getHeight() - 6);
+			}
+
+			@Override
+			protected int getMarkerContainerOffset() {
+				return offset;
+			}
+		};
+	}
+
+	public static class CreateTransactionFeature extends AbstractCreateExpandableFlowNodeFeature<Transaction> {
+
+		public CreateTransactionFeature(IFeatureProvider fp) {
+			super(fp, "Transaction",
+					"Specialized sub-process that will have behavior controlled by transaction protocol");
+		}
+
+		@Override
+		protected String getStencilImageId() {
+			return ImageProvider.IMG_16_TRANSACTION;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
+		 */
+		@Override
+		public EClass getBusinessObjectClass() {
+			return Bpmn2Package.eINSTANCE.getTransaction();
+		}
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateSubProcessFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateExpandableActivityFeature.java
similarity index 95%
rename from org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateSubProcessFeature.java
rename to org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateExpandableActivityFeature.java
index 4c91aaf..38a741f 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateSubProcessFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateExpandableActivityFeature.java
@@ -1,114 +1,114 @@
-/******************************************************************************* 

- * Copyright (c) 2011 Red Hat, Inc. 

- *  All rights reserved. 

- * This program is 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: 

- * Red Hat, Inc. - initial API and implementation 

- *

- * @author Innar Made

- ******************************************************************************/

-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;

-

-import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.TRIGGERED_BY_EVENT;

-import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.IS_EXPANDED;

-

-import java.io.IOException;

-

-import org.eclipse.bpmn2.SubProcess;

-import org.eclipse.bpmn2.di.BPMNShape;

-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;

-import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport;

-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;

-import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;

-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.Expand;

-import org.eclipse.graphiti.features.IFeatureProvider;

-import org.eclipse.graphiti.features.IReason;

-import org.eclipse.graphiti.features.context.IUpdateContext;

-import org.eclipse.graphiti.features.impl.AbstractUpdateFeature;

-import org.eclipse.graphiti.features.impl.Reason;

-import org.eclipse.graphiti.mm.Property;

-import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;

-import org.eclipse.graphiti.mm.algorithms.styles.LineStyle;

-import org.eclipse.graphiti.mm.pictograms.ContainerShape;

-import org.eclipse.graphiti.services.Graphiti;

-

-public class UpdateSubProcessFeature extends AbstractUpdateFeature {

-

-	public UpdateSubProcessFeature(IFeatureProvider fp) {

-		super(fp);

-	}

-

-	@Override

-	public boolean canUpdate(IUpdateContext context) {

-		Object bo = getBusinessObjectForPictogramElement(context.getPictogramElement());

-		return bo != null && bo instanceof SubProcess;

-	}

-

-	@Override

-	public IReason updateNeeded(IUpdateContext context) {

-		Property triggerProperty = Graphiti.getPeService().getProperty(context.getPictogramElement(),

-		        TRIGGERED_BY_EVENT);

-		Property expandedProperty = Graphiti.getPeService().getProperty(context.getPictogramElement(),

-		        IS_EXPANDED);

-		

-		SubProcess process = (SubProcess) getBusinessObjectForPictogramElement(context.getPictogramElement());

-		try {

-			BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(process);

-			if (expandedProperty != null && Boolean.parseBoolean(expandedProperty.getValue()) != bpmnShape.isIsExpanded()) {

-				return Reason.createTrueReason("Expanded property changed");

-			}

-			

-		} catch (Exception e) {

-			throw new IllegalStateException("Could not get DI shape for subprocess:"+process);

-		}

-

-		if (triggerProperty != null && Boolean.parseBoolean(triggerProperty.getValue()) != process.isTriggeredByEvent()) {

-			return Reason.createTrueReason("Trigger property changed");

-		}

-			

-		return Reason.createFalseReason();

-	}

-

-	@Override

-	public boolean update(IUpdateContext context) {

-		SubProcess process = (SubProcess) getBusinessObjectForPictogramElement(context.getPictogramElement());

-		ContainerShape container = (ContainerShape) context.getPictogramElement();

-		ContainerShape markerContainer = (ContainerShape) GraphicsUtil.getShape(container,

-				GraphicsUtil.ACTIVITY_MARKER_CONTAINER);

-		boolean isExpanded = false;

-		

-		try {

-			BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(process);

-			isExpanded =bpmnShape.isIsExpanded();

-		} catch (IOException e) {

-			throw new IllegalStateException("Could not get DI shape for subprocess:"+process);

-		}

-		Graphiti.getPeService().setPropertyValue(context.getPictogramElement(), TRIGGERED_BY_EVENT,

-		        Boolean.toString(process.isTriggeredByEvent()));

-		Graphiti.getPeService().setPropertyValue(context.getPictogramElement(), IS_EXPANDED,

-		        Boolean.toString(isExpanded));

-

-		RoundedRectangle rectangle = (RoundedRectangle) Graphiti.getPeService()

-		        .getAllContainedPictogramElements(context.getPictogramElement()).iterator().next()

-		        .getGraphicsAlgorithm();

-		LineStyle lineStyle = process.isTriggeredByEvent() ? LineStyle.DOT : LineStyle.SOLID;

-		rectangle.setLineStyle(lineStyle);

-

-		if(!isExpanded){

-			FeatureSupport.setContainerChildrenVisible(container, false);

-			

-			Expand expand = GraphicsUtil.createActivityMarkerExpand(markerContainer);

-			expand.rect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));

-			expand.horizontal.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));

-			expand.vertical.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));

-		}else{

-			GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);

-			FeatureSupport.setContainerChildrenVisible(container, true);

-		}

-		

-		return true;

-	}

+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ *  All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.TRIGGERED_BY_EVENT;
+import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.IS_EXPANDED;
+
+import java.io.IOException;
+
+import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.di.BPMNShape;
+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
+import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
+import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.Expand;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.IReason;
+import org.eclipse.graphiti.features.context.IUpdateContext;
+import org.eclipse.graphiti.features.impl.AbstractUpdateFeature;
+import org.eclipse.graphiti.features.impl.Reason;
+import org.eclipse.graphiti.mm.Property;
+import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;
+import org.eclipse.graphiti.mm.algorithms.styles.LineStyle;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.services.Graphiti;
+
+public class UpdateExpandableActivityFeature extends AbstractUpdateFeature {
+
+	public UpdateExpandableActivityFeature(IFeatureProvider fp) {
+		super(fp);
+	}
+
+	@Override
+	public boolean canUpdate(IUpdateContext context) {
+		Object bo = getBusinessObjectForPictogramElement(context.getPictogramElement());
+		return AbstractExpandableActivityFeatureContainer.isExpandableElement(bo);
+	}
+
+	@Override
+	public IReason updateNeeded(IUpdateContext context) {
+		Property triggerProperty = Graphiti.getPeService().getProperty(context.getPictogramElement(),
+		        TRIGGERED_BY_EVENT);
+		Property expandedProperty = Graphiti.getPeService().getProperty(context.getPictogramElement(),
+		        IS_EXPANDED);
+		
+		SubProcess process = (SubProcess) getBusinessObjectForPictogramElement(context.getPictogramElement());
+		try {
+			BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(process);
+			if (expandedProperty != null && Boolean.parseBoolean(expandedProperty.getValue()) != bpmnShape.isIsExpanded()) {
+				return Reason.createTrueReason("Expanded property changed");
+			}
+			
+		} catch (Exception e) {
+			throw new IllegalStateException("Could not get DI shape for subprocess:"+process);
+		}
+
+		if (triggerProperty != null && Boolean.parseBoolean(triggerProperty.getValue()) != process.isTriggeredByEvent()) {
+			return Reason.createTrueReason("Trigger property changed");
+		}
+			
+		return Reason.createFalseReason();
+	}
+
+	@Override
+	public boolean update(IUpdateContext context) {
+		SubProcess process = (SubProcess) getBusinessObjectForPictogramElement(context.getPictogramElement());
+		ContainerShape container = (ContainerShape) context.getPictogramElement();
+		ContainerShape markerContainer = (ContainerShape) GraphicsUtil.getShape(container,
+				GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
+		boolean isExpanded = false;
+		
+		try {
+			BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(process);
+			isExpanded =bpmnShape.isIsExpanded();
+		} catch (IOException e) {
+			throw new IllegalStateException("Could not get DI shape for subprocess:"+process);
+		}
+		Graphiti.getPeService().setPropertyValue(context.getPictogramElement(), TRIGGERED_BY_EVENT,
+		        Boolean.toString(process.isTriggeredByEvent()));
+		Graphiti.getPeService().setPropertyValue(context.getPictogramElement(), IS_EXPANDED,
+		        Boolean.toString(isExpanded));
+
+		RoundedRectangle rectangle = (RoundedRectangle) Graphiti.getPeService()
+		        .getAllContainedPictogramElements(context.getPictogramElement()).iterator().next()
+		        .getGraphicsAlgorithm();
+		LineStyle lineStyle = process.isTriggeredByEvent() ? LineStyle.DOT : LineStyle.SOLID;
+		rectangle.setLineStyle(lineStyle);
+
+		if(!isExpanded){
+			FeatureSupport.setContainerChildrenVisible(container, false);
+			
+			Expand expand = GraphicsUtil.createActivityMarkerExpand(markerContainer);
+			expand.rect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+			expand.horizontal.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+			expand.vertical.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+		}else{
+			GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
+			FeatureSupport.setContainerChildrenVisible(container, true);
+		}
+		
+		return true;
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/ChoreographyTaskFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/ChoreographyTaskFeatureContainer.java
index 9f5e754..d6260c5 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/ChoreographyTaskFeatureContainer.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/ChoreographyTaskFeatureContainer.java
@@ -1,163 +1,163 @@
-/******************************************************************************* 

- * Copyright (c) 2011 Red Hat, Inc. 

- *  All rights reserved. 

- * This program is 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: 

- * Red Hat, Inc. - initial API and implementation 

- *

- * @author Innar Made

- ******************************************************************************/

-package org.eclipse.bpmn2.modeler.ui.features.choreography;

-

-import java.util.ArrayList;

-import java.util.List;

-

-import org.eclipse.bpmn2.BaseElement;

-import org.eclipse.bpmn2.Bpmn2Package;

-import org.eclipse.bpmn2.ChoreographyLoopType;

-import org.eclipse.bpmn2.ChoreographyTask;

-import org.eclipse.bpmn2.MessageFlow;

-import org.eclipse.bpmn2.Participant;

-import org.eclipse.bpmn2.di.BPMNShape;

-import org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature;

-import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;

-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;

-import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;

-import org.eclipse.bpmn2.modeler.ui.ImageProvider;

-import org.eclipse.bpmn2.modeler.ui.features.AbstractDefaultDeleteFeature;

-import org.eclipse.bpmn2.modeler.ui.features.activity.AppendActivityFeature;

-import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.CollapseSubProcessFeature;

-import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.ExpandSubProcessFeature;

-import org.eclipse.bpmn2.modeler.ui.features.event.AppendEventFeature;

-import org.eclipse.bpmn2.modeler.ui.features.gateway.AppendGatewayFeature;

-import org.eclipse.emf.common.util.EList;

-import org.eclipse.emf.ecore.EClass;

-import org.eclipse.emf.ecore.EObject;

-import org.eclipse.graphiti.features.IAddFeature;

-import org.eclipse.graphiti.features.ICreateFeature;

-import org.eclipse.graphiti.features.IDeleteFeature;

-import org.eclipse.graphiti.features.IFeatureProvider;

-import org.eclipse.graphiti.features.context.ICreateContext;

-import org.eclipse.graphiti.features.context.IDeleteContext;

-import org.eclipse.graphiti.features.context.IPictogramElementContext;

-import org.eclipse.graphiti.features.context.impl.DeleteContext;

-import org.eclipse.graphiti.features.custom.ICustomFeature;

-import org.eclipse.graphiti.mm.pictograms.Anchor;

-import org.eclipse.graphiti.mm.pictograms.Connection;

-import org.eclipse.graphiti.mm.pictograms.ContainerShape;

-import org.eclipse.graphiti.mm.pictograms.PictogramElement;

-import org.eclipse.graphiti.services.Graphiti;

-

-public class ChoreographyTaskFeatureContainer extends AbstractChoreographyFeatureContainer {

-

-	@Override

-	public boolean canApplyTo(Object o) {

-		return super.canApplyTo(o) && o instanceof ChoreographyTask;

-	}

-

-	@Override

-	public ICreateFeature getCreateFeature(IFeatureProvider fp) {

-		return new CreateChoreographyTaskFeature(fp);

-	}

-

-	@Override

-	public IAddFeature getAddFeature(IFeatureProvider fp) {

-		return new AddChoreographyTaskFeature(fp);

-	}

-

-	@Override

-	public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {

-		MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);

-		multiUpdate.addUpdateFeature(new UpdateChoreographyMessageFlowFeature(fp));

-		return multiUpdate;

-	}

-

-	@Override

-	public IDeleteFeature getDeleteFeature(IFeatureProvider fp) {

-		return new AbstractDefaultDeleteFeature(fp) {

-			

-			@Override

-			protected void deletePeEnvironment(PictogramElement pictogramElement){

-				if (pictogramElement instanceof ContainerShape) {

-					ContainerShape cShape = (ContainerShape) pictogramElement;

-					EList<Anchor> anchors = cShape.getAnchors();

-					for (Anchor anchor : anchors) {

-						deleteConnections(getFeatureProvider(), anchor.getIncomingConnections());

-						deleteConnections(getFeatureProvider(), anchor.getOutgoingConnections());

-					}

-					deleteContainer(getFeatureProvider(), cShape);

-				}

-			}

-

-			@Override

-			protected void deleteConnections(IFeatureProvider fp, EList<Connection> connections) {

-				List<Connection> con = new ArrayList<Connection>();

-				con.addAll(connections);

-				for (Connection connection : con) {

-					// if this is a messageflow, delete the message figure as well

-					BaseElement be = BusinessObjectUtil.getFirstElementOfType(connection, BaseElement.class);

-					if (be instanceof MessageFlow) {

-						EObject msg = connection.getEnd().eContainer();

-						if (msg instanceof PictogramElement) {

-							Graphiti.getPeService().deletePictogramElement((PictogramElement)msg);

-						}

-					}

-					IDeleteContext conDelete = new DeleteContext(connection);

-					IDeleteFeature df = fp.getDeleteFeature(conDelete);

-					df.delete(conDelete);

-				}

-			}

-

-			@Override

-			protected void deleteContainer(IFeatureProvider fp, ContainerShape cShape) {

-				Object[] children = cShape.getChildren().toArray();

-				for (Object shape : children) {

-					if (shape instanceof ContainerShape) {

-						ContainerShape cs = (ContainerShape)shape;

-						BaseElement be = BusinessObjectUtil.getFirstElementOfType(cs, BaseElement.class);

-						if (be instanceof Participant) {

-							BPMNShape bs = BusinessObjectUtil.getFirstElementOfType(cs, BPMNShape.class);

-							Graphiti.getPeService().deletePictogramElement(cs);

-							if (bs!=null)

-								deleteBusinessObject(bs);

-						}

-					}

-				}

-			}

-		};

-	}

-	

-	@Override

-	public ICustomFeature[] getCustomFeatures(IFeatureProvider fp) {

-		ICustomFeature[] superFeatures = super.getCustomFeatures(fp);

-		ICustomFeature[] thisFeatures = new ICustomFeature[1 + superFeatures.length];

-		int i;

-		for (i=0; i<superFeatures.length; ++i)

-			thisFeatures[i] = superFeatures[i];

-		thisFeatures[i++] = new AddChoreographyParticipantFeature(fp);

-		return thisFeatures;

-	}

-

-	public static class CreateChoreographyTaskFeature extends AbstractCreateFlowElementFeature<ChoreographyTask> {

-

-		public CreateChoreographyTaskFeature(IFeatureProvider fp) {

-			super(fp, "Choreography Task", "Represents interactions between two participants");

-		}

-

-		@Override

-		public String getStencilImageId() {

-			return ImageProvider.IMG_16_CHOREOGRAPHY_TASK;

-		}

-

-		/* (non-Javadoc)

-		 * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()

-		 */

-		@Override

-		public EClass getBusinessObjectClass() {

-			return Bpmn2Package.eINSTANCE.getChoreographyTask();

-		}

-	}

+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ *  All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.choreography;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.bpmn2.BaseElement;
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.ChoreographyLoopType;
+import org.eclipse.bpmn2.ChoreographyTask;
+import org.eclipse.bpmn2.MessageFlow;
+import org.eclipse.bpmn2.Participant;
+import org.eclipse.bpmn2.di.BPMNShape;
+import org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
+import org.eclipse.bpmn2.modeler.ui.ImageProvider;
+import org.eclipse.bpmn2.modeler.ui.features.AbstractDefaultDeleteFeature;
+import org.eclipse.bpmn2.modeler.ui.features.activity.AppendActivityFeature;
+import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.CollapseFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.ExpandFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.ui.features.event.AppendEventFeature;
+import org.eclipse.bpmn2.modeler.ui.features.gateway.AppendGatewayFeature;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.features.IAddFeature;
+import org.eclipse.graphiti.features.ICreateFeature;
+import org.eclipse.graphiti.features.IDeleteFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.ICreateContext;
+import org.eclipse.graphiti.features.context.IDeleteContext;
+import org.eclipse.graphiti.features.context.IPictogramElementContext;
+import org.eclipse.graphiti.features.context.impl.DeleteContext;
+import org.eclipse.graphiti.features.custom.ICustomFeature;
+import org.eclipse.graphiti.mm.pictograms.Anchor;
+import org.eclipse.graphiti.mm.pictograms.Connection;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+
+public class ChoreographyTaskFeatureContainer extends AbstractChoreographyFeatureContainer {
+
+	@Override
+	public boolean canApplyTo(Object o) {
+		return super.canApplyTo(o) && o instanceof ChoreographyTask;
+	}
+
+	@Override
+	public ICreateFeature getCreateFeature(IFeatureProvider fp) {
+		return new CreateChoreographyTaskFeature(fp);
+	}
+
+	@Override
+	public IAddFeature getAddFeature(IFeatureProvider fp) {
+		return new AddChoreographyTaskFeature(fp);
+	}
+
+	@Override
+	public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+		MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
+		multiUpdate.addUpdateFeature(new UpdateChoreographyMessageFlowFeature(fp));
+		return multiUpdate;
+	}
+
+	@Override
+	public IDeleteFeature getDeleteFeature(IFeatureProvider fp) {
+		return new AbstractDefaultDeleteFeature(fp) {
+			
+			@Override
+			protected void deletePeEnvironment(PictogramElement pictogramElement){
+				if (pictogramElement instanceof ContainerShape) {
+					ContainerShape cShape = (ContainerShape) pictogramElement;
+					EList<Anchor> anchors = cShape.getAnchors();
+					for (Anchor anchor : anchors) {
+						deleteConnections(getFeatureProvider(), anchor.getIncomingConnections());
+						deleteConnections(getFeatureProvider(), anchor.getOutgoingConnections());
+					}
+					deleteContainer(getFeatureProvider(), cShape);
+				}
+			}
+
+			@Override
+			protected void deleteConnections(IFeatureProvider fp, EList<Connection> connections) {
+				List<Connection> con = new ArrayList<Connection>();
+				con.addAll(connections);
+				for (Connection connection : con) {
+					// if this is a messageflow, delete the message figure as well
+					BaseElement be = BusinessObjectUtil.getFirstElementOfType(connection, BaseElement.class);
+					if (be instanceof MessageFlow) {
+						EObject msg = connection.getEnd().eContainer();
+						if (msg instanceof PictogramElement) {
+							Graphiti.getPeService().deletePictogramElement((PictogramElement)msg);
+						}
+					}
+					IDeleteContext conDelete = new DeleteContext(connection);
+					IDeleteFeature df = fp.getDeleteFeature(conDelete);
+					df.delete(conDelete);
+				}
+			}
+
+			@Override
+			protected void deleteContainer(IFeatureProvider fp, ContainerShape cShape) {
+				Object[] children = cShape.getChildren().toArray();
+				for (Object shape : children) {
+					if (shape instanceof ContainerShape) {
+						ContainerShape cs = (ContainerShape)shape;
+						BaseElement be = BusinessObjectUtil.getFirstElementOfType(cs, BaseElement.class);
+						if (be instanceof Participant) {
+							BPMNShape bs = BusinessObjectUtil.getFirstElementOfType(cs, BPMNShape.class);
+							Graphiti.getPeService().deletePictogramElement(cs);
+							if (bs!=null)
+								deleteBusinessObject(bs);
+						}
+					}
+				}
+			}
+		};
+	}
+	
+	@Override
+	public ICustomFeature[] getCustomFeatures(IFeatureProvider fp) {
+		ICustomFeature[] superFeatures = super.getCustomFeatures(fp);
+		ICustomFeature[] thisFeatures = new ICustomFeature[1 + superFeatures.length];
+		int i;
+		for (i=0; i<superFeatures.length; ++i)
+			thisFeatures[i] = superFeatures[i];
+		thisFeatures[i++] = new AddChoreographyParticipantFeature(fp);
+		return thisFeatures;
+	}
+
+	public static class CreateChoreographyTaskFeature extends AbstractCreateFlowElementFeature<ChoreographyTask> {
+
+		public CreateChoreographyTaskFeature(IFeatureProvider fp) {
+			super(fp, "Choreography Task", "Represents interactions between two participants");
+		}
+
+		@Override
+		public String getStencilImageId() {
+			return ImageProvider.IMG_16_CHOREOGRAPHY_TASK;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
+		 */
+		@Override
+		public EClass getBusinessObjectClass() {
+			return Bpmn2Package.eINSTANCE.getChoreographyTask();
+		}
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/SubProcessDetailComposite.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/SubProcessDetailComposite.java
index 418b775..ba643a2 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/SubProcessDetailComposite.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/SubProcessDetailComposite.java
@@ -1,52 +1,63 @@
-/*******************************************************************************

- * Copyright (c) 2011 Red Hat, Inc.

- *  All rights reserved.

- * This program is 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:

- * Red Hat, Inc. - initial API and implementation

- *

- * @author Bob Brodt

- ******************************************************************************/

-

-

-package org.eclipse.bpmn2.modeler.ui.property.tasks;

-

-import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractBpmn2PropertySection;

-import org.eclipse.emf.ecore.EObject;

-import org.eclipse.swt.widgets.Composite;

-

-public class SubProcessDetailComposite extends ActivityDetailComposite {

-

-	public SubProcessDetailComposite(Composite parent, int style) {

-		super(parent, style);

-	}

-

-	/**

-	 * @param section

-	 */

-	public SubProcessDetailComposite(AbstractBpmn2PropertySection section) {

-		super(section);

-	}

-

-	@Override

-	public AbstractPropertiesProvider getPropertiesProvider(EObject object) {

-		if (propertiesProvider==null) {

-			propertiesProvider = new AbstractPropertiesProvider(object) {

-				String[] properties = new String[] {

-						"triggeredByEvent",

-						"loopCharacteristics",

-						"properties",

-				};

-				

-				@Override

-				public String[] getProperties() {

-					return properties; 

-				}

-			};

-		}

-		return propertiesProvider;

-	}

+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat, Inc.
+ *  All rights reserved.
+ * This program is 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:
+ * Red Hat, Inc. - initial API and implementation
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+
+
+package org.eclipse.bpmn2.modeler.ui.property.tasks;
+
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractBpmn2PropertySection;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.swt.widgets.Composite;
+
+public class SubProcessDetailComposite extends ActivityDetailComposite {
+
+	public SubProcessDetailComposite(Composite parent, int style) {
+		super(parent, style);
+	}
+
+	/**
+	 * @param section
+	 */
+	public SubProcessDetailComposite(AbstractBpmn2PropertySection section) {
+		super(section);
+	}
+
+	@Override
+	public AbstractPropertiesProvider getPropertiesProvider(EObject object) {
+		if (propertiesProvider==null) {
+			propertiesProvider = new AbstractPropertiesProvider(object) {
+				String[] properties = new String[] {
+						"anyAttribute",
+						"calledElementRef", // only used in CallActivity
+						"startQuantity",
+						"completionQuantity",
+						"completionCondition",
+						"isForCompensation",
+						"triggeredByEvent",
+						"cancelRemainingInstances",
+						"loopCharacteristics",
+						"boundaryEventDefs",
+						"method",
+						"ordering",
+						"protocol",
+						"properties",
+				};
+				
+				@Override
+				public String[] getProperties() {
+					return properties; 
+				}
+			};
+		}
+		return propertiesProvider;
+	}
 }
\ No newline at end of file