Bug 427406 - Add support for EndPoint objects and define extensions.
EndPoints not yet supported, but fixed some related issues. Also fixed
property tabs for collaboration diagrams.
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/Bpmn2ModelerResourceImpl.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/Bpmn2ModelerResourceImpl.java
index 6939389..924f30e 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/Bpmn2ModelerResourceImpl.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/Bpmn2ModelerResourceImpl.java
@@ -1162,14 +1162,15 @@
 				isTargetNamespacePrefix = xmlHelper.isTargetNamespace(prefix);
 			} catch (Exception e) {
 			}
+
+			String uriString = xmlHelper.getPathForPrefix(prefix).appendFragment(fragment).toString();
+			
 			if (!isTargetNamespacePrefix) {
-				EObject o;
-				String uriString = xmlHelper.getPathForPrefix(prefix).appendFragment(fragment).toString();
 				URI uri = URI.createURI(uriString);
 				ResourceSet rs = ModelUtil.slightlyHackedResourceSet(xmlHelper.getResource().getResourceSet());
 				Resource r = ((Bpmn2ModelerResourceSetImpl)rs).getResource(uri, true, "wsdl"); // the only problem here... //$NON-NLS-1$
 				if (r instanceof WSDLResourceImpl) {
-					o = r.getContents().get(0);
+					EObject o = r.getContents().get(0);
 					Definition def = (Definition)o;
 					// if eReference -- operation.implementationref
 					// search all of these:
@@ -1182,8 +1183,9 @@
 				}
 				return xmlHelper.getPathForPrefix(prefix).appendFragment(fragment).toString();
 			}
-			else
-				return baseURI.appendFragment(fragment).toString();
+			else {
+				return uriString;
+			}
 		}
 	}
 	
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/RootElementComparator.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/RootElementComparator.java
index 4ec7c92..21d74a5 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/RootElementComparator.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/model/RootElementComparator.java
@@ -12,18 +12,40 @@
 
 import java.util.Comparator;
 
+import org.eclipse.bpmn2.Category;
+import org.eclipse.bpmn2.CorrelationProperty;
 import org.eclipse.bpmn2.DataStore;
+import org.eclipse.bpmn2.EndPoint;
 import org.eclipse.bpmn2.Error;
 import org.eclipse.bpmn2.Escalation;
 import org.eclipse.bpmn2.EventDefinition;
 import org.eclipse.bpmn2.Interface;
 import org.eclipse.bpmn2.ItemDefinition;
 import org.eclipse.bpmn2.Message;
+import org.eclipse.bpmn2.PartnerEntity;
+import org.eclipse.bpmn2.PartnerRole;
 import org.eclipse.bpmn2.Resource;
 import org.eclipse.bpmn2.RootElement;
 import org.eclipse.bpmn2.Signal;
 
 public final class RootElementComparator implements Comparator<RootElement> {
+	private static Class[] elements = new Class[] {
+		ItemDefinition.class,
+		Error.class,
+		Signal.class,
+		Escalation.class,
+		Resource.class,
+		Message.class,
+		EventDefinition.class,
+		DataStore.class,
+		EndPoint.class,
+		Interface.class,
+		Category.class,
+		CorrelationProperty.class,
+		PartnerRole.class,
+		PartnerEntity.class,
+	};
+	
 	@Override
 	public int compare(RootElement a, RootElement b) {
 		int aOrder = getOrder(a);
@@ -32,24 +54,10 @@
 	}
 	
 	private int getOrder(RootElement element) {
-		if (element instanceof ItemDefinition)
-			return 0;
-		if (element instanceof Error)
-			return 1;
-		if (element instanceof Signal)
-			return 2;
-		if (element instanceof Escalation)
-			return 3;
-		if (element instanceof Resource)
-			return 4;
-		if (element instanceof Message)
-			return 5;
-		if (element instanceof EventDefinition)
-			return 6;
-		if (element instanceof DataStore)
-			return 7;
-		if (element instanceof Interface)
-			return 8;
+		for (int i=0; i<elements.length; ++i) {
+			if (element.eClass().getInstanceClass() == elements[i])
+				return i;
+		}
 		
 		return Integer.MAX_VALUE;
 	}
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/preferences/ModelEnablements.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/preferences/ModelEnablements.java
index aa61763..e4ec391 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/preferences/ModelEnablements.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/preferences/ModelEnablements.java
@@ -27,8 +27,8 @@
 	// Map of enabled EClasses and their enabled Features
 	private Hashtable<String, HashSet<String>> classes = new Hashtable<String, HashSet<String>>();
 	private TargetRuntime targetRuntime = null;
-	private Bpmn2DiagramType diagramType;
-	private String profile;
+	private Bpmn2DiagramType diagramType = Bpmn2DiagramType.NONE;
+	private String profile = "";
 	private int enableIdAttribute = -1;
 	
 	// require a TargetRuntime!
@@ -452,4 +452,11 @@
 		return classList;
 	}
 
+	public Bpmn2DiagramType getDiagramType() {
+		return diagramType;
+	}
+
+	public String getProfile() {
+		return profile;
+	}
 }
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 000eab2..f7aafea 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
@@ -22,6 +22,7 @@
 
 import org.eclipse.bpmn2.AdHocSubProcess;
 import org.eclipse.bpmn2.BaseElement;
+import org.eclipse.bpmn2.Bpmn2Factory;
 import org.eclipse.bpmn2.Bpmn2Package;
 import org.eclipse.bpmn2.Choreography;
 import org.eclipse.bpmn2.ChoreographyActivity;
@@ -49,6 +50,7 @@
 import org.eclipse.bpmn2.modeler.core.adapters.InsertionAdapter;
 import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
 import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceSetImpl;
+import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime;
 import org.eclipse.bpmn2.util.Bpmn2Resource;
 import org.eclipse.core.runtime.Assert;
 import org.eclipse.dd.dc.DcPackage;
@@ -714,7 +716,14 @@
 	@SuppressWarnings("unchecked")
 	public static EStructuralFeature addAnyAttribute(EObject childObject, String namespace, String name, String type, Object value) {
 		EStructuralFeature attr = null;
-		EStructuralFeature anyAttribute = childObject.eClass().getEStructuralFeature(Bpmn2Package.BASE_ELEMENT__ANY_ATTRIBUTE);
+		EClass eclass = null;
+		if (childObject instanceof EClass) {
+			eclass = (EClass)childObject;
+			childObject = ExtendedPropertiesAdapter.getDummyObject(eclass);
+		}
+		else
+			eclass = childObject.eClass();
+		EStructuralFeature anyAttribute = eclass.getEStructuralFeature(Bpmn2Package.BASE_ELEMENT__ANY_ATTRIBUTE);
 		List<BasicFeatureMap.Entry> anyMap = (List<BasicFeatureMap.Entry>)childObject.eGet(anyAttribute);
 		if (anyMap==null)
 			return null;
@@ -771,6 +780,10 @@
 	
 	public static EAttribute createDynamicAttribute(EPackage pkg, EObject object, String name, String type) {
 		if (isBpmnPackage(pkg)) {
+			String namespace = TargetRuntime.getDefaultRuntime().getRuntimeExtension().getTargetNamespace(Bpmn2DiagramType.NONE);
+			EStructuralFeature feature = ModelUtil.addAnyAttribute(object, namespace, name, type, null);
+			if (feature instanceof EAttribute)
+				return (EAttribute) feature;
 			throw new IllegalArgumentException(NLS.bind(Messages.ModelUtil_Illegal_EPackage_For_Attribute, pkg.getName()));
 		}
 		EClass eClass = object instanceof EClass ? (EClass)object : object.eClass(); 
diff --git a/org.eclipse.bpmn2.modeler.ui/plugin.xml b/org.eclipse.bpmn2.modeler.ui/plugin.xml
index be33abe..46a57f3 100644
--- a/org.eclipse.bpmn2.modeler.ui/plugin.xml
+++ b/org.eclipse.bpmn2.modeler.ui/plugin.xml
@@ -32,14 +32,21 @@
 	</extension>
 
 	<extension point="org.eclipse.core.contenttype.contentTypes">
-		<content-type base-type="org.eclipse.core.runtime.xml"
+		<content-type
+			base-type="org.eclipse.core.runtime.xml"
 			id="org.eclipse.bpmn2.content-type.xml"
 			name="%content-type.name"
 			file-extensions="bpmn,bpmn2,bpmn20,xml"
-			priority="normal">
-			<describer class="org.eclipse.bpmn2.modeler.ui.BPMN2ContentDescriber">
+			priority="high">
+			<describer
+				class="org.eclipse.bpmn2.modeler.ui.BPMN2ContentDescriber"
+				plugin="org.eclipse.bpmn2.modeler.ui">
 			</describer>
 		</content-type>
+		<file-association
+			content-type="org.eclipse.bpmn2.content-type.xml"
+			file-extensions="bpmn,bpmn2">
+		</file-association>
 	</extension>
 
 	<extension
@@ -152,16 +159,13 @@
 		<!-- ========= Default EndPoint Ext ========= -->
 		<!-- ======================================== -->
 		
-		<!-- TODO: how do we handle this?
 		<modelExtension
 			id="org.eclipse.bpmn2.modeler.runtime.none.modelExtension.endpoint"
 			runtimeId="org.eclipse.bpmn2.modeler.runtime.none"
 			name="Default EndPoint Extension"
 			type="EndPoint">
-			<property name="name" type="EString"/>
-			<property name="value" type="WSDLElement"/>
+			<property name="serviceAddress" type="EString"/>
 		</modelExtension>
-		-->
 		
 		<!-- ======================================== -->
 		<!-- ============  Property Tabs ============ -->
@@ -558,7 +562,7 @@
 			id="org.eclipse.bpmn2.modeler.interface.tab"
 			afterTab="org.eclipse.bpmn2.modeler.process.diagram.tab"
 			class="org.eclipse.bpmn2.modeler.ui.property.data.InterfacePropertySection"
-			type="org.eclipse.bpmn2.di.BPMNDiagram org.eclipse.bpmn2.Process"
+			type="org.eclipse.bpmn2.di.BPMNDiagram org.eclipse.bpmn2.Process org.eclipse.bpmn2.Participant"
 			label="%propertyTab.label.41">
 		</propertyTab>
 
@@ -987,7 +991,7 @@
 			<enable object="Assignment"/>
 			<enable object="FormalExpression"/>
 			<disable object="FormalExpression" feature="evaluatesToTypeRef"/>
-			<enable object="EndPoint"/>
+<!--			<enable object="EndPoint" feature="serviceAddress"/> -->
 		</modelEnablement>
 
 		<modelEnablement
@@ -1022,13 +1026,11 @@
 			<!-- and then add these objects -->
 			<enable object="Collaboration"/>
 			<enable object="Participant"/>
-			<enable object="Lane"/>
 			<enable object="MessageFlow"/>
 			<enable object="Conversation"/>
 			<enable object="SubConversation"/>
 			<enable object="CallConversation"/>
 			<enable object="ConversationLink"/>
-			<enable object="EndPoint"/>
 		</modelEnablement>
 
 		<modelEnablement
@@ -1088,7 +1090,6 @@
 			<disable object="ConversationNode"/>
 			<disable object="ExtensionAttributeDefinition"/>
 			<disable object="MessageFlowAssociation"/>
-			<enable object="EndPoint"/>
 		</modelEnablement>
 
 		<style object="AdHocSubProcess" foreground="546778" background="D4E7F8" textColor="546778" font="arial,10,-,-"/>
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/DefaultBpmn2RuntimeExtension.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/DefaultBpmn2RuntimeExtension.java
index 0f21b9d..3e84bad 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/DefaultBpmn2RuntimeExtension.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/DefaultBpmn2RuntimeExtension.java
@@ -30,7 +30,7 @@
 
 public class DefaultBpmn2RuntimeExtension implements IBpmn2RuntimeExtension {
 
-	private static final String targetNamespace = "http://sample.bpmn2.org/bpmn2/sample"; //$NON-NLS-1$
+	private static final String targetNamespace = "http://org.eclipse.bpmn2/default"; //$NON-NLS-1$
 	private static final String[] typeLanguages = new String[] {
 		"http://www.w3.org/2001/XMLSchema", "XML Schema", //$NON-NLS-1$ //$NON-NLS-2$
 	};
@@ -59,6 +59,9 @@
 		case CHOREOGRAPHY:
 			type = "/choreography"; //$NON-NLS-1$
 			break;
+		default:
+			type = "/ext"; //$NON-NLS-1$
+			break;
 		}
 		return targetNamespace + type;
 	}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
index 46256a5..f8737c8 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
@@ -612,9 +612,16 @@
 	}
 	
 	public ModelEnablements getModelEnablements() {
+		Bpmn2DiagramType diagramType = ModelUtil.getDiagramType(bpmnDiagram);
+		String profile = getPreferences().getDefaultToolProfile(getTargetRuntime(), diagramType);
+		if (modelEnablements!=null) {
+			if (	!modelEnablements.getProfile().equals(profile) ||
+					!modelEnablements.getDiagramType().equals(diagramType)) {
+				modelEnablements = null;
+			}
+				
+		}
 		if (modelEnablements==null) {
-			Bpmn2DiagramType diagramType = ModelUtil.getDiagramType(bpmnDiagram);
-			String profile = getPreferences().getDefaultToolProfile(getTargetRuntime(), diagramType);
 			modelEnablements = getPreferences().getModelEnablements(getTargetRuntime(), diagramType, profile);
 			if (modelEnablements.size()==0) {
 				// This Target Runtime doesn't define a profile for the current diagram type,
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 f6756c0..b869c63 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
@@ -17,6 +17,7 @@
 import org.eclipse.bpmn2.BaseElement;
 import org.eclipse.bpmn2.Bpmn2Package;
 import org.eclipse.bpmn2.CallableElement;
+import org.eclipse.bpmn2.Collaboration;
 import org.eclipse.bpmn2.Definitions;
 import org.eclipse.bpmn2.Interface;
 import org.eclipse.bpmn2.Participant;
@@ -72,10 +73,10 @@
 	@Override
 	protected EObject getBusinessObjectForSelection(ISelection selection) {
 		EObject bo = super.getBusinessObjectForSelection(selection);
-		if (bo instanceof Participant) {
-			return bo;
-		} else if (bo instanceof BPMNDiagram) {
+		if (bo instanceof BPMNDiagram) {
 			BaseElement be = ((BPMNDiagram)bo).getPlane().getBpmnElement();
+			if (be instanceof Collaboration)
+				return be;
 			if (be instanceof Process)
 				return be;
 		} else if (bo instanceof CallableElement) {
@@ -182,7 +183,7 @@
 		}
 	}
 	
-	public class ProvidedInterfaceListComposite extends DefaultListComposite {
+	public static class ProvidedInterfaceListComposite extends DefaultListComposite {
 		
 		/**
 		 * @param section
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/DataItemsDetailComposite.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/DataItemsDetailComposite.java
index 968a6cc..a700a35 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/DataItemsDetailComposite.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/DataItemsDetailComposite.java
@@ -13,16 +13,16 @@
 
 package org.eclipse.bpmn2.modeler.ui.property.diagrams;
 
-import org.eclipse.bpmn2.Definitions;
+import org.eclipse.bpmn2.BaseElement;
+import org.eclipse.bpmn2.Collaboration;
 import org.eclipse.bpmn2.Process;
-import org.eclipse.bpmn2.RootElement;
 import org.eclipse.bpmn2.di.BPMNDiagram;
 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.AbstractPropertiesProvider;
 import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDetailComposite;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
 import org.eclipse.bpmn2.modeler.ui.editor.BPMN2Editor;
-import org.eclipse.bpmn2.modeler.ui.util.PropertyUtil;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
@@ -75,8 +75,16 @@
 			return null;
 		}
 		BPMNDiagram bpmnDiagram = ((BPMN2Editor)getDiagramEditor()).getBpmnDiagram();
-		if (bpmnDiagram.getPlane().getBpmnElement() != object)
-			return null;
+		BaseElement bpmnElement = bpmnDiagram.getPlane().getBpmnElement();
+		if (bpmnElement != object) {
+			// This Process is embedded in a Participant, and is not the top-level diagram
+			// only display variables table for the selected Process, not all Processes
+			if (propertySection!=null) {
+				EObject bo = BusinessObjectUtil.getBusinessObjectForSelection(propertySection.getSelection());
+				if (bo!=object)
+					return null;
+			}
+		}
 		return super.bindList(object, feature, listItemClass);
 	}
 }
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/DataItemsPropertySection.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/DataItemsPropertySection.java
index 03ccf52..77a8456 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/DataItemsPropertySection.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/DataItemsPropertySection.java
@@ -13,8 +13,11 @@
 import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractDetailComposite;
 import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultPropertySection;
 import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.bpmn2.Process;
 
 public class DataItemsPropertySection extends DefaultPropertySection {
 
@@ -27,8 +30,18 @@
 	}
 
 	@Override
+	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
+		if (super.appliesTo(part, selection)) {
+			return getBusinessObjectForSelection(selection) != null;
+		}
+		return false;
+	}
+	
+	@Override
 	protected EObject getBusinessObjectForSelection(ISelection selection) {
 		EObject be = super.getBusinessObjectForSelection(selection);
-		return ModelUtil.getDefinitions(be);
+		if (be instanceof Process || ModelUtil.getDiagramType(be)==Bpmn2DiagramType.PROCESS)
+			return ModelUtil.getDefinitions(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 9101adc..14bda82 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
@@ -27,6 +27,7 @@
 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.PropertiesCompositeFactory;
 import org.eclipse.bpmn2.modeler.core.merrimac.clad.TableColumn;
 import org.eclipse.bpmn2.modeler.core.merrimac.dialogs.ObjectEditor;
 import org.eclipse.bpmn2.modeler.core.merrimac.dialogs.TextAndButtonObjectEditor;
@@ -87,7 +88,6 @@
 						"relationships", //$NON-NLS-1$
 						"rootElements#PartnerEntity", //$NON-NLS-1$
 						"rootElements#PartnerRole", //$NON-NLS-1$
-						// TODO: how do we handle this?
 //						"rootElements#EndPoint", //$NON-NLS-1$
 						"rootElements#Resource", //$NON-NLS-1$
 						"rootElements#DataStore", //$NON-NLS-1$
@@ -480,7 +480,6 @@
 		}
 	}
 	
-	// TODO: finish this
 	public class EndPointListComposite extends DefaultListComposite {
 
 		public EndPointListComposite(AbstractBpmn2PropertySection section) {
@@ -492,66 +491,100 @@
 			return Bpmn2Package.eINSTANCE.getEndPoint();
 		}
 		
-		protected int createColumnProvider(EObject object, EStructuralFeature feature) {
-			if (columnProvider==null) {
-				columnProvider = new ListCompositeColumnProvider(this);
+//		protected int createColumnProvider(EObject object, EStructuralFeature feature) {
+//			if (columnProvider==null) {
+//				columnProvider = new ListCompositeColumnProvider(this);
+//
+//				TargetRuntime rt = getTargetRuntime();
+//				for (ModelExtensionDescriptor md : rt.getModelExtensions()) {
+//					if ("EndPoint".equals(md.getType())) {
+//
+//						for (Property p : md.getProperties()) {
+//							final String name = p.name;
+//							TableColumn tableColumn = new TableColumn(object,(EStructuralFeature)null) {
+//								@Override
+//								public String getHeaderText() {
+//									return ModelUtil.toDisplayName(name);
+//								}
+//				
+//								@Override
+//								public String getText(Object element) {
+//									if (element instanceof EndPoint) {
+//										EndPoint ep = (EndPoint) element;
+//										EStructuralFeature feature = ModelUtil.getAnyAttribute(ep, name);
+//										Object v = ep.eGet(feature);
+//										if (v!=null)
+//											return v.toString();
+//									}
+//									return ""; //$NON-NLS-1$
+//								}
+//
+//								@Override
+//								public CellEditor createCellEditor (Composite parent) {
+//									CellEditor ce = null;
+//									return ce;
+//								}
+//							};
+//							columnProvider.add(tableColumn);
+//						}
+//					}
+//				}
+//			}
+//			return columnProvider.getColumns().size();
+//		}
+//		
+//		@Override
+//		public AbstractDetailComposite createDetailComposite(Class eClass, Composite parent, int style) {
+//			AbstractDetailComposite composite = new DefaultDetailComposite(parent, style) {
+//
+//				protected boolean isModelObjectEnabled(EClass eclass, EStructuralFeature feature) {
+//					return true;
+//				}
+//				
+//				@Override
+//				public AbstractPropertiesProvider getPropertiesProvider(EObject object) {
+//					if (propertiesProvider==null) {
+//						propertiesProvider = new AbstractPropertiesProvider(object) {
+//							String[] properties = null;
+//							
+//							@Override
+//							public String[] getProperties() {
+//								if (properties==null) {
+//									TargetRuntime rt = getTargetRuntime();
+//									for (ModelExtensionDescriptor md : rt.getModelExtensions()) {
+//										if ("EndPoint".equals(md.getType())) {
+//											properties = new String[md.getProperties().size()];
+//											int i=0;
+//											for (Property p : md.getProperties()) {
+//												properties[i++] = p.name;
+//											}
+//										}
+//									}
+//								}
+//								
+//								return properties; 
+//							}
+//						};
+//					}
+//					return propertiesProvider;
+//				}
+//				
+//			};
+//			
+//			return composite;
+//		}
 
-				TargetRuntime rt = getTargetRuntime();
-				for (ModelExtensionDescriptor md : rt.getModelExtensions()) {
-					if ("EndPoint".equals(md.getType())) {
-
-						for (Property p : md.getProperties()) {
-							final String name = p.name;
-							TableColumn tableColumn = new TableColumn(object,(EStructuralFeature)null) {
-								@Override
-								public String getHeaderText() {
-									return ModelUtil.toDisplayName(name);
-								}
-				
-								@Override
-								public String getText(Object element) {
-									if (element instanceof EndPoint) {
-										EndPoint ep = (EndPoint) element;
-										EStructuralFeature feature = ModelUtil.getAnyAttribute(ep, name);
-										Object v = ep.eGet(feature);
-										if (v!=null)
-											return v.toString();
-									}
-									return ""; //$NON-NLS-1$
-								}
-
-								@Override
-								public CellEditor createCellEditor (Composite parent) {
-									CellEditor ce = null;
-									// TODO: create a dialog cell editor for NS prefix
-									return ce;
-								}
-							};
-							columnProvider.add(tableColumn);
-						}
-					}
-				}
-			}
-			return columnProvider.getColumns().size();
-		}
-		
 		@Override
 		protected EObject addListItem(EObject object, EStructuralFeature feature) {
 			EObject ep = super.addListItem(object, feature);
-			TargetRuntime rt = getTargetRuntime();
-			for (ModelExtensionDescriptor md : rt.getModelExtensions()) {
-				if ("EndPoint".equals(md.getType())) {
-					md.populateObject(ep, true);
-				}
-			}
+//			TargetRuntime rt = getTargetRuntime();
+//			for (ModelExtensionDescriptor md : rt.getModelExtensions()) {
+//				if ("EndPoint".equals(md.getType())) {
+//					md.populateObject(ep, true);
+//				}
+//			}
 
 			return ep;
 		}
-
-		@Override
-		protected EObject editListItem(EObject object, EStructuralFeature feature) {
-			return super.editListItem(object, feature);
-		}
-		
 	}
 }
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/ParticipantDetailComposite.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/ParticipantDetailComposite.java
index c073633..e27f228 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/ParticipantDetailComposite.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/ParticipantDetailComposite.java
@@ -24,6 +24,7 @@
 import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDetailComposite;
 import org.eclipse.bpmn2.modeler.core.merrimac.dialogs.IntObjectEditor;
 import org.eclipse.bpmn2.modeler.core.utils.ErrorUtils;
+import org.eclipse.bpmn2.modeler.ui.property.data.InterfacePropertySection.ProvidedInterfaceListComposite;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EReference;
 import org.eclipse.emf.ecore.EStructuralFeature;
@@ -38,6 +39,8 @@
  */
 public class ParticipantDetailComposite extends DefaultDetailComposite {
 
+	protected ProvidedInterfaceListComposite providedInterfacesTable;
+
 	public ParticipantDetailComposite(Composite parent, int style) {
 		super(parent, style);
 	}
@@ -57,7 +60,6 @@
 						"processRef", //$NON-NLS-1$
 						"participantMultiplicity", //$NON-NLS-1$
 						"interfaceRefs", //$NON-NLS-1$
-						// TODO: finish this
 //						"endPointRefs", //$NON-NLS-1$
 				};
 				
@@ -70,6 +72,12 @@
 		return propertiesProvider;
 	}
 
+	@Override
+	public void cleanBindings() {
+		super.cleanBindings();
+		providedInterfacesTable = null;
+	}
+	
 	protected void bindReference(Composite parent, EObject object, EReference reference) {
 		if (isModelObjectEnabled(object.eClass(), reference)) {
 			if (parent==null)
@@ -97,6 +105,10 @@
 				
 				minEditor.updateText();
 			}
+			else if ("interfaceRefs".equals(reference.getName())) {
+				providedInterfacesTable = new ProvidedInterfaceListComposite(this);
+				providedInterfacesTable.bindList(object, getFeature(object, "interfaceRefs")); //$NON-NLS-1$
+			}
 			else {
 				super.bindReference(parent, object, reference);
 			}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/ProcessDiagramPropertySection.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/ProcessDiagramPropertySection.java
index 10d856c..b1288da 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/ProcessDiagramPropertySection.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/diagrams/ProcessDiagramPropertySection.java
@@ -55,9 +55,10 @@
 	
 	@Override
 	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		if (super.appliesTo(part, selection))
-			return true;
-		EObject bo = getBusinessObjectForSelection(selection);
-		return bo!=null;
+		if (super.appliesTo(part, selection)) {
+			EObject bo = getBusinessObjectForSelection(selection);
+			return bo!=null;
+		}
+		return false;
 	}
 }