Merge branch 'develop' into X-multipage
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractAddActivityFeature.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractAddActivityFeature.java
index 731e269..d7866e6 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractAddActivityFeature.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractAddActivityFeature.java
@@ -89,12 +89,12 @@
 		decorateActivityRectangle(rect);
 		peService.setPropertyValue(rectShape, IS_ACTIVITY, Boolean.toString(true));
 
-		ContainerShape markerContainer = peService.createContainerShape(containerShape, false);
-		Rectangle markerInvisibleRect = gaService.createInvisibleRectangle(markerContainer);
-		int h = 10;
-		y = height - h - 3 - getMarkerContainerOffset();
-		gaService.setLocationAndSize(markerInvisibleRect, 0, y, invisibleRect.getWidth(), h);
-		peService.setPropertyValue(markerContainer, GraphicsUtil.ACTIVITY_MARKER_CONTAINER, Boolean.toString(true));
+//		ContainerShape markerContainer = peService.createContainerShape(containerShape, false);
+//		Rectangle markerInvisibleRect = gaService.createInvisibleRectangle(markerContainer);
+//		int h = 10;
+//		y = height - h - 3 - getMarkerContainerOffset();
+//		gaService.setLocationAndSize(markerInvisibleRect, 0, y, invisibleRect.getWidth(), h);
+//		peService.setPropertyValue(markerContainer, GraphicsUtil.ACTIVITY_MARKER_CONTAINER, Boolean.toString(true));
 
 		hook(activity, containerShape, context, width, height); // hook for subclasses to inject extra code
 
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractUpdateMarkerFeature.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractUpdateMarkerFeature.java
index 63350ef..6b3fa28 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractUpdateMarkerFeature.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/AbstractUpdateMarkerFeature.java
@@ -59,35 +59,12 @@
 		ContainerShape container = (ContainerShape) context.getPictogramElement();
 		T element = (T) getBusinessObjectForPictogramElement(context.getPictogramElement());
 
-		ContainerShape markerContainer = null;
-		if (isMarkerContainer(container))
-			markerContainer = container;
-		Iterator<Shape> iterator = peService.getAllContainedShapes(container).iterator();
-		while (iterator.hasNext()) {
-			Shape shape = (Shape) iterator.next();
-			if (isMarkerContainer(shape)) {
-				markerContainer = (ContainerShape) shape;
-				break;
-			}
-		}
-		
+		ContainerShape markerContainer = GraphicsUtil.getActivityMarkerContainer(container);
 		doUpdate(element, markerContainer);
 		peService.setPropertyValue(container, getPropertyKey(), convertPropertyToString(element));
 		return true;
     }
 	
-	private boolean isMarkerContainer(Shape shape) {
-		String property = Graphiti.getPeService().getPropertyValue(shape, GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
-		if(property != null && new Boolean(property)) {
-			return shape instanceof ContainerShape;
-		}
-		property = Graphiti.getPeService().getPropertyValue(shape, GraphicsUtil.EVENT_MARKER_CONTAINER);
-		if(property != null && new Boolean(property)) {
-			return shape instanceof ContainerShape;
-		}
-		return false;
-	}
-	
 	protected abstract String getPropertyKey();
 	
 	protected abstract boolean isPropertyChanged(T element, String propertyValue);
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/LayoutActivityFeature.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/LayoutActivityFeature.java
index 15c603a..d2c13ca 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/LayoutActivityFeature.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/LayoutActivityFeature.java
@@ -51,24 +51,27 @@
 	public boolean layout(ILayoutContext context) {
 		ContainerShape containerShape = (ContainerShape) context.getPictogramElement();
 		GraphicsAlgorithm parentGa = containerShape.getGraphicsAlgorithm();
+		int newWidth = parentGa.getWidth();
+		int newHeight = parentGa.getHeight();
 
+		GraphicsUtil.setActivityMarkerOffest(containerShape, getMarkerContainerOffset());
+		GraphicsUtil.layoutActivityMarkerContainer(containerShape);
+		
 		Iterator<Shape> iterator = Graphiti.getPeService().getAllContainedShapes(containerShape).iterator();
 		while (iterator.hasNext()) {
 			Shape shape = iterator.next();
 			GraphicsAlgorithm ga = shape.getGraphicsAlgorithm();
 			IGaService gaService = Graphiti.getGaService();
 
-			int newWidth = parentGa.getWidth();
-			int newHeight = parentGa.getHeight();
 
-			String markerProperty = Graphiti.getPeService().getPropertyValue(shape,
-					GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
-			if (markerProperty != null && new Boolean(markerProperty)) {
-				int x = (newWidth / 2) - (ga.getWidth() / 2);
-				int y = newHeight - ga.getHeight() - 3 - getMarkerContainerOffset();
-				gaService.setLocation(ga, x, y);
-				continue;
-			}
+//			String markerProperty = Graphiti.getPeService().getPropertyValue(shape,
+//					GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
+//			if (markerProperty != null && new Boolean(markerProperty)) {
+//				int x = (newWidth / 2) - (ga.getWidth() / 2);
+//				int y = newHeight - ga.getHeight() - 3 - getMarkerContainerOffset();
+//				gaService.setLocation(ga, x, y);
+//				continue;
+//			}
 
 			Shape rectShape = FeatureSupport.getShape(containerShape, IS_ACTIVITY, Boolean.toString(true));
 			gaService.setSize(rectShape.getGraphicsAlgorithm(), newWidth, newHeight);
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/UpdateActivityCompensateMarkerFeature.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/UpdateActivityCompensateMarkerFeature.java
index feeb510..55e4344 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/UpdateActivityCompensateMarkerFeature.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/UpdateActivityCompensateMarkerFeature.java
@@ -40,11 +40,9 @@
 	@Override
 	protected void doUpdate(Activity activity, ContainerShape markerContainer) {
 		if (activity.isIsForCompensation()) {
-			Compensation compensation = GraphicsUtil.createActivityMarkerCompensate(markerContainer);
-			compensation.arrow1.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
-			compensation.arrow2.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+			GraphicsUtil.showActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_COMPENSATE);
 		} else {
-			GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_COMPENSATE);
+			GraphicsUtil.hideActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_COMPENSATE);
 		}
 	}
 	
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/UpdateActivityLoopAndMultiInstanceMarkerFeature.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/UpdateActivityLoopAndMultiInstanceMarkerFeature.java
index 2382457..cd039ea 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/UpdateActivityLoopAndMultiInstanceMarkerFeature.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/activity/UpdateActivityLoopAndMultiInstanceMarkerFeature.java
@@ -64,25 +64,26 @@
 
 	@Override
 	protected void doUpdate(Activity activity, ContainerShape markerContainer) {
-		GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_LOOP_CHARACTERISTIC);
 		switch (getLoopCharacteristicsValue(activity)) {
 		case LOOP:
-			Loop loop = GraphicsUtil.createActivityMarkerStandardLoop(markerContainer);
-			loop.circle.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
-			loop.arrow.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+			GraphicsUtil.showActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_LC_STANDARD);
+			GraphicsUtil.hideActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_LC_MULTI_PARALLEL);
+			GraphicsUtil.hideActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_LC_MULTI_SEQUENTIAL);
 			break;
 		case MULTI_PARALLEL:
-			MultiInstance multiParallel = GraphicsUtil.createActivityMarkerMultiParallel(markerContainer);
-			multiParallel.line1.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
-			multiParallel.line2.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
-			multiParallel.line3.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+			GraphicsUtil.hideActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_LC_STANDARD);
+			GraphicsUtil.showActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_LC_MULTI_PARALLEL);
+			GraphicsUtil.hideActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_LC_MULTI_SEQUENTIAL);
 			break;
 		case MULTI_SEQUENTIAL:
-			MultiInstance multiSeq = GraphicsUtil.createActivityMarkerMultiSequential(markerContainer);
-			multiSeq.line1.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
-			multiSeq.line2.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
-			multiSeq.line3.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+			GraphicsUtil.hideActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_LC_STANDARD);
+			GraphicsUtil.hideActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_LC_MULTI_PARALLEL);
+			GraphicsUtil.showActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_LC_MULTI_SEQUENTIAL);
 			break;
+		default:
+			GraphicsUtil.hideActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_LC_STANDARD);
+			GraphicsUtil.hideActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_LC_MULTI_PARALLEL);
+			GraphicsUtil.hideActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_LC_MULTI_SEQUENTIAL);
 		}
 	}
 
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/GraphicsUtil.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/GraphicsUtil.java
index 689edc3..b1339f8 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/GraphicsUtil.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/GraphicsUtil.java
@@ -16,6 +16,7 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 import org.eclipse.bpmn2.EventDefinition;
@@ -33,6 +34,7 @@
 import org.eclipse.graphiti.mm.algorithms.Polygon;
 import org.eclipse.graphiti.mm.algorithms.Polyline;
 import org.eclipse.graphiti.mm.algorithms.Rectangle;
+import org.eclipse.graphiti.mm.algorithms.styles.Color;
 import org.eclipse.graphiti.mm.algorithms.styles.Point;
 import org.eclipse.graphiti.mm.pictograms.ContainerShape;
 import org.eclipse.graphiti.mm.pictograms.Diagram;
@@ -43,6 +45,7 @@
 import org.eclipse.graphiti.services.ILayoutService;
 import org.eclipse.graphiti.services.IPeService;
 import org.eclipse.graphiti.ui.services.GraphitiUi;
+import org.eclipse.graphiti.util.IColorConstant;
 
 public class GraphicsUtil {
 
@@ -239,7 +242,7 @@
 		return shape.getGraphicsAlgorithm().getWidth();
 	}
 	
-	public static Shape getShape(ContainerShape container, String propertyKey) {
+	public static Shape getContainedShape(ContainerShape container, String propertyKey) {
 		IPeService peService = Graphiti.getPeService();
 		Iterator<Shape> iterator = peService.getAllContainedShapes(container).iterator();
 		while (iterator.hasNext()) {
@@ -251,6 +254,20 @@
 		}
 		return null;
 	}
+	
+	public static List<PictogramElement> getContainedPictogramElements(PictogramElement container, String propertyKey) {
+		List<PictogramElement> pictogramElements = new ArrayList<PictogramElement>();
+		IPeService peService = Graphiti.getPeService();
+		Iterator<PictogramElement> iterator = peService.getAllContainedPictogramElements(container).iterator();
+		while (iterator.hasNext()) {
+			PictogramElement pe = iterator.next();
+			String property = peService.getPropertyValue(pe, propertyKey);
+			if (property != null && new Boolean(property)) {
+				pictogramElements.add(pe);
+			}
+		}
+		return pictogramElements;
+	}
 
 //	private static final int[] GATEWAY = { 0, GATEWAY_RADIUS, GATEWAY_RADIUS, 0, 2 * GATEWAY_RADIUS, GATEWAY_RADIUS,
 //	        GATEWAY_RADIUS, 2 * GATEWAY_RADIUS };
@@ -486,13 +503,8 @@
 	}
 
 	public static void clearGateway(PictogramElement element) {
-		Iterator<PictogramElement> iterator = peService.getAllContainedPictogramElements(element).iterator();
-		while (iterator.hasNext()) {
-			PictogramElement childElement = iterator.next();
-			boolean deletable = Boolean.parseBoolean(peService.getPropertyValue(childElement, DELETABLE_PROPERTY));
-			if (deletable) {
-				peService.deletePictogramElement(childElement);
-			}
+		for (PictogramElement pe : getContainedPictogramElements(element, DELETABLE_PROPERTY)) {
+			peService.deletePictogramElement(pe);
 		}
 	}
 
@@ -793,22 +805,28 @@
 	public static final int MARKER_WIDTH = 10;
 	public static final int MARKER_HEIGHT = 10;
 
-	public static final String ACTIVITY_MARKER_CONTAINER = "activity.marker.container";
+	private static final String ACTIVITY_MARKER_CONTAINER = "activity.marker.container";
 	public static final String ACTIVITY_MARKER_COMPENSATE = "activity.marker.compensate";
-	public static final String ACTIVITY_MARKER_LOOP_CHARACTERISTIC = "activity.marker.loop.characteristic";
+	public static final String ACTIVITY_MARKER_LC_STANDARD = "activity.marker.lc.standard";
+	public static final String ACTIVITY_MARKER_LC_MULTI_SEQUENTIAL = "activity.marker.lc.multi.sequential";
+	public static final String ACTIVITY_MARKER_LC_MULTI_PARALLEL = "activity.marker.lc.multi.parallel";
 	public static final String ACTIVITY_MARKER_AD_HOC = "activity.marker.adhoc";
 	public static final String ACTIVITY_MARKER_EXPAND = "activity.marker.expand";
+	public static final String ACTIVITY_MARKER_OFFSET = "activity.marker.offset";
 	public static final String EVENT_MARKER_CONTAINER = "event.marker.container";
 
-	public static Compensation createActivityMarkerCompensate(ContainerShape markerContainer) {
+	private static GraphicsAlgorithmContainer createActivityMarkerCompensate(ContainerShape markerContainer) {
 		GraphicsAlgorithmContainer algorithmContainer = createActivityMarkerGaContainer(markerContainer,
 		        ACTIVITY_MARKER_COMPENSATE);
-		return createCompensation(algorithmContainer, MARKER_WIDTH, MARKER_HEIGHT);
+		Compensation compensation = createCompensation(algorithmContainer, MARKER_WIDTH, MARKER_HEIGHT);
+		compensation.arrow1.setForeground(manageColor(markerContainer, StyleUtil.CLASS_FOREGROUND));
+		compensation.arrow2.setForeground(manageColor(markerContainer, StyleUtil.CLASS_FOREGROUND));
+		return algorithmContainer;
 	}
 
-	public static Loop createActivityMarkerStandardLoop(ContainerShape markerContainer) {
+	private static GraphicsAlgorithmContainer createActivityMarkerStandardLoop(ContainerShape markerContainer) {
 		GraphicsAlgorithmContainer algorithmContainer = createActivityMarkerGaContainer(markerContainer,
-		        ACTIVITY_MARKER_LOOP_CHARACTERISTIC);
+				ACTIVITY_MARKER_LC_STANDARD);
 
 		int[] xy = { 8, 10, 10, 5, 5, 0, 0, 5, 3, 10 };
 		int[] bend = { 0, 0, 3, 4, 4, 4, 4, 3, 3, 0 };
@@ -817,38 +835,48 @@
 		Loop loop = new Loop();
 		loop.circle = circle;
 		loop.arrow = gaService.createPolyline(algorithmContainer, new int[] { 5, 5, 5, 10, 0, 10 });
-		return loop;
+		loop.circle.setForeground(manageColor(markerContainer, StyleUtil.CLASS_FOREGROUND));
+		loop.arrow.setForeground(manageColor(markerContainer, StyleUtil.CLASS_FOREGROUND));
+		return algorithmContainer;
 	}
 
-	public static MultiInstance createActivityMarkerMultiParallel(ContainerShape markerContainer) {
+	private static GraphicsAlgorithmContainer createActivityMarkerMultiParallel(ContainerShape markerContainer) {
 		GraphicsAlgorithmContainer algorithmContainer = createActivityMarkerGaContainer(markerContainer,
-		        ACTIVITY_MARKER_LOOP_CHARACTERISTIC);
+				ACTIVITY_MARKER_LC_MULTI_PARALLEL);
 		MultiInstance multiInstance = new MultiInstance();
 		multiInstance.line1 = gaService.createPolyline(algorithmContainer, new int[] { 2, 0, 2, MARKER_HEIGHT });
 		multiInstance.line2 = gaService.createPolyline(algorithmContainer, new int[] { 5, 0, 5, MARKER_HEIGHT });
 		multiInstance.line3 = gaService.createPolyline(algorithmContainer, new int[] { 8, 0, 8, MARKER_HEIGHT });
-		return multiInstance;
+		multiInstance.line1.setForeground(manageColor(markerContainer, StyleUtil.CLASS_FOREGROUND));
+		multiInstance.line2.setForeground(manageColor(markerContainer, StyleUtil.CLASS_FOREGROUND));
+		multiInstance.line3.setForeground(manageColor(markerContainer, StyleUtil.CLASS_FOREGROUND));
+		return algorithmContainer;
 	}
 
-	public static MultiInstance createActivityMarkerMultiSequential(ContainerShape markerContainer) {
+	private static GraphicsAlgorithmContainer createActivityMarkerMultiSequential(ContainerShape markerContainer) {
 		GraphicsAlgorithmContainer algorithmContainer = createActivityMarkerGaContainer(markerContainer,
-		        ACTIVITY_MARKER_LOOP_CHARACTERISTIC);
+		        ACTIVITY_MARKER_LC_MULTI_SEQUENTIAL);
 		MultiInstance multiInstance = new MultiInstance();
 		multiInstance.line1 = gaService.createPolyline(algorithmContainer, new int[] { 0, 2, MARKER_WIDTH, 2 });
 		multiInstance.line2 = gaService.createPolyline(algorithmContainer, new int[] { 0, 5, MARKER_WIDTH, 5 });
 		multiInstance.line3 = gaService.createPolyline(algorithmContainer, new int[] { 0, 8, MARKER_WIDTH, 8 });
-		return multiInstance;
+		multiInstance.line1.setForeground(manageColor(markerContainer, StyleUtil.CLASS_FOREGROUND));
+		multiInstance.line2.setForeground(manageColor(markerContainer, StyleUtil.CLASS_FOREGROUND));
+		multiInstance.line3.setForeground(manageColor(markerContainer, StyleUtil.CLASS_FOREGROUND));
+		return algorithmContainer;
 	}
 
-	public static Polyline createActivityMarkerAdHoc(ContainerShape markerContainer) {
+	private static GraphicsAlgorithmContainer createActivityMarkerAdHoc(ContainerShape markerContainer) {
 		GraphicsAlgorithmContainer algorithmContainer = createActivityMarkerGaContainer(markerContainer,
 		        ACTIVITY_MARKER_AD_HOC);
 		int[] xy = { 0, 8, 3, 2, 7, 8, 10, 2 };
 		int[] bend = { 0, 3, 3, 3, 3, 3, 3, 0 };
-		return gaService.createPolyline(algorithmContainer, xy, bend);
+		Polyline tilde = gaService.createPolyline(algorithmContainer, xy, bend);
+		tilde.setForeground(manageColor(markerContainer, StyleUtil.CLASS_FOREGROUND));
+		return algorithmContainer;
 	}
 
-	public static Expand createActivityMarkerExpand(ContainerShape markerContainer) {
+	private static GraphicsAlgorithmContainer createActivityMarkerExpand(ContainerShape markerContainer) {
 		GraphicsAlgorithmContainer algorithmContainer = createActivityMarkerGaContainer(markerContainer,
 		        ACTIVITY_MARKER_EXPAND);
 
@@ -860,35 +888,118 @@
 		expand.rect = rect;
 		expand.horizontal = gaService.createPolyline(algorithmContainer, new int[] { 0, 5, 10, 5 });
 		expand.vertical = gaService.createPolyline(algorithmContainer, new int[] { 5, 0, 5, 10 });
-		return expand;
+		expand.rect.setForeground(manageColor(markerContainer, StyleUtil.CLASS_FOREGROUND));
+		expand.horizontal.setForeground(manageColor(markerContainer, StyleUtil.CLASS_FOREGROUND));
+		expand.vertical.setForeground(manageColor(markerContainer, StyleUtil.CLASS_FOREGROUND));
+		return algorithmContainer;
 	}
 
-	public static void clearActivityMarker(ContainerShape markerContainer, String property) {
+	
+	public static ContainerShape getActivityMarkerContainer(ContainerShape container) {
+		String property = peService.getPropertyValue(container, ACTIVITY_MARKER_CONTAINER);
+		if (property != null && new Boolean(property)) {
+			return container;
+		}
+		return (ContainerShape) getContainedShape(container, ACTIVITY_MARKER_CONTAINER);
+	}
 
-		int totalWidth = 0;
-		int parentW = ((ContainerShape) markerContainer.eContainer()).getGraphicsAlgorithm().getWidth();
-		int lastX = -1;
+	private static ContainerShape createActivityMarkerContainer(ContainerShape container) {
+		
+		ContainerShape markerContainer = getActivityMarkerContainer(container);
+		if (markerContainer==null) {
+			// need to create a marker container first
+			markerContainer = peService.createContainerShape(container, false);
+			Rectangle markerInvisibleRect = gaService.createInvisibleRectangle(markerContainer);
+			GraphicsAlgorithm ga = container.getGraphicsAlgorithm();
+			int x = ga.getWidth() / 2;
+			int y = ga.getHeight() - 10;
+			int w = 50;
+			int h = 10;
+			gaService.setLocationAndSize(markerInvisibleRect, x, y, w, h);
+			peService.setPropertyValue(markerContainer, GraphicsUtil.ACTIVITY_MARKER_CONTAINER, Boolean.toString(true));
 
-		Iterator<Shape> iterator = peService.getAllContainedShapes(markerContainer).iterator();
-		while (iterator.hasNext()) {
-			Shape shape = iterator.next();
-			String value = peService.getPropertyValue(shape, property);
-			GraphicsAlgorithm ga = shape.getGraphicsAlgorithm();
-			if (value != null && new Boolean(value)) {
-				lastX = ga.getX();
-				peService.deletePictogramElement(shape);
-			} else {
-				totalWidth += ga.getWidth();
-				if (lastX != -1) {
-					gaService.setLocation(ga, lastX, ga.getY(), true);
-					lastX = ga.getX() + ga.getWidth();
-				}
+			createActivityMarkerCompensate(markerContainer);
+			createActivityMarkerStandardLoop(markerContainer);
+			createActivityMarkerMultiParallel(markerContainer);
+			createActivityMarkerMultiSequential(markerContainer);
+			createActivityMarkerAdHoc(markerContainer);
+			createActivityMarkerExpand(markerContainer);
+			
+			// make them all invisible
+			Iterator<Shape> iterator = peService.getAllContainedShapes(markerContainer).iterator();
+			while (iterator.hasNext()) {
+				Shape shape = iterator.next();
+				shape.setVisible(false);
 			}
 		}
+		return markerContainer;
+	}
 
-		totalWidth = totalWidth == 0 ? 10 : totalWidth;
-		GraphicsAlgorithm ga = markerContainer.getGraphicsAlgorithm();
-		gaService.setLocationAndSize(ga, (parentW / 2) - (totalWidth / 2), ga.getY(), totalWidth, MARKER_HEIGHT);
+	public static void setActivityMarkerOffest(ContainerShape container, int offset) {
+		peService.setPropertyValue(container, GraphicsUtil.ACTIVITY_MARKER_OFFSET, Integer.toString(offset));
+	}
+
+	public static int getActivityMarkerOffest(ContainerShape container) {
+		int offset = 0;
+		String s = peService.getPropertyValue(container, GraphicsUtil.ACTIVITY_MARKER_OFFSET);
+		if (s!=null) {
+			try {
+				offset = Integer.parseInt(s);
+			}
+			catch (Exception e) {
+			}
+		}
+		return offset;
+	}
+	
+	public static void layoutActivityMarkerContainer(ContainerShape container) {
+
+		ContainerShape markerContainer = getActivityMarkerContainer(container);
+		if (markerContainer!=null) {
+			int lastX = 0;
+			Iterator<Shape> iterator = peService.getAllContainedShapes(markerContainer).iterator();
+			while (iterator.hasNext()) {
+				Shape marker = iterator.next();
+				if (marker.isVisible()) {
+					GraphicsAlgorithm ga = marker.getGraphicsAlgorithm();
+					gaService.setLocation(ga, lastX, 0);
+					lastX += ga.getWidth() + 3;
+				}
+			}
+			
+			GraphicsAlgorithm parentGa = container.getGraphicsAlgorithm();
+			GraphicsAlgorithm ga = markerContainer.getGraphicsAlgorithm();
+			int newWidth = parentGa.getWidth();
+			int newHeight = parentGa.getHeight();
+			int x = (newWidth / 2) - (lastX / 2);
+			int y = newHeight - 13 - getActivityMarkerOffest(container);
+			gaService.setLocation(ga, x, y);
+		}
+	}
+	
+	public static void showActivityMarker(ContainerShape container, String property) {
+
+		ContainerShape markerContainer = getActivityMarkerContainer(container);
+		if (markerContainer==null) {
+			markerContainer = createActivityMarkerContainer(container);
+		}
+		GraphicsUtil.getContainedShape(markerContainer, property).setVisible(true);
+		layoutActivityMarkerContainer(container);
+	}
+	
+	public static void hideActivityMarker(ContainerShape container, String property) {
+
+		ContainerShape markerContainer = getActivityMarkerContainer(container);
+		if (markerContainer==null) {
+			markerContainer = createActivityMarkerContainer(container);
+		}
+		GraphicsUtil.getContainedShape(markerContainer, property).setVisible(false);
+		layoutActivityMarkerContainer(container);
+	}
+	
+	private static Color manageColor(PictogramElement pe, IColorConstant colorConstant) {
+		Diagram diagram = Graphiti.getPeService().getDiagramForPictogramElement(pe);
+		return Graphiti.getGaService().manageColor(diagram, colorConstant);
 	}
 
 	private static GraphicsAlgorithmContainer createActivityMarkerGaContainer(ContainerShape markerContainer,
@@ -904,9 +1015,11 @@
 		Iterator<Shape> iterator = peService.getAllContainedShapes(markerContainer).iterator();
 		while (iterator.hasNext()) {
 			Shape containedShape = (Shape) iterator.next();
-			GraphicsAlgorithm containedGa = containedShape.getGraphicsAlgorithm();
-			totalWidth += containedGa.getWidth();
-			lastX = containedGa.getX() + containedGa.getWidth();
+			if (containedShape.isVisible()) {
+				GraphicsAlgorithm containedGa = containedShape.getGraphicsAlgorithm();
+				totalWidth += containedGa.getWidth();
+				lastX = containedGa.getX() + containedGa.getWidth();
+			}
 		}
 
 		gaService.setLocationAndSize(ga, (parentW / 2) - (totalWidth / 2), parentH-MARKER_WIDTH, totalWidth, MARKER_HEIGHT);
@@ -1056,17 +1169,4 @@
 		}
 		return true;
 	}
-
-	public static Shape getShapeForProperty(ContainerShape container, String propertyKey) {
-		IPeService peService = Graphiti.getPeService();
-		Iterator<Shape> iterator = peService.getAllContainedShapes(container).iterator();
-		while (iterator.hasNext()) {
-			Shape shape = iterator.next();
-			String property = peService.getPropertyValue(shape, propertyKey);
-			if (property != null && new Boolean(property)) {
-				return shape;
-			}
-		}
-		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/AdHocSubProcessFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AdHocSubProcessFeatureContainer.java
index 7dd32c3..18a7605 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
@@ -53,16 +53,7 @@
 			@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));
-					}
-				}
+				GraphicsUtil.showActivityMarker(container, GraphicsUtil.ACTIVITY_MARKER_AD_HOC);
 			}
 		};
 	}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandableActivityFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandableActivityFeature.java
index eb1304d..dde3483 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandableActivityFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandableActivityFeature.java
@@ -24,7 +24,6 @@
 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;
@@ -76,14 +75,11 @@
 //		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));
+			GraphicsUtil.showActivityMarker(container, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
+		}
+		else {
+			GraphicsUtil.hideActivityMarker(container, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
 		}
 	}
 
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 d8ee2c4..285e51d 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
@@ -198,19 +198,17 @@
 			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);
+			Shape globalTaskShape = GraphicsUtil.getContainedShape(container, GLOBAL_TASK_SHAPE_PROPERTY);
 
 			if (callActivity.getCalledElementRef() == null) {
-				GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
+				GraphicsUtil.hideActivityMarker(container, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
 				if (globalTaskShape != null) {
 					peService.deletePictogramElement(globalTaskShape);
 				}
 			}
 
 			else if (callActivity.getCalledElementRef() instanceof GlobalTask) {
-				GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
+				GraphicsUtil.hideActivityMarker(container, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
 				GlobalTask t = (GlobalTask) callActivity.getCalledElementRef();
 				if (globalTaskShape == null) {
 					globalTaskShape = peService.createShape(container, false);
@@ -227,10 +225,7 @@
 				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));
+				GraphicsUtil.showActivityMarker(container, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
 			}
 
 			peService.setPropertyValue(container, CALL_ACTIVITY_REF_PROPERTY,
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutExpandableActivityFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutExpandableActivityFeature.java
index 45688a0..e41a8a1 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutExpandableActivityFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutExpandableActivityFeature.java
@@ -13,19 +13,24 @@
 package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
 
 import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.Task;
 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.bpmn2.modeler.core.utils.GraphicsUtil;
 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.algorithms.MultiText;
+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;
 
 public class LayoutExpandableActivityFeature extends LayoutActivityFeature {
 
@@ -35,12 +40,13 @@
 
 	@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;
+		if (bo != null && ga instanceof Text) {
+			int padding = GraphicsUtil.TASK_IMAGE_SIZE;
+			int size = ((Text)ga).getFont().getSize();
+			Graphiti.getGaService().setLocationAndSize(ga, 5, 10, newWidth - 10, size);
+			return true;
+		}
+		return false;
 	}
 	
 	@Override
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateExpandableActivityFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateExpandableActivityFeature.java
index 7837a54..bdb3562 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateExpandableActivityFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateExpandableActivityFeature.java
@@ -77,8 +77,6 @@
 		PictogramElement pe = context.getPictogramElement();
 		SubProcess process = (SubProcess) getBusinessObjectForPictogramElement(pe);
 		ContainerShape container = (ContainerShape) pe;
-		ContainerShape markerContainer = (ContainerShape) GraphicsUtil.getShape(container,
-				GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
 		boolean isExpanded = false;
 		
 		try {
@@ -98,14 +96,10 @@
 
 		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));
+			GraphicsUtil.showActivityMarker(container, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
 		}else{
-			GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
 			FeatureSupport.setContainerChildrenVisible(container, true);
+			GraphicsUtil.hideActivityMarker(container, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
 		}
 		
 		return true;