It works!!! mostly...
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 725c11e..311591c 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
@@ -73,6 +73,7 @@
 import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
 import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
 import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.graphiti.dt.IDiagramTypeProvider;
 import org.eclipse.graphiti.features.IFeatureProvider;
 import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
 import org.eclipse.graphiti.mm.pictograms.Diagram;
@@ -140,7 +141,7 @@
 	
 	private Bpmn2Preferences preferences;
 	private TargetRuntime targetRuntime;
-	private Hashtable<BPMNDiagram, GraphicalViewer> mapDiagramToViewer = new Hashtable<BPMNDiagram, GraphicalViewer>();
+//	private Hashtable<BPMNDiagram, GraphicalViewer> mapDiagramToViewer = new Hashtable<BPMNDiagram, GraphicalViewer>();
 
 	protected DiagramEditorAdapter editorAdapter;
 	
@@ -549,37 +550,42 @@
 		if (bpmnDiagram==null)
 			bpmnDiagram = getModelHandler().getDefinitions().getDiagrams().get(0);
 
-		if (bpmnDiagram!=null) {
-			GraphicalViewer viewer = getGraphicalViewer();
-			mapDiagramToViewer.put(bpmnDiagram, viewer);
-		}
+//		if (bpmnDiagram!=null) {
+//			GraphicalViewer viewer = getGraphicalViewer();
+//			mapDiagramToViewer.put(bpmnDiagram, viewer);
+//		}
 		return bpmnDiagram;
 	}
 	
 	public void setBpmnDiagram(final BPMNDiagram bpmnDiagram) {
-//		if (this.bpmnDiagram == bpmnDiagram)
-//			return;
+		IDiagramTypeProvider dtp = getDiagramTypeProvider();
 		
-		GraphicalViewer viewer = mapDiagramToViewer.get(bpmnDiagram);
 		// do we need to create a new Diagram or is this already in the model?
 		Diagram oldDiagram = null;
 		Diagram diagram = null;
-		final Resource resource = getDiagramTypeProvider().getDiagram().eResource();
-		for (EObject o : resource.getContents()) {
-			if (o instanceof Diagram) {
-				Diagram d = (Diagram)o;
-				if (BusinessObjectUtil.getFirstElementOfType(d, BPMNDiagram.class) == bpmnDiagram) {
-					oldDiagram = d;
-					break;
+		ResourceSet resourceSet = getResourceSet();
+		if (resourceSet!=null) {
+			for (Resource r : resourceSet.getResources()) {
+				for (EObject o : r.getContents()) {
+					if (o instanceof Diagram) {
+						Diagram d = (Diagram)o;
+						if (BusinessObjectUtil.getFirstElementOfType(d, BPMNDiagram.class) == bpmnDiagram) {
+							oldDiagram = d;
+							break;
+						}
+					}
 				}
+				if (oldDiagram!=null)
+					break;
 			}
 		}
 		
 		if (oldDiagram==null) {
 			// create a new one
-			String typeId = getDiagramTypeProvider().getDiagram().getDiagramTypeId();
+			String typeId = dtp.getDiagram().getDiagramTypeId();
 			final Diagram newDiagram = Graphiti.getCreateService().createDiagram(typeId, bpmnDiagram.getName(), true);
-			final IFeatureProvider featureProvider = getDiagramTypeProvider().getFeatureProvider();
+			final IFeatureProvider featureProvider = dtp.getFeatureProvider();
+			final Resource resource = dtp.getDiagram().eResource();
 			TransactionalEditingDomain domain = getEditingDomain();
 			domain.getCommandStack().execute(new RecordingCommand(domain) {
 				protected void doExecute() {
@@ -598,7 +604,7 @@
 		// set the new Diagram in the DTP and refresh graphical viewer
 		getRefreshBehavior().initRefresh();
 		setPictogramElementsForSelection(null);
-		getDiagramTypeProvider().init(diagram, this);
+		dtp.init(diagram, this);
 //		if (viewer!=null)
 //			setGraphicalViewer(viewer);
 		getGraphicalViewer().setContents(diagram);
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java
index c9335a3..9194362 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java
@@ -22,6 +22,7 @@
 import org.eclipse.bpmn2.Definitions;
 import org.eclipse.bpmn2.di.BPMNDiagram;
 import org.eclipse.bpmn2.di.BPMNPlane;
+import org.eclipse.bpmn2.modeler.ui.util.PropertyUtil;
 import org.eclipse.bpmn2.modeler.ui.wizards.Bpmn2DiagramEditorInput;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.emf.common.command.Command;
@@ -55,11 +56,13 @@
 import org.eclipse.swt.custom.CTabFolder2Listener;
 import org.eclipse.swt.custom.CTabFolderEvent;
 import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.part.EditorPart;
 import org.eclipse.ui.part.FileEditorInput;
@@ -314,6 +317,8 @@
 
 			this.setActivePage(pageIndex);
 			updateTabs();
+			
+//			dumpTabWidgets();
 		}
 		catch (Exception e) {
 			e.printStackTrace();
@@ -323,13 +328,21 @@
 	protected void removeDesignPage(BPMNDiagram bpmnDiagram) {
 		int pageIndex = bpmnDiagrams.indexOf(bpmnDiagram);
 		if (pageIndex>0) {
+			// go back to "Design" page - the only page that can't be removed
+			setActivePage(0);
+			
 			IEditorPart editor = getEditor(pageIndex);
 			if (editor instanceof DesignEditor) {
 				((DesignEditor)editor).disposeBpmnDiagram(bpmnDiagram);
 			}
-			CTabItem item = tabFolder.getItem(pageIndex);
-			item.setControl(null);
+			
+			// need to manage this ourselves so that the CTabFolder doesn't
+			// dispose our editor site (a child of the CTabItem.control)
+			tabFolder.getItem(pageIndex).setControl(null);
+			
 			removePage(pageIndex);
+			
+			tabFolder.getSelection().getControl().setVisible(true);
 		}
 	}