Missed one
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/ModelHandler.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/ModelHandler.java
index a1f6a1b..953f681 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/ModelHandler.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/ModelHandler.java
@@ -582,6 +582,7 @@
 		FlowElementsContainer container = getFlowElementContainer(target);
 		if (container.getLaneSets().isEmpty()) {
 			LaneSet laneSet = create(LaneSet.class);
+			laneSet.setName("Lane Set "+ModelUtil.getIDNumber( laneSet.getId() ));
 			container.getLaneSets().add(laneSet);
 		}
 		container.getLaneSets().get(0).getLanes().add(lane);
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/AbstractListComposite.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/AbstractListComposite.java
index e21344f..bca83cd 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/AbstractListComposite.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/AbstractListComposite.java
@@ -14,6 +14,7 @@
 package org.eclipse.bpmn2.modeler.core.merrimac.clad;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 
 import org.eclipse.bpmn2.modeler.core.Activator;
@@ -22,11 +23,13 @@
 import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.ecore.EAttribute;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.util.BasicFeatureMap;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.util.FeatureMap;
 import org.eclipse.emf.ecore.util.FeatureMap.Entry;
 import org.eclipse.emf.edit.provider.INotifyChangedListener;
@@ -702,12 +705,71 @@
 	    return section;
 	}
 
+	@SuppressWarnings("unchecked")
 	@Override
 	public void notifyChanged(Notification notification) {
-		if (this.businessObject == notification.getNotifier() &&
-				this.feature == notification.getFeature()) {
-			final EList<EObject> list = (EList<EObject>)businessObject.eGet(feature);
-			tableViewer.setInput(list);
+		EList<EObject> table = (EList<EObject>)businessObject.eGet(feature);
+		Object n = notification.getNotifier();
+		if (table.contains(n)) {
+			tableViewer.setInput(table);
+			return; // quick exit before the exhaustive search that follows
 		}
+		if (n instanceof EObject) {
+			HashSet<Object> visited = new HashSet<Object>(); 
+			if (refreshIfNeededRecursive((EObject)n, table, visited))
+				return;
+		}
+	}
+	
+	@SuppressWarnings("rawtypes")
+	private boolean refreshIfNeededRecursive(EObject value, EList<EObject> table, HashSet<Object> visited) {
+		for (EStructuralFeature f : value.eClass().getEAllStructuralFeatures()) {
+			try {
+				Object v = value.eGet(f);
+				if (!visited.contains(v)) {
+					visited.add(v);
+					if (v instanceof List) {
+						if (!((List)v).isEmpty())
+							if (refreshIfNeededRecursive((List)v, table, visited))
+								return true;
+					}
+					else if (v instanceof EObject) {
+						if (refreshIfNeeded((EObject)v, table))
+							return true;
+					}
+				}
+			}
+			catch (Exception e) {
+				// some getters may throw exceptions - ignore those
+			}
+		}
+		return refreshIfNeeded(value, table);
+	}
+
+	static int count = 0;
+	@SuppressWarnings("rawtypes")
+	private boolean refreshIfNeededRecursive(List list, EList<EObject> table, HashSet<Object> visited) {
+		for (Object v : list) {
+			if (!visited.contains(v)) {
+				visited.add(v);
+				if (v instanceof List) {
+					if (refreshIfNeededRecursive((List)v, table, visited))
+						return true;
+				}
+				else if (v instanceof EObject) {
+					if (refreshIfNeededRecursive((EObject)v, table, visited))
+						return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	private boolean refreshIfNeeded(EObject value, EList<EObject> table) {
+		if (table.contains(value)) {
+			tableViewer.setInput(table);
+			return true;
+		}
+		return false;
 	}
 }
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/ListAndDetailCompositeBase.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/ListAndDetailCompositeBase.java
index d61d91f..991a057 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/ListAndDetailCompositeBase.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/ListAndDetailCompositeBase.java
@@ -241,12 +241,20 @@
 				if (c instanceof Composite) {
 					getAllChildWidgets((Composite)c,kids);
 				}
-				if (!c.isDisposed())
-					kids.add(c);
+				if (!c.isDisposed() &&
+					c.getData(IConstants.NOTIFY_CHANGE_LISTENER_KEY) instanceof INotifyChangedListener) {
+						kids.add(c);
+				}
 			}
 		}
 	}
 	
+	// TODO: Figure out a broader method of detecting model changes.
+	// This listener is only called AFTER a transaction has committed,
+	// it will not receive notification of model changes inside a txn.
+	// So, while this works in the Property Sheet pages, things like
+	// the ObjectEditingDialog (which makes changes in the current txn)
+	// will not cause other widgets in the dialog to be notified.
 	@Override
 	public void resourceSetChanged(ResourceSetChangeEvent event) {
 		final List<Notification> notifications = new ArrayList<Notification>();
@@ -267,7 +275,7 @@
 		Display.getDefault().asyncExec( new Runnable() {
 			public void run() {
 				List<Control>kids = new ArrayList<Control>();
-				Composite parent = ListAndDetailCompositeBase.this.getParent();
+				Composite parent = ListAndDetailCompositeBase.this;
 				AbstractBpmn2PropertySection section = ListAndDetailCompositeBase.this.getPropertySection();
 				if (section!=null && section.getTabbedPropertySheetPage()!=null) {
 					parent = (Composite)section.getTabbedPropertySheetPage().getControl();
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/TableColumn.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/TableColumn.java
index 65a1784..4da5d74 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/TableColumn.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/clad/TableColumn.java
@@ -36,6 +36,7 @@
 	// The column cell editor
 	protected CellEditor cellEditor = null;
 	protected boolean editable = true;
+	protected String headerText = null;
 
 	public TableColumn(EObject o, EStructuralFeature f) {
 		this(null,o,f);
@@ -46,6 +47,16 @@
 		object = o;
 		feature = f;
 	}
+
+	public TableColumn(EObject o, String f) {
+		this(null,o,f);
+	}
+
+	public TableColumn(AbstractListComposite abstractListComposite, EObject o, String f) {
+		this.listComposite = abstractListComposite;
+		object = o;
+		feature = o.eClass().getEStructuralFeature(f);
+	}
 	
 	public void setOwner(AbstractListComposite abstractListComposite) {
 		this.listComposite = abstractListComposite;
@@ -55,8 +66,15 @@
 		tableViewer = t;
 	}
 	
+	public void setHeaderText(String text) {
+		headerText = text;
+	}
+	
 	@Override
 	public String getHeaderText() {
+		if (headerText!=null)
+			return headerText;
+		
 		String text = "";
 		if (feature!=null) {
 			if (feature.eContainer() instanceof EClass) {
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/dialogs/FeatureEditingDialog.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/dialogs/FeatureEditingDialog.java
index 20f8b7e..a3fa7ca 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/dialogs/FeatureEditingDialog.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/merrimac/dialogs/FeatureEditingDialog.java
@@ -18,10 +18,14 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
 import org.eclipse.graphiti.ui.editor.DiagramEditor;
 import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.emf.transaction.RecordingCommand;
 
 public class FeatureEditingDialog extends ObjectEditingDialog {
 
@@ -42,7 +46,7 @@
 			ModelSubclassSelectionDialog dialog = new ModelSubclassSelectionDialog(editor, object, feature);
 			if (dialog.open()==Window.OK){
 				eclass = (EClass)dialog.getResult()[0];
-				newObject = ModelUtil.createFeature(object, feature, eclass);
+				newObject = createNewObject(object, feature, eclass);
 			}
 			else
 				cancel = true;
@@ -53,6 +57,23 @@
 		return content;
 	}
 	
+	protected EObject createNewObject(final EObject object, final EStructuralFeature feature, final EClass eclass) {
+		final EObject[] result = new EObject[1];
+		final TransactionalEditingDomain domain = (TransactionalEditingDomainImpl)editor.getEditingDomain();
+		if (domain!=null) {
+			domain.getCommandStack().execute(new RecordingCommand(domain) {
+				@Override
+				protected void doExecute() {
+					result[0] = ModelUtil.createFeature(object, feature, eclass);
+				}
+			});
+		}
+		else {
+			result[0] = ModelUtil.createFeature(object, feature, eclass);
+		}
+		return result[0];
+	}
+	
 	public void aboutToOpen() {
 		String title;
 		if (createNew)
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 d2d2dce..cdaa1e3 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
@@ -958,12 +958,11 @@
 		
 		if (valueChanged) {
 			try {
-				InsertionAdapter insertionAdapter = AdapterUtil.adapt(value, InsertionAdapter.class);
-				if (insertionAdapter!=null) {
+				if (value 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.execute();
+					InsertionAdapter.executeIfNeeded((EObject)value);
 				}
 				
 				if (isEmpty(value)){
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 1315fb0..b5b1c6d 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
@@ -1,240 +1,247 @@
-/*******************************************************************************

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

- *  All rights reserved.

- * This program is made available under the terms of the

- * Eclipse Public License v1.0 which accompanies this distribution,

- * and is available at http://www.eclipse.org/legal/epl-v10.html

- *

- * Contributors:

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

- *

- * @author Bob Brodt

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

-/**

- * <copyright>

- * </copyright>

- *

- * $Id$

- */

-package org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.util;

-

-import java.util.ArrayList;

-import java.util.List;

-import java.util.Map;

-

-import org.eclipse.bpmn2.Bpmn2Package;

-import org.eclipse.bpmn2.CallActivity;

-import org.eclipse.bpmn2.CallableElement;

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

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

-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.EObject;

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

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

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

-import org.eclipse.emf.ecore.impl.EAttributeImpl;

-import org.eclipse.emf.ecore.util.BasicFeatureMap;

-import org.eclipse.emf.ecore.util.ExtendedMetaData;

-import org.eclipse.emf.ecore.xmi.XMLHelper;

-import org.eclipse.emf.ecore.xmi.XMLLoad;

-import org.eclipse.emf.ecore.xmi.XMLResource;

-import org.eclipse.emf.ecore.xmi.XMLSave;

-import org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl;

-import org.eclipse.emf.ecore.xmi.impl.XMLString;

-import org.xml.sax.Attributes;

-import org.xml.sax.SAXException;

-import org.xml.sax.helpers.DefaultHandler;

-

-/**

- * <!-- begin-user-doc -->

- * The <b>Resource </b> associated with the package.

- * <!-- end-user-doc -->

- * @see org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.util.ModelResourceFactoryImpl

- * @generated NOT

- */

-public class ModelResourceImpl extends Bpmn2ModelerResourceImpl {

-	

-	/**

-	 * Creates an instance of the resource.

-	 * <!-- begin-user-doc -->

-	 * <!-- end-user-doc -->

-	 * @param uri the URI of the new resource.

-	 * @generated NOT

-	 */

-	public ModelResourceImpl(URI uri) {

-		super(uri);

-	}

-

-

-    /**

-     * Override this method to hook in our own XmlHandler

-     */

-    @Override

-    protected XMLLoad createXMLLoad() {

-        return new XMLLoadImpl(createXMLHelper()) {

-            @Override

-            protected DefaultHandler makeDefaultHandler() {

-                return new ModelXmlHandler(resource, helper, options);

-            }

-        };

-    }

-

-    @Override

-	protected XMLSave createXMLSave() {

-		return new Bpmn2ModelerXMLSave(createXMLHelper()) {

-			

-			private boolean needTargetNamespace = true;

-			

-			@Override

-			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);

-			}

-

-			@Override

-			protected void init(XMLResource resource, Map<?, ?> options) {

-				super.init(resource, options);

-		        doc = new XMLString(Integer.MAX_VALUE, publicId, systemId, null) {

-		        	@Override

-		        	public void addAttribute(String name, String value) {

-		        		if ("targetNamespace".equals(name))

-		        			needTargetNamespace = false;

-		        		else if (XSI_SCHEMA_LOCATION.equals(name)) {

-		        			value = "http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd";

-		        		}

-		        		super.addAttribute(name, value);

-		        	}

-		        };

-			}

-			  

-			@Override

-			protected void addNamespaceDeclarations() {

-				if (needTargetNamespace)

-					doc.addAttribute("targetNamespace", ModelPackage.eNS_URI);

-				super.addNamespaceDeclarations();

-			}

-		};

-	}

-

-	/**

-     * We need extend the standard SAXXMLHandler to hook into the handling of attribute references

-     * which may be either simple ID Strings or QNames. We'll search through all of the objects'

-     * IDs first to find the one we're looking for. If not, we'll try a QName search.

-     */

-    protected static class ModelXmlHandler extends Bpmn2ModelerXmlHandler {

-

-        public ModelXmlHandler(XMLResource xmiResource, XMLHelper helper, Map<?, ?> options) {

-            super(xmiResource, helper, options);

-        }

-

-		@Override

-		public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

-			for (int i=0; i<attributes.getLength(); ++i ) {

-				String n = attributes.getQName(i);

-				if (n.startsWith("xmlns:")) {

-					String v = attributes.getValue(i);

-					if (ModelPackage.eINSTANCE.getNsURI().equals(v)) {

-						Bpmn2ModelerFactory.setEnableModelExtensions(false);

-						break;

-					}

-				}

-			}

-			super.startElement(uri, localName, qName, attributes);

-		}

-

-		@Override

-		public void endDocument() {

-			super.endDocument();

-			Bpmn2ModelerFactory.setEnableModelExtensions(true);

-		}

-

-		@SuppressWarnings("unchecked")

-		@Override

-		protected void processElement(String name, String prefix, String localName) {

-			

-			super.processElement(name, prefix, localName);

-			

-			// ugly hack for https://bugs.eclipse.org/bugs/show_bug.cgi?id=355686

-			// Remove the "type" attribute from the feature parentMap if there is one.

-			// The XSI type will have already been used to construct the EObject,

-			// so any "type" in the feature parentMap will be a duplicate which will

-			// cause problems during parsing.

-			// See also getXSIType()

-			EObject childObject = objects.peekEObject();

-			if (childObject!=null) {

-				try {

-					EStructuralFeature anyAttribute = childObject.eClass().getEStructuralFeature(Bpmn2Package.BASE_ELEMENT__ANY_ATTRIBUTE);

-					if (anyAttribute!=null) {

-						List<BasicFeatureMap.Entry> anyMap = (List<BasicFeatureMap.Entry>)childObject.eGet(anyAttribute);

-						if (anyMap!=null) {

-							List<BasicFeatureMap.Entry> removed = new ArrayList<BasicFeatureMap.Entry>();

-							for (BasicFeatureMap.Entry fe : anyMap) {

-								if (fe.getEStructuralFeature() instanceof EAttribute) {

-									EAttributeImpl a = (EAttributeImpl)fe.getEStructuralFeature();

-									String n = a.getName();

-									String ns = a.getExtendedMetaData().getNamespace();

-									if (TYPE.equals(n) && XSI_URI.equals(ns)) {

-										removed.add(fe);

-									}

-								}

-							}

-							if (removed.size()>0)

-								anyMap.removeAll(removed);

-						}

-					}

-				}

-				catch(Exception e) {

-				}

-			}

-		}

-

-		@Override

-		protected String getXSIType() {

-			if (isNamespaceAware)

-				return attribs.getValue(ExtendedMetaData.XSI_URI,

-						XMLResource.TYPE);

-

-			// If an parameter specifies multiple xsi:type data types, the last one wins.

-			// NOTE: we must check for "type" in any namespace with the URI

-			// "http://www.w3.org/2001/XMLSchema-instance"

-			String value = null;

-			int length = attribs.getLength();

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

-				attribs.getQName(i);

-				String localpart= attribs.getLocalName(i);

-				String prefix = null;

-				int ci = localpart.lastIndexOf(':');

-				if (ci>0) {

-					prefix = localpart.substring(0, ci); 

-					localpart = localpart.substring(ci+1);

-				}

-				if (TYPE.equals(localpart)) {

-					String uri = helper.getNamespaceURI(prefix);

-					if (XSI_URI.equals(uri)) {

-						value = attribs.getValue(i);

-					}

-				}

-			}

-			return value;

-		}

-		

-		@Override

-		protected void setValueFromId(EObject object, EReference eReference, String ids) {

-			// the CalledElementRef in CallActivity is just an ID. This means we need

-			// to create a CallableElement which is simply a proxy, not a real object.

-			if (object instanceof CallActivity) {

-				CallActivity ca = (CallActivity)object;

-				CallableElement ce = Bpmn2ModelerFactory.create(CallableElement.class);

-				((InternalEObject)ce).eSetProxyURI(URI.createURI(ids));

-				ca.setCalledElementRef(ce);

-			}

-			else

-				super.setValueFromId(object, eReference, ids);

-		}

-    }

-} //ModelResourceImpl

+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat, Inc.
+ *  All rights reserved.
+ * This program is made available under the terms of the
+ * Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id$
+ */
+package org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.CallActivity;
+import org.eclipse.bpmn2.CallableElement;
+import org.eclipse.bpmn2.Interface;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceImpl;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
+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.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.EAttributeImpl;
+import org.eclipse.emf.ecore.util.BasicFeatureMap;
+import org.eclipse.emf.ecore.util.ExtendedMetaData;
+import org.eclipse.emf.ecore.xmi.XMLHelper;
+import org.eclipse.emf.ecore.xmi.XMLLoad;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+import org.eclipse.emf.ecore.xmi.XMLSave;
+import org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl;
+import org.eclipse.emf.ecore.xmi.impl.XMLString;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Resource </b> associated with the package.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.util.ModelResourceFactoryImpl
+ * @generated NOT
+ */
+public class ModelResourceImpl extends Bpmn2ModelerResourceImpl {
+	
+	/**
+	 * Creates an instance of the resource.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param uri the URI of the new resource.
+	 * @generated NOT
+	 */
+	public ModelResourceImpl(URI uri) {
+		super(uri);
+	}
+
+
+    /**
+     * Override this method to hook in our own XmlHandler
+     */
+    @Override
+    protected XMLLoad createXMLLoad() {
+        return new XMLLoadImpl(createXMLHelper()) {
+            @Override
+            protected DefaultHandler makeDefaultHandler() {
+                return new ModelXmlHandler(resource, helper, options);
+            }
+        };
+    }
+
+    @Override
+	protected XMLSave createXMLSave() {
+		return new Bpmn2ModelerXMLSave(createXMLHelper()) {
+			
+			private boolean needTargetNamespace = true;
+			
+			@Override
+			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);
+			}
+
+			@Override
+			protected void init(XMLResource resource, Map<?, ?> options) {
+				super.init(resource, options);
+		        doc = new XMLString(Integer.MAX_VALUE, publicId, systemId, null) {
+		        	@Override
+		        	public void addAttribute(String name, String value) {
+		        		if ("targetNamespace".equals(name))
+		        			needTargetNamespace = false;
+		        		else if (XSI_SCHEMA_LOCATION.equals(name)) {
+		        			value = "http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd";
+		        		}
+		        		super.addAttribute(name, value);
+		        	}
+		        };
+			}
+			  
+			@Override
+			protected void addNamespaceDeclarations() {
+				if (needTargetNamespace)
+					doc.addAttribute("targetNamespace", ModelPackage.eNS_URI);
+				super.addNamespaceDeclarations();
+			}
+		};
+	}
+
+	/**
+     * We need extend the standard SAXXMLHandler to hook into the handling of attribute references
+     * which may be either simple ID Strings or QNames. We'll search through all of the objects'
+     * IDs first to find the one we're looking for. If not, we'll try a QName search.
+     */
+    protected static class ModelXmlHandler extends Bpmn2ModelerXmlHandler {
+
+        public ModelXmlHandler(XMLResource xmiResource, XMLHelper helper, Map<?, ?> options) {
+            super(xmiResource, helper, options);
+        }
+
+		@Override
+		public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+			for (int i=0; i<attributes.getLength(); ++i ) {
+				String n = attributes.getQName(i);
+				if (n.startsWith("xmlns:")) {
+					String v = attributes.getValue(i);
+					if (ModelPackage.eINSTANCE.getNsURI().equals(v)) {
+						Bpmn2ModelerFactory.setEnableModelExtensions(false);
+						break;
+					}
+				}
+			}
+			super.startElement(uri, localName, qName, attributes);
+		}
+
+		@Override
+		public void endDocument() {
+			super.endDocument();
+			Bpmn2ModelerFactory.setEnableModelExtensions(true);
+		}
+
+		@SuppressWarnings("unchecked")
+		@Override
+		protected void processElement(String name, String prefix, String localName) {
+			
+			super.processElement(name, prefix, localName);
+			
+			// ugly hack for https://bugs.eclipse.org/bugs/show_bug.cgi?id=355686
+			// Remove the "type" attribute from the feature parentMap if there is one.
+			// The XSI type will have already been used to construct the EObject,
+			// so any "type" in the feature parentMap will be a duplicate which will
+			// cause problems during parsing.
+			// See also getXSIType()
+			EObject childObject = objects.peekEObject();
+			if (childObject!=null) {
+				try {
+					EStructuralFeature anyAttribute = childObject.eClass().getEStructuralFeature(Bpmn2Package.BASE_ELEMENT__ANY_ATTRIBUTE);
+					if (anyAttribute!=null) {
+						List<BasicFeatureMap.Entry> anyMap = (List<BasicFeatureMap.Entry>)childObject.eGet(anyAttribute);
+						if (anyMap!=null) {
+							List<BasicFeatureMap.Entry> removed = new ArrayList<BasicFeatureMap.Entry>();
+							for (BasicFeatureMap.Entry fe : anyMap) {
+								if (fe.getEStructuralFeature() instanceof EAttribute) {
+									EAttributeImpl a = (EAttributeImpl)fe.getEStructuralFeature();
+									String n = a.getName();
+									String ns = a.getExtendedMetaData().getNamespace();
+									if (TYPE.equals(n) && XSI_URI.equals(ns)) {
+										removed.add(fe);
+									}
+								}
+							}
+							if (removed.size()>0)
+								anyMap.removeAll(removed);
+						}
+					}
+				}
+				catch(Exception e) {
+				}
+			}
+		}
+
+		@Override
+		protected String getXSIType() {
+			if (isNamespaceAware)
+				return attribs.getValue(ExtendedMetaData.XSI_URI,
+						XMLResource.TYPE);
+
+			// If an parameter specifies multiple xsi:type data types, the last one wins.
+			// NOTE: we must check for "type" in any namespace with the URI
+			// "http://www.w3.org/2001/XMLSchema-instance"
+			String value = null;
+			int length = attribs.getLength();
+			for (int i = 0; i < length; ++i) {
+				attribs.getQName(i);
+				String localpart= attribs.getLocalName(i);
+				String prefix = null;
+				int ci = localpart.lastIndexOf(':');
+				if (ci>0) {
+					prefix = localpart.substring(0, ci); 
+					localpart = localpart.substring(ci+1);
+				}
+				if (TYPE.equals(localpart)) {
+					String uri = helper.getNamespaceURI(prefix);
+					if (XSI_URI.equals(uri)) {
+						value = attribs.getValue(i);
+					}
+				}
+			}
+			return value;
+		}
+		
+		@Override
+		protected void setValueFromId(EObject object, EReference eReference, String ids) {
+			if (object instanceof CallActivity) {
+				// the CalledElementRef in CallActivity is just an ID. This means we need
+				// to create a CallableElement which is simply a proxy, not a real object.
+				CallActivity ca = (CallActivity)object;
+				CallableElement ce = Bpmn2ModelerFactory.create(CallableElement.class);
+				((InternalEObject)ce).eSetProxyURI(URI.createURI(ids));
+				ca.setCalledElementRef(ce);
+			}
+			else if (object instanceof Interface && eReference==Bpmn2Package.eINSTANCE.getInterface_ImplementationRef()) {
+				// the Interface.implementationRef is yet again just a string
+				Interface iface = (Interface)object;
+				iface.setImplementationRef( ModelUtil.createStringWrapper(ids) );
+			}
+			else
+				super.setValueFromId(object, eReference, ids);
+		}
+    }
+} //ModelResourceImpl
diff --git a/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/src/org/eclipse/bpmn2/modeler/runtime/jboss/jbpm5/property/JbpmDefinitionsPropertySection.java b/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/src/org/eclipse/bpmn2/modeler/runtime/jboss/jbpm5/property/JbpmDefinitionsPropertySection.java
index 8c3b64c..8a6dd18 100644
--- a/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/src/org/eclipse/bpmn2/modeler/runtime/jboss/jbpm5/property/JbpmDefinitionsPropertySection.java
+++ b/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/src/org/eclipse/bpmn2/modeler/runtime/jboss/jbpm5/property/JbpmDefinitionsPropertySection.java
@@ -1,36 +1,144 @@
-/*******************************************************************************

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

- *  All rights reserved.

- * This program is made available under the terms of the

- * Eclipse Public License v1.0 which accompanies this distribution,

- * and is available at http://www.eclipse.org/legal/epl-v10.html

- *

- * Contributors:

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

- *

- * @author Bob Brodt

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

-

-package org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property;

-

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

-import org.eclipse.bpmn2.modeler.ui.property.diagrams.DefinitionsPropertySection;

-import org.eclipse.bpmn2.modeler.ui.property.tasks.TaskDetailComposite;

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

-

-/**

- * @author Bob Brodt

- *

- */

-public class JbpmDefinitionsPropertySection extends DefinitionsPropertySection {

-

-	@Override

-	protected AbstractDetailComposite createSectionRoot() {

-		return new JbpmDefinitionsPropertyComposite(this);

-	}

-

-	@Override

-	public AbstractDetailComposite createSectionRoot(Composite parent, int style) {

-		return new JbpmDefinitionsPropertyComposite(parent,style);

-	}

-}

+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat, Inc.
+ *  All rights reserved.
+ * This program is made available under the terms of the
+ * Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+
+package org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property;
+
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.Message;
+import org.eclipse.bpmn2.Property;
+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.DefaultListComposite;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.ListCompositeColumnProvider;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.PropertiesCompositeFactory;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.TableColumn;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDetailComposite.AbstractPropertiesProvider;
+import org.eclipse.bpmn2.modeler.ui.property.data.ItemAwareElementDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.MessageDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.MessageListComposite;
+import org.eclipse.bpmn2.modeler.ui.property.diagrams.DefinitionsPropertySection;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.TaskDetailComposite;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Bob Brodt
+ *
+ */
+public class JbpmDefinitionsPropertySection extends DefinitionsPropertySection {
+	static {
+		PropertiesCompositeFactory.register(Message.class, JbpmMessageDetailComposite.class);
+		PropertiesCompositeFactory.register(Message.class, JbpmMessageListComposite.class);
+	}
+
+	@Override
+	protected AbstractDetailComposite createSectionRoot() {
+		return new JbpmDefinitionsPropertyComposite(this);
+	}
+
+	@Override
+	public AbstractDetailComposite createSectionRoot(Composite parent, int style) {
+		return new JbpmDefinitionsPropertyComposite(parent,style);
+	}
+	public class JbpmMessageDetailComposite extends DefaultDetailComposite {
+
+		private AbstractPropertiesProvider propertiesProvider;
+
+		public JbpmMessageDetailComposite(Composite parent, int style) {
+			super(parent, style);
+		}
+
+		/**
+		 * @param section
+		 */
+		public JbpmMessageDetailComposite(AbstractBpmn2PropertySection section) {
+			super(section);
+		}
+
+		@Override
+		public AbstractPropertiesProvider getPropertiesProvider(EObject object) {
+			if (propertiesProvider==null) {
+				propertiesProvider = new AbstractPropertiesProvider(object) {
+					String[] properties = new String[] {
+							"id",
+							"itemRef"
+					};
+					
+					@Override
+					public String[] getProperties() {
+						return properties; 
+					}
+				};
+			}
+			return propertiesProvider;
+		}
+		
+		@Override
+		protected void bindAttribute(Composite parent, EObject object, EAttribute attribute, String label) {
+			if ("id".equals(attribute.getName()))
+				label = "Name";
+			super.bindAttribute(parent, object, attribute, label);
+		}
+		
+		@Override
+		protected boolean isModelObjectEnabled(String className, String featureName) {
+			return true;
+		}
+	}
+	
+	public class JbpmMessageListComposite extends DefaultListComposite {
+
+		public JbpmMessageListComposite(AbstractBpmn2PropertySection section, int style) {
+			super(section, style);
+			// TODO Auto-generated constructor stub
+		}
+
+		public JbpmMessageListComposite(AbstractBpmn2PropertySection section) {
+			super(section,
+					AbstractListComposite.SHOW_DETAILS |
+					AbstractListComposite.ADD_BUTTON |
+					AbstractListComposite.MOVE_BUTTONS |
+					AbstractListComposite.DELETE_BUTTON);
+		}
+
+		public JbpmMessageListComposite(Composite parent, int style) {
+			super(parent,
+					AbstractListComposite.SHOW_DETAILS |
+					AbstractListComposite.ADD_BUTTON |
+					AbstractListComposite.MOVE_BUTTONS |
+					AbstractListComposite.DELETE_BUTTON);
+		}
+		
+		@Override
+		public ListCompositeColumnProvider getColumnProvider(EObject object, EStructuralFeature feature) {
+			if (columnProvider==null) {
+				columnProvider = new ListCompositeColumnProvider(this, false);
+				TableColumn tc = new TableColumn(object,Bpmn2Package.eINSTANCE.getBaseElement_Id());
+				tc.setHeaderText("Name"); 
+				columnProvider.add(tc);
+				columnProvider.add(new TableColumn(object,Bpmn2Package.eINSTANCE.getMessage_ItemRef()));
+			}
+			return columnProvider;
+		}
+
+		@Override
+		protected boolean isModelObjectEnabled(String className, String featureName) {
+			return true;
+		}
+	}
+
+}
diff --git a/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/src/org/eclipse/bpmn2/modeler/runtime/jboss/jbpm5/property/JbpmDescriptionPropertySection.java b/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/src/org/eclipse/bpmn2/modeler/runtime/jboss/jbpm5/property/JbpmDescriptionPropertySection.java
index f5dfe71..5c23f13 100644
--- a/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/src/org/eclipse/bpmn2/modeler/runtime/jboss/jbpm5/property/JbpmDescriptionPropertySection.java
+++ b/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/src/org/eclipse/bpmn2/modeler/runtime/jboss/jbpm5/property/JbpmDescriptionPropertySection.java
@@ -1,101 +1,101 @@
-/*******************************************************************************

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

- *  All rights reserved.

- * This program is made available under the terms of the

- * Eclipse Public License v1.0 which accompanies this distribution,

- * and is available at http://www.eclipse.org/legal/epl-v10.html

- *

- * Contributors:

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

- *

- * @author Bob Brodt

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

-

-package org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property;

-

-import org.eclipse.bpmn2.BaseElement;

-import org.eclipse.bpmn2.Participant;

-import org.eclipse.bpmn2.Process;

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

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

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

-import org.eclipse.bpmn2.modeler.ui.property.DescriptionPropertySection;

-import org.eclipse.bpmn2.modeler.ui.property.tasks.TaskDetailComposite;

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

-import org.eclipse.jface.viewers.ISelection;

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

-import org.eclipse.ui.IWorkbenchPart;

-

-/**

- * This is an empty tab section which simply exists to hide the "Basic" tab

- * defined the editor UI plugin.

- * 

- * @author Bob Brodt

- *

- */

-public class JbpmDescriptionPropertySection extends DescriptionPropertySection {

-	

-	@Override

-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {

-		return getBusinessObjectForSelection(selection) != null;

-	}

-

-	@Override

-	protected AbstractDetailComposite createSectionRoot() {

-		return new JbpmDescriptionPropertyComposite(this);

-	}

-

-	@Override

-	public AbstractDetailComposite createSectionRoot(Composite parent, int style) {

-		return new JbpmDescriptionPropertyComposite(parent,style);

-	}

-	

-	public JbpmDescriptionPropertySection() {

-		super();

-		// TODO Auto-generated constructor stub

-	}

-

-	public class JbpmDescriptionPropertyComposite extends DescriptionPropertyComposite {

-		

-		public JbpmDescriptionPropertyComposite(

-				AbstractBpmn2PropertySection section) {

-			super(section);

-		}

-

-		public JbpmDescriptionPropertyComposite(Composite parent, int style) {

-			super(parent, style);

-		}

-

-		@Override

-		public void createBindings(EObject be) {

-			// for BPMNDiagram objects, pick out the Process and render the Process attributes

-			Process process = null;

-			if (be instanceof Participant) {

-				process = ((Participant) be).getProcessRef();

-			} else if (be instanceof BPMNDiagram) {

-				BaseElement bpmnElement = ((BPMNDiagram)be).getPlane().getBpmnElement();

-				if (bpmnElement instanceof Process)

-					process = (Process)bpmnElement;

-			}

-			

-			if (process==null) {

-				// display the default Description tab

-				super.createBindings(be);

-			}

-			else {

-				// create our own for Process

-				bindDescription(be);

-				

-				bindAttribute(process, "id");

-				bindAttribute(process, "name");

-				bindAttribute(process, "anyAttribute");

-				bindAttribute(process, "processType");

-				bindAttribute(process, "isExecutable");

-				bindAttribute(process, "isClosed");

-//				bindList(process, "properties"); // this has moved to JbpmDataItemsDetailComposite

-				bindList(process, "laneSets");

-			}

-		}

-

-	}

-}

+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat, Inc.
+ *  All rights reserved.
+ * This program is made available under the terms of the
+ * Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+
+package org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property;
+
+import org.eclipse.bpmn2.BaseElement;
+import org.eclipse.bpmn2.Participant;
+import org.eclipse.bpmn2.Process;
+import org.eclipse.bpmn2.di.BPMNDiagram;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractBpmn2PropertySection;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.DescriptionPropertySection;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.TaskDetailComposite;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * This is an empty tab section which simply exists to hide the "Basic" tab
+ * defined the editor UI plugin.
+ * 
+ * @author Bob Brodt
+ *
+ */
+public class JbpmDescriptionPropertySection extends DescriptionPropertySection {
+	
+	@Override
+	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
+		return getBusinessObjectForSelection(selection) != null;
+	}
+
+	@Override
+	protected AbstractDetailComposite createSectionRoot() {
+		return new JbpmDescriptionPropertyComposite(this);
+	}
+
+	@Override
+	public AbstractDetailComposite createSectionRoot(Composite parent, int style) {
+		return new JbpmDescriptionPropertyComposite(parent,style);
+	}
+	
+	public JbpmDescriptionPropertySection() {
+		super();
+		// TODO Auto-generated constructor stub
+	}
+
+	public class JbpmDescriptionPropertyComposite extends DescriptionPropertyComposite {
+		
+		public JbpmDescriptionPropertyComposite(
+				AbstractBpmn2PropertySection section) {
+			super(section);
+		}
+
+		public JbpmDescriptionPropertyComposite(Composite parent, int style) {
+			super(parent, style);
+		}
+
+		@Override
+		public void createBindings(EObject be) {
+			// for BPMNDiagram objects, pick out the Process and render the Process attributes
+			Process process = null;
+			if (be instanceof Participant) {
+				process = ((Participant) be).getProcessRef();
+			} else if (be instanceof BPMNDiagram) {
+				BaseElement bpmnElement = ((BPMNDiagram)be).getPlane().getBpmnElement();
+				if (bpmnElement instanceof Process)
+					process = (Process)bpmnElement;
+			}
+			
+			if (process==null) {
+				// display the default Description tab
+				super.createBindings(be);
+			}
+			else {
+				// create our own for Process
+				bindDescription(be);
+				
+				bindAttribute(process, "id");
+				bindAttribute(process, "name");
+				bindAttribute(process, "anyAttribute");
+				bindAttribute(process, "processType");
+				bindAttribute(process, "isExecutable");
+				bindAttribute(process, "isClosed");
+//				bindList(process, "properties"); // this has moved to JbpmDataItemsDetailComposite
+//				bindList(process, "laneSets"); // don't need this
+			}
+		}
+
+	}
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/adapters/properties/InterfacePropertiesAdapter.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/adapters/properties/InterfacePropertiesAdapter.java
index 339c01d..77f8873 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/adapters/properties/InterfacePropertiesAdapter.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/adapters/properties/InterfacePropertiesAdapter.java
@@ -49,6 +49,7 @@
 						String text = ModelUtil.getStringWrapperValue( iface.getImplementationRef() ); // + type;
 						if (text==null)
 							return ModelUtil.getDisplayName(iface.getImplementationRef());
+						return text;
 					}
 					return "";
 				}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/adapters/properties/MessagePropertiesAdapter.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/adapters/properties/MessagePropertiesAdapter.java
index 2f66ec1..5b51b09 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/adapters/properties/MessagePropertiesAdapter.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/adapters/properties/MessagePropertiesAdapter.java
@@ -1,50 +1,75 @@
-/*******************************************************************************

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

- *  All rights reserved.

- * This program is made available under the terms of the

- * Eclipse Public License v1.0 which accompanies this distribution,

- * and is available at http://www.eclipse.org/legal/epl-v10.html

- *

- * Contributors:

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

- *

- * @author Bob Brodt

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

-

-package org.eclipse.bpmn2.modeler.ui.adapters.properties;

-

-import org.eclipse.bpmn2.Bpmn2Package;

-import org.eclipse.bpmn2.Error;

-import org.eclipse.bpmn2.Message;

-import org.eclipse.bpmn2.modeler.core.adapters.ExtendedPropertiesAdapter;

-import org.eclipse.bpmn2.modeler.core.adapters.ObjectDescriptor;

-import org.eclipse.bpmn2.modeler.ui.features.choreography.ChoreographyUtil;

-import org.eclipse.emf.common.notify.AdapterFactory;

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

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

-import org.eclipse.emf.ecore.resource.Resource;

-

-/**

- * @author Gary Brown

- *

- */

-public class MessagePropertiesAdapter extends RootElementPropertiesAdapter<Message> {

-

-	/**

-	 * @param adapterFactory

-	 * @param object

-	 */

-	public MessagePropertiesAdapter(AdapterFactory adapterFactory, Message object) {

-		super(adapterFactory, object);

-		

-    	setObjectDescriptor(new RootElementObjectDescriptor<Message>(adapterFactory, object) {

-			@Override

-			public String getDisplayName(Object context) {

-				final Message mesg = adopt(context);

-				String text = ChoreographyUtil.getMessageName(mesg);

-				return text;

-			}

-    	});

-	}

-

-}

+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat, Inc.
+ *  All rights reserved.
+ * This program is made available under the terms of the
+ * Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+
+package org.eclipse.bpmn2.modeler.ui.adapters.properties;
+
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.Error;
+import org.eclipse.bpmn2.ItemAwareElement;
+import org.eclipse.bpmn2.ItemDefinition;
+import org.eclipse.bpmn2.Message;
+import org.eclipse.bpmn2.modeler.core.adapters.AdapterUtil;
+import org.eclipse.bpmn2.modeler.core.adapters.ExtendedPropertiesAdapter;
+import org.eclipse.bpmn2.modeler.core.adapters.FeatureDescriptor;
+import org.eclipse.bpmn2.modeler.core.adapters.ObjectDescriptor;
+import org.eclipse.bpmn2.modeler.ui.features.choreography.ChoreographyUtil;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.resource.Resource;
+
+/**
+ * @author Gary Brown
+ *
+ */
+public class MessagePropertiesAdapter extends RootElementPropertiesAdapter<Message> {
+
+	/**
+	 * @param adapterFactory
+	 * @param object
+	 */
+	public MessagePropertiesAdapter(AdapterFactory adapterFactory, Message object) {
+		super(adapterFactory, object);
+
+		EStructuralFeature ref = Bpmn2Package.eINSTANCE.getMessage_ItemRef();
+    	
+    	setFeatureDescriptor(ref, new FeatureDescriptor<Message>(adapterFactory, object, ref) {
+
+    		@Override
+    		public String getDisplayName(Object context) {
+    			EObject object = this.object;
+    			ItemDefinition itemDefinition = null;
+    			if (object instanceof Message) {
+    				itemDefinition = (ItemDefinition) object.eGet(feature);
+    			}
+    			if (itemDefinition!=null) {
+    				ExtendedPropertiesAdapter<ItemDefinition> adapter =
+    						(ExtendedPropertiesAdapter<ItemDefinition>) AdapterUtil.adapt(itemDefinition, ExtendedPropertiesAdapter.class);
+    				return adapter.getFeatureDescriptor(Bpmn2Package.eINSTANCE.getItemDefinition_StructureRef()).getDisplayName(itemDefinition);
+    			}
+    			return super.getDisplayName(context);
+    		}
+    		
+    	});
+
+    	setObjectDescriptor(new RootElementObjectDescriptor<Message>(adapterFactory, object) {
+			@Override
+			public String getDisplayName(Object context) {
+				final Message mesg = adopt(context);
+				String text = ChoreographyUtil.getMessageName(mesg);
+				return text;
+			}
+    	});
+	}
+
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/data/InterfacePropertySection.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/data/InterfacePropertySection.java
index 447934d..cbcc520 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/data/InterfacePropertySection.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/data/InterfacePropertySection.java
@@ -1,272 +1,284 @@
-package org.eclipse.bpmn2.modeler.ui.property.data;

-

-

-import java.util.ArrayList;

-import java.util.List;

-

-import org.eclipse.bpmn2.BaseElement;

-import org.eclipse.bpmn2.Bpmn2Package;

-import org.eclipse.bpmn2.CallableElement;

-import org.eclipse.bpmn2.Definitions;

-import org.eclipse.bpmn2.Interface;

-import org.eclipse.bpmn2.Participant;

-import org.eclipse.bpmn2.Process;

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

-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.DefaultListComposite;

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

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

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

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

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

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

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

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

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

-import org.eclipse.jface.dialogs.MessageDialog;

-import org.eclipse.jface.viewers.ILabelProvider;

-import org.eclipse.jface.viewers.ILabelProviderListener;

-import org.eclipse.jface.viewers.IStructuredContentProvider;

-import org.eclipse.jface.viewers.Viewer;

-import org.eclipse.jface.window.Window;

-import org.eclipse.swt.graphics.Image;

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

-import org.eclipse.ui.dialogs.ListDialog;

-

-public class InterfacePropertySection extends DefaultPropertySection {

-

-	static {

-		PropertiesCompositeFactory.register(Interface.class, InterfaceDetailComposite.class);

-	}

-

-	@Override

-	protected AbstractDetailComposite createSectionRoot() {

-		return new InterfaceSectionRoot(this);

-	}

-

-	public InterfacePropertySection() {

-		super();

-	}

-

-	@Override

-	protected EObject getBusinessObjectForPictogramElement(PictogramElement pe) {

-		EObject bo = super.getBusinessObjectForPictogramElement(pe);

-		if (bo instanceof Participant) {

-			return bo;

-		} else if (bo instanceof BPMNDiagram) {

-			BaseElement be = ((BPMNDiagram)bo).getPlane().getBpmnElement();

-			if (be instanceof Process)

-				return be;

-		} else if (bo instanceof CallableElement) {

-			return bo;

-		}

-		

-		return null;

-	}

-	

-	public class InterfaceSectionRoot extends DefaultDetailComposite {

-

-		DefinedInterfaceListComposite definedInterfacesTable;

-		ProvidedInterfaceListComposite providedInterfacesTable;

-		

-		/**

-		 * @param parent

-		 * @param style

-		 */

-		public InterfaceSectionRoot(Composite parent, int style) {

-			super(parent, style);

-		}

-

-		/**

-		 * @param section

-		 */

-		public InterfaceSectionRoot(AbstractBpmn2PropertySection section) {

-			super(section);

-		}

-

-		@Override

-		public void cleanBindings() {

-			super.cleanBindings();

-			definedInterfacesTable = null;

-			providedInterfacesTable = null;

-		}

-

-		@Override

-		public void createBindings(EObject be) {

-			definedInterfacesTable = new DefinedInterfaceListComposite(this);

-			definedInterfacesTable.bindList(be);

-

-			if (be instanceof Participant) {

-				providedInterfacesTable = new ProvidedInterfaceListComposite(this);

-				providedInterfacesTable.bindList(be, getFeature(be, "interfaceRefs"));

-			}

-			else if (be instanceof CallableElement) {

-				CallableElement ce = (CallableElement)be;

-				providedInterfacesTable = new ProvidedInterfaceListComposite(this);

-				providedInterfacesTable.bindList(be, getFeature(be, "supportedInterfaceRefs"));

-			}

-		}

-	}

-	

-	public class DefinedInterfaceListComposite extends DefaultListComposite {

-		

-		/**

-		 * @param section

-		 * @param style

-		 */

-		public DefinedInterfaceListComposite(Composite parent) {

-			super(parent,

-					AbstractListComposite.SHOW_DETAILS |

-					AbstractListComposite.ADD_BUTTON |

-					AbstractListComposite.MOVE_BUTTONS |

-					AbstractListComposite.DELETE_BUTTON);

-		}

-

-		@Override

-		public EClass getListItemClass(EObject object, EStructuralFeature feature) {

-			return listItemClass = Bpmn2Package.eINSTANCE.getInterface();

-		}

-

-		public void bindList(EObject theobject) {

-			Definitions defs = ModelUtil.getDefinitions(theobject);

-			super.bindList(defs, Bpmn2Package.eINSTANCE.getDefinitions_RootElements());

-			setTitle("All Defined Interfaces");

-		}

-

-		@Override

-		protected EObject addListItem(EObject object, EStructuralFeature feature) {

-			Interface iface = (Interface) ModelUtil.createObject(object.eResource(), PACKAGE.getInterface());

-			

-			EList<EObject> list = (EList<EObject>)object.eGet(feature);

-			list.add(iface);

-			return iface;

-		}

-	}

-	

-	public class ProvidedInterfaceListComposite extends DefaultListComposite {

-		

-		/**

-		 * @param section

-		 * @param style

-		 */

-		public ProvidedInterfaceListComposite(Composite parent) {

-			super(parent,

-					// only allow details editing in DefinedInterfacesTable

-//					AbstractListComposite.SHOW_DETAILS |

-					AbstractListComposite.ADD_BUTTON |

-					AbstractListComposite.MOVE_BUTTONS |

-					AbstractListComposite.REMOVE_BUTTON);

-		}

-		

-		public void bindList(final EObject theobject, final EStructuralFeature thefeature) {

-			super.bindList(theobject, thefeature);

-			if (theobject instanceof Participant)

-				setTitle("Interfaces Provided by Participant");

-			else if (theobject instanceof CallableElement)

-				setTitle("Interfaces Provided by Process");

-		}

-		

-		@Override

-		protected EObject addListItem(EObject object, EStructuralFeature feature) {

-			Definitions defs = ModelUtil.getDefinitions(object);

-			final List<Interface>items = new ArrayList<Interface>();

-			for (EObject o : defs.getRootElements()) {

-				if (o instanceof Interface) {

-					if (object instanceof Participant) {

-						Participant participant = (Participant)object;

-						if (!participant.getInterfaceRefs().contains(o))

-							items.add((Interface)o);

-					} else if (object instanceof CallableElement) {

-						CallableElement callableElement = (CallableElement)object;

-						if (!callableElement.getSupportedInterfaceRefs().contains(o))

-							items.add((Interface)o);

-					}

-				}

-			}

-			Interface iface = null;

-			ListDialog dialog = new ListDialog(getShell());

-			if (items.size()>1) {

-				dialog.setContentProvider(new IStructuredContentProvider() {

-		

-					@Override

-					public void dispose() {

-					}

-		

-					@Override

-					public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

-					}

-		

-					@Override

-					public Object[] getElements(Object inputElement) {

-						return items.toArray();

-					}

-					

-				});

-				dialog.setLabelProvider(new ILabelProvider() {

-		

-					@Override

-					public void addListener(ILabelProviderListener listener) {

-					}

-		

-					@Override

-					public void dispose() {

-					}

-		

-					@Override

-					public boolean isLabelProperty(Object element, String property) {

-						return false;

-					}

-		

-					@Override

-					public void removeListener(ILabelProviderListener listener) {

-					}

-		

-					@Override

-					public Image getImage(Object element) {

-						return null;

-					}

-		

-					@Override

-					public String getText(Object element) {

-						return ModelUtil.getName((BaseElement)element);

-					}

-					

-				});

-				dialog.setTitle("Interfaces");

-				dialog.setMessage("Select the Interface provided by this Process");

-				dialog.setAddCancelButton(true);

-				dialog.setHelpAvailable(false);

-				dialog.setInput(new Object());

-

-				if (dialog.open() == Window.OK) {

-					iface = (Interface)dialog.getResult()[0];

-				}

-			}

-			else if (items.size()==1) {

-				iface = items.get(0);

-			}

-			else {

-				MessageDialog.openInformation(getShell(), "No Defined Interfaces",

-						"There are no new Interfaces to add.\n"+

-						"Please create a new Interface in the \"Defined Interfaces\" first."

-				);

-			}

-			

-			if (iface!=null) {

-				if (object instanceof Participant) {

-					Participant participant = (Participant)object;

-					participant.getInterfaceRefs().add(iface);

-				} else if (object instanceof CallableElement) {

-					CallableElement callableElement = (CallableElement)object;

-					callableElement.getSupportedInterfaceRefs().add(iface);

-				}

-			}

-

-			return iface;

-		}

-	}

-	

-}

+package org.eclipse.bpmn2.modeler.ui.property.data;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.bpmn2.BaseElement;
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.CallableElement;
+import org.eclipse.bpmn2.Definitions;
+import org.eclipse.bpmn2.Interface;
+import org.eclipse.bpmn2.Participant;
+import org.eclipse.bpmn2.Process;
+import org.eclipse.bpmn2.di.BPMNDiagram;
+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.DefaultListComposite;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultPropertySection;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.ListCompositeColumnProvider;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.PropertiesCompositeFactory;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.TableColumn;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.dialogs.ListDialog;
+
+public class InterfacePropertySection extends DefaultPropertySection {
+
+	static {
+		PropertiesCompositeFactory.register(Interface.class, InterfaceDetailComposite.class);
+	}
+
+	@Override
+	protected AbstractDetailComposite createSectionRoot() {
+		return new InterfaceSectionRoot(this);
+	}
+
+	public InterfacePropertySection() {
+		super();
+	}
+
+	@Override
+	protected EObject getBusinessObjectForPictogramElement(PictogramElement pe) {
+		EObject bo = super.getBusinessObjectForPictogramElement(pe);
+		if (bo instanceof Participant) {
+			return bo;
+		} else if (bo instanceof BPMNDiagram) {
+			BaseElement be = ((BPMNDiagram)bo).getPlane().getBpmnElement();
+			if (be instanceof Process)
+				return be;
+		} else if (bo instanceof CallableElement) {
+			return bo;
+		}
+		
+		return null;
+	}
+	
+	public class InterfaceSectionRoot extends DefaultDetailComposite {
+
+		DefinedInterfaceListComposite definedInterfacesTable;
+		ProvidedInterfaceListComposite providedInterfacesTable;
+		
+		/**
+		 * @param parent
+		 * @param style
+		 */
+		public InterfaceSectionRoot(Composite parent, int style) {
+			super(parent, style);
+		}
+
+		/**
+		 * @param section
+		 */
+		public InterfaceSectionRoot(AbstractBpmn2PropertySection section) {
+			super(section);
+		}
+
+		@Override
+		public void cleanBindings() {
+			super.cleanBindings();
+			definedInterfacesTable = null;
+			providedInterfacesTable = null;
+		}
+
+		@Override
+		public void createBindings(EObject be) {
+			definedInterfacesTable = new DefinedInterfaceListComposite(this);
+			definedInterfacesTable.bindList(be);
+
+			if (be instanceof Participant) {
+				providedInterfacesTable = new ProvidedInterfaceListComposite(this);
+				providedInterfacesTable.bindList(be, getFeature(be, "interfaceRefs"));
+			}
+			else if (be instanceof CallableElement) {
+				CallableElement ce = (CallableElement)be;
+				providedInterfacesTable = new ProvidedInterfaceListComposite(this);
+				providedInterfacesTable.bindList(be, getFeature(be, "supportedInterfaceRefs"));
+			}
+		}
+	}
+	
+	public class DefinedInterfaceListComposite extends DefaultListComposite {
+		
+		/**
+		 * @param section
+		 * @param style
+		 */
+		public DefinedInterfaceListComposite(Composite parent) {
+			super(parent,
+					AbstractListComposite.SHOW_DETAILS |
+					AbstractListComposite.ADD_BUTTON |
+					AbstractListComposite.MOVE_BUTTONS |
+					AbstractListComposite.DELETE_BUTTON);
+		}
+
+		@Override
+		public EClass getListItemClass(EObject object, EStructuralFeature feature) {
+			return listItemClass = Bpmn2Package.eINSTANCE.getInterface();
+		}
+
+		public void bindList(EObject theobject) {
+			Definitions defs = ModelUtil.getDefinitions(theobject);
+			super.bindList(defs, Bpmn2Package.eINSTANCE.getDefinitions_RootElements());
+			setTitle("All Defined Interfaces");
+		}
+
+		@Override
+		protected EObject addListItem(EObject object, EStructuralFeature feature) {
+			Interface iface = (Interface) ModelUtil.createObject(object.eResource(), PACKAGE.getInterface());
+			
+			EList<EObject> list = (EList<EObject>)object.eGet(feature);
+			list.add(iface);
+			return iface;
+		}
+		
+		@Override
+		public ListCompositeColumnProvider getColumnProvider(EObject object, EStructuralFeature feature) {
+			if (columnProvider==null) {
+				columnProvider = new ListCompositeColumnProvider(this, false);
+				columnProvider.add(new TableColumn(object, Bpmn2Package.eINSTANCE.getInterface_Name()));
+				columnProvider.add(new TableColumn(object,Bpmn2Package.eINSTANCE.getInterface_ImplementationRef()));
+			}
+			return columnProvider;
+		}
+	}
+	
+	public class ProvidedInterfaceListComposite extends DefaultListComposite {
+		
+		/**
+		 * @param section
+		 * @param style
+		 */
+		public ProvidedInterfaceListComposite(Composite parent) {
+			super(parent,
+					// only allow details editing in DefinedInterfacesTable
+//					AbstractListComposite.SHOW_DETAILS |
+					AbstractListComposite.ADD_BUTTON |
+					AbstractListComposite.MOVE_BUTTONS |
+					AbstractListComposite.REMOVE_BUTTON);
+		}
+		
+		public void bindList(final EObject theobject, final EStructuralFeature thefeature) {
+			super.bindList(theobject, thefeature);
+			if (theobject instanceof Participant)
+				setTitle("Interfaces Provided by Participant");
+			else if (theobject instanceof CallableElement)
+				setTitle("Interfaces Provided by Process");
+		}
+		
+		@Override
+		protected EObject addListItem(EObject object, EStructuralFeature feature) {
+			Definitions defs = ModelUtil.getDefinitions(object);
+			final List<Interface>items = new ArrayList<Interface>();
+			for (EObject o : defs.getRootElements()) {
+				if (o instanceof Interface) {
+					if (object instanceof Participant) {
+						Participant participant = (Participant)object;
+						if (!participant.getInterfaceRefs().contains(o))
+							items.add((Interface)o);
+					} else if (object instanceof CallableElement) {
+						CallableElement callableElement = (CallableElement)object;
+						if (!callableElement.getSupportedInterfaceRefs().contains(o))
+							items.add((Interface)o);
+					}
+				}
+			}
+			Interface iface = null;
+			ListDialog dialog = new ListDialog(getShell());
+			if (items.size()>1) {
+				dialog.setContentProvider(new IStructuredContentProvider() {
+		
+					@Override
+					public void dispose() {
+					}
+		
+					@Override
+					public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+					}
+		
+					@Override
+					public Object[] getElements(Object inputElement) {
+						return items.toArray();
+					}
+					
+				});
+				dialog.setLabelProvider(new ILabelProvider() {
+		
+					@Override
+					public void addListener(ILabelProviderListener listener) {
+					}
+		
+					@Override
+					public void dispose() {
+					}
+		
+					@Override
+					public boolean isLabelProperty(Object element, String property) {
+						return false;
+					}
+		
+					@Override
+					public void removeListener(ILabelProviderListener listener) {
+					}
+		
+					@Override
+					public Image getImage(Object element) {
+						return null;
+					}
+		
+					@Override
+					public String getText(Object element) {
+						return ModelUtil.getName((BaseElement)element);
+					}
+					
+				});
+				dialog.setTitle("Interfaces");
+				dialog.setMessage("Select the Interface provided by this Process");
+				dialog.setAddCancelButton(true);
+				dialog.setHelpAvailable(false);
+				dialog.setInput(new Object());
+
+				if (dialog.open() == Window.OK) {
+					iface = (Interface)dialog.getResult()[0];
+				}
+			}
+			else if (items.size()==1) {
+				iface = items.get(0);
+			}
+			else {
+				MessageDialog.openInformation(getShell(), "No Defined Interfaces",
+						"There are no new Interfaces to add.\n"+
+						"Please create a new Interface in the \"Defined Interfaces\" first."
+				);
+			}
+			
+			if (iface!=null) {
+				if (object instanceof Participant) {
+					Participant participant = (Participant)object;
+					participant.getInterfaceRefs().add(iface);
+				} else if (object instanceof CallableElement) {
+					CallableElement callableElement = (CallableElement)object;
+					callableElement.getSupportedInterfaceRefs().add(iface);
+				}
+			}
+
+			return iface;
+		}
+	}
+	
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/data/MessageListComposite.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/data/MessageListComposite.java
new file mode 100644
index 0000000..e3b0d31
--- /dev/null
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/data/MessageListComposite.java
@@ -0,0 +1,45 @@
+package org.eclipse.bpmn2.modeler.ui.property.data;
+
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractBpmn2PropertySection;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractListComposite;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultListComposite;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.ListCompositeColumnProvider;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.TableColumn;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.swt.widgets.Composite;
+
+public class MessageListComposite extends DefaultListComposite {
+
+	public MessageListComposite(AbstractBpmn2PropertySection section, int style) {
+		super(section, style);
+		// TODO Auto-generated constructor stub
+	}
+
+	public MessageListComposite(AbstractBpmn2PropertySection section) {
+		super(section,
+				AbstractListComposite.SHOW_DETAILS |
+				AbstractListComposite.ADD_BUTTON |
+				AbstractListComposite.MOVE_BUTTONS |
+				AbstractListComposite.DELETE_BUTTON);
+	}
+
+	public MessageListComposite(Composite parent, int style) {
+		super(parent,
+				AbstractListComposite.SHOW_DETAILS |
+				AbstractListComposite.ADD_BUTTON |
+				AbstractListComposite.MOVE_BUTTONS |
+				AbstractListComposite.DELETE_BUTTON);
+	}
+	
+	@Override
+	public ListCompositeColumnProvider getColumnProvider(EObject object, EStructuralFeature feature) {
+		if (columnProvider==null) {
+			columnProvider = new ListCompositeColumnProvider(this, false);
+			columnProvider.add(new TableColumn(object,Bpmn2Package.eINSTANCE.getMessage_Name()));
+			columnProvider.add(new TableColumn(object,Bpmn2Package.eINSTANCE.getMessage_ItemRef()));
+		}
+		return columnProvider;
+	}
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/data/MessagePropertySection.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/data/MessagePropertySection.java
index 9d50db7..30a23dd 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/data/MessagePropertySection.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/data/MessagePropertySection.java
@@ -1,51 +1,52 @@
-/******************************************************************************* 

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

- *  All rights reserved. 

- * This program is made available under the terms of the 

- * Eclipse Public License v1.0 which accompanies this distribution, 

- * and is available at http://www.eclipse.org/legal/epl-v10.html 

- * 

- * Contributors: 

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

- *

- * @author Innar Made

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

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

-

-import org.eclipse.bpmn2.Message;

-import org.eclipse.bpmn2.Property;

-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.PropertiesCompositeFactory;

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

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

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

-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;

-

-public class MessagePropertySection extends AbstractBpmn2PropertySection implements ITabbedPropertyConstants {

-	static {

-		PropertiesCompositeFactory.register(Message.class, MessageDetailComposite.class);

-		PropertiesCompositeFactory.register(Property.class, ItemAwareElementDetailComposite.class);

-	}

-

-	/* (non-Javadoc)

-	 * @see org.eclipse.bpmn2.modeler.ui.property.AbstractBpmn2PropertySection#createSectionRoot()

-	 */

-	@Override

-	protected AbstractDetailComposite createSectionRoot() {

-		return new MessageDetailComposite(this);

-	}

-

-	@Override

-	public AbstractDetailComposite createSectionRoot(Composite parent, int style) {

-		return new MessageDetailComposite(parent,style);

-	}

-

-	@Override

-	protected EObject getBusinessObjectForPictogramElement(PictogramElement pe) {

-		EObject be = super.getBusinessObjectForPictogramElement(pe);

-		if (be instanceof Message)

-			return be;

-		return null;

-	}

-}

+/******************************************************************************* 
+ * Copyright (c) 2011 Red Hat, Inc. 
+ *  All rights reserved. 
+ * This program is made available under the terms of the 
+ * Eclipse Public License v1.0 which accompanies this distribution, 
+ * and is available at http://www.eclipse.org/legal/epl-v10.html 
+ * 
+ * Contributors: 
+ * Red Hat, Inc. - initial API and implementation 
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.property.data;
+
+import org.eclipse.bpmn2.Message;
+import org.eclipse.bpmn2.Property;
+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.PropertiesCompositeFactory;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
+
+public class MessagePropertySection extends AbstractBpmn2PropertySection implements ITabbedPropertyConstants {
+	static {
+		PropertiesCompositeFactory.register(Message.class, MessageDetailComposite.class);
+		PropertiesCompositeFactory.register(Message.class, MessageListComposite.class);
+		PropertiesCompositeFactory.register(Property.class, ItemAwareElementDetailComposite.class);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.bpmn2.modeler.ui.property.AbstractBpmn2PropertySection#createSectionRoot()
+	 */
+	@Override
+	protected AbstractDetailComposite createSectionRoot() {
+		return new MessageDetailComposite(this);
+	}
+
+	@Override
+	public AbstractDetailComposite createSectionRoot(Composite parent, int style) {
+		return new MessageDetailComposite(parent,style);
+	}
+
+	@Override
+	protected EObject getBusinessObjectForPictogramElement(PictogramElement pe) {
+		EObject be = super.getBusinessObjectForPictogramElement(pe);
+		if (be instanceof Message)
+			return be;
+		return null;
+	}
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/DefinitionsPropertyComposite.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/DefinitionsPropertyComposite.java
index 7f381e6..1c6ede5 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/DefinitionsPropertyComposite.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/DefinitionsPropertyComposite.java
@@ -254,7 +254,7 @@
 			int columnIndex;
 			
 			public NamespacesTableColumn(EObject object, int columnIndex) {
-				super(object,null);
+				super(object,(EStructuralFeature)null);
 				this.columnIndex = columnIndex;
 			}
 
@@ -296,7 +296,7 @@
 				columnProvider = new ListCompositeColumnProvider(this);
 				
 				// add a namespace prefix column that does NOT come from the Import object
-				TableColumn tableColumn = new TableColumn(object,null) {
+				TableColumn tableColumn = new TableColumn(object,(EStructuralFeature)null) {
 					@Override
 					public String getHeaderText() {
 						return "Namespace Prefix";
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/gateways/GatewayDetailComposite.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/gateways/GatewayDetailComposite.java
index a2d7a7f..61c5411 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/gateways/GatewayDetailComposite.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/gateways/GatewayDetailComposite.java
@@ -1,256 +1,256 @@
-/*******************************************************************************

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

- *  All rights reserved.

- * This program is made available under the terms of the

- * Eclipse Public License v1.0 which accompanies this distribution,

- * and is available at http://www.eclipse.org/legal/epl-v10.html

- *

- * Contributors:

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

- *

- * @author Bob Brodt

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

-

-

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

-

-import java.util.List;

-

-import org.eclipse.bpmn2.Bpmn2Package;

-import org.eclipse.bpmn2.Gateway;

-import org.eclipse.bpmn2.SequenceFlow;

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

-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.DefaultListComposite;

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

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

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

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

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

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

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

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

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

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

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

-import org.eclipse.jface.viewers.ISelection;

-import org.eclipse.jface.viewers.ISelectionChangedListener;

-import org.eclipse.jface.viewers.SelectionChangedEvent;

-import org.eclipse.jface.viewers.StructuredSelection;

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

-

-public class GatewayDetailComposite extends DefaultDetailComposite {

-

-	private SequenceFlowsListComposite sequenceFlowsList;

-

-	/**

-	 * @param section

-	 */

-	public GatewayDetailComposite(AbstractBpmn2PropertySection section) {

-		super(section);

-	}

-	

-	public GatewayDetailComposite(Composite parent, int style) {

-		super(parent, style);

-	}

-

-	@Override

-	public AbstractPropertiesProvider getPropertiesProvider(EObject object) {

-		if (propertiesProvider == null) {

-			propertiesProvider = new AbstractPropertiesProvider(object) {

-				// lump all the gateway properties into one composite

-				// if a gateway doesn't have one of the attributes listed here,

-				// it simply won't be displayed.

-				String[] properties = new String[] {

-						"gatewayDirection",

-						"instantiate",

-						"activationCondition",

-						"eventGatewayType"

-						// note: "default" sequence flow is already being displayed in the SequenceFlow tab

-						// so, no need to show it here

-				};

-				

-				@Override

-				public String[] getProperties() {

-					return properties; 

-				}

-			};

-		}

-		return propertiesProvider;

-	}

-

-	@Override

-	public void cleanBindings() {

-		super.cleanBindings();

-		sequenceFlowsList = null;

-	}

-

-	@Override

-	public void createBindings(EObject be) {

-		super.createBindings(be);

-		Gateway gateway = (Gateway)be;

-		sequenceFlowsList = new SequenceFlowsListComposite(this);

-		sequenceFlowsList.bindList(gateway, Bpmn2Package.eINSTANCE.getFlowNode_Incoming());

-	}

-	

-	/**

-	 * A ListComposite that displays all incoming and outgoing sequence flows for a Gateway

-	 */

-	public class SequenceFlowsListComposite extends DefaultListComposite {

-		public SequenceFlowsListComposite(AbstractBpmn2PropertySection section) {

-			super(section, SHOW_DETAILS);

-		}

-

-		

-		public SequenceFlowsListComposite(Composite parent) {

-			super(parent, SHOW_DETAILS);

-		}

-

-		/* (non-Javadoc)

-		 * @see org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractListComposite#getContentProvider(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature, org.eclipse.emf.common.util.EList)

-		 * 

-		 * Create a custom list content provider

-		 */

-		public ListCompositeContentProvider getContentProvider(EObject object, EStructuralFeature feature, EList<EObject>list) {

-			if (contentProvider==null) {

-				contentProvider = new SequenceFlowsListContentProvider(this,object);

-			}

-			return contentProvider;

-		}

-		

-		/* (non-Javadoc)

-		 * @see org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractListComposite#getColumnProvider(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature)

-		 * 

-		 * Create a custom column provider

-		 */

-		public ListCompositeColumnProvider getColumnProvider(EObject object, EStructuralFeature feature) {

-			if (columnProvider==null) {

-				columnProvider = new SequenceFlowListColumnProvider(this, object);

-			}

-			return columnProvider;

-		}

-		

-		public void bindList(final EObject theobject, final EStructuralFeature thefeature) {

-			super.bindList(theobject, thefeature);

-			tableViewer.addPostSelectionChangedListener(new ISelectionChangedListener() {

-				public void selectionChanged(SelectionChangedEvent event) {

-					StructuredSelection sel = (StructuredSelection)event.getSelection();

-					EObject object = (EObject)sel.getFirstElement();

-					Diagram diagram = getDiagramEditor().getDiagramTypeProvider().getDiagram();

-					List<PictogramElement> pes = Graphiti.getLinkService().getPictogramElements(diagram, object);

-					getDiagramEditor().setPictogramElementForSelection(pes.get(0));

-					getDiagramEditor().refresh();

-				}

-			});

-		}

-	}

-

-	/**

-	 * Custom content provider for a gateway's incoming and outgoing sequence flows

-	 */

-	public class SequenceFlowsListContentProvider extends ListCompositeContentProvider {

-

-		public SequenceFlowsListContentProvider(AbstractListComposite listComposite, EObject object) {

-			super(listComposite, object, null, null);

-			

-			Gateway gateway = (Gateway)object;

-			list = new BasicEList<EObject>();

-			list.addAll(gateway.getIncoming());

-			list.addAll(gateway.getOutgoing());

-		}

-

-		@Override

-		public Object[] getElements(Object inputElement) {

-			return list.toArray();

-		}

-	}

-	

-	/**

-	 * A custom column provider for sequence flows

-	 */

-	public class SequenceFlowListColumnProvider extends ListCompositeColumnProvider {

-

-		public SequenceFlowListColumnProvider(AbstractListComposite list, EObject object) {

-			super(list, false);

-			// add 2 or 3 columns, depending on gateway type

-			add(new SequenceFlowListColumn(object,1)); // identifier (from -> to)

-			add(new SequenceFlowListColumn(object,2)); // Condition (expression)

-			if (object.eClass().getEStructuralFeature("default")!=null) {

-				add(new SequenceFlowListColumn(object,3)); // Is Default (boolean)

-			}

-		}

-	}

-	

-	/**

-	 * A custom TableColumn for sequence flows

-	 */

-	public class SequenceFlowListColumn extends TableColumn {

-

-		int columnIndex;

-		

-	

-		/**

-		 * Construct a column by giving it the gateway EObject and column index

-		 * @param gateway - the Gateway BPMN2 element

-		 * @param columnIndex - a column index between 1 and 3:

-		 * 1 = describes the sequence flow by source and target endpoints

-		 * 2 = conditional expression for this sequence flow

-		 * 3 = true/false if this sequence flow is the default for the gateway

-		 */

-		public SequenceFlowListColumn(EObject gateway, int columnIndex) {

-			super(gateway, null);

-			this.columnIndex = columnIndex;

-		}

-		

-		@Override

-		public String getHeaderText() {

-			switch (columnIndex) {

-			case 1:

-				return "Sequence Flow";

-			case 2:

-				return "Condition";

-			case 3:

-				return "Is Default";

-			}

-			return "header " + columnIndex;

-		}

-

-		@Override

-		public String getText(Object element) {

-			SequenceFlow flow = (SequenceFlow)element;

-			Gateway gateway = (Gateway)object;

-			String text = "";

-			switch (columnIndex) {

-			case 1:

-				text += ModelUtil.getDisplayName(flow.getSourceRef());

-				text += " -> ";

-				text += ModelUtil.getDisplayName(flow.getTargetRef());

-				break;

-			case 2:

-				text = ModelUtil.getDisplayName(flow.getConditionExpression());

-				if (text==null)

-					text = "";

-				break;

-			case 3:

-				{

-					EStructuralFeature f = gateway.eClass().getEStructuralFeature("default");

-					Object defaultFlow = gateway.eGet(f);

-					text += (flow == defaultFlow);

-				}

-				break;

-			}

-			return text;

-		}

-

-		@Override

-		public Object getValue(Object element, String property) {

-			return null;

-		}

-

-		@Override

-		public String getProperty() {

-			return "column " + columnIndex;

-		}

-	}

+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat, Inc.
+ *  All rights reserved.
+ * This program is made available under the terms of the
+ * Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+
+
+package org.eclipse.bpmn2.modeler.ui.property.gateways;
+
+import java.util.List;
+
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.Gateway;
+import org.eclipse.bpmn2.SequenceFlow;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractBpmn2PropertySection;
+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.DefaultListComposite;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.ListCompositeColumnProvider;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.ListCompositeContentProvider;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.TableColumn;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.widgets.Composite;
+
+public class GatewayDetailComposite extends DefaultDetailComposite {
+
+	private SequenceFlowsListComposite sequenceFlowsList;
+
+	/**
+	 * @param section
+	 */
+	public GatewayDetailComposite(AbstractBpmn2PropertySection section) {
+		super(section);
+	}
+	
+	public GatewayDetailComposite(Composite parent, int style) {
+		super(parent, style);
+	}
+
+	@Override
+	public AbstractPropertiesProvider getPropertiesProvider(EObject object) {
+		if (propertiesProvider == null) {
+			propertiesProvider = new AbstractPropertiesProvider(object) {
+				// lump all the gateway properties into one composite
+				// if a gateway doesn't have one of the attributes listed here,
+				// it simply won't be displayed.
+				String[] properties = new String[] {
+						"gatewayDirection",
+						"instantiate",
+						"activationCondition",
+						"eventGatewayType"
+						// note: "default" sequence flow is already being displayed in the SequenceFlow tab
+						// so, no need to show it here
+				};
+				
+				@Override
+				public String[] getProperties() {
+					return properties; 
+				}
+			};
+		}
+		return propertiesProvider;
+	}
+
+	@Override
+	public void cleanBindings() {
+		super.cleanBindings();
+		sequenceFlowsList = null;
+	}
+
+	@Override
+	public void createBindings(EObject be) {
+		super.createBindings(be);
+		Gateway gateway = (Gateway)be;
+		sequenceFlowsList = new SequenceFlowsListComposite(this);
+		sequenceFlowsList.bindList(gateway, Bpmn2Package.eINSTANCE.getFlowNode_Incoming());
+	}
+	
+	/**
+	 * A ListComposite that displays all incoming and outgoing sequence flows for a Gateway
+	 */
+	public class SequenceFlowsListComposite extends DefaultListComposite {
+		public SequenceFlowsListComposite(AbstractBpmn2PropertySection section) {
+			super(section, SHOW_DETAILS);
+		}
+
+		
+		public SequenceFlowsListComposite(Composite parent) {
+			super(parent, SHOW_DETAILS);
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractListComposite#getContentProvider(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature, org.eclipse.emf.common.util.EList)
+		 * 
+		 * Create a custom list content provider
+		 */
+		public ListCompositeContentProvider getContentProvider(EObject object, EStructuralFeature feature, EList<EObject>list) {
+			if (contentProvider==null) {
+				contentProvider = new SequenceFlowsListContentProvider(this,object);
+			}
+			return contentProvider;
+		}
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractListComposite#getColumnProvider(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature)
+		 * 
+		 * Create a custom column provider
+		 */
+		public ListCompositeColumnProvider getColumnProvider(EObject object, EStructuralFeature feature) {
+			if (columnProvider==null) {
+				columnProvider = new SequenceFlowListColumnProvider(this, object);
+			}
+			return columnProvider;
+		}
+		
+		public void bindList(final EObject theobject, final EStructuralFeature thefeature) {
+			super.bindList(theobject, thefeature);
+			tableViewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
+				public void selectionChanged(SelectionChangedEvent event) {
+					StructuredSelection sel = (StructuredSelection)event.getSelection();
+					EObject object = (EObject)sel.getFirstElement();
+					Diagram diagram = getDiagramEditor().getDiagramTypeProvider().getDiagram();
+					List<PictogramElement> pes = Graphiti.getLinkService().getPictogramElements(diagram, object);
+					getDiagramEditor().setPictogramElementForSelection(pes.get(0));
+					getDiagramEditor().refresh();
+				}
+			});
+		}
+	}
+
+	/**
+	 * Custom content provider for a gateway's incoming and outgoing sequence flows
+	 */
+	public class SequenceFlowsListContentProvider extends ListCompositeContentProvider {
+
+		public SequenceFlowsListContentProvider(AbstractListComposite listComposite, EObject object) {
+			super(listComposite, object, null, null);
+			
+			Gateway gateway = (Gateway)object;
+			list = new BasicEList<EObject>();
+			list.addAll(gateway.getIncoming());
+			list.addAll(gateway.getOutgoing());
+		}
+
+		@Override
+		public Object[] getElements(Object inputElement) {
+			return list.toArray();
+		}
+	}
+	
+	/**
+	 * A custom column provider for sequence flows
+	 */
+	public class SequenceFlowListColumnProvider extends ListCompositeColumnProvider {
+
+		public SequenceFlowListColumnProvider(AbstractListComposite list, EObject object) {
+			super(list, false);
+			// add 2 or 3 columns, depending on gateway type
+			add(new SequenceFlowListColumn(object,1)); // identifier (from -> to)
+			add(new SequenceFlowListColumn(object,2)); // Condition (expression)
+			if (object.eClass().getEStructuralFeature("default")!=null) {
+				add(new SequenceFlowListColumn(object,3)); // Is Default (boolean)
+			}
+		}
+	}
+	
+	/**
+	 * A custom TableColumn for sequence flows
+	 */
+	public class SequenceFlowListColumn extends TableColumn {
+
+		int columnIndex;
+		
+	
+		/**
+		 * Construct a column by giving it the gateway EObject and column index
+		 * @param gateway - the Gateway BPMN2 element
+		 * @param columnIndex - a column index between 1 and 3:
+		 * 1 = describes the sequence flow by source and target endpoints
+		 * 2 = conditional expression for this sequence flow
+		 * 3 = true/false if this sequence flow is the default for the gateway
+		 */
+		public SequenceFlowListColumn(EObject gateway, int columnIndex) {
+			super(gateway, (EStructuralFeature)null);
+			this.columnIndex = columnIndex;
+		}
+		
+		@Override
+		public String getHeaderText() {
+			switch (columnIndex) {
+			case 1:
+				return "Sequence Flow";
+			case 2:
+				return "Condition";
+			case 3:
+				return "Is Default";
+			}
+			return "header " + columnIndex;
+		}
+
+		@Override
+		public String getText(Object element) {
+			SequenceFlow flow = (SequenceFlow)element;
+			Gateway gateway = (Gateway)object;
+			String text = "";
+			switch (columnIndex) {
+			case 1:
+				text += ModelUtil.getDisplayName(flow.getSourceRef());
+				text += " -> ";
+				text += ModelUtil.getDisplayName(flow.getTargetRef());
+				break;
+			case 2:
+				text = ModelUtil.getDisplayName(flow.getConditionExpression());
+				if (text==null)
+					text = "";
+				break;
+			case 3:
+				{
+					EStructuralFeature f = gateway.eClass().getEStructuralFeature("default");
+					Object defaultFlow = gateway.eGet(f);
+					text += (flow == defaultFlow);
+				}
+				break;
+			}
+			return text;
+		}
+
+		@Override
+		public Object getValue(Object element, String property) {
+			return null;
+		}
+
+		@Override
+		public String getProperty() {
+			return "column " + columnIndex;
+		}
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/DataAssociationDetailComposite.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/DataAssociationDetailComposite.java
index e088559..f5b3af4 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/DataAssociationDetailComposite.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/DataAssociationDetailComposite.java
@@ -81,7 +81,7 @@
  *    o Copy the Data Association “sourceRef” value into the “targetRef.” Only one
  *      sourceRef parameter is allowed in this case.					
  */
-public class DataAssociationDetailComposite extends DefaultDetailComposite implements IResourceChangeListener {
+public class DataAssociationDetailComposite extends DefaultDetailComposite {
 	
 	public enum MapType {
 		None,
@@ -282,13 +282,20 @@
 		}
 		return MapType.None;
 	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-	 */
-	@Override
-	public void resourceChanged(IResourceChangeEvent event) {
-//		updateWidgets();
+	
+	private void redrawParent() {
+		// this DetailComposite should be sitting in a SashForm created
+		// by a ListComposite. layout this thing first
+		layout();
+		// and then search for the DetailComposite that contains the list 
+		Composite parent = getParent();
+		while (parent!=null) {
+			parent = parent.getParent();
+			if (parent instanceof AbstractDetailComposite) {
+				parent.layout();
+				break;
+			}
+		}
 	}
 
 	private void updateWidgets() {
@@ -407,7 +414,7 @@
 						showAdvancedMappingWidgets(false);
 
 						showPropertyWidgets(true);
-						redrawPage();
+						redrawParent();
 					}
 				}
 			});
@@ -426,7 +433,7 @@
 						showAdvancedMappingWidgets(false);
 
 						showTransformationWidgets(true);
-						redrawPage();
+						redrawParent();
 					}
 				}
 			});
@@ -445,7 +452,7 @@
 						showAdvancedMappingWidgets(false);
 
 						showExpressionWidgets(true);
-						redrawPage();
+						redrawParent();
 					}
 				}
 			});
@@ -464,7 +471,7 @@
 						showExpressionWidgets(false);
 						
 						showAdvancedMappingWidgets(true);
-						redrawPage();
+						redrawParent();
 					}
 				}
 			});
@@ -531,8 +538,6 @@
 					};
 					propertyDetailsComposite.setBusinessObject(association);
 					propertyDetailsComposite.setTitle("Properties");
-					// Oy vey! Fix this!
-					getParent().getParent().getParent().getParent().getParent().layout();
 				}
 			}
 			else {
@@ -593,7 +598,7 @@
 				}
 				transformationDetailsComposite.setBusinessObject(transformation);
 				transformationDetailsComposite.setTitle("Transformation");
-				transformationDetailsComposite.redrawPage();
+//				transformationDetailsComposite.redrawPage();
 	
 			}
 			else {
@@ -665,7 +670,7 @@
 				}
 				expressionDetailsComposite.setBusinessObject(expression);//association.getexpression());
 				expressionDetailsComposite.setTitle("Expression");
-				expressionDetailsComposite.redrawPage();
+//				expressionDetailsComposite.redrawPage();
 			}
 			else {
 				if (expressionComposite!=null) {
@@ -717,7 +722,7 @@
 				}
 				transformationDetailsComposite.setBusinessObject(transformation);//association.getTransformation());
 				transformationDetailsComposite.setTitle("Transformation");
-				transformationDetailsComposite.redrawPage();
+//				transformationDetailsComposite.redrawPage();
 				
 				if (assignmentsTable!=null)
 					assignmentsTable.dispose();
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/IoParametersDetailComposite.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/IoParametersDetailComposite.java
index 112eb23..0ed741c 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/IoParametersDetailComposite.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/IoParametersDetailComposite.java
@@ -68,7 +68,7 @@
 			// the control parameter must be an Activity or CallableElement (i.e. a Process or GlobalTask)
 			InputOutputSpecification ioSpecification = (InputOutputSpecification)be.eGet(ioSpecificationFeature);
 			if (ioSpecification==null) {
-				ioSpecification = (InputOutputSpecification) ModelUtil.createFeature(be,ioSpecificationFeature);
+				ioSpecification = (InputOutputSpecification) FACTORY.createInputOutputSpecification();
 				InsertionAdapter.add(be, ioSpecificationFeature, ioSpecification);
 			}