https://bugs.eclipse.org/bugs/show_bug.cgi?id=389905 - InputDataItem and
OutputDataItem fixes for MultiInstanceLoopCharacteristics. Also reworked
"Loop Characteristics" property section.
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;
 	}
 }