Fixed NPE during delete of nested Lanes in Pools.
Fixed NPE from double-click actcion when Property View is closed.
Added a "Show Property View" context menu action.
Added missing [+] decorator to SubChoreography.
Added missing Participants in Outline View for Choreographies.
diff --git a/plugins/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/di/DIUtils.java b/plugins/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/di/DIUtils.java
index 7db2963..822d37a 100644
--- a/plugins/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/di/DIUtils.java
+++ b/plugins/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/di/DIUtils.java
@@ -652,48 +652,51 @@
 		
 		boolean canDelete = false;
 		Definitions definitions = (Definitions)rootElement.eContainer();
-		BPMNDiagram bpmnDiagram = DIUtils.findBPMNDiagram(rootElement);
-		RootElement newRootElement = null;
-		if (bpmnDiagram==null) {
-			List<EObject> allObjects = new ArrayList<EObject>();
-			Map<EObject, Collection<EStructuralFeature.Setting>> usages;
-			TreeIterator<EObject> iter = rootElement.eContainer().eAllContents();
-			while (iter.hasNext())
-				allObjects.add(iter.next());
-				
-	        usages = UsageCrossReferencer.findAll(allObjects, rootElement);
-			canDelete = usages.isEmpty();
-		}
-		else {
-			// find a replacement for the BPMNDiagram target element
-			for (RootElement r : definitions.getRootElements()) {
-				if (r!=rootElement && (r instanceof FlowElementsContainer || r instanceof Collaboration)) {
-					if (rootElement instanceof Collaboration) {
-						Collaboration collaboration = (Collaboration) rootElement;
-						if (collaboration.getParticipants().isEmpty()) {
-							newRootElement = r;
-							canDelete = true;
-							break;
+		// check if this thing has already been deleted (eContainer == null)
+		if (definitions!=null) {
+			BPMNDiagram bpmnDiagram = DIUtils.findBPMNDiagram(rootElement);
+			RootElement newRootElement = null;
+			if (bpmnDiagram==null) {
+				List<EObject> allObjects = new ArrayList<EObject>();
+				Map<EObject, Collection<EStructuralFeature.Setting>> usages;
+				TreeIterator<EObject> iter = definitions.eAllContents();
+				while (iter.hasNext())
+					allObjects.add(iter.next());
+					
+		        usages = UsageCrossReferencer.findAll(allObjects, rootElement);
+				canDelete = usages.isEmpty();
+			}
+			else {
+				// find a replacement for the BPMNDiagram target element
+				for (RootElement r : definitions.getRootElements()) {
+					if (r!=rootElement && (r instanceof FlowElementsContainer || r instanceof Collaboration)) {
+						if (rootElement instanceof Collaboration) {
+							Collaboration collaboration = (Collaboration) rootElement;
+							if (collaboration.getParticipants().isEmpty()) {
+								newRootElement = r;
+								canDelete = true;
+								break;
+							}
+								
 						}
-							
-					}
-					else if (rootElement instanceof FlowElementsContainer) {
-						FlowElementsContainer container = (FlowElementsContainer) rootElement;
-						if (container.getFlowElements().isEmpty()) {
-							newRootElement = r;
-							canDelete = true;
-							break;
+						else if (rootElement instanceof FlowElementsContainer) {
+							FlowElementsContainer container = (FlowElementsContainer) rootElement;
+							if (container.getFlowElements().isEmpty()) {
+								newRootElement = r;
+								canDelete = true;
+								break;
+							}
 						}
+						break;
 					}
-					break;
 				}
 			}
-		}
-		
-		if (canDelete) {
-			EcoreUtil.delete(rootElement);
-			if (bpmnDiagram!=null && newRootElement!=null)
-				bpmnDiagram.getPlane().setBpmnElement(newRootElement);
+			
+			if (canDelete) {
+				EcoreUtil.delete(rootElement);
+				if (bpmnDiagram!=null && newRootElement!=null)
+					bpmnDiagram.getPlane().setBpmnElement(newRootElement);
+			}
 		}
 		return canDelete;
 	}
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
index 55f6350..e92c657 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
@@ -604,11 +604,6 @@
 	public String getContributorId() {
 		return CONTRIBUTOR_ID;
 	}
-
-	public TargetRuntime getTargetRuntime(ITabDescriptorProvider tdp) {
-		tabDescriptorProvider = tdp;
-		return getTargetRuntime();
-	}
 	
 	public TargetRuntime getTargetRuntime() {
 		if (targetRuntime==null) {
@@ -843,13 +838,14 @@
 		}
 		if (required==ITabDescriptorProvider.class) {
 			if (tabDescriptorProvider==null) {
-				IWorkbenchPage page = getEditorSite().getPage();
-				String viewID = "org.eclipse.ui.views.PropertySheet"; //$NON-NLS-1$
-				try {
-					page.showView(viewID, null, IWorkbenchPage.VIEW_CREATE);
-					page.showView(viewID, null,  IWorkbenchPage.VIEW_ACTIVATE);
-				}
-				catch (Exception e) {}
+				tabDescriptorProvider = new PropertyTabDescriptorProvider();
+//				IWorkbenchPage page = getEditorSite().getPage();
+//				String viewID = "org.eclipse.ui.views.PropertySheet"; //$NON-NLS-1$
+//				try {
+//					page.showView(viewID, null, IWorkbenchPage.VIEW_CREATE);
+//					page.showView(viewID, null,  IWorkbenchPage.VIEW_ACTIVATE);
+//				}
+//				catch (Exception e) {}
 			}
 			return tabDescriptorProvider;
 		}
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorDiagramBehavior.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorDiagramBehavior.java
index 087fc28..6de025a 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorDiagramBehavior.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorDiagramBehavior.java
@@ -78,6 +78,10 @@
 					action.setEnabled(action.isEnabled());
 					manager.add(action);
 				}
+
+				action = getDiagramContainer().getActionRegistry().getAction("show.property.view"); //$NON-NLS-1$
+				action.setText(action.getText());
+				manager.add(action);
 			}
 		};
 	}
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
index 854d184..b89c4ff 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
@@ -63,6 +63,7 @@
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.views.contentoutline.ContentOutline;
 
@@ -430,6 +431,37 @@
 			}
 		};
 		registry.registerAction(action);
+		
+		action = new WorkbenchPartAction(multipageEditor.getDesignEditor()) {
+
+			@Override
+			protected void init() {
+				super.init();
+				setId("show.property.view"); //$NON-NLS-1$
+			}
+
+			@Override
+			public String getText() {
+				return Messages.DesignEditor_Show_Property_View_Action;
+			}
+
+			@Override
+			protected boolean calculateEnabled() {
+				return true;
+			}
+
+			public void run() {
+				IWorkbenchPage page = getEditorSite().getPage();
+				String viewID = "org.eclipse.ui.views.PropertySheet"; //$NON-NLS-1$
+				try {
+					page.showView(viewID, null, IWorkbenchPage.VIEW_CREATE);
+					page.showView(viewID, null,  IWorkbenchPage.VIEW_ACTIVATE);
+				}
+				catch (Exception e) {}
+			}
+		};
+		registry.registerAction(action);
+
 	}
 
 	public class AddRemoveDiagramListener implements ResourceSetListener {
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/Messages.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/Messages.java
index 4ea544f..eb05ba4 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/Messages.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/Messages.java
@@ -23,6 +23,7 @@
 	public static String DesignEditor_Diagram_Tab;
 	public static String DesignEditor_Hide_Source_View_Action;
 	public static String DesignEditor_Show_Source_View_Action;
+	public static String DesignEditor_Show_Property_View_Action;
 	static {
 		// initialize resource bundle
 		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/messages.properties b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/messages.properties
index e4d0eab..987fe67 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/messages.properties
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/messages.properties
@@ -17,3 +17,4 @@
 DesignEditor_Diagram_Tab=Diagram
 DesignEditor_Hide_Source_View_Action=Hide Source View
 DesignEditor_Show_Source_View_Action=Show Source View
+DesignEditor_Show_Property_View_Action=Show Property View
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/SubChoreographyFeatureContainer.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/SubChoreographyFeatureContainer.java
index bd8500c..0b2ce4e 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/SubChoreographyFeatureContainer.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/SubChoreographyFeatureContainer.java
@@ -13,13 +13,18 @@
 package org.eclipse.bpmn2.modeler.ui.features.choreography;
 
 import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.ChoreographyActivity;
 import org.eclipse.bpmn2.Participant;
 import org.eclipse.bpmn2.SubChoreography;
+import org.eclipse.bpmn2.modeler.core.features.GraphitiConstants;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.core.utils.ShapeDecoratorUtil;
 import org.eclipse.bpmn2.modeler.ui.ImageProvider;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.graphiti.features.IAddFeature;
 import org.eclipse.graphiti.features.ICreateFeature;
 import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
 
 public class SubChoreographyFeatureContainer extends AbstractChoreographyFeatureContainer {
 
@@ -39,6 +44,21 @@
 		return new AddSubChoreographyFeature(fp);
 	}
 
+	@Override
+	public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+		MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
+		multiUpdate.addFeature(new UpdateChoreographyMarkerFeature(fp) {
+			@Override
+			protected void doUpdate(ChoreographyActivity element, ContainerShape markerContainer) {
+				super.doUpdate(element, markerContainer);
+				// SubChoreography always has an EXPAND marker
+				ShapeDecoratorUtil.showActivityMarker(markerContainer, GraphitiConstants.ACTIVITY_MARKER_EXPAND);
+			}
+		});
+		
+		return multiUpdate;
+	}
+	
 	public static class CreateSubChoreographyFeature extends AbstractCreateChoreographyActivityFeature<SubChoreography> {
 
 		public CreateSubChoreographyFeature(IFeatureProvider fp) {
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/conversation/ConversationFeatureContainer.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/conversation/ConversationFeatureContainer.java
index d4767ca..cb88e17 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/conversation/ConversationFeatureContainer.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/conversation/ConversationFeatureContainer.java
@@ -16,7 +16,6 @@
 import org.eclipse.bpmn2.Conversation;
 import org.eclipse.bpmn2.SubConversation;
 import org.eclipse.bpmn2.modeler.core.features.BaseElementFeatureContainer;
-import org.eclipse.bpmn2.modeler.core.features.DefaultLayoutBPMNConnectionFeature;
 import org.eclipse.bpmn2.modeler.core.features.DefaultMoveBPMNShapeFeature;
 import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
 import org.eclipse.bpmn2.modeler.core.features.label.UpdateLabelFeature;
@@ -30,10 +29,8 @@
 import org.eclipse.graphiti.features.IMoveShapeFeature;
 import org.eclipse.graphiti.features.IResizeShapeFeature;
 import org.eclipse.graphiti.features.IUpdateFeature;
-import org.eclipse.graphiti.features.context.IAddContext;
 import org.eclipse.graphiti.features.context.IResizeShapeContext;
 import org.eclipse.graphiti.features.impl.DefaultResizeShapeFeature;
-import org.eclipse.graphiti.mm.pictograms.ContainerShape;
 
 public class ConversationFeatureContainer extends BaseElementFeatureContainer {
 
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/lane/DeleteLaneFeature.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/lane/DeleteLaneFeature.java
index d747c82..57764c5 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/lane/DeleteLaneFeature.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/lane/DeleteLaneFeature.java
@@ -46,6 +46,10 @@
 		ContainerShape laneContainerShape = (ContainerShape) context.getPictogramElement();
 		ContainerShape parentContainerShape = laneContainerShape.getContainer();
 		Lane lane = (Lane)getBusinessObjectForPictogramElement(laneContainerShape);
+		if (lane==null) {
+			// this can happen if the lane was already deleted by its parent Lane or Pool
+			return;
+		}
 		LaneSet laneSet = (LaneSet)lane.eContainer();
 		
 		if (parentContainerShape != null) {
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/PropertyTabDescriptorProvider.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/PropertyTabDescriptorProvider.java
index 08128d3..3615397 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/PropertyTabDescriptorProvider.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/PropertyTabDescriptorProvider.java
@@ -16,11 +16,11 @@
 import java.util.Hashtable;
 import java.util.List;
 
+import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;
 import org.eclipse.bpmn2.modeler.core.runtime.Bpmn2SectionDescriptor;
 import org.eclipse.bpmn2.modeler.core.runtime.PropertyTabDescriptor;
 import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime;
 import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
-import org.eclipse.bpmn2.modeler.ui.editor.BPMN2Editor;
 import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
@@ -35,7 +35,7 @@
 	// cached in this map. It is the BPMN2 Editor's responsibility to remove these items from the map
 	// when it is disposed().
 	// @see PropertyTabDescriptorProvider#disposeTabDescriptors(Resource)
-	Hashtable <EObject, TabDescriptorList> tabDescriptorListMap = new Hashtable <EObject, TabDescriptorList>();
+	static Hashtable <EObject, TabDescriptorList> tabDescriptorListMap = new Hashtable <EObject, TabDescriptorList>();
 	
 	public PropertyTabDescriptorProvider() {
 		super();
@@ -45,26 +45,22 @@
 	@Override
 	public ITabDescriptor[] getTabDescriptors(IWorkbenchPart part, ISelection selection) {
 		
-		// is the Tab Descriptor List already in our cache?
-		TabDescriptorList tabDescriptorList = null;
 		EObject businessObject = BusinessObjectUtil.getBusinessObjectForSelection(selection);
-		if (businessObject!=null) {
-			tabDescriptorList = tabDescriptorListMap.get(businessObject);
-			if (tabDescriptorList!=null) {
-				// Yes! return it.
-				return tabDescriptorList.toArray();
-			}
+		if (businessObject==null || businessObject.eResource()==null) {
+			return new ITabDescriptor[] {};
+		}
+		
+		// is the Tab Descriptor List already in our cache?
+		TabDescriptorList tabDescriptorList = tabDescriptorListMap.get(businessObject);
+		if (tabDescriptorList!=null) {
+			// Yes! return it.
+			return tabDescriptorList.toArray();
 		}
 		
 		// No, we need build the list: get the Target Runtime <propertyTab> contributions
 		// and merge with the Default Runtime Tab Descriptors
-		TargetRuntime rt = TargetRuntime.getDefaultRuntime();
-		Object bpmn2Editor = part.getAdapter(BPMN2Editor.class);
-		if (bpmn2Editor instanceof BPMN2Editor) {
-			rt = ((BPMN2Editor)bpmn2Editor).getTargetRuntime(this);
-		}
-		
 		List<PropertyTabDescriptor> desc = null;
+		TargetRuntime rt = Bpmn2Preferences.getInstance(businessObject.eResource()).getRuntime();
 		if (rt!=TargetRuntime.getDefaultRuntime()) {
 			desc = TargetRuntime.getDefaultRuntime().buildPropertyTabDescriptors();
 			desc.addAll(rt.buildPropertyTabDescriptors());
@@ -185,5 +181,14 @@
 				tabDescriptorListMap.remove(object);
 			}
 		}
+		// clean up any dangling EObjects (ones that are not contained in a Resource)
+		List<EObject> removed = new ArrayList<EObject>();
+		for (EObject o : tabDescriptorListMap.keySet()) {
+			if (o.eResource()==null) {
+				removed.add(o);
+			}
+		}
+		for (EObject o : removed)
+			tabDescriptorListMap.remove(o);
 	}
 }
diff --git a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/views/outline/FlowElementTreeEditPart.java b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/views/outline/FlowElementTreeEditPart.java
index 2d4ebae..6f078bb 100644
--- a/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/views/outline/FlowElementTreeEditPart.java
+++ b/plugins/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/views/outline/FlowElementTreeEditPart.java
@@ -18,6 +18,7 @@
 import org.eclipse.bpmn2.CallActivity;
 import org.eclipse.bpmn2.CallableElement;
 import org.eclipse.bpmn2.CatchEvent;
+import org.eclipse.bpmn2.Choreography;
 import org.eclipse.bpmn2.ChoreographyActivity;
 import org.eclipse.bpmn2.Definitions;
 import org.eclipse.bpmn2.FlowElement;
@@ -25,6 +26,7 @@
 import org.eclipse.bpmn2.FlowNode;
 import org.eclipse.bpmn2.Lane;
 import org.eclipse.bpmn2.LaneSet;
+import org.eclipse.bpmn2.Participant;
 import org.eclipse.bpmn2.Process;
 import org.eclipse.bpmn2.SequenceFlow;
 import org.eclipse.bpmn2.SubChoreography;
@@ -168,6 +170,23 @@
 		if (container instanceof SubChoreography) {
 			retList.addAll(((SubChoreography)container).getArtifacts());
 		}
+		if (container instanceof Choreography) {
+			// Add Pools as children if the Pool has a Process associated with it,
+			// or if the Participant is NOT referenced by a Choreography Activity.
+			for (Participant p : ((Choreography)container).getParticipants()) {
+				if (p.getProcessRef()!=null)
+					retList.add(p);
+				else {
+					for (FlowElement fe : flowElements) {
+						if (fe instanceof ChoreographyActivity) {
+							if (!((ChoreographyActivity)fe).getParticipantRefs().contains(p)) {
+								retList.add(p);
+							}
+						}
+					}
+				}
+			}
+		}
 		return retList;
 	}