diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/AbstractDetailComposite.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/AbstractDetailComposite.java
index d3f6b70..0983af2 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/AbstractDetailComposite.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/AbstractDetailComposite.java
@@ -16,10 +16,7 @@
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Stack;
 
-import org.eclipse.bpmn2.Bpmn2Package;
-import org.eclipse.bpmn2.modeler.core.adapters.InsertionAdapter;
 import org.eclipse.bpmn2.modeler.core.merrimac.IConstants;
 import org.eclipse.bpmn2.modeler.core.merrimac.dialogs.BooleanObjectEditor;
 import org.eclipse.bpmn2.modeler.core.merrimac.dialogs.ComboObjectEditor;
@@ -36,8 +33,6 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EReference;
 import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.util.BasicFeatureMap;
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
@@ -59,7 +54,6 @@
 import org.eclipse.ui.forms.events.IExpansionListener;
 import org.eclipse.ui.forms.widgets.ExpandableComposite;
 import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
 /**
  * This is a base class for all Property Sheet Sections. The Composite is used to render
@@ -454,7 +448,7 @@
 			
 			String displayName = ModelUtil.getLabel(object, reference);
 
-			ObjectEditor editor;
+			ObjectEditor editor = null;
 			if (ModelUtil.isMultiChoice(object, reference)) {
 				if (reference.isMany()) {
 					editor = new FeatureListObjectEditor(this,object,reference);
@@ -468,7 +462,8 @@
 			else {
 				editor = new TextObjectEditor(this,object,reference);
 			}
-			editor.createControl(parent,displayName);
+			if (editor!=null)
+				editor.createControl(parent,displayName);
 		}
 	}
 
@@ -485,7 +480,6 @@
 	}
 	
 	protected AbstractListComposite bindList(EObject object, EStructuralFeature feature, EClass listItemClass) {
-
 		AbstractListComposite tableComposite = null;
 		if (isModelObjectEnabled(object.eClass(), feature) || isModelObjectEnabled(listItemClass)) {
 			Class clazz = (listItemClass!=null) ?
@@ -503,6 +497,20 @@
 		}
 		return tableComposite;
 	}
+	
+	protected AbstractListComposite bindList(Composite parent, EObject object, EStructuralFeature feature, EClass listItemClass) {
+
+		AbstractListComposite tableComposite = null;
+		if (isModelObjectEnabled(object.eClass(), feature) || isModelObjectEnabled(listItemClass)) {
+			Class clazz = (listItemClass!=null) ?
+					listItemClass.getInstanceClass() :
+					feature.getEType().getInstanceClass();
+			tableComposite = PropertiesCompositeFactory.createListComposite(clazz, parent, AbstractListComposite.DEFAULT_STYLE);
+			tableComposite.setListItemClass(listItemClass);
+			tableComposite.bindList(object, feature);
+		}
+		return tableComposite;
+	}
 
 	public void refresh() {
 		Display.getDefault().asyncExec( new Runnable() {
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/DefaultDetailComposite.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/DefaultDetailComposite.java
index cf6e9f9..15f60b3 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/DefaultDetailComposite.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/DefaultDetailComposite.java
@@ -16,7 +16,11 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.bpmn2.Expression;
+import org.eclipse.bpmn2.FormalExpression;
 import org.eclipse.bpmn2.impl.Bpmn2PackageImpl;
+import org.eclipse.bpmn2.modeler.core.adapters.InsertionAdapter;
+import org.eclipse.bpmn2.modeler.core.merrimac.dialogs.ObjectEditor;
 import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EAttribute;
@@ -24,6 +28,7 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EReference;
 import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 
 public class DefaultDetailComposite extends AbstractDetailComposite {
@@ -215,6 +220,29 @@
 		}
 	}
 
+	
+	protected void bindReference(Composite parent, EObject object, EReference reference) {
+		if (isModelObjectEnabled(object.eClass(), reference)) {
+			if (parent==null)
+				parent = getAttributesParent();
+			
+			String displayName = ModelUtil.getLabel(object, reference);
+
+			if (reference.getEType() == PACKAGE.getExpression()) {
+				FormalExpression expression = (FormalExpression)object.eGet(reference);
+				if (expression==null) {
+					expression = FACTORY.createFormalExpression();
+					InsertionAdapter.add(object, reference, expression);
+				}
+				AbstractDetailComposite composite = PropertiesCompositeFactory.createDetailComposite(Expression.class, getAttributesParent(), SWT.BORDER);
+				composite.setBusinessObject(expression);
+				composite.setTitle(displayName);
+			}
+			else
+				super.bindReference(parent, object, reference);
+		}
+	}
+	
 	/**
 	 * Provider class for the Default Properties sheet tab.
 	 * This simply returns a list of properties, containment ELists and references
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/dialogs/ObjectEditor.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/dialogs/ObjectEditor.java
index 8d7c5b3..dbb6737 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/dialogs/ObjectEditor.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/dialogs/ObjectEditor.java
@@ -13,14 +13,12 @@
 
 package org.eclipse.bpmn2.modeler.core.merrimac.dialogs;
 
-import org.eclipse.bpmn2.modeler.core.Activator;
 import org.eclipse.bpmn2.modeler.core.merrimac.IConstants;
 import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractDetailComposite;
 import org.eclipse.bpmn2.modeler.core.utils.ErrorUtils;
 import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
 import org.eclipse.bpmn2.modeler.core.validation.ValidationStatusAdapter;
 import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
@@ -29,12 +27,9 @@
 import org.eclipse.emf.transaction.TransactionalEditingDomain;
 import org.eclipse.emf.validation.model.ConstraintStatus;
 import org.eclipse.graphiti.mm.pictograms.Diagram;
-import org.eclipse.graphiti.platform.IPlatformImageConstants;
-import org.eclipse.graphiti.tb.ImageDecorator;
 import org.eclipse.graphiti.ui.editor.DiagramEditor;
 import org.eclipse.jface.fieldassist.ControlDecoration;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/Bpmn2ModelerResourceImpl.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/Bpmn2ModelerResourceImpl.java
index 68557da..e267ad5 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/Bpmn2ModelerResourceImpl.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/Bpmn2ModelerResourceImpl.java
@@ -35,6 +35,8 @@
 
 import org.eclipse.bpmn2.Bpmn2Package;
 import org.eclipse.bpmn2.Definitions;
+import org.eclipse.bpmn2.Expression;
+import org.eclipse.bpmn2.FormalExpression;
 import org.eclipse.bpmn2.Import;
 import org.eclipse.bpmn2.InputSet;
 import org.eclipse.bpmn2.ItemDefinition;
@@ -318,6 +320,28 @@
             	return true;
             }
             
+            // empty Expressions should not be saved
+            if (f!=null && f.getEType() == Bpmn2Package.eINSTANCE.getExpression()) {
+            	Expression expression = (Expression)o.eGet(f);
+            	if (expression==null)
+            		return false;
+            	if (expression instanceof FormalExpression) {
+	            	FormalExpression formalExpression = (FormalExpression)expression;
+	            	if (
+	            			(formalExpression.getBody()==null || formalExpression.getBody().isEmpty()) &&
+	            			(formalExpression.getLanguage()==null || formalExpression.getLanguage().isEmpty()) &&
+	            			formalExpression.getEvaluatesToTypeRef()==null) {
+	            		return false;
+	            	}
+            	}
+            }
+            
+            // don't serialize the "body" attribute of FormalExpressions because the expression text
+            // is already in the CDATA section of the <bpmn2:expression> element. This would cause
+            // the expression text to be duplicated on deserialization.
+			if (Bpmn2Package.eINSTANCE.getFormalExpression_Body().equals(f))
+				return false;
+            
             return super.shouldSaveFeature(o, f);
         }
 		
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ModelUtil.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ModelUtil.java
index 4b719d6..e325f69 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ModelUtil.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ModelUtil.java
@@ -1006,20 +1006,22 @@
 	public static boolean setValue(TransactionalEditingDomain domain, final EObject object, final EStructuralFeature feature, final Object value) {
 		ExtendedPropertiesAdapter adapter = AdapterUtil.adapt(object, ExtendedPropertiesAdapter.class);
 		Object oldValue = adapter==null ? object.eGet(feature) : adapter.getFeatureDescriptor(feature).getValue();
-		boolean valueChanged = (value != oldValue);
-		if (value!=null && oldValue!=null)
-			valueChanged = !value.equals(oldValue);
+		final Object newValue = (feature instanceof EReference && !(value instanceof EObject)) ? null : value;
+		
+		boolean valueChanged = (newValue != oldValue);
+		if (newValue!=null && oldValue!=null)
+			valueChanged = !newValue.equals(oldValue);
 		
 		if (valueChanged) {
 			try {
-				if (value instanceof EObject) {
+				if (newValue instanceof EObject) {
 					// make sure the new object is added to its control first
 					// so that it inherits the control's Resource and EditingDomain
 					// before we try to change its value.
-					InsertionAdapter.executeIfNeeded((EObject)value);
+					InsertionAdapter.executeIfNeeded((EObject)newValue);
 				}
 				
-				if (value==null){ // DO NOT use isEmpty() because this erases an object's anyAttribute feature!
+				if (newValue==null){ // DO NOT use isEmpty() because this erases an object's anyAttribute feature!
 					domain.getCommandStack().execute(new RecordingCommand(domain) {
 						@Override
 						protected void doExecute() {
@@ -1028,7 +1030,7 @@
 					});
 				}
 				else if (adapter!=null) { 			// use the Extended Properties adapter if there is one
-					adapter.getFeatureDescriptor(feature).setValue(value);
+					adapter.getFeatureDescriptor(feature).setValue(newValue);
 				}
 				else {
 					// fallback is to set the new value here using good ol' EObject.eSet()
@@ -1036,10 +1038,10 @@
 						@Override
 						protected void doExecute() {
 							if (object.eGet(feature) instanceof List) {
-								((List)object.eGet(feature)).add(value);
+								((List)object.eGet(feature)).add(newValue);
 							}
 							else
-								object.eSet(feature, value);
+								object.eSet(feature, newValue);
 						}
 					});
 				}
diff --git a/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/src/org/eclipse/bpmn2/modeler/runtime/jboss/jbpm5/model/util/ModelResourceImpl.java b/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/src/org/eclipse/bpmn2/modeler/runtime/jboss/jbpm5/model/util/ModelResourceImpl.java
index cbd83c3..dbfc8f5 100644
--- a/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/src/org/eclipse/bpmn2/modeler/runtime/jboss/jbpm5/model/util/ModelResourceImpl.java
+++ b/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/src/org/eclipse/bpmn2/modeler/runtime/jboss/jbpm5/model/util/ModelResourceImpl.java
@@ -32,7 +32,6 @@
 import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.ModelPackage;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EReference;
 import org.eclipse.emf.ecore.EStructuralFeature;
@@ -94,8 +93,6 @@
 			protected boolean shouldSaveFeature(EObject o, EStructuralFeature f) {
 				if (Bpmn2Package.eINSTANCE.getDocumentation_Text().equals(f))
 					return false;
-				if (Bpmn2Package.eINSTANCE.getFormalExpression_Body().equals(f))
-					return false;
 				return super.shouldSaveFeature(o, f);
 			}
 
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/adapters/properties/FormalExpressionPropertiesAdapter.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/adapters/properties/FormalExpressionPropertiesAdapter.java
index d25baec..4e59392 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/adapters/properties/FormalExpressionPropertiesAdapter.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/adapters/properties/FormalExpressionPropertiesAdapter.java
@@ -18,9 +18,12 @@
 import org.eclipse.bpmn2.SequenceFlow;
 import org.eclipse.bpmn2.modeler.core.adapters.ExtendedPropertiesAdapter;
 import org.eclipse.bpmn2.modeler.core.adapters.FeatureDescriptor;
+import org.eclipse.bpmn2.modeler.core.adapters.InsertionAdapter;
 import org.eclipse.bpmn2.modeler.core.adapters.ObjectDescriptor;
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
 
 /**
  * @author Bob Brodt
@@ -39,6 +42,24 @@
     	setFeatureDescriptor(body,
 			new FeatureDescriptor<FormalExpression>(adapterFactory,object,body) {
     		
+    			@Override
+    			
+    			public void setValue(Object context, final Object value) {
+    				final FormalExpression formalExpression = adopt(context);
+    				InsertionAdapter.executeIfNeeded(formalExpression);
+    				TransactionalEditingDomain editingDomain = getEditingDomain(formalExpression);
+					if (editingDomain == null) {
+	    				formalExpression.setBody(value.toString());
+					} else {
+						editingDomain.getCommandStack().execute(new RecordingCommand(editingDomain) {
+							@Override
+							protected void doExecute() {
+			    				formalExpression.setBody(value.toString());
+							}
+						});
+					}
+    			}
+    			
 	    		@Override
 	    		public String getDisplayName(Object context) {
 					FormalExpression expression = adopt(context);
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/MultiInstanceLoopCharacteristicsDetailComposite.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/MultiInstanceLoopCharacteristicsDetailComposite.java
index 03658ce..f0cbfa4 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/MultiInstanceLoopCharacteristicsDetailComposite.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/MultiInstanceLoopCharacteristicsDetailComposite.java
@@ -2,12 +2,15 @@
 
 import org.eclipse.bpmn2.Bpmn2Package;
 import org.eclipse.bpmn2.DataInput;
+import org.eclipse.bpmn2.Expression;
 import org.eclipse.bpmn2.MultiInstanceBehavior;
 import org.eclipse.bpmn2.MultiInstanceLoopCharacteristics;
+import org.eclipse.bpmn2.modeler.core.adapters.InsertionAdapter;
 import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractBpmn2PropertySection;
 import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractDetailComposite;
 import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractListComposite;
 import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDetailComposite;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.PropertiesCompositeFactory;
 import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDetailComposite.AbstractPropertiesProvider;
 import org.eclipse.bpmn2.modeler.core.merrimac.dialogs.ComboObjectEditor;
 import org.eclipse.bpmn2.modeler.core.merrimac.dialogs.FeatureEditingDialog;
@@ -24,15 +27,16 @@
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.transaction.RecordingCommand;
 import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 
 public class MultiInstanceLoopCharacteristicsDetailComposite extends DefaultDetailComposite {
 
-	ObjectEditor noneBehaviorEditor;
-	ObjectEditor oneBehaviorEditor;
+	ObjectEditor noneBehaviorEventEditor;
+	ObjectEditor oneBehaviorEventEditor;
 	AbstractListComposite complexBehaviorList;
-	
+
 	public MultiInstanceLoopCharacteristicsDetailComposite(Composite parent, int style) {
 		super(parent, style);
 	}
@@ -47,17 +51,17 @@
 			propertiesProvider = new AbstractPropertiesProvider(object) {
 				String[] properties = new String[] {
 						"anyAttribute",
-						"isSequential", // attr
-						"inputDataItem", // ref
-						"outputDataItem", // ref
-						"completionCondition", // ref
-						"loopCardinality", // ref
-						"loopDataInputRef", // ref
-						"loopDataOutputRef", // ref
-						"behavior", // attr
-						"noneBehaviorEventRef", // ref
-						"oneBehaviorEventRef", // ref
-						"complexBehaviorDefinition", // list
+						"isSequential",
+						"inputDataItem",
+						"outputDataItem",
+						"loopDataInputRef",
+						"loopDataOutputRef",
+						"completionCondition",
+						"loopCardinality",
+						"behavior",
+						"noneBehaviorEventRef",
+						"oneBehaviorEventRef",
+						"complexBehaviorDefinition",
 				};
 				
 				@Override
@@ -69,6 +73,14 @@
 		return propertiesProvider;
 	}
 
+	@Override
+	protected void cleanBindings() {
+		super.cleanBindings();
+		noneBehaviorEventEditor = null;
+		oneBehaviorEventEditor = null;
+		complexBehaviorList = null;
+	}
+
 	public void createBindings(EObject be) {
 		super.createBindings(be);
 	}
@@ -80,57 +92,64 @@
 				@Override
 				protected boolean updateObject(Object result) {
 					MultiInstanceLoopCharacteristics lc = (MultiInstanceLoopCharacteristics)object;
-					boolean update = super.updateObject(result);
-					if (update) {
+					boolean updated = super.updateObject(result);
+					if (updated) {
 						switch (lc.getBehavior()) {
 						case ALL:
-							if (noneBehaviorEditor!=null) {
-								noneBehaviorEditor.setVisible(false);
+							if (noneBehaviorEventEditor!=null) {
+								noneBehaviorEventEditor.setVisible(false);
 							}
-							if (oneBehaviorEditor!=null) {
-								oneBehaviorEditor.setVisible(false);
+							if (oneBehaviorEventEditor!=null) {
+								oneBehaviorEventEditor.setVisible(false);
 							}
 							if (complexBehaviorList!=null) {
 								complexBehaviorList.setVisible(false);
 							}
 							break;
 						case NONE:
-							if (noneBehaviorEditor!=null) {
-								noneBehaviorEditor.setVisible(true);
+							if (noneBehaviorEventEditor!=null) {
+								noneBehaviorEventEditor.setVisible(true);
 							}
-							if (oneBehaviorEditor!=null) {
-								oneBehaviorEditor.setVisible(false);
+							if (oneBehaviorEventEditor!=null) {
+								oneBehaviorEventEditor.setVisible(false);
 							}
 							if (complexBehaviorList!=null) {
 								complexBehaviorList.setVisible(false);
 							}
 							break;
 						case ONE:
-							if (noneBehaviorEditor!=null) {
-								noneBehaviorEditor.setVisible(false);
+							if (noneBehaviorEventEditor!=null) {
+								noneBehaviorEventEditor.setVisible(false);
 							}
-							if (oneBehaviorEditor!=null) {
-								oneBehaviorEditor.setVisible(true);
+							if (oneBehaviorEventEditor!=null) {
+								oneBehaviorEventEditor.setVisible(true);
 							}
 							if (complexBehaviorList!=null) {
 								complexBehaviorList.setVisible(false);
 							}
 							break;
 						case COMPLEX:
-							if (noneBehaviorEditor!=null) {
-								noneBehaviorEditor.setVisible(false);
+							if (noneBehaviorEventEditor!=null) {
+								noneBehaviorEventEditor.setVisible(false);
 							}
-							if (oneBehaviorEditor!=null) {
-								oneBehaviorEditor.setVisible(false);
+							if (oneBehaviorEventEditor!=null) {
+								oneBehaviorEventEditor.setVisible(false);
 							}
 							if (complexBehaviorList!=null) {
 								complexBehaviorList.setVisible(true);
 							}
 							break;
 						}
-						redrawPage();
+						Display.getDefault().asyncExec( new Runnable() {
+
+							@Override
+							public void run() {
+								redrawPage();
+							}
+							
+						});
 					}
-					return update;
+					return updated;
 				}
 			};
 			editor.createControl(parent,label);
@@ -143,32 +162,32 @@
 		MultiInstanceLoopCharacteristics lc = (MultiInstanceLoopCharacteristics)object;
 		EStructuralFeature f;
 
-		if (reference.getName().equals("inputDataItem")) {
+		if (reference == PACKAGE.getMultiInstanceLoopCharacteristics_InputDataItem()) {
 			f = Bpmn2Package.eINSTANCE.getMultiInstanceLoopCharacteristics_InputDataItem();
 			if (isModelObjectEnabled(lc.eClass(), f)) {
 				DataIoObjectEditor inputDataItemEditor = new DataIoObjectEditor(lc,f);
 				inputDataItemEditor.createControl(getAttributesParent(), "Input Paramter");
 			}
 		}
-		else if (reference.getName().equals("outputDataItem")) {
+		else if (reference == PACKAGE.getMultiInstanceLoopCharacteristics_OutputDataItem()) {
 			f = Bpmn2Package.eINSTANCE.getMultiInstanceLoopCharacteristics_OutputDataItem();
 			if (isModelObjectEnabled(lc.eClass(), f)) {
 				DataIoObjectEditor outputDataItemEditor = new DataIoObjectEditor(lc,f);
 				outputDataItemEditor.createControl(getAttributesParent(), "Output Paramter");
 			}
 		}
-		else if (reference.getName().equals("noneBehaviorEventRef")) {
+		else if (reference == PACKAGE.getMultiInstanceLoopCharacteristics_NoneBehaviorEventRef()) {
 			String displayName = ModelUtil.getLabel(object, reference);
-			noneBehaviorEditor = new ComboObjectEditor(this,object,reference);
-			noneBehaviorEditor.createControl(parent,displayName);
-			noneBehaviorEditor.setVisible( lc.getBehavior() == MultiInstanceBehavior.NONE );
+			noneBehaviorEventEditor = new ComboObjectEditor(this,object,reference);
+			noneBehaviorEventEditor.createControl(parent,displayName);
+			noneBehaviorEventEditor.setVisible( lc.getBehavior() == MultiInstanceBehavior.NONE );
 				
 		}		
-		else if (reference.getName().equals("oneBehaviorEventRef")) {
+		else if (reference == PACKAGE.getMultiInstanceLoopCharacteristics_OneBehaviorEventRef()) {
 			String displayName = ModelUtil.getLabel(object, reference);
-			oneBehaviorEditor = new ComboObjectEditor(this,object,reference);
-			oneBehaviorEditor.createControl(parent,displayName);
-			oneBehaviorEditor.setVisible( lc.getBehavior() == MultiInstanceBehavior.ONE );
+			oneBehaviorEventEditor = new ComboObjectEditor(this,object,reference);
+			oneBehaviorEventEditor.createControl(parent,displayName);
+			oneBehaviorEventEditor.setVisible( lc.getBehavior() == MultiInstanceBehavior.ONE );
 		}		
 		else
 			super.bindReference(parent, object, reference);
@@ -177,7 +196,7 @@
 	protected AbstractListComposite bindList(EObject object, EStructuralFeature feature, EClass listItemClass) {
 		MultiInstanceLoopCharacteristics lc = (MultiInstanceLoopCharacteristics)object;
 		if (feature.getName().equals("complexBehaviorDefinition")) {
-			complexBehaviorList = super.bindList(object, feature, listItemClass);
+			complexBehaviorList = super.bindList(getAttributesParent(), object, feature, listItemClass);
 			complexBehaviorList.setVisible( lc.getBehavior() == MultiInstanceBehavior.COMPLEX );
 			return complexBehaviorList;
 		}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/StandardLoopCharacteristicsDetailComposite.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/StandardLoopCharacteristicsDetailComposite.java
index 349dc0c..d8eb51e 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/StandardLoopCharacteristicsDetailComposite.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/StandardLoopCharacteristicsDetailComposite.java
@@ -1,28 +1,12 @@
 package org.eclipse.bpmn2.modeler.ui.property.tasks;
 
-import org.eclipse.bpmn2.Expression;
-import org.eclipse.bpmn2.StandardLoopCharacteristics;
-import org.eclipse.bpmn2.modeler.core.adapters.InsertionAdapter;
 import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractBpmn2PropertySection;
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractDetailComposite;
 import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDetailComposite;
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.PropertiesCompositeFactory;
-import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.RecordingCommand;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 
 public class StandardLoopCharacteristicsDetailComposite extends DefaultDetailComposite {
 
-	AbstractDetailComposite loopConditionComposite = null;
-	AbstractDetailComposite loopMaximumComposite = null;
-	
 	public StandardLoopCharacteristicsDetailComposite(Composite parent, int style) {
 		super(parent, style);
 	}
@@ -30,44 +14,24 @@
 	public StandardLoopCharacteristicsDetailComposite(AbstractBpmn2PropertySection section) {
 		super(section);
 	}
-
-	@Override
-	protected void cleanBindings() {
-		super.cleanBindings();
-		loopConditionComposite = null;
-		loopMaximumComposite = null;
-	}
-
-	public Composite getAttributesParent() {
-		return super.getAttributesParent();
-	}
 	
-	public void createBindings(EObject be) {
-		getAttributesParent();
-		
-		bindAttribute(be,"testBefore");
-		
-		if (be instanceof StandardLoopCharacteristics) {
-			
-			final StandardLoopCharacteristics lc = (StandardLoopCharacteristics) be;
-			
-			Expression loopConditionExpression = lc.getLoopCondition();
-			if (loopConditionExpression==null) {
-				loopConditionExpression = FACTORY.createFormalExpression();
-				InsertionAdapter.add(lc, PACKAGE.getStandardLoopCharacteristics_LoopCondition(), loopConditionExpression);
-			}
-			loopConditionComposite = PropertiesCompositeFactory.createDetailComposite(Expression.class, getAttributesParent(), SWT.NONE);
-			loopConditionComposite.setBusinessObject(loopConditionExpression);
-			loopConditionComposite.setTitle("Loop Condition");
-			
-			Expression loopMaximumExpression = lc.getLoopMaximum();
-			if (loopMaximumExpression==null) {
-				loopMaximumExpression = FACTORY.createFormalExpression();
-				InsertionAdapter.add(lc, PACKAGE.getStandardLoopCharacteristics_LoopMaximum(), loopMaximumExpression);
-			}
-			loopMaximumComposite = PropertiesCompositeFactory.createDetailComposite(Expression.class, getAttributesParent(), SWT.NONE);
-			loopMaximumComposite.setBusinessObject(loopMaximumExpression);
-			loopMaximumComposite.setTitle("Loop Maximum");
+	@Override
+	public AbstractPropertiesProvider getPropertiesProvider(EObject object) {
+		if (propertiesProvider==null) {
+			propertiesProvider = new AbstractPropertiesProvider(object) {
+				String[] properties = new String[] {
+						"anyAttribute",
+						"testBefore",
+						"loopCondition",
+						"loopMaximum",
+				};
+				
+				@Override
+				public String[] getProperties() {
+					return properties; 
+				}
+			};
 		}
+		return propertiesProvider;
 	}
 }
