diff --git a/org.eclipse.bpmn2.modeler.core/META-INF/MANIFEST.MF b/org.eclipse.bpmn2.modeler.core/META-INF/MANIFEST.MF
index d8fcd7c..ca25bff 100644
--- a/org.eclipse.bpmn2.modeler.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.bpmn2.modeler.core/META-INF/MANIFEST.MF
@@ -1,74 +1,74 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: BPMN2 Editor Core
-Bundle-SymbolicName: org.eclipse.bpmn2.modeler.core;singleton:=true
-Bundle-Version: 0.0.1.qualifier
-Bundle-Activator: org.eclipse.bpmn2.modeler.core.Activator
-Bundle-Vendor: Eclipse.org
-Require-Bundle: org.eclipse.emf.transaction,
- org.eclipse.emf.edit.ui,
- org.eclipse.emf.validation.ocl,
- org.eclipse.osgi,
- org.eclipse.graphiti;bundle-version="0.9.0",
- org.eclipse.graphiti.ui;bundle-version="0.9.0",
- org.eclipse.gef,
- org.eclipse.bpmn2.edit,
- org.eclipse.bpmn2.editor,
- org.eclipse.xsd,
- org.eclipse.wst.wsdl;bundle-version="[1.1.200,2.0.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.300,2.0.0)",
- org.eclipse.xsd;bundle-version="[2.4.0,3.0.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.300,2.0.0)",
- javax.wsdl;bundle-version="[1.5.0,1.6.0)";visibility:=reexport,
- org.eclipse.wst.xsd.ui;bundle-version="[1.2.101,2.0.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.400,2.0.0)",
- org.eclipse.jst.j2ee,
- org.eclipse.ui.ide,
- org.eclipse.core.commands,
- org.eclipse.jdt,
- org.eclipse.jdt.core,
- org.eclipse.jdt.launching,
- org.eclipse.ui.views.properties.tabbed,
- org.eclipse.jface.databinding,
- org.eclipse.core.databinding,
- org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.ui
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.bpmn2.modeler.core,
- org.eclipse.bpmn2.modeler.core.adapters,
- org.eclipse.bpmn2.modeler.core.di,
- org.eclipse.bpmn2.modeler.core.features,
- org.eclipse.bpmn2.modeler.core.features.activity,
- org.eclipse.bpmn2.modeler.core.features.activity.task,
- org.eclipse.bpmn2.modeler.core.features.artifact,
- org.eclipse.bpmn2.modeler.core.features.bendpoint,
- org.eclipse.bpmn2.modeler.core.features.choreography,
- org.eclipse.bpmn2.modeler.core.features.conversation,
- org.eclipse.bpmn2.modeler.core.features.data,
- org.eclipse.bpmn2.modeler.core.features.event,
- org.eclipse.bpmn2.modeler.core.features.event.definitions,
- org.eclipse.bpmn2.modeler.core.features.flow,
- org.eclipse.bpmn2.modeler.core.features.gateway,
- org.eclipse.bpmn2.modeler.core.features.lane,
- org.eclipse.bpmn2.modeler.core.features.participant,
- org.eclipse.bpmn2.modeler.core.merrimac.clad,
- org.eclipse.bpmn2.modeler.core.merrimac.dialogs,
- org.eclipse.bpmn2.modeler.core.merrimac.providers,
- org.eclipse.bpmn2.modeler.core.model,
- org.eclipse.bpmn2.modeler.core.preferences,
- org.eclipse.bpmn2.modeler.core.runtime,
- org.eclipse.bpmn2.modeler.core.utils,
- org.eclipse.bpmn2.modeler.core.validation
-Import-Package: org.eclipse.bpel.wsil.model.inspection,
- org.eclipse.graphiti.ui.features,
- org.eclipse.jface.preference,
- org.eclipse.jface.util,
- org.eclipse.jface.viewers,
- org.eclipse.swt.graphics,
- org.eclipse.ui,
- org.eclipse.ui.plugin,
- org.eclipse.ui.views.properties.tabbed,
- org.eclipse.wst.validation
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: BPMN2 Editor Core
+Bundle-SymbolicName: org.eclipse.bpmn2.modeler.core;singleton:=true
+Bundle-Version: 0.0.1.qualifier
+Bundle-Activator: org.eclipse.bpmn2.modeler.core.Activator
+Bundle-Vendor: Eclipse.org
+Require-Bundle: org.eclipse.emf.transaction,
+ org.eclipse.emf.edit.ui,
+ org.eclipse.emf.validation.ocl,
+ org.eclipse.osgi,
+ org.eclipse.graphiti;bundle-version="0.8.2",
+ org.eclipse.graphiti.ui;bundle-version="0.8.2",
+ org.eclipse.gef,
+ org.eclipse.bpmn2.edit,
+ org.eclipse.bpmn2.editor,
+ org.eclipse.xsd,
+ org.eclipse.wst.wsdl;bundle-version="[1.1.200,2.0.0)",
+ org.eclipse.wst.xml.core;bundle-version="[1.1.300,2.0.0)",
+ org.eclipse.xsd;bundle-version="[2.4.0,3.0.0)",
+ org.eclipse.wst.sse.ui;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.sse.core;bundle-version="[1.1.300,2.0.0)",
+ javax.wsdl;bundle-version="[1.5.0,1.6.0)";visibility:=reexport,
+ org.eclipse.wst.xsd.ui;bundle-version="[1.2.101,2.0.0)",
+ org.eclipse.wst.xml.ui;bundle-version="[1.0.400,2.0.0)",
+ org.eclipse.jst.j2ee,
+ org.eclipse.ui.ide,
+ org.eclipse.core.commands,
+ org.eclipse.jdt,
+ org.eclipse.jdt.core,
+ org.eclipse.jdt.launching,
+ org.eclipse.ui.views.properties.tabbed,
+ org.eclipse.jface.databinding,
+ org.eclipse.core.databinding,
+ org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.ui
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.bpmn2.modeler.core,
+ org.eclipse.bpmn2.modeler.core.adapters,
+ org.eclipse.bpmn2.modeler.core.di,
+ org.eclipse.bpmn2.modeler.core.features,
+ org.eclipse.bpmn2.modeler.core.features.activity,
+ org.eclipse.bpmn2.modeler.core.features.activity.task,
+ org.eclipse.bpmn2.modeler.core.features.artifact,
+ org.eclipse.bpmn2.modeler.core.features.bendpoint,
+ org.eclipse.bpmn2.modeler.core.features.choreography,
+ org.eclipse.bpmn2.modeler.core.features.conversation,
+ org.eclipse.bpmn2.modeler.core.features.data,
+ org.eclipse.bpmn2.modeler.core.features.event,
+ org.eclipse.bpmn2.modeler.core.features.event.definitions,
+ org.eclipse.bpmn2.modeler.core.features.flow,
+ org.eclipse.bpmn2.modeler.core.features.gateway,
+ org.eclipse.bpmn2.modeler.core.features.lane,
+ org.eclipse.bpmn2.modeler.core.features.participant,
+ org.eclipse.bpmn2.modeler.core.merrimac.clad,
+ org.eclipse.bpmn2.modeler.core.merrimac.dialogs,
+ org.eclipse.bpmn2.modeler.core.merrimac.providers,
+ org.eclipse.bpmn2.modeler.core.model,
+ org.eclipse.bpmn2.modeler.core.preferences,
+ org.eclipse.bpmn2.modeler.core.runtime,
+ org.eclipse.bpmn2.modeler.core.utils,
+ org.eclipse.bpmn2.modeler.core.validation
+Import-Package: org.eclipse.bpel.wsil.model.inspection,
+ org.eclipse.graphiti.ui.features,
+ org.eclipse.jface.preference,
+ org.eclipse.jface.util,
+ org.eclipse.jface.viewers,
+ org.eclipse.swt.graphics,
+ org.eclipse.ui,
+ org.eclipse.ui.plugin,
+ org.eclipse.ui.views.properties.tabbed,
+ org.eclipse.wst.validation
diff --git a/org.eclipse.bpmn2.modeler.runtime.example/src/org/eclipse/bpmn2/modeler/runtime/example/SampleModel/util/SampleModelSwitch.java b/org.eclipse.bpmn2.modeler.runtime.example/src/org/eclipse/bpmn2/modeler/runtime/example/SampleModel/util/SampleModelSwitch.java
index 88f336b..7853f2f 100644
--- a/org.eclipse.bpmn2.modeler.runtime.example/src/org/eclipse/bpmn2/modeler/runtime/example/SampleModel/util/SampleModelSwitch.java
+++ b/org.eclipse.bpmn2.modeler.runtime.example/src/org/eclipse/bpmn2/modeler/runtime/example/SampleModel/util/SampleModelSwitch.java
@@ -6,12 +6,12 @@
  */
 package org.eclipse.bpmn2.modeler.runtime.example.SampleModel.util;
 
+import java.util.List;
+
 import org.eclipse.bpmn2.modeler.runtime.example.SampleModel.*;
 
+import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.util.Switch;
 
 /**
  * <!-- begin-user-doc -->
@@ -26,7 +26,7 @@
  * @see org.eclipse.bpmn2.modeler.runtime.example.SampleModel.SampleModelPackage
  * @generated
  */
-public class SampleModelSwitch<T> extends Switch<T> {
+public class SampleModelSwitch<T> {
 	/**
 	 * The cached model package
 	 * <!-- begin-user-doc -->
@@ -48,16 +48,14 @@
 	}
 
 	/**
-	 * Checks whether this is a switch for the given package.
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @parameter ePackage the package in question.
-	 * @return whether this is a switch for the given package.
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
 	 * @generated
 	 */
-	@Override
-	protected boolean isSwitchFor(EPackage ePackage) {
-		return ePackage == modelPackage;
+	public T doSwitch(EObject theEObject) {
+		return doSwitch(theEObject.eClass(), theEObject);
 	}
 
 	/**
@@ -67,7 +65,26 @@
 	 * @return the first non-null result returned by a <code>caseXXX</code> call.
 	 * @generated
 	 */
-	@Override
+	protected T doSwitch(EClass theEClass, EObject theEObject) {
+		if (theEClass.eContainer() == modelPackage) {
+			return doSwitch(theEClass.getClassifierID(), theEObject);
+		}
+		else {
+			List<EClass> eSuperTypes = theEClass.getESuperTypes();
+			return
+				eSuperTypes.isEmpty() ?
+					defaultCase(theEObject) :
+					doSwitch(eSuperTypes.get(0), theEObject);
+		}
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
 	protected T doSwitch(int classifierID, EObject theEObject) {
 		switch (classifierID) {
 			case SampleModelPackage.DOCUMENT_ROOT: {
@@ -122,7 +139,6 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
 	 * @generated
 	 */
-	@Override
 	public T defaultCase(EObject object) {
 		return null;
 	}
diff --git a/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/META-INF/MANIFEST.MF b/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/META-INF/MANIFEST.MF
index 1b81d2d..b476dca 100644
--- a/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/META-INF/MANIFEST.MF
+++ b/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/META-INF/MANIFEST.MF
@@ -1,37 +1,37 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: BPMN2 Editor Runtime extensions for JBoss jBPM5
-Bundle-SymbolicName: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5;singleton:=true
-Bundle-Version: 0.0.1.qualifier
-Bundle-Activator: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.Activator
-Bundle-Vendor: Eclipse.org
-Require-Bundle: org.eclipse.ui.ide,
- org.eclipse.graphiti;bundle-version="0.9.0",
- org.eclipse.graphiti.ui;bundle-version="0.9.0",
- org.eclipse.bpmn2.modeler.core,
- org.eclipse.emf.transaction;bundle-version="1.4.0",
- org.eclipse.ui.views.properties.tabbed;bundle-version="3.5.100",
- org.eclipse.gef,
- org.eclipse.bpmn2.edit,
- org.eclipse.bpmn2.editor,
- org.eclipse.jface.databinding,
- org.eclipse.emf.databinding,
- org.eclipse.emf.edit.ui,
- org.apache.xerces,
- org.eclipse.bpmn2.modeler.ui
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.features,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.impl,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.util,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.adapters,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.wid
-Import-Package: org.eclipse.bpmn2.modeler.ui,
- org.eclipse.bpmn2.modeler.ui.editor,
- org.eclipse.bpmn2.modeler.ui.features.activity.task,
- org.eclipse.bpmn2.modeler.ui.property,
- org.eclipse.bpmn2.modeler.ui.property.providers
- 
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: BPMN2 Editor Runtime extensions for JBoss jBPM5
+Bundle-SymbolicName: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5;singleton:=true
+Bundle-Version: 0.0.1.qualifier
+Bundle-Activator: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.Activator
+Bundle-Vendor: Eclipse.org
+Require-Bundle: org.eclipse.ui.ide,
+ org.eclipse.graphiti;bundle-version="0.8.2",
+ org.eclipse.graphiti.ui;bundle-version="0.8.2",
+ org.eclipse.bpmn2.modeler.core,
+ org.eclipse.emf.transaction;bundle-version="1.4.0",
+ org.eclipse.ui.views.properties.tabbed;bundle-version="3.5.100",
+ org.eclipse.gef,
+ org.eclipse.bpmn2.edit,
+ org.eclipse.bpmn2.editor,
+ org.eclipse.jface.databinding,
+ org.eclipse.emf.databinding,
+ org.eclipse.emf.edit.ui,
+ org.apache.xerces,
+ org.eclipse.bpmn2.modeler.ui
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5,
+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.features,
+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model,
+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.impl,
+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.util,
+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property,
+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.adapters,
+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.wid
+Import-Package: org.eclipse.bpmn2.modeler.ui,
+ org.eclipse.bpmn2.modeler.ui.editor,
+ org.eclipse.bpmn2.modeler.ui.features.activity.task,
+ org.eclipse.bpmn2.modeler.ui.property,
+ org.eclipse.bpmn2.modeler.ui.property.providers
+ 
diff --git a/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF b/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF
index 3669055..bad36ac 100644
--- a/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF
@@ -1,73 +1,73 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: BPMN2 Editor UI
-Bundle-SymbolicName: org.eclipse.bpmn2.modeler.ui;singleton:=true
-Bundle-Version: 0.0.1.qualifier
-Bundle-Activator: org.eclipse.bpmn2.modeler.ui.Activator
-Bundle-Vendor: Eclipse.org
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui.ide,
- org.eclipse.osgi,
- org.eclipse.graphiti;bundle-version="0.9.0",
- org.eclipse.graphiti.ui;bundle-version="0.9.0",
- org.eclipse.bpmn2.modeler.core,
- org.eclipse.emf.transaction;bundle-version="1.4.0",
- org.eclipse.ui.views.properties.tabbed,
- org.eclipse.gef,
- org.eclipse.bpmn2.edit,
- org.eclipse.bpmn2.editor,
- org.eclipse.jface.databinding,
- org.eclipse.emf.databinding,
- org.eclipse.emf.edit.ui,
- org.eclipse.bpel.wsil.model,
- org.apache.xerces,
- org.eclipse.wst.wsdl;bundle-version="[1.1.200,2.0.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.300,2.0.0)",
- org.eclipse.xsd;bundle-version="[2.4.0,3.0.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.300,2.0.0)",
- javax.wsdl;bundle-version="[1.5.0,1.6.0)";visibility:=reexport,
- org.eclipse.wst.xsd.ui;bundle-version="[1.2.101,2.0.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.400,2.0.0)",
- org.eclipse.jface.text,
- org.eclipse.jdt,
- org.eclipse.jdt.core,
- org.eclipse.emf.workspace
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.bpmn2.modeler.ui,
- org.eclipse.bpmn2.modeler.ui.adapters,
- org.eclipse.bpmn2.modeler.ui.adapters.properties,
- org.eclipse.bpmn2.modeler.ui.diagram,
- org.eclipse.bpmn2.modeler.ui.editor,
- org.eclipse.bpmn2.modeler.ui.features.activity.subprocess,
- org.eclipse.bpmn2.modeler.ui.features.activity.task,
- org.eclipse.bpmn2.modeler.ui.features.artifact,
- org.eclipse.bpmn2.modeler.ui.features.choreography,
- org.eclipse.bpmn2.modeler.ui.features.conversation,
- org.eclipse.bpmn2.modeler.ui.features.data,
- org.eclipse.bpmn2.modeler.ui.features.event,
- org.eclipse.bpmn2.modeler.ui.features.event.definitions,
- org.eclipse.bpmn2.modeler.ui.features.flow,
- org.eclipse.bpmn2.modeler.ui.features.gateway,
- org.eclipse.bpmn2.modeler.ui.features.lane,
- org.eclipse.bpmn2.modeler.ui.features.participant,
- org.eclipse.bpmn2.modeler.ui.preferences,
- org.eclipse.bpmn2.modeler.ui.property,
- org.eclipse.bpmn2.modeler.ui.property.artifact,
- org.eclipse.bpmn2.modeler.ui.property.connectors,
- org.eclipse.bpmn2.modeler.ui.property.data,
- org.eclipse.bpmn2.modeler.ui.property.diagrams,
- org.eclipse.bpmn2.modeler.ui.property.dialogs,
- org.eclipse.bpmn2.modeler.ui.property.editors,
- org.eclipse.bpmn2.modeler.ui.property.events,
- org.eclipse.bpmn2.modeler.ui.property.gateways,
- org.eclipse.bpmn2.modeler.ui.property.providers,
- org.eclipse.bpmn2.modeler.ui.property.tasks,
- org.eclipse.bpmn2.modeler.ui.util,
- org.eclipse.bpmn2.modeler.ui.views,
- org.eclipse.bpmn2.modeler.ui.wizards
-Import-Package: org.eclipse.emf.workspace,
- org.eclipse.emf.workspace.util,
- org.eclipse.wst.validation
-
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: BPMN2 Editor UI
+Bundle-SymbolicName: org.eclipse.bpmn2.modeler.ui;singleton:=true
+Bundle-Version: 0.0.1.qualifier
+Bundle-Activator: org.eclipse.bpmn2.modeler.ui.Activator
+Bundle-Vendor: Eclipse.org
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui.ide,
+ org.eclipse.osgi,
+ org.eclipse.graphiti;bundle-version="0.8.2",
+ org.eclipse.graphiti.ui;bundle-version="0.8.2",
+ org.eclipse.bpmn2.modeler.core,
+ org.eclipse.emf.transaction;bundle-version="1.4.0",
+ org.eclipse.ui.views.properties.tabbed,
+ org.eclipse.gef,
+ org.eclipse.bpmn2.edit,
+ org.eclipse.bpmn2.editor,
+ org.eclipse.jface.databinding,
+ org.eclipse.emf.databinding,
+ org.eclipse.emf.edit.ui,
+ org.eclipse.bpel.wsil.model,
+ org.apache.xerces,
+ org.eclipse.wst.wsdl;bundle-version="[1.1.200,2.0.0)",
+ org.eclipse.wst.xml.core;bundle-version="[1.1.300,2.0.0)",
+ org.eclipse.xsd;bundle-version="[2.4.0,3.0.0)",
+ org.eclipse.wst.sse.ui;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.wst.sse.core;bundle-version="[1.1.300,2.0.0)",
+ javax.wsdl;bundle-version="[1.5.0,1.6.0)";visibility:=reexport,
+ org.eclipse.wst.xsd.ui;bundle-version="[1.2.101,2.0.0)",
+ org.eclipse.wst.xml.ui;bundle-version="[1.0.400,2.0.0)",
+ org.eclipse.jface.text,
+ org.eclipse.jdt,
+ org.eclipse.jdt.core,
+ org.eclipse.emf.workspace
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.bpmn2.modeler.ui,
+ org.eclipse.bpmn2.modeler.ui.adapters,
+ org.eclipse.bpmn2.modeler.ui.adapters.properties,
+ org.eclipse.bpmn2.modeler.ui.diagram,
+ org.eclipse.bpmn2.modeler.ui.editor,
+ org.eclipse.bpmn2.modeler.ui.features.activity.subprocess,
+ org.eclipse.bpmn2.modeler.ui.features.activity.task,
+ org.eclipse.bpmn2.modeler.ui.features.artifact,
+ org.eclipse.bpmn2.modeler.ui.features.choreography,
+ org.eclipse.bpmn2.modeler.ui.features.conversation,
+ org.eclipse.bpmn2.modeler.ui.features.data,
+ org.eclipse.bpmn2.modeler.ui.features.event,
+ org.eclipse.bpmn2.modeler.ui.features.event.definitions,
+ org.eclipse.bpmn2.modeler.ui.features.flow,
+ org.eclipse.bpmn2.modeler.ui.features.gateway,
+ org.eclipse.bpmn2.modeler.ui.features.lane,
+ org.eclipse.bpmn2.modeler.ui.features.participant,
+ org.eclipse.bpmn2.modeler.ui.preferences,
+ org.eclipse.bpmn2.modeler.ui.property,
+ org.eclipse.bpmn2.modeler.ui.property.artifact,
+ org.eclipse.bpmn2.modeler.ui.property.connectors,
+ org.eclipse.bpmn2.modeler.ui.property.data,
+ org.eclipse.bpmn2.modeler.ui.property.diagrams,
+ org.eclipse.bpmn2.modeler.ui.property.dialogs,
+ org.eclipse.bpmn2.modeler.ui.property.editors,
+ org.eclipse.bpmn2.modeler.ui.property.events,
+ org.eclipse.bpmn2.modeler.ui.property.gateways,
+ org.eclipse.bpmn2.modeler.ui.property.providers,
+ org.eclipse.bpmn2.modeler.ui.property.tasks,
+ org.eclipse.bpmn2.modeler.ui.util,
+ org.eclipse.bpmn2.modeler.ui.views,
+ org.eclipse.bpmn2.modeler.ui.wizards
+Import-Package: org.eclipse.emf.workspace,
+ org.eclipse.emf.workspace.util,
+ org.eclipse.wst.validation
+
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/Activator.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/Activator.java
index c6b3adb..e05922d 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/Activator.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/Activator.java
@@ -161,6 +161,14 @@
 	// The shared instance
 	private static Activator plugin;
 	
+	// handles changes to the bpmn file
+	private BPMN2ResourceChangeListener resourceChangeListener;
+	private ISaveParticipant saveParticipant;
+    
+	static {
+		TargetRuntime.getAllRuntimes();
+	}
+	
 	// Adapter Factory registration
 	static {
 		AdapterRegistry.INSTANCE.registerAdapterFactory(
@@ -193,6 +201,8 @@
 	public void start(BundleContext context) throws Exception {
 		super.start(context);
 		plugin = this;
+
+		initializeResourceChangeListener();
 	}
 
 	/*
@@ -203,6 +213,11 @@
 	public void stop(BundleContext context) throws Exception {
 		plugin = null;
 		super.stop(context);
+		
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		if (workspace != null) {
+			workspace.removeResourceChangeListener(this.resourceChangeListener);
+		}
 	}
 
 	/**
@@ -314,4 +329,66 @@
     public ImageDescriptor getImageDescriptor(String id) {
 		return getImageRegistry().getDescriptor(id);
     }
+
+	/**
+	 * Installs the IResourceChangeListener for this Plugin. Also
+	 * checks if there were any changes to bpmn files while the plug-in
+	 * was not active.
+	 */
+	private void initializeResourceChangeListener() throws CoreException {
+		this.resourceChangeListener = new BPMN2ResourceChangeListener();
+		// Add the save participant in a separate thread
+		// to make sure that it doesn't block the UI thread and potentially cause
+		// deadlocks with the code that caused our plugin to be started.
+		Thread initSaveParticipantThread = new Thread(new Runnable() {
+			@Override
+			public void run() {
+				try {
+					IWorkspace workspace = ResourcesPlugin.getWorkspace();
+					workspace.addResourceChangeListener(Activator.this.resourceChangeListener, IResourceChangeEvent.POST_BUILD);
+					ISavedState savedState = workspace.addSaveParticipant("BPMN2 Modeler", getSaveParticipant());
+					if (savedState != null) {
+						savedState.processResourceChangeEvents(Activator.this.resourceChangeListener);
+					}
+				} catch (CoreException e) {
+					throw new RuntimeException(e);
+				}
+			}
+		});
+		initSaveParticipantThread.setName("BPMN2 Modeler plugin init"); //$NON-NLS-1$
+		initSaveParticipantThread.start();
+	}
+
+	/**
+	 * We are only interested in the resource delta while the plugin was
+	 * not active and don't really care about the plug-in save lifecycle.
+	 */
+	private ISaveParticipant getSaveParticipant() {
+		if (this.saveParticipant == null) {
+			this.saveParticipant = new ISaveParticipant() {
+				@Override
+				public void doneSaving(ISaveContext context) {
+				}
+				@Override
+				public void prepareToSave(ISaveContext context) throws CoreException {
+				}
+				@Override
+				public void rollback(ISaveContext context) {
+				}
+				@Override
+				public void saving(ISaveContext context) throws CoreException {
+					context.needDelta();
+				}
+			};
+		}
+		return this.saveParticipant;
+	}
+
+	/**
+	 * Returns the resource change listener.
+	 */
+	public BPMN2ResourceChangeListener getResourceChangeListener() {
+		return this.resourceChangeListener;
+	}
+
 }
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/BPMN2ResourceChangeListener.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/BPMN2ResourceChangeListener.java
new file mode 100644
index 0000000..1cca90a
--- /dev/null
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/BPMN2ResourceChangeListener.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * 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;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Bob Brodt
+ *
+ */
+public class BPMN2ResourceChangeListener implements IResourceChangeListener {
+
+	class ResourceDeltaVisitor implements IResourceDeltaVisitor {
+
+		public boolean visit(final IResourceDelta delta) throws CoreException {
+			IResource target = delta.getResource();
+//			switch (delta.getKind()) {
+//			case IResourceDelta.ADDED:
+//				System.out.println(target.getFullPath()+" ADDED");
+//				break;
+//			case IResourceDelta.CHANGED:
+//				System.out.println(target.getFullPath()+" CHANGED");
+//				break;
+//			case IResourceDelta.REMOVED:
+//				System.out.println(target.getFullPath()+" REMOVED");
+//				break;
+//			case IResourceDelta.ADDED_PHANTOM:
+//				System.out.println(target.getFullPath()+" ADDED_PHANTOM");
+//				break;
+//			}
+			if (target.getType() == IResource.FILE) {
+				handleFile(delta);
+			}
+			return true;
+		}
+
+		private void handleFile(final IResourceDelta delta)
+			throws CoreException {
+			IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
+				public void run(IProgressMonitor monitor)
+					throws CoreException {
+					IFile target = (IFile) delta.getResource();
+					int flags = delta.getFlags();
+					
+					switch (delta.getKind()) {
+					case IResourceDelta.ADDED:
+						if ((flags & IResourceDelta.MOVED_FROM) != 0) {
+							if (target.exists())
+								fileMoved(delta.getMovedFromPath(), target.getFullPath());
+						}
+						break;
+					case IResourceDelta.REMOVED:
+						if ((flags & IResourceDelta.MOVED_TO) != 0) {
+							if (target.exists())
+								fileMoved(target.getFullPath(), delta.getMovedToPath());
+						} else {
+							fileDeleted(target.getFullPath(), monitor);
+						}
+						break;
+					}
+				}
+			};
+			ResourcesPlugin.getWorkspace().run(runnable, null);
+		}
+	}
+
+	protected IResourceDeltaVisitor visitor;
+	protected List<IFileChangeListener> listeners;
+
+	public BPMN2ResourceChangeListener() {
+		listeners = new ArrayList<IFileChangeListener>();
+	}
+
+	/**
+	 * Objects like the BPELEditor can add listeners so they can be
+	 * notified and react when BPEL files change.
+	 */
+	public void addListener(IFileChangeListener listener) {
+		listeners.add(listener);
+	}
+	
+	/**
+	 * Removed the listener.
+	 */
+	public void removeListener(IFileChangeListener listener) {
+		listeners.remove(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
+	 */
+	@Override
+	public void resourceChanged(IResourceChangeEvent event) {
+		try {
+			event.getDelta().accept(getResourceDeltaVisitor());
+		} catch (CoreException e) {
+			Activator.logError(e);
+		}
+	}
+
+	protected IResourceDeltaVisitor getResourceDeltaVisitor() {
+		if (visitor == null) {
+			visitor = new ResourceDeltaVisitor();
+		}
+		return visitor;
+	}
+
+	protected void fileMoved(IPath oldFilePath, IPath newFilePath) throws CoreException {
+		// notify listeners
+		// make a copy of listener list to avoid concurrent list modification
+		List<IFileChangeListener> l = new ArrayList<IFileChangeListener>();
+		l.addAll(listeners);
+		for (IFileChangeListener listener : l) {
+			listener.moved(oldFilePath, newFilePath);
+		}
+	}
+	
+	protected void fileDeleted(IPath filePath, IProgressMonitor monitor) throws CoreException {
+		// notify listeners
+		// make a copy of listener list to avoid concurrent list modification
+		List<IFileChangeListener> l = new ArrayList<IFileChangeListener>();
+		l.addAll(listeners);
+		for (IFileChangeListener listener : l) {
+			listener.deleted(filePath);
+		}
+	}
+}
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 74e3f96..f204ef8 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
@@ -1,1048 +1,1058 @@
-/******************************************************************************* 
- * 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.editor;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import org.eclipse.bpmn2.Activity;
-import org.eclipse.bpmn2.Assignment;
-import org.eclipse.bpmn2.BaseElement;
-import org.eclipse.bpmn2.BoundaryEvent;
-import org.eclipse.bpmn2.CallActivity;
-import org.eclipse.bpmn2.CallChoreography;
-import org.eclipse.bpmn2.CatchEvent;
-import org.eclipse.bpmn2.Category;
-import org.eclipse.bpmn2.CompensateEventDefinition;
-import org.eclipse.bpmn2.ConditionalEventDefinition;
-import org.eclipse.bpmn2.DataInput;
-import org.eclipse.bpmn2.DataObject;
-import org.eclipse.bpmn2.DataObjectReference;
-import org.eclipse.bpmn2.DataOutput;
-import org.eclipse.bpmn2.DataStore;
-import org.eclipse.bpmn2.DataStoreReference;
-import org.eclipse.bpmn2.EndEvent;
-import org.eclipse.bpmn2.ErrorEventDefinition;
-import org.eclipse.bpmn2.EscalationEventDefinition;
-import org.eclipse.bpmn2.Event;
-import org.eclipse.bpmn2.Expression;
-import org.eclipse.bpmn2.FormalExpression;
-import org.eclipse.bpmn2.Gateway;
-import org.eclipse.bpmn2.GlobalBusinessRuleTask;
-import org.eclipse.bpmn2.GlobalManualTask;
-import org.eclipse.bpmn2.GlobalScriptTask;
-import org.eclipse.bpmn2.GlobalTask;
-import org.eclipse.bpmn2.GlobalUserTask;
-import org.eclipse.bpmn2.HumanPerformer;
-import org.eclipse.bpmn2.Import;
-import org.eclipse.bpmn2.InputOutputSpecification;
-import org.eclipse.bpmn2.Interface;
-import org.eclipse.bpmn2.ItemDefinition;
-import org.eclipse.bpmn2.LinkEventDefinition;
-import org.eclipse.bpmn2.ManualTask;
-import org.eclipse.bpmn2.Message;
-import org.eclipse.bpmn2.MessageEventDefinition;
-import org.eclipse.bpmn2.MessageFlow;
-import org.eclipse.bpmn2.MultiInstanceLoopCharacteristics;
-import org.eclipse.bpmn2.Performer;
-import org.eclipse.bpmn2.PotentialOwner;
-import org.eclipse.bpmn2.Process;
-import org.eclipse.bpmn2.Property;
-import org.eclipse.bpmn2.ResourceAssignmentExpression;
-import org.eclipse.bpmn2.ResourceParameterBinding;
-import org.eclipse.bpmn2.ResourceRole;
-import org.eclipse.bpmn2.ScriptTask;
-import org.eclipse.bpmn2.SequenceFlow;
-import org.eclipse.bpmn2.SignalEventDefinition;
-import org.eclipse.bpmn2.StandardLoopCharacteristics;
-import org.eclipse.bpmn2.StartEvent;
-import org.eclipse.bpmn2.SubProcess;
-import org.eclipse.bpmn2.Task;
-import org.eclipse.bpmn2.TextAnnotation;
-import org.eclipse.bpmn2.ThrowEvent;
-import org.eclipse.bpmn2.TimerEventDefinition;
-import org.eclipse.bpmn2.di.BPMNDiagram;
-import org.eclipse.bpmn2.modeler.core.Bpmn2TabbedPropertySheetPage;
-import org.eclipse.bpmn2.modeler.core.ModelHandler;
-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
-import org.eclipse.bpmn2.modeler.core.ProxyURIConverterImplExtension;
-import org.eclipse.bpmn2.modeler.core.di.DIImport;
-import org.eclipse.bpmn2.modeler.core.di.DIUtils;
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDetailComposite;
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDialogComposite;
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultListComposite;
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.PropertiesCompositeFactory;
-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceImpl;
-import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;
-import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime;
-import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
-import org.eclipse.bpmn2.modeler.core.utils.DiagramEditorAdapter;
-import org.eclipse.bpmn2.modeler.core.utils.ErrorUtils;
-import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
-import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType;
-import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
-import org.eclipse.bpmn2.modeler.core.validation.BPMN2ProjectValidator;
-import org.eclipse.bpmn2.modeler.core.validation.BPMN2ValidationStatusLoader;
-import org.eclipse.bpmn2.modeler.ui.Activator;
-import org.eclipse.bpmn2.modeler.ui.property.artifact.CategoryDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.artifact.TextAnnotationDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.connectors.MessageFlowDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.connectors.SequenceFlowDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ConditionalEventDefinitionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataAssignmentDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataObjectPropertySection.DataObjectDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataObjectReferencePropertySection.DataObjectReferenceDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataStorePropertySection.DataStoreDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataStoreReferencePropertySection.DataStoreReferenceDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ExpressionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.InterfaceDetailComposite;
-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.data.ResourceAssignmentExpressionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ResourceParameterBindingDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ResourceRoleDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.DefinitionsPropertyComposite.ImportDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.ItemDefinitionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.ItemDefinitionListComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.ProcessDiagramPropertyComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.PropertyListComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.ResourceRoleListComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.BoundaryEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.CatchEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.CommonEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.CommonEventPropertySection.EventDefinitionDialogComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.EndEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.StartEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.ThrowEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.TimerEventDefinitionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.gateways.GatewayDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityInputDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityOutputDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.DataAssociationDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.IoParametersDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ManualTaskDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.MultiInstanceLoopCharacteristicsDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ScriptTaskDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.StandardLoopCharacteristicsDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.TaskDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.views.outline.BPMN2EditorOutlinePage;
-import org.eclipse.bpmn2.modeler.ui.wizards.BPMN2DiagramCreator;
-import org.eclipse.bpmn2.modeler.ui.wizards.Bpmn2DiagramEditorInput;
-import org.eclipse.bpmn2.modeler.ui.wizards.FileService;
-import org.eclipse.bpmn2.util.Bpmn2ResourceImpl;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EValidator;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.transaction.RecordingCommand;
-import org.eclipse.emf.transaction.TransactionalEditingDomain.Lifecycle;
-import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
-import org.eclipse.gef.ui.parts.SelectionSynchronizer;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
-import org.eclipse.graphiti.mm.pictograms.Diagram;
-import org.eclipse.graphiti.mm.pictograms.PictogramElement;
-import org.eclipse.graphiti.services.Graphiti;
-import org.eclipse.graphiti.services.IPeService;
-import org.eclipse.graphiti.ui.editor.DefaultPersistencyBehavior;
-import org.eclipse.graphiti.ui.editor.DefaultUpdateBehavior;
-import org.eclipse.graphiti.ui.editor.DiagramEditor;
-import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
-import org.eclipse.graphiti.ui.internal.editor.GFPaletteRoot;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IStorageEditorInput;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider;
-
-/**
- * 
- */
-@SuppressWarnings("restriction")
-public class BPMN2Editor extends DiagramEditor implements IPropertyChangeListener, IGotoMarker {
-	
-	static {
-		TargetRuntime.getAllRuntimes();
-		PropertiesCompositeFactory.register(EObject.class, DefaultDetailComposite.class);
-		PropertiesCompositeFactory.register(EObject.class, DefaultListComposite.class);
-		PropertiesCompositeFactory.register(EObject.class, DefaultDialogComposite.class);
-		PropertiesCompositeFactory.register(Message.class, MessageDetailComposite.class);
-		PropertiesCompositeFactory.register(Message.class, MessageListComposite.class);
-		PropertiesCompositeFactory.register(MessageFlow.class, MessageFlowDetailComposite.class);
-		PropertiesCompositeFactory.register(Property.class, ItemAwareElementDetailComposite.class);
-		PropertiesCompositeFactory.register(CallActivity.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(GlobalTask.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(GlobalBusinessRuleTask.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(GlobalManualTask.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(GlobalScriptTask.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(GlobalUserTask.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(Import.class, ImportDetailComposite.class);
-		PropertiesCompositeFactory.register(Category.class, CategoryDetailComposite.class);
-		PropertiesCompositeFactory.register(TextAnnotation.class, TextAnnotationDetailComposite.class);
-		PropertiesCompositeFactory.register(SequenceFlow.class, SequenceFlowDetailComposite.class);
-		PropertiesCompositeFactory.register(DataObject.class, DataObjectDetailComposite.class);
-		PropertiesCompositeFactory.register(DataObjectReference.class, DataObjectDetailComposite.class);
-		PropertiesCompositeFactory.register(Assignment.class, DataAssignmentDetailComposite.class);
-		PropertiesCompositeFactory.register(Expression.class, ExpressionDetailComposite.class);
-		PropertiesCompositeFactory.register(FormalExpression.class, ExpressionDetailComposite.class);
-		PropertiesCompositeFactory.register(ResourceAssignmentExpression.class, ResourceAssignmentExpressionDetailComposite.class);
-		PropertiesCompositeFactory.register(ResourceParameterBinding.class, ResourceParameterBindingDetailComposite.class);
-		PropertiesCompositeFactory.register(PotentialOwner.class, ResourceRoleDetailComposite.class);
-		PropertiesCompositeFactory.register(HumanPerformer.class, ResourceRoleDetailComposite.class);
-		PropertiesCompositeFactory.register(Performer.class, ResourceRoleDetailComposite.class);
-		PropertiesCompositeFactory.register(DataObjectReference.class, DataObjectReferenceDetailComposite.class);
-		PropertiesCompositeFactory.register(DataStore.class, DataStoreDetailComposite.class);
-		PropertiesCompositeFactory.register(DataStoreReference.class, DataStoreReferenceDetailComposite.class);
-		PropertiesCompositeFactory.register(Interface.class, InterfaceDetailComposite.class);
-		PropertiesCompositeFactory.register(ItemDefinition.class, ItemDefinitionDetailComposite.class);
-		PropertiesCompositeFactory.register(ItemDefinition.class, ItemDefinitionListComposite.class);
-		PropertiesCompositeFactory.register(Property.class, PropertyListComposite.class);
-		PropertiesCompositeFactory.register(ResourceRole.class, ResourceRoleListComposite.class);
-		PropertiesCompositeFactory.register(Event.class, CommonEventDetailComposite.class);
-		PropertiesCompositeFactory.register(StartEvent.class, StartEventDetailComposite.class);
-		PropertiesCompositeFactory.register(EndEvent.class, EndEventDetailComposite.class);
-		PropertiesCompositeFactory.register(CatchEvent.class, CatchEventDetailComposite.class);
-		PropertiesCompositeFactory.register(ThrowEvent.class, ThrowEventDetailComposite.class);
-		PropertiesCompositeFactory.register(BoundaryEvent.class, BoundaryEventDetailComposite.class);
-		PropertiesCompositeFactory.register(TimerEventDefinition.class, TimerEventDefinitionDetailComposite.class);
-		PropertiesCompositeFactory.register(ConditionalEventDefinition.class, ConditionalEventDefinitionDetailComposite.class);
-		PropertiesCompositeFactory.register(CompensateEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(ConditionalEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(ErrorEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(EscalationEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(LinkEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(MessageEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(SignalEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(TimerEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(Process.class, ProcessDiagramPropertyComposite.class);
-		PropertiesCompositeFactory.register(EndEvent.class, EndEventDetailComposite.class);
-		PropertiesCompositeFactory.register(StartEvent.class, StartEventDetailComposite.class);
-		PropertiesCompositeFactory.register(ThrowEvent.class, ThrowEventDetailComposite.class);
-		PropertiesCompositeFactory.register(StandardLoopCharacteristics.class, StandardLoopCharacteristicsDetailComposite.class);
-		PropertiesCompositeFactory.register(MultiInstanceLoopCharacteristics.class, MultiInstanceLoopCharacteristicsDetailComposite.class);
-		PropertiesCompositeFactory.register(Gateway.class, GatewayDetailComposite.class);
-		PropertiesCompositeFactory.register(Activity.class, ActivityInputDetailComposite.class);
-		PropertiesCompositeFactory.register(InputOutputSpecification.class, ActivityInputDetailComposite.class);
-		PropertiesCompositeFactory.register(Activity.class, ActivityOutputDetailComposite.class);
-		PropertiesCompositeFactory.register(CallChoreography.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(InputOutputSpecification.class, IoParametersDetailComposite.class);
-		PropertiesCompositeFactory.register(DataInput.class, DataAssociationDetailComposite.class);
-		PropertiesCompositeFactory.register(DataOutput.class, DataAssociationDetailComposite.class);
-		PropertiesCompositeFactory.register(ManualTask.class, ManualTaskDetailComposite.class);
-		PropertiesCompositeFactory.register(ScriptTask.class, ScriptTaskDetailComposite.class);
-		PropertiesCompositeFactory.register(SubProcess.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(Task.class, TaskDetailComposite.class);
-	}
-
-	public static final String EDITOR_ID = "org.eclipse.bpmn2.modeler.ui.bpmn2editor";
-	public static final String CONTRIBUTOR_ID = "org.eclipse.bpmn2.modeler.ui.PropertyContributor";
-
-	private ModelHandler modelHandler;
-	private URI modelUri;
-	private URI diagramUri;
-	private boolean editable = true;
-
-	protected BPMNDiagram bpmnDiagram;
-	protected Bpmn2ResourceImpl bpmnResource;
-	
-	private IWorkbenchListener workbenchListener;
-	private IPartListener2 selectionListener;
-    private IResourceChangeListener markerChangeListener;
-	private boolean workbenchShutdown = false;
-	private static BPMN2Editor activeEditor;
-	private static ITabDescriptorProvider tabDescriptorProvider;
-
-	private BPMN2EditingDomainListener editingDomainListener;
-	
-	private Bpmn2Preferences preferences;
-	private TargetRuntime targetRuntime;
-//	private Hashtable<BPMNDiagram, GraphicalViewer> mapDiagramToViewer = new Hashtable<BPMNDiagram, GraphicalViewer>();
-
-	protected DiagramEditorAdapter editorAdapter;
-	protected BPMN2MultiPageEditor multipageEditor;
-	
-	public BPMN2Editor(BPMN2MultiPageEditor mpe) {
-		multipageEditor = mpe;
-	}
-	
-	public static BPMN2Editor getActiveEditor() {
-		return activeEditor;
-	}
-	
-	private void setActiveEditor(BPMN2Editor editor) {
-		activeEditor = editor;
-		if (activeEditor!=null) {
-			Bpmn2Preferences.setActiveProject(activeEditor.getProject());
-			TargetRuntime.setCurrentRuntime( activeEditor.getTargetRuntime() );
-		}
-	}
-
-	public BPMN2MultiPageEditor getMultipageEditor() {
-		return multipageEditor;
-	}
-	
-	protected DiagramEditorAdapter getEditorAdapter() {
-		return editorAdapter;
-	}
-
-	@Override
-	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-		try {
-			Bpmn2DiagramType diagramType = Bpmn2DiagramType.NONE;
-			String targetNamespace = null;
-			bpmnDiagram = null;
-
-			if (input instanceof IStorageEditorInput) {
-				input = createNewDiagramEditorInput(site, input, diagramType, targetNamespace);
-			}
-			else if (input instanceof DiagramEditorInput) {
-				if (input instanceof Bpmn2DiagramEditorInput) {
-					diagramType = ((Bpmn2DiagramEditorInput)input).getInitialDiagramType();
-					targetNamespace = ((Bpmn2DiagramEditorInput)input).getTargetNamespace();
-					bpmnDiagram = ((Bpmn2DiagramEditorInput)input).getBpmnDiagram();
-				}
-				if (bpmnDiagram==null) {
-					// This was incorrectly constructed input, we ditch the old one and make a new and clean one instead
-					// This code path comes in from the New File Wizard
-					input = createNewDiagramEditorInput(site, input, diagramType, targetNamespace);
-				}
-				else {
-					BPMNDiagram d = bpmnDiagram;
-					bpmnDiagram = null;
-					setBpmnDiagram(d);
-					return;
-				}
-			}
-			else {
-				throw new PartInitException("Invalid Editor Input: "
-						+input.getClass().getSimpleName()+" "
-						+input.getName());
-			}
-		} catch (Exception e) {
-			Activator.showErrorWithLogging(e);
-			throw new PartInitException(e.getMessage());
-		}
-		
-		// add a listener so we get notified if the workbench is shutting down.
-		// in this case we don't want to delete the temp file!
-		addWorkbenchListener();
-		getTargetRuntime(input);
-		setActiveEditor(this);
-		
-		super.init(site, input);
-		
-		addSelectionListener();
-		addMarkerChangeListener();
-	}
-	
-	public void setEditable(boolean editable) {
-		this.editable = editable;
-	}
-
-	public boolean isEditable() {
-	    return editable;
-	}
-
-	@Override
-	public boolean isDirty() {
-		if (!editable)
-			return false;
-		return super.isDirty();
-	}
-	
-	@Override
-	protected DefaultUpdateBehavior createUpdateBehavior() {
-		return new BPMN2EditorUpdateBehavior(this);
-	}
-	
-    @Override
-    protected DefaultPersistencyBehavior createPersistencyBehavior() {
-    	return new BPMN2PersistencyBehavior(this);
-    }
-    
-	public Bpmn2Preferences getPreferences() {
-		if (preferences==null) {
-			loadPreferences(getProject());
-		}
-		return preferences;
-	}
-	
-	private void loadPreferences(IProject project) {
-		preferences = Bpmn2Preferences.getInstance(project);
-		preferences.load();
-		preferences.getGlobalPreferences().addPropertyChangeListener(this);
-	}
-
-	/**
-	 * ID for tabbed property sheets.
-	 * 
-	 * @return the contributor id
-	 */
-	@Override
-	public String getContributorId() {
-		return CONTRIBUTOR_ID;
-	}
-
-	public TargetRuntime getTargetRuntime(ITabDescriptorProvider tdp) {
-		tabDescriptorProvider = tdp;
-		return getTargetRuntime();
-	}
-	
-	public TargetRuntime getTargetRuntime() {
-		if (targetRuntime==null) {
-			targetRuntime = getTargetRuntime(getEditorInput());
-		}
-		return targetRuntime;
-	}
-	
-	protected TargetRuntime getTargetRuntime(IEditorInput input) {
-		if (targetRuntime==null) {
-			 // If the project has not been configured for a specific runtime through the "BPMN2"
-			 // project properties page (i.e. the target is "None") then allow the runtime extension
-			 // plug-ins an opportunity to identify the given process file contents as their own.
-			 // If none of the plug-ins respond with "yes, this file is targeted for my runtime",
-			 // then use the "None" as the extension. This will configure the BPMN2 Modeler with
-			 // generic property sheets and other default behavior.
-			targetRuntime = getPreferences().getRuntime();
-			if (targetRuntime == TargetRuntime.getDefaultRuntime()) {
-				for (TargetRuntime rt : TargetRuntime.getAllRuntimes()) {
-					if (rt.getRuntimeExtension().isContentForRuntime(input)) {
-						targetRuntime = rt;
-						break;
-					}
-				}
-			}
-			if (targetRuntime==null)
-				targetRuntime = TargetRuntime.getDefaultRuntime();
-		}
-		return targetRuntime;
-	}
-	
-	/**
-	 * Beware, creates a new input and changes this editor!
-	 */
-	private Bpmn2DiagramEditorInput createNewDiagramEditorInput(IEditorSite site, IEditorInput input, Bpmn2DiagramType diagramType, String targetNamespace)
-			throws CoreException {
-		
-		modelUri = FileService.getInputUri(input);
-		input = BPMN2DiagramCreator.createDiagram(modelUri, diagramType,targetNamespace,this);
-		diagramUri = ((Bpmn2DiagramEditorInput)input).getUri();
-
-		return (Bpmn2DiagramEditorInput)input;
-	}
-
-	private void saveModelFile() {
-		modelHandler.save();
-		((BasicCommandStack) getEditingDomain().getCommandStack()).saveIsDone();
-		updateDirtyState();
-	}
-
-	@Override
-	protected void setInput(IEditorInput input) {
-		super.setInput(input);
-		
-		// Hook a transaction exception handler so we can get diagnostics about EMF validation errors.
-		getEditingDomainListener();
-		
-		BasicCommandStack basicCommandStack = (BasicCommandStack) getEditingDomain().getCommandStack();
-
-		if (input instanceof DiagramEditorInput) {
-			ResourceSet resourceSet = getEditingDomain().getResourceSet();
-			getTargetRuntime().setResourceSet(resourceSet);
-			
-			bpmnResource = (Bpmn2ResourceImpl) resourceSet.createResource(modelUri,
-					Bpmn2ModelerResourceImpl.BPMN2_CONTENT_TYPE_ID);
-
-			resourceSet.setURIConverter(new ProxyURIConverterImplExtension());
-			resourceSet.eAdapters().add(editorAdapter = new DiagramEditorAdapter(this));
-
-			modelHandler = ModelHandlerLocator.createModelHandler(modelUri, bpmnResource);
-			ModelHandlerLocator.put(diagramUri, modelHandler);
-
-			getTargetRuntime(input);
-			setActiveEditor(this);
-
-			// allow the runtime extension to construct custom tasks and whatever else it needs
-			// custom tasks should be added to the current target runtime's custom tasks list
-			// where they will be picked up by the toolpalette refresh.
-			getTargetRuntime().getRuntimeExtension().initialize(this);
-
-			try {
-				if (getModelFile()==null || getModelFile().exists()) {
-					bpmnResource.load(null);
-				} else {
-					saveModelFile();
-				}
-			} catch (IOException e) {
-				Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
-				ErrorUtils.showErrorWithLogging(status);
-			}
-			basicCommandStack.execute(new RecordingCommand(getEditingDomain()) {
-
-				@Override
-				protected void doExecute() {
-					importDiagram();
-				}
-			});
-		}
-		basicCommandStack.saveIsDone();
-		basicCommandStack.flush();
-		loadMarkers();
-	}
-	
-	private void importDiagram() {
-		// make sure this guy is active, otherwise it's not selectable
-		Diagram diagram = getDiagramTypeProvider().getDiagram();
-		IFeatureProvider featureProvider = getDiagramTypeProvider().getFeatureProvider();
-		diagram.setActive(true);
-		Bpmn2DiagramEditorInput input = (Bpmn2DiagramEditorInput) getEditorInput();
-		Bpmn2DiagramType diagramType = input.getInitialDiagramType();
-		String targetNamespace = input.getTargetNamespace();
-
-		if (diagramType != Bpmn2DiagramType.NONE) {
-			bpmnDiagram = modelHandler.createDiagramType(diagramType, targetNamespace);
-			featureProvider.link(diagram, bpmnDiagram);
-			saveModelFile();
-		}
-		
-		DIImport di = new DIImport(this);
-		di.setModelHandler(modelHandler);
-
-		di.generateFromDI();
-	}
-
-	protected void updatePalette() {
-		GFPaletteRoot pr = (GFPaletteRoot)getPaletteRoot();
-		if (pr!=null)
-			pr.updatePaletteEntries();
-	}
-	
-	@Override
-	protected PictogramElement[] getPictogramElementsForSelection() {
-		// filter out invisible elements when setting selection
-		PictogramElement[] pictogramElements = super.getPictogramElementsForSelection();
-		if (pictogramElements==null)
-			return null;
-		ArrayList<PictogramElement> visibleList = new ArrayList<PictogramElement>();
-		for (PictogramElement pe : pictogramElements) {
-			if (pe.isVisible())
-				visibleList.add(pe);
-		}
-		return visibleList.toArray(new PictogramElement[visibleList.size()]);
-	}
-	
-	private void addWorkbenchListener() {
-		if (workbenchListener==null) {
-			workbenchListener = new IWorkbenchListener() {
-				@Override
-				public boolean preShutdown(IWorkbench workbench, boolean forced) {
-					workbenchShutdown = true;
-					return true;
-				}
-
-				@Override
-				public void postShutdown(IWorkbench workbench) {
-				}
-
-			};
-			PlatformUI.getWorkbench().addWorkbenchListener(workbenchListener);
-		}
-	}
-	
-    @Override
-    public void gotoMarker(IMarker marker) {
-        final EObject target = getTargetObject(marker);
-        if (target == null) {
-            return;
-        }
-        final PictogramElement pe = getDiagramTypeProvider().getFeatureProvider().getPictogramElementForBusinessObject(
-                target);
-        if (pe == null) {
-            return;
-        }
-        selectPictogramElements(new PictogramElement[] {pe });
-    }
-
-    private void loadMarkers() {
-    	if (getModelFile()!=null) {
-	        // read in the markers
-	        BPMN2ValidationStatusLoader vsl = new BPMN2ValidationStatusLoader(this);
-	
-	        try {
-	            vsl.load(Arrays.asList(getModelFile().findMarkers(
-	            		BPMN2ProjectValidator.BPMN2_MARKER_ID, true, IResource.DEPTH_ZERO)));
-	        } catch (CoreException e) {
-	            Activator.logStatus(e.getStatus());
-	        }
-    	}
-    }
-    
-    private EObject getTargetObject(IMarker marker) {
-        final String uriString = marker.getAttribute(EValidator.URI_ATTRIBUTE, null);
-        final URI uri = uriString == null ? null : URI.createURI(uriString);
-        if (uri == null) {
-            return null;
-        }
-        return getEditingDomain().getResourceSet().getEObject(uri, false);
-    }
-
-	private void removeWorkbenchListener()
-	{
-		if (workbenchListener!=null) {
-			PlatformUI.getWorkbench().removeWorkbenchListener(workbenchListener);
-			workbenchListener = null;
-		}
-	}
-	
-	private void addSelectionListener() {
-		if (selectionListener == null) {
-			IWorkbenchPage page = getSite().getPage();
-			selectionListener = new IPartListener2() {
-				public void partActivated(IWorkbenchPartReference partRef) {
-				}
-
-				@Override
-				public void partBroughtToTop(IWorkbenchPartReference partRef) {
-					IWorkbenchPart part = partRef.getPart(false);
-					if (part instanceof BPMN2MultiPageEditor) {
-						BPMN2MultiPageEditor mpe = (BPMN2MultiPageEditor)part;
-						setActiveEditor(mpe.getDesignEditor());
-					}
-				}
-
-				@Override
-				public void partClosed(IWorkbenchPartReference partRef) {
-				}
-
-				@Override
-				public void partDeactivated(IWorkbenchPartReference partRef) {
-				}
-
-				@Override
-				public void partOpened(IWorkbenchPartReference partRef) {
-				}
-
-				@Override
-				public void partHidden(IWorkbenchPartReference partRef) {
-				}
-
-				@Override
-				public void partVisible(IWorkbenchPartReference partRef) {
-				}
-
-				@Override
-				public void partInputChanged(IWorkbenchPartReference partRef) {
-				}
-			};
-			page.addPartListener(selectionListener);
-		}
-	}
-
-	private void removeSelectionListener()
-	{
-		if (selectionListener!=null) {
-			getSite().getPage().removePartListener(selectionListener);
-			selectionListener = null;
-		}
-	}
-
-	private void addMarkerChangeListener() {
-		if (getModelFile()!=null) {
-			if (markerChangeListener==null) {
-				markerChangeListener = new BPMN2MarkerChangeListener(this);
-		        getModelFile().getWorkspace().addResourceChangeListener(markerChangeListener, IResourceChangeEvent.POST_BUILD);
-			}
-		}
-	}
-	
-	private void removeMarkerChangeListener() {
-		if (markerChangeListener!=null) {
-			getModelFile().getWorkspace().removeResourceChangeListener(markerChangeListener);
-			markerChangeListener = null;
-		}
-	}
-	
-	public void refreshTitle() {
-		String name = getEditorInput().getName();
-		setPartName(URI.decode(name));
-	}
-
-	public BPMN2EditingDomainListener getEditingDomainListener() {
-		if (editingDomainListener==null) {
-			TransactionalEditingDomainImpl editingDomain = (TransactionalEditingDomainImpl)getEditingDomain();
-			if (editingDomain==null) {
-				return null;
-			}
-			editingDomainListener = new BPMN2EditingDomainListener(this);
-
-			Lifecycle domainLifeCycle = (Lifecycle) editingDomain.getAdapter(Lifecycle.class);
-			domainLifeCycle.addTransactionalEditingDomainListener(editingDomainListener);
-		}
-		return editingDomainListener;
-	}
-	
-	public BasicDiagnostic getDiagnostics() {
-		return getEditingDomainListener().getDiagnostics();
-	}
-	
-	@Override
-	public Object getAdapter(Class required) {
-		if (required==ITabDescriptorProvider.class) {
-			if (tabDescriptorProvider==null) {
-				IWorkbenchPage page = getEditorSite().getPage();
-				String viewID = "org.eclipse.ui.views.PropertySheet";
-				try {
-					page.showView(viewID, null, IWorkbenchPage.VIEW_CREATE);
-					page.showView(viewID, null,  IWorkbenchPage.VIEW_ACTIVATE);
-				}
-				catch (Exception e) {}
-			}
-			return tabDescriptorProvider;
-		}
-		if (required==TargetRuntime.class)
-			return getTargetRuntime();
-		if (required==Bpmn2Preferences.class)
-			return getPreferences();
-		if (required == IPropertySheetPage.class) {
-			return new Bpmn2TabbedPropertySheetPage(this);
-		}
-		if (required == SelectionSynchronizer.class) {
-			return getSelectionSynchronizer();
-		}
-		if (required == IContentOutlinePage.class) {
-			if (getDiagramTypeProvider() != null) {
-				BPMN2EditorOutlinePage outlinePage = new BPMN2EditorOutlinePage(this);
-				return outlinePage;
-			}
-		}
-		
-		return super.getAdapter(required);
-	}
-
-	@Override
-	public void dispose() {
-		// clear ID mapping tables if no more instances of editor are active
-		int instances = 0;
-		IWorkbenchPage[] pages = getEditorSite().getWorkbenchWindow().getPages();
-		for (IWorkbenchPage p : pages) {
-			IEditorReference[] refs = p.getEditorReferences();
-			instances += refs.length;
-		}
-		File diagramFile = new File(diagramUri.toFileString());
-		if (diagramFile.exists()) {
-			try {
-				diagramFile.delete();
-			}
-			catch (Exception e) {
-			}
-		}
-		ModelUtil.clearIDs(modelHandler.getResource(), instances==0);
-		getPreferences().getGlobalPreferences().removePropertyChangeListener(this);
-		
-		getResourceSet().eAdapters().remove(getEditorAdapter());
-		removeSelectionListener();
-		if (instances==0)
-			setActiveEditor(null);
-		
-		super.dispose();
-		ModelHandlerLocator.remove(modelUri);
-		// get rid of temp files and folders, but NOT if the workbench is being shut down.
-		// when the workbench is restarted, we need to have those temp files around!
-		if (!workbenchShutdown) {
-			if (FileService.isTempFile(modelUri)) {
-				FileService.deleteTempFile(modelUri);
-			}
-		}
-
-		removeWorkbenchListener();
-		removeMarkerChangeListener();
-		getPreferences().dispose();
-	}
-
-	public IPath getModelPath() {
-		if (getModelFile()!=null)
-			return getModelFile().getFullPath();
-		return null;
-	}
-	
-	public IProject getProject() {
-		if (getModelFile()!=null)
-			return getModelFile().getProject();
-		return null;
-	}
-	
-	public IFile getModelFile() {
-		if (modelUri!=null) {
-			String uriString = modelUri.trimFragment().toPlatformString(true);
-			if (uriString!=null) {
-				IPath fullPath = new Path(uriString);
-				return ResourcesPlugin.getWorkspace().getRoot().getFile(fullPath);
-			}
-		}
-		return null;
-	}
-	
-	public ModelHandler getModelHandler() {
-		return modelHandler;
-	}
-	
-	public void createPartControl(Composite parent) {
-		if (getGraphicalViewer()==null) {
-			super.createPartControl(parent);
-		}
-	}
-	
-	public BPMNDiagram getBpmnDiagram() {
-		if (bpmnDiagram==null)
-			bpmnDiagram = getModelHandler().getDefinitions().getDiagrams().get(0);
-
-//		if (bpmnDiagram!=null) {
-//			GraphicalViewer viewer = getGraphicalViewer();
-//			mapDiagramToViewer.put(bpmnDiagram, viewer);
-//		}
-		return bpmnDiagram;
-	}
-	
-	public void setBpmnDiagram(final BPMNDiagram bpmnDiagram) {
-		// create a new Graphiti Diagram if needed
-		Diagram diagram = DIUtils.getOrCreateDiagram(this, bpmnDiagram);
-		
-		// Tell the DTP about the new Diagram
-		getDiagramTypeProvider().resourceReloaded(diagram);
-		getRefreshBehavior().initRefresh();
-		setPictogramElementsForSelection(null);
-		// set Diagram as contents for the graphical viewer and refresh
-		getGraphicalViewer().setContents(diagram);
-		
-		refreshContent();
-		
-		// remember this for later
-		this.bpmnDiagram = bpmnDiagram;
-	}
-
-	@Override
-	public void doSave(IProgressMonitor monitor) {
-		super.doSave(monitor);
-
-		Resource resource = getResourceSet().getResource(modelUri, false);
-		BPMN2ProjectValidator.validateOnSave(resource, monitor);
-	}
-
-	@Override
-	public boolean isSaveAsAllowed() {
-		return getModelFile()!=null;
-	}
-	
-	@Override
-	public void doSaveAs() {
-		IFile oldFile = getModelFile();
-		SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());
-		saveAsDialog.setOriginalFile(oldFile);
-		saveAsDialog.create();
-		if (saveAsDialog.open() == SaveAsDialog.CANCEL) {
-			return;
-		}
-		IPath newFilePath = saveAsDialog.getResult();
-		if (newFilePath == null){
-			return;
-		}
-		
-        IFile newFile = ResourcesPlugin.getWorkspace().getRoot().getFile(newFilePath);
-        IWorkbenchPage page = getSite().getPage();
-        
-        try {
-        	// Save the current(old) file
-        	doSave(null);
-        	// if new file exists, close its editor (if open) and delete the existing file
-            if (newFile.exists()) {
-    			IEditorPart editorPart = ResourceUtil.findEditor(page, newFile);
-    			if (editorPart!=null)
-	    			page.closeEditor(editorPart, false);
-        		newFile.delete(true, null);
-            }
-            // make a copy
-			oldFile.copy(newFilePath, true, null);
-		} catch (CoreException e) {
-			showErrorDialogWithLogging(e);
-			return;
-		}
-
-        // open new editor
-    	try {
-			page.openEditor(new FileEditorInput(newFile), BPMN2Editor.EDITOR_ID);
-		} catch (PartInitException e1) {
-			showErrorDialogWithLogging(e1);
-			return;
-		}
-    	
-    	// and close the old editor
-		IEditorPart editorPart = ResourceUtil.findEditor(page, oldFile);
-		if (editorPart!=null)
-			page.closeEditor(editorPart, false);
-		
-    	try {
-			newFile.refreshLocal(IResource.DEPTH_ZERO,null);
-		} catch (CoreException e) {
-			showErrorDialogWithLogging(e);
-			return;
-		}
-	}
-
-	public void closeEditor() {
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				boolean closed = getSite().getPage().closeEditor(BPMN2Editor.this, false);
-				if (!closed){
-					// If close editor fails, try again with explicit editorpart 
-					// of the old file
-					IFile oldFile = ResourcesPlugin.getWorkspace().getRoot().getFile(getModelPath());
-					IEditorPart editorPart = ResourceUtil.findEditor(getSite().getPage(), oldFile);
-					closed = getSite().getPage().closeEditor(editorPart, false);
-				}
-			}
-		});
-	}
-
-	// Show error dialog and log the error
-	private void showErrorDialogWithLogging(Exception e) {
-		Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
-		ErrorUtils.showErrorWithLogging(status);
-	}
-
-	////////////////////////////////////////////////////////////////////////////////
-	// WorkspaceSynchronizer handlers called from delegate
-	////////////////////////////////////////////////////////////////////////////////
-	
-	public boolean handleResourceChanged(Resource resource) {
-		return true;
-	}
-
-	public boolean handleResourceDeleted(Resource resource) {
-		closeEditor();
-		return true;
-	}
-
-	public boolean handleResourceMoved(Resource resource, URI newURI) {
-		URI oldURI = resource.getURI();
-		resource.setURI(newURI);
-		
-		if (modelUri.equals(oldURI)) {
-			ModelHandlerLocator.remove(modelUri);
-			modelUri = newURI;
-			if (preferences!=null) {
-				preferences.getGlobalPreferences().removePropertyChangeListener(this);
-				preferences.dispose();
-				preferences = null;
-			}
-			targetRuntime = null;
-			modelHandler = ModelHandlerLocator.createModelHandler(modelUri, (Bpmn2ResourceImpl)resource);
-			ModelHandlerLocator.put(diagramUri, modelHandler);
-		}
-		else if (diagramUri.equals(oldURI)) {
-			ModelHandlerLocator.remove(diagramUri);
-			diagramUri = newURI;
-			ModelHandlerLocator.put(diagramUri, modelHandler);
-		}
-
-		return true;
-	}
-	
-	////////////////////////////////////////////////////////////////////////////////
-	// Other handlers
-	////////////////////////////////////////////////////////////////////////////////
-
-	@Override
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		// Graphiti understands multipage editors
-		super.selectionChanged(part,selection); // Graphiti's DiagramEditorInternal
-		// but apparently GEF doesn't
-		updateActions(getSelectionActions()); // usually done in GEF's GraphicalEditor
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	@Override
-	public void propertyChange(PropertyChangeEvent event) {
-		if (event.getProperty().endsWith(Bpmn2Preferences.PREF_SHAPE_STYLE)) {
-			getEditingDomain().getCommandStack().execute(new RecordingCommand(getEditingDomain()) {
-				@Override
-				protected void doExecute() {
-					IPeService peService = Graphiti.getPeService();
-					TreeIterator<EObject> iter = getDiagramTypeProvider().getDiagram().eAllContents();
-					while (iter.hasNext()) {
-						EObject o = iter.next();
-						if (o instanceof PictogramElement) {
-							PictogramElement pe = (PictogramElement)o;
-							BaseElement be = BusinessObjectUtil.getFirstElementOfType(pe, BaseElement.class);
-							if (be!=null) {
-								TreeIterator<EObject> childIter = pe.eAllContents();
-								while (childIter.hasNext()) {
-									o = childIter.next();
-									if (o instanceof GraphicsAlgorithm) {
-										GraphicsAlgorithm ga = (GraphicsAlgorithm)o;
-										if (peService.getPropertyValue(ga, Bpmn2Preferences.PREF_SHAPE_STYLE)!=null) {
-											StyleUtil.applyStyle(ga, be);
-										}
-									}
-			
-								}
-							}
-						}
-					}
-				}
-			});
-		}
-	}
-}
+/******************************************************************************* 
+ * 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.editor;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.eclipse.bpmn2.Activity;
+import org.eclipse.bpmn2.Assignment;
+import org.eclipse.bpmn2.BaseElement;
+import org.eclipse.bpmn2.BoundaryEvent;
+import org.eclipse.bpmn2.CallActivity;
+import org.eclipse.bpmn2.CallChoreography;
+import org.eclipse.bpmn2.CatchEvent;
+import org.eclipse.bpmn2.Category;
+import org.eclipse.bpmn2.CompensateEventDefinition;
+import org.eclipse.bpmn2.ConditionalEventDefinition;
+import org.eclipse.bpmn2.DataInput;
+import org.eclipse.bpmn2.DataObject;
+import org.eclipse.bpmn2.DataObjectReference;
+import org.eclipse.bpmn2.DataOutput;
+import org.eclipse.bpmn2.DataStore;
+import org.eclipse.bpmn2.DataStoreReference;
+import org.eclipse.bpmn2.EndEvent;
+import org.eclipse.bpmn2.ErrorEventDefinition;
+import org.eclipse.bpmn2.EscalationEventDefinition;
+import org.eclipse.bpmn2.Event;
+import org.eclipse.bpmn2.Expression;
+import org.eclipse.bpmn2.FormalExpression;
+import org.eclipse.bpmn2.Gateway;
+import org.eclipse.bpmn2.GlobalBusinessRuleTask;
+import org.eclipse.bpmn2.GlobalManualTask;
+import org.eclipse.bpmn2.GlobalScriptTask;
+import org.eclipse.bpmn2.GlobalTask;
+import org.eclipse.bpmn2.GlobalUserTask;
+import org.eclipse.bpmn2.HumanPerformer;
+import org.eclipse.bpmn2.Import;
+import org.eclipse.bpmn2.InputOutputSpecification;
+import org.eclipse.bpmn2.Interface;
+import org.eclipse.bpmn2.ItemDefinition;
+import org.eclipse.bpmn2.LinkEventDefinition;
+import org.eclipse.bpmn2.ManualTask;
+import org.eclipse.bpmn2.Message;
+import org.eclipse.bpmn2.MessageEventDefinition;
+import org.eclipse.bpmn2.MessageFlow;
+import org.eclipse.bpmn2.MultiInstanceLoopCharacteristics;
+import org.eclipse.bpmn2.Performer;
+import org.eclipse.bpmn2.PotentialOwner;
+import org.eclipse.bpmn2.Process;
+import org.eclipse.bpmn2.Property;
+import org.eclipse.bpmn2.ResourceAssignmentExpression;
+import org.eclipse.bpmn2.ResourceParameterBinding;
+import org.eclipse.bpmn2.ResourceRole;
+import org.eclipse.bpmn2.ScriptTask;
+import org.eclipse.bpmn2.SequenceFlow;
+import org.eclipse.bpmn2.SignalEventDefinition;
+import org.eclipse.bpmn2.StandardLoopCharacteristics;
+import org.eclipse.bpmn2.StartEvent;
+import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.Task;
+import org.eclipse.bpmn2.TextAnnotation;
+import org.eclipse.bpmn2.ThrowEvent;
+import org.eclipse.bpmn2.TimerEventDefinition;
+import org.eclipse.bpmn2.di.BPMNDiagram;
+import org.eclipse.bpmn2.modeler.core.Bpmn2TabbedPropertySheetPage;
+import org.eclipse.bpmn2.modeler.core.ModelHandler;
+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
+import org.eclipse.bpmn2.modeler.core.ProxyURIConverterImplExtension;
+import org.eclipse.bpmn2.modeler.core.di.DIImport;
+import org.eclipse.bpmn2.modeler.core.di.DIUtils;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDetailComposite;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDialogComposite;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultListComposite;
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.PropertiesCompositeFactory;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceImpl;
+import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;
+import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
+import org.eclipse.bpmn2.modeler.core.utils.DiagramEditorAdapter;
+import org.eclipse.bpmn2.modeler.core.utils.ErrorUtils;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType;
+import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
+import org.eclipse.bpmn2.modeler.core.validation.BPMN2ProjectValidator;
+import org.eclipse.bpmn2.modeler.core.validation.BPMN2ValidationStatusLoader;
+import org.eclipse.bpmn2.modeler.ui.Activator;
+import org.eclipse.bpmn2.modeler.ui.IFileChangeListener;
+import org.eclipse.bpmn2.modeler.ui.property.artifact.CategoryDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.artifact.TextAnnotationDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.connectors.MessageFlowDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.connectors.SequenceFlowDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.ConditionalEventDefinitionDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.DataAssignmentDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.DataObjectPropertySection.DataObjectDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.DataObjectReferencePropertySection.DataObjectReferenceDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.DataStorePropertySection.DataStoreDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.DataStoreReferencePropertySection.DataStoreReferenceDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.ExpressionDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.InterfaceDetailComposite;
+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.data.ResourceAssignmentExpressionDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.ResourceParameterBindingDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.data.ResourceRoleDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.diagrams.DefinitionsPropertyComposite.ImportDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.diagrams.ItemDefinitionDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.diagrams.ItemDefinitionListComposite;
+import org.eclipse.bpmn2.modeler.ui.property.diagrams.ProcessDiagramPropertyComposite;
+import org.eclipse.bpmn2.modeler.ui.property.diagrams.PropertyListComposite;
+import org.eclipse.bpmn2.modeler.ui.property.diagrams.ResourceRoleListComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.BoundaryEventDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.CatchEventDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.CommonEventDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.CommonEventPropertySection.EventDefinitionDialogComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.EndEventDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.StartEventDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.ThrowEventDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.events.TimerEventDefinitionDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.gateways.GatewayDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityInputDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityOutputDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.DataAssociationDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.IoParametersDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.ManualTaskDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.MultiInstanceLoopCharacteristicsDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.ScriptTaskDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.StandardLoopCharacteristicsDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.property.tasks.TaskDetailComposite;
+import org.eclipse.bpmn2.modeler.ui.views.outline.BPMN2EditorOutlinePage;
+import org.eclipse.bpmn2.modeler.ui.wizards.BPMN2DiagramCreator;
+import org.eclipse.bpmn2.modeler.ui.wizards.Bpmn2DiagramEditorInput;
+import org.eclipse.bpmn2.modeler.ui.wizards.FileService;
+import org.eclipse.bpmn2.util.Bpmn2ResourceImpl;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.command.BasicCommandStack;
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EValidator;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain.Lifecycle;
+import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
+import org.eclipse.gef.ui.parts.SelectionSynchronizer;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.services.IPeService;
+import org.eclipse.graphiti.ui.editor.DiagramEditor;
+import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
+import org.eclipse.graphiti.ui.internal.editor.GFPaletteRoot;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IPartListener2;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SaveAsDialog;
+import org.eclipse.ui.ide.IGotoMarker;
+import org.eclipse.ui.ide.ResourceUtil;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider;
+
+/**
+ * 
+ */
+@SuppressWarnings("restriction")
+public class BPMN2Editor extends DiagramEditor implements IPropertyChangeListener, IGotoMarker {
+	
+	static {
+		TargetRuntime.getAllRuntimes();
+		PropertiesCompositeFactory.register(EObject.class, DefaultDetailComposite.class);
+		PropertiesCompositeFactory.register(EObject.class, DefaultListComposite.class);
+		PropertiesCompositeFactory.register(EObject.class, DefaultDialogComposite.class);
+		PropertiesCompositeFactory.register(Message.class, MessageDetailComposite.class);
+		PropertiesCompositeFactory.register(Message.class, MessageListComposite.class);
+		PropertiesCompositeFactory.register(MessageFlow.class, MessageFlowDetailComposite.class);
+		PropertiesCompositeFactory.register(Property.class, ItemAwareElementDetailComposite.class);
+		PropertiesCompositeFactory.register(CallActivity.class, ActivityDetailComposite.class);
+		PropertiesCompositeFactory.register(GlobalTask.class, ActivityDetailComposite.class);
+		PropertiesCompositeFactory.register(GlobalBusinessRuleTask.class, ActivityDetailComposite.class);
+		PropertiesCompositeFactory.register(GlobalManualTask.class, ActivityDetailComposite.class);
+		PropertiesCompositeFactory.register(GlobalScriptTask.class, ActivityDetailComposite.class);
+		PropertiesCompositeFactory.register(GlobalUserTask.class, ActivityDetailComposite.class);
+		PropertiesCompositeFactory.register(Import.class, ImportDetailComposite.class);
+		PropertiesCompositeFactory.register(Category.class, CategoryDetailComposite.class);
+		PropertiesCompositeFactory.register(TextAnnotation.class, TextAnnotationDetailComposite.class);
+		PropertiesCompositeFactory.register(SequenceFlow.class, SequenceFlowDetailComposite.class);
+		PropertiesCompositeFactory.register(DataObject.class, DataObjectDetailComposite.class);
+		PropertiesCompositeFactory.register(DataObjectReference.class, DataObjectDetailComposite.class);
+		PropertiesCompositeFactory.register(Assignment.class, DataAssignmentDetailComposite.class);
+		PropertiesCompositeFactory.register(Expression.class, ExpressionDetailComposite.class);
+		PropertiesCompositeFactory.register(FormalExpression.class, ExpressionDetailComposite.class);
+		PropertiesCompositeFactory.register(ResourceAssignmentExpression.class, ResourceAssignmentExpressionDetailComposite.class);
+		PropertiesCompositeFactory.register(ResourceParameterBinding.class, ResourceParameterBindingDetailComposite.class);
+		PropertiesCompositeFactory.register(PotentialOwner.class, ResourceRoleDetailComposite.class);
+		PropertiesCompositeFactory.register(HumanPerformer.class, ResourceRoleDetailComposite.class);
+		PropertiesCompositeFactory.register(Performer.class, ResourceRoleDetailComposite.class);
+		PropertiesCompositeFactory.register(DataObjectReference.class, DataObjectReferenceDetailComposite.class);
+		PropertiesCompositeFactory.register(DataStore.class, DataStoreDetailComposite.class);
+		PropertiesCompositeFactory.register(DataStoreReference.class, DataStoreReferenceDetailComposite.class);
+		PropertiesCompositeFactory.register(Interface.class, InterfaceDetailComposite.class);
+		PropertiesCompositeFactory.register(ItemDefinition.class, ItemDefinitionDetailComposite.class);
+		PropertiesCompositeFactory.register(ItemDefinition.class, ItemDefinitionListComposite.class);
+		PropertiesCompositeFactory.register(Property.class, PropertyListComposite.class);
+		PropertiesCompositeFactory.register(ResourceRole.class, ResourceRoleListComposite.class);
+		PropertiesCompositeFactory.register(Event.class, CommonEventDetailComposite.class);
+		PropertiesCompositeFactory.register(StartEvent.class, StartEventDetailComposite.class);
+		PropertiesCompositeFactory.register(EndEvent.class, EndEventDetailComposite.class);
+		PropertiesCompositeFactory.register(CatchEvent.class, CatchEventDetailComposite.class);
+		PropertiesCompositeFactory.register(ThrowEvent.class, ThrowEventDetailComposite.class);
+		PropertiesCompositeFactory.register(BoundaryEvent.class, BoundaryEventDetailComposite.class);
+		PropertiesCompositeFactory.register(TimerEventDefinition.class, TimerEventDefinitionDetailComposite.class);
+		PropertiesCompositeFactory.register(ConditionalEventDefinition.class, ConditionalEventDefinitionDetailComposite.class);
+		PropertiesCompositeFactory.register(CompensateEventDefinition.class, EventDefinitionDialogComposite.class);
+		PropertiesCompositeFactory.register(ConditionalEventDefinition.class, EventDefinitionDialogComposite.class);
+		PropertiesCompositeFactory.register(ErrorEventDefinition.class, EventDefinitionDialogComposite.class);
+		PropertiesCompositeFactory.register(EscalationEventDefinition.class, EventDefinitionDialogComposite.class);
+		PropertiesCompositeFactory.register(LinkEventDefinition.class, EventDefinitionDialogComposite.class);
+		PropertiesCompositeFactory.register(MessageEventDefinition.class, EventDefinitionDialogComposite.class);
+		PropertiesCompositeFactory.register(SignalEventDefinition.class, EventDefinitionDialogComposite.class);
+		PropertiesCompositeFactory.register(TimerEventDefinition.class, EventDefinitionDialogComposite.class);
+		PropertiesCompositeFactory.register(Process.class, ProcessDiagramPropertyComposite.class);
+		PropertiesCompositeFactory.register(EndEvent.class, EndEventDetailComposite.class);
+		PropertiesCompositeFactory.register(StartEvent.class, StartEventDetailComposite.class);
+		PropertiesCompositeFactory.register(ThrowEvent.class, ThrowEventDetailComposite.class);
+		PropertiesCompositeFactory.register(StandardLoopCharacteristics.class, StandardLoopCharacteristicsDetailComposite.class);
+		PropertiesCompositeFactory.register(MultiInstanceLoopCharacteristics.class, MultiInstanceLoopCharacteristicsDetailComposite.class);
+		PropertiesCompositeFactory.register(Gateway.class, GatewayDetailComposite.class);
+		PropertiesCompositeFactory.register(Activity.class, ActivityInputDetailComposite.class);
+		PropertiesCompositeFactory.register(InputOutputSpecification.class, ActivityInputDetailComposite.class);
+		PropertiesCompositeFactory.register(Activity.class, ActivityOutputDetailComposite.class);
+		PropertiesCompositeFactory.register(CallChoreography.class, ActivityDetailComposite.class);
+		PropertiesCompositeFactory.register(InputOutputSpecification.class, IoParametersDetailComposite.class);
+		PropertiesCompositeFactory.register(DataInput.class, DataAssociationDetailComposite.class);
+		PropertiesCompositeFactory.register(DataOutput.class, DataAssociationDetailComposite.class);
+		PropertiesCompositeFactory.register(ManualTask.class, ManualTaskDetailComposite.class);
+		PropertiesCompositeFactory.register(ScriptTask.class, ScriptTaskDetailComposite.class);
+		PropertiesCompositeFactory.register(SubProcess.class, ActivityDetailComposite.class);
+		PropertiesCompositeFactory.register(Task.class, TaskDetailComposite.class);
+	}
+
+	public static final String EDITOR_ID = "org.eclipse.bpmn2.modeler.ui.bpmn2editor";
+	public static final String CONTRIBUTOR_ID = "org.eclipse.bpmn2.modeler.ui.PropertyContributor";
+
+	private ModelHandler modelHandler;
+	private URI modelUri;
+	private URI diagramUri;
+	private boolean editable = true;
+
+	protected BPMNDiagram bpmnDiagram;
+	protected Bpmn2ResourceImpl bpmnResource;
+	
+	private IFileChangeListener fileChangeListener;
+	private IWorkbenchListener workbenchListener;
+	private IPartListener2 selectionListener;
+    private IResourceChangeListener markerChangeListener;
+	private boolean workbenchShutdown = false;
+	private static BPMN2Editor activeEditor;
+	private static ITabDescriptorProvider tabDescriptorProvider;
+
+	private BPMN2EditingDomainListener editingDomainListener;
+	
+	private Bpmn2Preferences preferences;
+	private TargetRuntime targetRuntime;
+//	private Hashtable<BPMNDiagram, GraphicalViewer> mapDiagramToViewer = new Hashtable<BPMNDiagram, GraphicalViewer>();
+
+	protected DiagramEditorAdapter editorAdapter;
+	protected BPMN2MultiPageEditor multipageEditor;
+	
+	public BPMN2Editor(BPMN2MultiPageEditor mpe) {
+		multipageEditor = mpe;
+	}
+	
+	public static BPMN2Editor getActiveEditor() {
+		return activeEditor;
+	}
+	
+	private void setActiveEditor(BPMN2Editor editor) {
+		activeEditor = editor;
+		if (activeEditor!=null) {
+			Bpmn2Preferences.setActiveProject(activeEditor.getProject());
+			TargetRuntime.setCurrentRuntime( activeEditor.getTargetRuntime() );
+		}
+	}
+
+	public BPMN2MultiPageEditor getMultipageEditor() {
+		return multipageEditor;
+	}
+	
+	protected DiagramEditorAdapter getEditorAdapter() {
+		return editorAdapter;
+	}
+
+	@Override
+	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+		try {
+			Bpmn2DiagramType diagramType = Bpmn2DiagramType.NONE;
+			String targetNamespace = null;
+			bpmnDiagram = null;
+
+			if (input instanceof IStorageEditorInput) {
+				input = createNewDiagramEditorInput(site, input, diagramType, targetNamespace);
+			}
+			else if (input instanceof DiagramEditorInput) {
+				if (input instanceof Bpmn2DiagramEditorInput) {
+					diagramType = ((Bpmn2DiagramEditorInput)input).getInitialDiagramType();
+					targetNamespace = ((Bpmn2DiagramEditorInput)input).getTargetNamespace();
+					bpmnDiagram = ((Bpmn2DiagramEditorInput)input).getBpmnDiagram();
+				}
+				if (bpmnDiagram==null) {
+					// This was incorrectly constructed input, we ditch the old one and make a new and clean one instead
+					// This code path comes in from the New File Wizard
+					input = createNewDiagramEditorInput(site, input, diagramType, targetNamespace);
+				}
+				else {
+					BPMNDiagram d = bpmnDiagram;
+					bpmnDiagram = null;
+					setBpmnDiagram(d);
+					return;
+				}
+			}
+			else {
+				throw new PartInitException("Invalid Editor Input: "
+						+input.getClass().getSimpleName()+" "
+						+input.getName());
+			}
+		} catch (Exception e) {
+			Activator.showErrorWithLogging(e);
+			throw new PartInitException(e.getMessage());
+		}
+		
+		// add a listener so we get notified if the workbench is shutting down.
+		// in this case we don't want to delete the temp file!
+		addWorkbenchListener();
+		getTargetRuntime(input);
+		setActiveEditor(this);
+		
+		super.init(site, input);
+		
+		addSelectionListener();
+		addFileChangeListener();
+		addMarkerChangeListener();
+	}
+	
+	public void setEditable(boolean editable) {
+		this.editable = editable;
+	}
+
+	public boolean isEditable() {
+	    return editable;
+	}
+
+	@Override
+	public boolean isDirty() {
+		if (!editable)
+			return false;
+		return super.isDirty();
+	}
+    
+	public Bpmn2Preferences getPreferences() {
+		if (preferences==null) {
+			loadPreferences(getProject());
+		}
+		return preferences;
+	}
+	
+	private void loadPreferences(IProject project) {
+		preferences = Bpmn2Preferences.getInstance(project);
+		preferences.load();
+		preferences.getGlobalPreferences().addPropertyChangeListener(this);
+	}
+
+	/**
+	 * ID for tabbed property sheets.
+	 * 
+	 * @return the contributor id
+	 */
+	@Override
+	public String getContributorId() {
+		return CONTRIBUTOR_ID;
+	}
+
+	public TargetRuntime getTargetRuntime(ITabDescriptorProvider tdp) {
+		tabDescriptorProvider = tdp;
+		return getTargetRuntime();
+	}
+	
+	public TargetRuntime getTargetRuntime() {
+		if (targetRuntime==null) {
+			targetRuntime = getTargetRuntime(getEditorInput());
+		}
+		return targetRuntime;
+	}
+	
+	protected TargetRuntime getTargetRuntime(IEditorInput input) {
+		if (targetRuntime==null) {
+			 // If the project has not been configured for a specific runtime through the "BPMN2"
+			 // project properties page (i.e. the target is "None") then allow the runtime extension
+			 // plug-ins an opportunity to identify the given process file contents as their own.
+			 // If none of the plug-ins respond with "yes, this file is targeted for my runtime",
+			 // then use the "None" as the extension. This will configure the BPMN2 Modeler with
+			 // generic property sheets and other default behavior.
+			targetRuntime = getPreferences().getRuntime();
+			if (targetRuntime == TargetRuntime.getDefaultRuntime()) {
+				for (TargetRuntime rt : TargetRuntime.getAllRuntimes()) {
+					if (rt.getRuntimeExtension().isContentForRuntime(input)) {
+						targetRuntime = rt;
+						break;
+					}
+				}
+			}
+			if (targetRuntime==null)
+				targetRuntime = TargetRuntime.getDefaultRuntime();
+		}
+		return targetRuntime;
+	}
+	
+	/**
+	 * Beware, creates a new input and changes this editor!
+	 */
+	private Bpmn2DiagramEditorInput createNewDiagramEditorInput(IEditorSite site, IEditorInput input, Bpmn2DiagramType diagramType, String targetNamespace)
+			throws CoreException {
+		
+		modelUri = FileService.getInputUri(input);
+		input = BPMN2DiagramCreator.createDiagram(modelUri, diagramType,targetNamespace,this);
+		diagramUri = ((Bpmn2DiagramEditorInput)input).getUri();
+
+		return (Bpmn2DiagramEditorInput)input;
+	}
+
+	private void saveModelFile() {
+		modelHandler.save();
+		((BasicCommandStack) getEditingDomain().getCommandStack()).saveIsDone();
+		firePropertyChange(IEditorPart.PROP_DIRTY);
+	}
+
+	@Override
+	protected void setInput(IEditorInput input) {
+		super.setInput(input);
+		
+		// Hook a transaction exception handler so we can get diagnostics about EMF validation errors.
+		getEditingDomainListener();
+		
+		BasicCommandStack basicCommandStack = (BasicCommandStack) getEditingDomain().getCommandStack();
+
+		if (input instanceof DiagramEditorInput) {
+			ResourceSet resourceSet = getEditingDomain().getResourceSet();
+			getTargetRuntime().setResourceSet(resourceSet);
+			
+			bpmnResource = (Bpmn2ResourceImpl) resourceSet.createResource(modelUri,
+					Bpmn2ModelerResourceImpl.BPMN2_CONTENT_TYPE_ID);
+
+			resourceSet.setURIConverter(new ProxyURIConverterImplExtension());
+			resourceSet.eAdapters().add(editorAdapter = new DiagramEditorAdapter(this));
+
+			modelHandler = ModelHandlerLocator.createModelHandler(modelUri, bpmnResource);
+			ModelHandlerLocator.put(diagramUri, modelHandler);
+
+			getTargetRuntime(input);
+			setActiveEditor(this);
+
+			// allow the runtime extension to construct custom tasks and whatever else it needs
+			// custom tasks should be added to the current target runtime's custom tasks list
+			// where they will be picked up by the toolpalette refresh.
+			getTargetRuntime().getRuntimeExtension().initialize(this);
+
+			try {
+				if (getModelFile()==null || getModelFile().exists()) {
+					bpmnResource.load(null);
+				} else {
+					saveModelFile();
+				}
+			} catch (IOException e) {
+				Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
+				ErrorUtils.showErrorWithLogging(status);
+			}
+			basicCommandStack.execute(new RecordingCommand(getEditingDomain()) {
+
+				@Override
+				protected void doExecute() {
+					importDiagram();
+				}
+			});
+		}
+		basicCommandStack.saveIsDone();
+		basicCommandStack.flush();
+		loadMarkers();
+	}
+	
+	private void importDiagram() {
+		// make sure this guy is active, otherwise it's not selectable
+		Diagram diagram = getDiagramTypeProvider().getDiagram();
+		IFeatureProvider featureProvider = getDiagramTypeProvider().getFeatureProvider();
+		diagram.setActive(true);
+		Bpmn2DiagramEditorInput input = (Bpmn2DiagramEditorInput) getEditorInput();
+		Bpmn2DiagramType diagramType = input.getInitialDiagramType();
+		String targetNamespace = input.getTargetNamespace();
+
+		if (diagramType != Bpmn2DiagramType.NONE) {
+			bpmnDiagram = modelHandler.createDiagramType(diagramType, targetNamespace);
+			featureProvider.link(diagram, bpmnDiagram);
+			saveModelFile();
+		}
+		
+		DIImport di = new DIImport(this);
+		di.setModelHandler(modelHandler);
+
+		di.generateFromDI();
+	}
+
+	protected void updatePalette() {
+		GFPaletteRoot pr = (GFPaletteRoot)getPaletteRoot();
+		if (pr!=null)
+			pr.updatePaletteEntries();
+	}
+	
+	@Override
+	protected PictogramElement[] getPictogramElementsForSelection() {
+		// filter out invisible elements when setting selection
+		PictogramElement[] pictogramElements = super.getPictogramElementsForSelection();
+		if (pictogramElements==null)
+			return null;
+		ArrayList<PictogramElement> visibleList = new ArrayList<PictogramElement>();
+		for (PictogramElement pe : pictogramElements) {
+			if (pe.isVisible())
+				visibleList.add(pe);
+		}
+		return visibleList.toArray(new PictogramElement[visibleList.size()]);
+	}
+	
+	private void addWorkbenchListener() {
+		if (workbenchListener==null) {
+			workbenchListener = new IWorkbenchListener() {
+				@Override
+				public boolean preShutdown(IWorkbench workbench, boolean forced) {
+					workbenchShutdown = true;
+					return true;
+				}
+
+				@Override
+				public void postShutdown(IWorkbench workbench) {
+				}
+
+			};
+			PlatformUI.getWorkbench().addWorkbenchListener(workbenchListener);
+		}
+	}
+	
+    @Override
+    public void gotoMarker(IMarker marker) {
+        final EObject target = getTargetObject(marker);
+        if (target == null) {
+            return;
+        }
+        final PictogramElement pe = getDiagramTypeProvider().getFeatureProvider().getPictogramElementForBusinessObject(
+                target);
+        if (pe == null) {
+            return;
+        }
+        selectPictogramElements(new PictogramElement[] {pe });
+    }
+
+    private void loadMarkers() {
+    	if (getModelFile()!=null) {
+	        // read in the markers
+	        BPMN2ValidationStatusLoader vsl = new BPMN2ValidationStatusLoader(this);
+	
+	        try {
+	            vsl.load(Arrays.asList(getModelFile().findMarkers(
+	            		BPMN2ProjectValidator.BPMN2_MARKER_ID, true, IResource.DEPTH_ZERO)));
+	        } catch (CoreException e) {
+	            Activator.logStatus(e.getStatus());
+	        }
+    	}
+    }
+    
+    private EObject getTargetObject(IMarker marker) {
+        final String uriString = marker.getAttribute(EValidator.URI_ATTRIBUTE, null);
+        final URI uri = uriString == null ? null : URI.createURI(uriString);
+        if (uri == null) {
+            return null;
+        }
+        return getEditingDomain().getResourceSet().getEObject(uri, false);
+    }
+
+	private void removeWorkbenchListener()
+	{
+		if (workbenchListener!=null) {
+			PlatformUI.getWorkbench().removeWorkbenchListener(workbenchListener);
+			workbenchListener = null;
+		}
+	}
+	
+	private void addSelectionListener() {
+		if (selectionListener == null) {
+			IWorkbenchPage page = getSite().getPage();
+			selectionListener = new IPartListener2() {
+				public void partActivated(IWorkbenchPartReference partRef) {
+				}
+
+				@Override
+				public void partBroughtToTop(IWorkbenchPartReference partRef) {
+					IWorkbenchPart part = partRef.getPart(false);
+					if (part instanceof BPMN2MultiPageEditor) {
+						BPMN2MultiPageEditor mpe = (BPMN2MultiPageEditor)part;
+						setActiveEditor(mpe.getDesignEditor());
+					}
+				}
+
+				@Override
+				public void partClosed(IWorkbenchPartReference partRef) {
+				}
+
+				@Override
+				public void partDeactivated(IWorkbenchPartReference partRef) {
+				}
+
+				@Override
+				public void partOpened(IWorkbenchPartReference partRef) {
+				}
+
+				@Override
+				public void partHidden(IWorkbenchPartReference partRef) {
+				}
+
+				@Override
+				public void partVisible(IWorkbenchPartReference partRef) {
+				}
+
+				@Override
+				public void partInputChanged(IWorkbenchPartReference partRef) {
+				}
+			};
+			page.addPartListener(selectionListener);
+		}
+	}
+
+	private void removeSelectionListener()
+	{
+		if (selectionListener!=null) {
+			getSite().getPage().removePartListener(selectionListener);
+			selectionListener = null;
+		}
+	}
+
+	private void addMarkerChangeListener() {
+		if (getModelFile()!=null) {
+			if (markerChangeListener==null) {
+				markerChangeListener = new BPMN2MarkerChangeListener(this);
+		        getModelFile().getWorkspace().addResourceChangeListener(markerChangeListener, IResourceChangeEvent.POST_BUILD);
+			}
+		}
+	}
+	
+	private void removeMarkerChangeListener() {
+		if (markerChangeListener!=null) {
+			getModelFile().getWorkspace().removeResourceChangeListener(markerChangeListener);
+			markerChangeListener = null;
+		}
+	}
+	
+	public void refreshTitle() {
+		String name = getEditorInput().getName();
+		setPartName(URI.decode(name));
+	}
+	
+	private void addFileChangeListener() {
+		if (fileChangeListener==null) {
+			fileChangeListener = new IFileChangeListener() {
+				public void deleted(IPath filePath) {
+					// close the editor if either the dummy diagramfile (in the .bpmn2 folder)
+					// or the model file is deleted
+					if (filePath.equals(getModelPath())) {
+						// Close the editor.
+						closeEditor();
+					}
+				}
+				public void moved(IPath oldFilePath, IPath newFilePath) {
+					// handle file move/rename after the fact (i.e. newFile now exists, old file does not)
+					if (oldFilePath.equals(getModelPath())) {
+						reopenEditor(newFilePath);
+					}
+				}
+			};
+			Activator.getDefault().getResourceChangeListener().addListener(fileChangeListener);
+		}
+	}
+
+	private void removeFileChangeListener() {
+		if (fileChangeListener!=null) {
+			Activator.getDefault().getResourceChangeListener().removeListener(fileChangeListener);
+			fileChangeListener = null;
+		}
+	}
+	
+	public BPMN2EditingDomainListener getEditingDomainListener() {
+		if (editingDomainListener==null) {
+			TransactionalEditingDomainImpl editingDomain = (TransactionalEditingDomainImpl)getEditingDomain();
+			if (editingDomain==null) {
+				return null;
+			}
+			editingDomainListener = new BPMN2EditingDomainListener(this);
+
+			Lifecycle domainLifeCycle = (Lifecycle) editingDomain.getAdapter(Lifecycle.class);
+			domainLifeCycle.addTransactionalEditingDomainListener(editingDomainListener);
+		}
+		return editingDomainListener;
+	}
+	
+	public BasicDiagnostic getDiagnostics() {
+		return getEditingDomainListener().getDiagnostics();
+	}
+	
+	@Override
+	public Object getAdapter(Class required) {
+		if (required==ITabDescriptorProvider.class) {
+			if (tabDescriptorProvider==null) {
+				IWorkbenchPage page = getEditorSite().getPage();
+				String viewID = "org.eclipse.ui.views.PropertySheet";
+				try {
+					page.showView(viewID, null, IWorkbenchPage.VIEW_CREATE);
+					page.showView(viewID, null,  IWorkbenchPage.VIEW_ACTIVATE);
+				}
+				catch (Exception e) {}
+			}
+			return tabDescriptorProvider;
+		}
+		if (required==TargetRuntime.class)
+			return getTargetRuntime();
+		if (required==Bpmn2Preferences.class)
+			return getPreferences();
+		if (required == IPropertySheetPage.class) {
+			return new Bpmn2TabbedPropertySheetPage(this);
+		}
+		if (required == SelectionSynchronizer.class) {
+			return getSelectionSynchronizer();
+		}
+		if (required == IContentOutlinePage.class) {
+			if (getDiagramTypeProvider() != null) {
+				BPMN2EditorOutlinePage outlinePage = new BPMN2EditorOutlinePage(this);
+				return outlinePage;
+			}
+		}
+		
+		return super.getAdapter(required);
+	}
+
+	@Override
+	public void dispose() {
+		// clear ID mapping tables if no more instances of editor are active
+		int instances = 0;
+		IWorkbenchPage[] pages = getEditorSite().getWorkbenchWindow().getPages();
+		for (IWorkbenchPage p : pages) {
+			IEditorReference[] refs = p.getEditorReferences();
+			instances += refs.length;
+		}
+		File diagramFile = new File(diagramUri.toFileString());
+		if (diagramFile.exists()) {
+			try {
+				diagramFile.delete();
+			}
+			catch (Exception e) {
+			}
+		}
+		ModelUtil.clearIDs(modelHandler.getResource(), instances==0);
+		getPreferences().getGlobalPreferences().removePropertyChangeListener(this);
+		
+		getResourceSet().eAdapters().remove(getEditorAdapter());
+		removeSelectionListener();
+		removeFileChangeListener();
+		if (instances==0)
+			setActiveEditor(null);
+		
+		super.dispose();
+		ModelHandlerLocator.remove(modelUri);
+		// get rid of temp files and folders, but NOT if the workbench is being shut down.
+		// when the workbench is restarted, we need to have those temp files around!
+		if (!workbenchShutdown) {
+			if (FileService.isTempFile(modelUri)) {
+				FileService.deleteTempFile(modelUri);
+			}
+		}
+
+		removeWorkbenchListener();
+		removeMarkerChangeListener();
+		getPreferences().dispose();
+	}
+
+	public IPath getModelPath() {
+		if (getModelFile()!=null)
+			return getModelFile().getFullPath();
+		return null;
+	}
+	
+	public IProject getProject() {
+		if (getModelFile()!=null)
+			return getModelFile().getProject();
+		return null;
+	}
+	
+	public IFile getModelFile() {
+		if (modelUri!=null) {
+			String uriString = modelUri.trimFragment().toPlatformString(true);
+			if (uriString!=null) {
+				IPath fullPath = new Path(uriString);
+				return ResourcesPlugin.getWorkspace().getRoot().getFile(fullPath);
+			}
+		}
+		return null;
+	}
+	
+	public ModelHandler getModelHandler() {
+		return modelHandler;
+	}
+	
+	public void createPartControl(Composite parent) {
+		if (getGraphicalViewer()==null) {
+			super.createPartControl(parent);
+		}
+	}
+	
+	public BPMNDiagram getBpmnDiagram() {
+		if (bpmnDiagram==null)
+			bpmnDiagram = getModelHandler().getDefinitions().getDiagrams().get(0);
+
+//		if (bpmnDiagram!=null) {
+//			GraphicalViewer viewer = getGraphicalViewer();
+//			mapDiagramToViewer.put(bpmnDiagram, viewer);
+//		}
+		return bpmnDiagram;
+	}
+	
+	public void setBpmnDiagram(final BPMNDiagram bpmnDiagram) {
+		// create a new Graphiti Diagram if needed
+		Diagram diagram = DIUtils.getOrCreateDiagram(this, bpmnDiagram);
+		
+		// Tell the DTP about the new Diagram
+		getDiagramTypeProvider().resourceReloaded(diagram);
+//		getRefreshBehavior().initRefresh();
+		setPictogramElementsForSelection(null);
+		// set Diagram as contents for the graphical viewer and refresh
+		getGraphicalViewer().setContents(diagram);
+		
+		refreshContent();
+		
+		// remember this for later
+		this.bpmnDiagram = bpmnDiagram;
+	}
+
+	@Override
+	public void doSave(IProgressMonitor monitor) {
+		super.doSave(monitor);
+
+		Resource resource = getResourceSet().getResource(modelUri, false);
+		BPMN2ProjectValidator.validateOnSave(resource, monitor);
+	}
+
+	@Override
+	public boolean isSaveAsAllowed() {
+		return getModelFile()!=null;
+	}
+	
+	@Override
+	public void doSaveAs() {
+		IFile oldFile = getModelFile();
+		SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());
+		saveAsDialog.setOriginalFile(oldFile);
+		saveAsDialog.create();
+		if (saveAsDialog.open() == SaveAsDialog.CANCEL) {
+			return;
+		}
+		IPath newFilePath = saveAsDialog.getResult();
+		if (newFilePath == null){
+			return;
+		}
+		
+        IFile newFile = ResourcesPlugin.getWorkspace().getRoot().getFile(newFilePath);
+        IWorkbenchPage page = getSite().getPage();
+        
+        try {
+        	// Save the current(old) file
+        	doSave(null);
+        	// if new file exists, close its editor (if open) and delete the existing file
+            if (newFile.exists()) {
+    			IEditorPart editorPart = ResourceUtil.findEditor(page, newFile);
+    			if (editorPart!=null)
+	    			page.closeEditor(editorPart, false);
+        		newFile.delete(true, null);
+            }
+            // make a copy
+			oldFile.copy(newFilePath, true, null);
+		} catch (CoreException e) {
+			showErrorDialogWithLogging(e);
+			return;
+		}
+
+        // open new editor
+    	try {
+			page.openEditor(new FileEditorInput(newFile), BPMN2Editor.EDITOR_ID);
+		} catch (PartInitException e1) {
+			showErrorDialogWithLogging(e1);
+			return;
+		}
+    	
+    	// and close the old editor
+		IEditorPart editorPart = ResourceUtil.findEditor(page, oldFile);
+		if (editorPart!=null)
+			page.closeEditor(editorPart, false);
+		
+    	try {
+			newFile.refreshLocal(IResource.DEPTH_ZERO,null);
+		} catch (CoreException e) {
+			showErrorDialogWithLogging(e);
+			return;
+		}
+	}
+
+	public void closeEditor() {
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {
+				boolean closed = getSite().getPage().closeEditor(BPMN2Editor.this, false);
+				if (!closed){
+					// If close editor fails, try again with explicit editorpart 
+					// of the old file
+					IFile oldFile = ResourcesPlugin.getWorkspace().getRoot().getFile(getModelPath());
+					IEditorPart editorPart = ResourceUtil.findEditor(getSite().getPage(), oldFile);
+					closed = getSite().getPage().closeEditor(editorPart, false);
+				}
+			}
+		});
+	}
+	
+	protected void reopenEditor(final IPath newFilePath) {
+		Display display = getSite().getShell().getDisplay();
+		display.syncExec(new Runnable() {
+			public void run() {
+				boolean closed = getSite().getPage().closeEditor(BPMN2Editor.this, false);
+				if (!closed){
+					// If close editor fails, try again with explicit editorpart 
+					// of the old file
+					IFile oldFile = ResourcesPlugin.getWorkspace().getRoot().getFile(getModelPath());
+					IEditorPart editorPart = ResourceUtil.findEditor(getSite().getPage(), oldFile);
+					closed = getSite().getPage().closeEditor(editorPart, false);
+				}
+				if (closed) {
+					IFile renamedFile = ResourcesPlugin.getWorkspace().getRoot().getFile(newFilePath);
+					try {
+						getSite().getPage().openEditor(new FileEditorInput(renamedFile), EDITOR_ID);
+					} catch (PartInitException e) {
+						Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
+						ErrorUtils.showErrorWithLogging(status);
+					}
+				}
+			}
+		});
+	}
+
+	// Show error dialog and log the error
+	private void showErrorDialogWithLogging(Exception e) {
+		Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
+		ErrorUtils.showErrorWithLogging(status);
+	}
+
+	////////////////////////////////////////////////////////////////////////////////
+	// Other handlers
+	////////////////////////////////////////////////////////////////////////////////
+
+	@Override
+	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+		// Graphiti understands multipage editors
+		super.selectionChanged(part,selection); // Graphiti's DiagramEditorInternal
+		// but apparently GEF doesn't
+		updateActions(getSelectionActions()); // usually done in GEF's GraphicalEditor
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+	 */
+	@Override
+	public void propertyChange(PropertyChangeEvent event) {
+		if (event.getProperty().endsWith(Bpmn2Preferences.PREF_SHAPE_STYLE)) {
+			getEditingDomain().getCommandStack().execute(new RecordingCommand(getEditingDomain()) {
+				@Override
+				protected void doExecute() {
+					IPeService peService = Graphiti.getPeService();
+					TreeIterator<EObject> iter = getDiagramTypeProvider().getDiagram().eAllContents();
+					while (iter.hasNext()) {
+						EObject o = iter.next();
+						if (o instanceof PictogramElement) {
+							PictogramElement pe = (PictogramElement)o;
+							BaseElement be = BusinessObjectUtil.getFirstElementOfType(pe, BaseElement.class);
+							if (be!=null) {
+								TreeIterator<EObject> childIter = pe.eAllContents();
+								while (childIter.hasNext()) {
+									o = childIter.next();
+									if (o instanceof GraphicsAlgorithm) {
+										GraphicsAlgorithm ga = (GraphicsAlgorithm)o;
+										if (peService.getPropertyValue(ga, Bpmn2Preferences.PREF_SHAPE_STYLE)!=null) {
+											StyleUtil.applyStyle(ga, be);
+										}
+									}
+			
+								}
+							}
+						}
+					}
+				}
+			});
+		}
+	}
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorUpdateBehavior.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorUpdateBehavior.java
deleted file mode 100644
index fa0bb47..0000000
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorUpdateBehavior.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * 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.editor;
-
-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceSetImpl;
-import org.eclipse.bpmn2.modeler.core.validation.ValidationStatusAdapterFactory;
-import org.eclipse.core.commands.operations.DefaultOperationHistory;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
-import org.eclipse.emf.workspace.IWorkspaceCommandStack;
-import org.eclipse.emf.workspace.WorkspaceEditingDomainFactory;
-import org.eclipse.graphiti.ui.editor.DefaultUpdateBehavior;
-import org.eclipse.graphiti.ui.editor.DiagramEditor;
-import org.eclipse.graphiti.ui.editor.IDiagramEditorInput;
-import org.eclipse.graphiti.ui.internal.editor.GFWorkspaceCommandStackImpl;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-
-/**
- * This overrides the DefaultUpdateBehavior provider class from Graphiti. This
- * is necessary because we want to provide our own ResourceSet implementation
- * instead of being forced to deal with the default ResourceSetImpl. See
- * createResourceSetAndEditingDomain() for details.
- * 
- * @author Bob Brodt
- * 
- */
-public class BPMN2EditorUpdateBehavior extends DefaultUpdateBehavior {
-
-	private TransactionalEditingDomain editingDomain;
-	private WorkspaceSynchronizer workspaceSynchronizer;
-
-	/**
-	 * @param diagramEditor
-	 */
-	public BPMN2EditorUpdateBehavior(DiagramEditor diagramEditor) {
-		super(diagramEditor);
-	}
-
-	public TransactionalEditingDomain getEditingDomain() {
-		if (editingDomain == null)
-			createEditingDomain();
-		return editingDomain;
-	}
-
-	@Override
-	public void createEditingDomain() {
-		if (editingDomain == null) {
-			editingDomain = createResourceSetAndEditingDomain();
-			initializeEditingDomain(editingDomain);
-		}
-	}
-
-	public TransactionalEditingDomain createResourceSetAndEditingDomain() {
-		// Argh!! This is the ONLY line of code that actually differs
-		// (significantly) from
-		// the Graphiti EMF Service. Here we want to substitute our own
-		// Bpmn2ModelerResourceSetImpl instead of using a ResourceSetImpl.
-		final ResourceSet resourceSet = new Bpmn2ModelerResourceSetImpl();
-		final IWorkspaceCommandStack workspaceCommandStack = new GFWorkspaceCommandStackImpl(
-				new DefaultOperationHistory());
-
-		final TransactionalEditingDomainImpl editingDomain = new TransactionalEditingDomainImpl(
-				new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE),
-				workspaceCommandStack, resourceSet);
-		WorkspaceEditingDomainFactory.INSTANCE.mapResourceSet(editingDomain);
-		return editingDomain;
-	}
-	
-	protected void initializeEditingDomain(TransactionalEditingDomain domain) {
-		// we want first crack at these notifications!
-		workspaceSynchronizer = new WorkspaceSynchronizer(getEditingDomain(),
-				new BPMN2EditorWorkspaceSynchronizerDelegate(diagramEditor));
-		super.initializeEditingDomain(domain);
-	}
-	
-	public void dispose() {
-		super.dispose();
-		workspaceSynchronizer.dispose();
-	}
-	
-	public class BPMN2EditorWorkspaceSynchronizerDelegate implements WorkspaceSynchronizer.Delegate {
-
-		private BPMN2Editor bpmnEditor;
-
-		/**
-		 * The DiagramEditorBehavior reacts on a setResourceChanged(true) if he gets
-		 * activated.
-		 */
-		public BPMN2EditorWorkspaceSynchronizerDelegate(DiagramEditor diagramEditor) {
-			this.bpmnEditor = (BPMN2Editor)diagramEditor;
-		}
-
-		public void dispose() { 
-			bpmnEditor = null;
-		}
-
-		public boolean handleResourceChanged(Resource resource) {
-			return bpmnEditor.handleResourceChanged(resource);
-		}
-
-		public boolean handleResourceDeleted(Resource resource) {
-			return bpmnEditor.handleResourceDeleted(resource);
-		}
-
-		public boolean handleResourceMoved(Resource resource, URI newURI) {
-			return bpmnEditor.handleResourceMoved(resource, newURI);
-		}
-
-	}}
\ No newline at end of file
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 205970d..28159ea 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
@@ -1,409 +1,409 @@
-/*******************************************************************************
- * 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.editor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.bpmn2.di.BPMNDiagram;
-import org.eclipse.bpmn2.modeler.core.di.DIUtils;
-import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
-import org.eclipse.bpmn2.modeler.ui.wizards.Bpmn2DiagramEditorInput;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.graphiti.mm.pictograms.Diagram;
-import org.eclipse.graphiti.mm.pictograms.PictogramElement;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabFolder2Listener;
-import org.eclipse.swt.custom.CTabFolderEvent;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-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.PartInitException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.MultiPageEditorSite;
-import org.eclipse.ui.part.MultiPageSelectionProvider;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * This class implements a multi-page version of the BPMN2 Modeler (BPMN2Editor class).
- * To revert back to the original, single-page version simply change the editor extension
- * point in plugin.xml (see comments there).
- * 
- * This is still in the experimental phase and currently only supports a single diagram
- * per .bpmn file. An optional second page, which displays the XML source, can be created
- * from the context menu. The source view is not yet synchronized to the design view and
- * can only show the XML as of the last "Save" i.e. the current state of the file on disk,
- * not the in-memory model. Design/Source view synchronization will be implemented in a
- * future version, but direct editing of the XML will not be supported - it will remain
- * "view only".
- * 
- * Future versions will support multiple diagrams per .bpmn file with the ability to add
- * and remove pages containing different diagram types. It should be possible for the user
- * to create a single file that contains a mix of Process, Collaboration and Choreography
- * diagrams. Whether or not these types of files are actually deployable and/or executable
- * is another story ;)
- */
-public class BPMN2MultiPageEditor extends MultiPageEditorPart implements IGotoMarker {
-
-	DesignEditor designEditor;
-	SourceViewer sourceViewer;
-	private CTabFolder tabFolder;
-	private int defaultTabHeight;
-	private List<BPMNDiagram> bpmnDiagrams = new ArrayList<BPMNDiagram>();
-	
-	public BPMN2MultiPageEditor() {
-		super();
-	}
-
-	@Override
-	protected IEditorSite createSite(IEditorPart editor) {
-		if (editor instanceof DesignEditor)
-			return new DesignEditorSite(this, editor);
-		return new MultiPageEditorSite(this, editor);
-	}
-
-	@Override
-	public String getTitle() {
-		if (designEditor!=null)
-			return designEditor.getTitle();
-		return super.getTitle();
-	}
-
-	@Override
-	public String getPartName() {
-		if (designEditor!=null)
-			return designEditor.getPartName();
-		return super.getPartName();
-	}
-
-    /**
-     * Method declared on IEditorPart.
-     * 
-     * @param marker Marker to look for
-     */
-    @Override
-    public void gotoMarker(IMarker marker) {
-        if (getActivePage() < 0) {
-            setActivePage(0);
-        }
-        IDE.gotoMarker(getEditor(getActivePage()), marker);
-    }
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#createPages()
-	 */
-	@Override
-	protected void createPages() {
-		tabFolder = (CTabFolder)getContainer();
-		tabFolder.addCTabFolder2Listener( new CTabFolder2Listener() {
-
-			@Override
-			public void close(CTabFolderEvent event) {
-				if (event.item.getData() == sourceViewer)
-					removeSourceViewer();
-			}
-
-			@Override
-			public void minimize(CTabFolderEvent event) {
-			}
-
-			@Override
-			public void maximize(CTabFolderEvent event) {
-			}
-
-			@Override
-			public void restore(CTabFolderEvent event) {
-			}
-
-			@Override
-			public void showList(CTabFolderEvent event) {
-			}
-			
-		});
-		tabFolder.addSelectionListener( new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				int pageIndex = tabFolder.getSelectionIndex();
-				if (pageIndex>=0 && pageIndex<bpmnDiagrams.size() && designEditor!=null) {
-					BPMNDiagram bpmnDiagram = bpmnDiagrams.get(pageIndex);
-					designEditor.selectBpmnDiagram(bpmnDiagram);
-				}
-			}
-		});
-		
-		// defer editor layout until all pages have been created
-		tabFolder.setLayoutDeferred(true);
-		
-		createDesignEditor();
-		
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				setActivePage(0);
-				designEditor.selectBpmnDiagram(bpmnDiagrams.get(0));
-				tabFolder.setLayoutDeferred(false);
-				tabFolder.setTabPosition(SWT.TOP);
-				updateTabs();
-			}
-		});
-	}
-
-	protected void createDesignEditor() {
-		if (designEditor==null) {
-			designEditor = new DesignEditor(this, this);
-			
-			try {
-				int pageIndex = tabFolder.getItemCount();
-				if (sourceViewer!=null)
-					--pageIndex;
-				addPage(pageIndex, designEditor, BPMN2MultiPageEditor.this.getEditorInput());
-				defaultTabHeight = tabFolder.getTabHeight();
-				setPageText(pageIndex,ModelUtil.getDiagramTypeName( designEditor.getBpmnDiagram() ));
-
-				defaultTabHeight = tabFolder.getTabHeight();
-
-				updateTabs();
-			}
-			catch (Exception e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-	public DesignEditor getDesignEditor() {
-		return designEditor;
-	}
-	
-	protected void addDesignPage(final BPMNDiagram bpmnDiagram) {
-		createDesignEditor();
-			Display.getDefault().asyncExec(new Runnable() {
-				public void run() {
-					try {
-			
-						int pageIndex = tabFolder.getItemCount();
-						if (sourceViewer!=null)
-							--pageIndex;
-						Bpmn2DiagramEditorInput input = (Bpmn2DiagramEditorInput)designEditor.getEditorInput();
-						input.setBpmnDiagram(bpmnDiagram);
-						addPage(pageIndex, designEditor, input);
-						CTabItem oldItem = tabFolder.getItem(pageIndex-1);
-						CTabItem newItem = tabFolder.getItem(pageIndex);
-						newItem.setControl( oldItem.getControl() );
-						setPageText(pageIndex,bpmnDiagram.getName());
-			
-						setActivePage(pageIndex);
-						updateTabs();
-					}
-					catch (Exception e) {
-						e.printStackTrace();
-					}
-				}
-			});
-	}
-	
-	public void showDesignPage(final BPMNDiagram bpmnDiagram) {
-		final int pageIndex = bpmnDiagrams.indexOf(bpmnDiagram);
-		if (pageIndex>=0) {
-			if (getDesignEditor().getBpmnDiagram()!=bpmnDiagram) {
-				setActivePage(pageIndex);
-			}
-		}
-		else {
-			designEditor.showDesignPage(bpmnDiagram);
-		}
-	}
-	
-	protected void removeDesignPage(final BPMNDiagram bpmnDiagram) {
-		final int pageIndex = bpmnDiagrams.indexOf(bpmnDiagram);
-		if (pageIndex>0) {
-			// go back to "Design" page - the only page that can't be removed
-			Display.getCurrent().asyncExec( new Runnable() {
-				@Override
-				public void run() {
-					setActivePage(0);
-					
-					IEditorPart editor = getEditor(pageIndex);
-					if (editor instanceof DesignEditor) {
-						((DesignEditor)editor).deleteBpmnDiagram(bpmnDiagram);
-					}
-					
-					// 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);
-				}
-			});
-		}
-	}
-
-	public int getDesignPageCount() {
-		int count = getPageCount();
-		if (sourceViewer!=null)
-			--count;
-		return count;
-	}
-
-	protected void createSourceViewer() {
-		if (sourceViewer==null) {
-			sourceViewer = new SourceViewer(this);
-
-			try {
-				int pageIndex = tabFolder.getItemCount();
-				FileEditorInput input = new FileEditorInput(designEditor.getModelFile());
-				addPage(pageIndex, sourceViewer, input);
-				tabFolder.getItem(pageIndex).setShowClose(true);
-				
-				setPageText(pageIndex,"Source");
-				setActivePage(pageIndex);
-
-				updateTabs();
-			}
-			catch (Exception e) {
-				e.printStackTrace();
-				if (sourceViewer!=null)
-					sourceViewer.dispose();
-			}
-		}
-	}
-	
-	public SourceViewer getSourceViewer() {
-		return sourceViewer;
-	}
-
-	public void removeSourceViewer() {
-		// there will only be one source page and it will always be the last page in the tab folder
-		if (sourceViewer!=null) {
-			int pageIndex = tabFolder.getItemCount() - 1;
-			if (pageIndex>0) {
-				removePage(pageIndex);
-				sourceViewer = null;
-			}
-		}
-	}
-
-	public void addPage(int pageIndex, IEditorPart editor, IEditorInput input)
-			throws PartInitException {
-		super.addPage(pageIndex,editor,input);
-		if (editor instanceof DesignEditor) {
-			bpmnDiagrams.add(pageIndex,((DesignEditor)editor).getBpmnDiagram());
-		}
-	}
-	
-	@Override
-	public void removePage(int pageIndex) {
-		Object page = tabFolder.getItem(pageIndex).getData();
-		super.removePage(pageIndex);
-		updateTabs();
-		if (page instanceof DesignEditor) {
-			bpmnDiagrams.remove(pageIndex);
-		}
-	}
-
-	@Override
-	protected void pageChange(int newPageIndex) {
-		super.pageChange(newPageIndex);
-
-		IEditorPart editor = getEditor(newPageIndex);
-		if (editor instanceof DesignEditor) {
-			BPMNDiagram bpmnDiagram = bpmnDiagrams.get(newPageIndex);
-			((DesignEditor)editor).pageChange(bpmnDiagram);
-//			Diagram diagram = DIUtils.findDiagram(designEditor, bpmnDiagram);
-//			if (diagram != null)
-//				designEditor.selectPictogramElements(new PictogramElement[] {(PictogramElement)diagram});
-		}
-	}
-
-	public int getPageCount() {
-		return tabFolder.getItemCount();
-	}
-	
-	public CTabItem getTabItem(int pageIndex) {
-		return tabFolder.getItem(pageIndex);
-	}
-	
-	public BPMNDiagram getBpmnDiagram(int i) {
-		if (i>=0 && i<bpmnDiagrams.size()) {
-			return bpmnDiagrams.get(i);
-		}
-		return null;
-	}
-	
-	private void updateTabs() {
-		if (!tabFolder.getLayoutDeferred()) {
-			if (tabFolder.getItemCount()==1) {
-				tabFolder.setTabHeight(0);
-			}
-			else
-				tabFolder.setTabHeight(defaultTabHeight);
-		}
-		tabFolder.layout();
-	}
-	
-	public CTabFolder getTabFolder() {
-		return tabFolder;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	@Override
-	public void doSave(IProgressMonitor monitor) {
-		designEditor.doSave(monitor);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
-	 */
-	@Override
-	public void doSaveAs() {
-		IEditorPart activeEditor = getActiveEditor();
-		activeEditor.doSaveAs();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
-	 */
-	@Override
-	public boolean isSaveAsAllowed() {
-		
-		/* 
-		 * Depending upon the active page in multipage editor, call the saveAsAllowed. 
-		 * It helps to see whether a particular editor allows 'save as' feature 
-		 */
-		IEditorPart activeEditor = getActiveEditor();
-		return activeEditor.isSaveAsAllowed();
-	}
-
-	@Override
-	public void dispose() {
-		designEditor.dispose();
-		if (sourceViewer!=null)
-			sourceViewer.dispose();
-	}
-}
+/*******************************************************************************
+ * 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.editor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.bpmn2.di.BPMNDiagram;
+import org.eclipse.bpmn2.modeler.core.di.DIUtils;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
+import org.eclipse.bpmn2.modeler.ui.wizards.Bpmn2DiagramEditorInput;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabFolder2Listener;
+import org.eclipse.swt.custom.CTabFolderEvent;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.PartInitException;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.ide.IGotoMarker;
+import org.eclipse.ui.part.EditorPart;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.MultiPageEditorPart;
+import org.eclipse.ui.part.MultiPageEditorSite;
+import org.eclipse.ui.part.MultiPageSelectionProvider;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * This class implements a multi-page version of the BPMN2 Modeler (BPMN2Editor class).
+ * To revert back to the original, single-page version simply change the editor extension
+ * point in plugin.xml (see comments there).
+ * 
+ * This is still in the experimental phase and currently only supports a single diagram
+ * per .bpmn file. An optional second page, which displays the XML source, can be created
+ * from the context menu. The source view is not yet synchronized to the design view and
+ * can only show the XML as of the last "Save" i.e. the current state of the file on disk,
+ * not the in-memory model. Design/Source view synchronization will be implemented in a
+ * future version, but direct editing of the XML will not be supported - it will remain
+ * "view only".
+ * 
+ * Future versions will support multiple diagrams per .bpmn file with the ability to add
+ * and remove pages containing different diagram types. It should be possible for the user
+ * to create a single file that contains a mix of Process, Collaboration and Choreography
+ * diagrams. Whether or not these types of files are actually deployable and/or executable
+ * is another story ;)
+ */
+public class BPMN2MultiPageEditor extends MultiPageEditorPart implements IGotoMarker {
+
+	DesignEditor designEditor;
+	SourceViewer sourceViewer;
+	private CTabFolder tabFolder;
+	private int defaultTabHeight;
+	private List<BPMNDiagram> bpmnDiagrams = new ArrayList<BPMNDiagram>();
+	
+	public BPMN2MultiPageEditor() {
+		super();
+	}
+
+	@Override
+	protected IEditorSite createSite(IEditorPart editor) {
+		if (editor instanceof DesignEditor)
+			return new DesignEditorSite(this, editor);
+		return new MultiPageEditorSite(this, editor);
+	}
+
+	@Override
+	public String getTitle() {
+		if (designEditor!=null)
+			return designEditor.getTitle();
+		return super.getTitle();
+	}
+
+	@Override
+	public String getPartName() {
+		if (designEditor!=null)
+			return designEditor.getPartName();
+		return super.getPartName();
+	}
+
+    /**
+     * Method declared on IEditorPart.
+     * 
+     * @param marker Marker to look for
+     */
+    @Override
+    public void gotoMarker(IMarker marker) {
+        if (getActivePage() < 0) {
+            setActivePage(0);
+        }
+        IDE.gotoMarker(getEditor(getActivePage()), marker);
+    }
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.MultiPageEditorPart#createPages()
+	 */
+	@Override
+	protected void createPages() {
+		tabFolder = (CTabFolder)getContainer();
+		tabFolder.addCTabFolder2Listener( new CTabFolder2Listener() {
+
+			@Override
+			public void close(CTabFolderEvent event) {
+				if (event.item.getData() == sourceViewer)
+					removeSourceViewer();
+			}
+
+			@Override
+			public void minimize(CTabFolderEvent event) {
+			}
+
+			@Override
+			public void maximize(CTabFolderEvent event) {
+			}
+
+			@Override
+			public void restore(CTabFolderEvent event) {
+			}
+
+			@Override
+			public void showList(CTabFolderEvent event) {
+			}
+			
+		});
+		tabFolder.addSelectionListener( new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				int pageIndex = tabFolder.getSelectionIndex();
+				if (pageIndex>=0 && pageIndex<bpmnDiagrams.size() && designEditor!=null) {
+					BPMNDiagram bpmnDiagram = bpmnDiagrams.get(pageIndex);
+					designEditor.selectBpmnDiagram(bpmnDiagram);
+				}
+			}
+		});
+		
+		// defer editor layout until all pages have been created
+		tabFolder.setLayoutDeferred(true);
+		
+		createDesignEditor();
+		
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {
+				setActivePage(0);
+				designEditor.selectBpmnDiagram(bpmnDiagrams.get(0));
+				tabFolder.setLayoutDeferred(false);
+				tabFolder.setTabPosition(SWT.TOP);
+				updateTabs();
+			}
+		});
+	}
+
+	protected void createDesignEditor() {
+		if (designEditor==null) {
+			designEditor = new DesignEditor(this, this);
+			
+			try {
+				int pageIndex = tabFolder.getItemCount();
+				if (sourceViewer!=null)
+					--pageIndex;
+				addPage(pageIndex, designEditor, BPMN2MultiPageEditor.this.getEditorInput());
+				defaultTabHeight = tabFolder.getTabHeight();
+				setPageText(pageIndex,ModelUtil.getDiagramTypeName( designEditor.getBpmnDiagram() ));
+
+				defaultTabHeight = tabFolder.getTabHeight();
+
+				updateTabs();
+			}
+			catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	public DesignEditor getDesignEditor() {
+		return designEditor;
+	}
+	
+	protected void addDesignPage(final BPMNDiagram bpmnDiagram) {
+		createDesignEditor();
+			Display.getDefault().asyncExec(new Runnable() {
+				public void run() {
+					try {
+			
+						int pageIndex = tabFolder.getItemCount();
+						if (sourceViewer!=null)
+							--pageIndex;
+						Bpmn2DiagramEditorInput input = (Bpmn2DiagramEditorInput)designEditor.getEditorInput();
+						input.setBpmnDiagram(bpmnDiagram);
+						addPage(pageIndex, designEditor, input);
+						CTabItem oldItem = tabFolder.getItem(pageIndex-1);
+						CTabItem newItem = tabFolder.getItem(pageIndex);
+						newItem.setControl( oldItem.getControl() );
+						setPageText(pageIndex,bpmnDiagram.getName());
+			
+						setActivePage(pageIndex);
+						updateTabs();
+					}
+					catch (Exception e) {
+						e.printStackTrace();
+					}
+				}
+			});
+	}
+	
+	public void showDesignPage(final BPMNDiagram bpmnDiagram) {
+		final int pageIndex = bpmnDiagrams.indexOf(bpmnDiagram);
+		if (pageIndex>=0) {
+			if (getDesignEditor().getBpmnDiagram()!=bpmnDiagram) {
+				setActivePage(pageIndex);
+			}
+		}
+		else {
+			designEditor.showDesignPage(bpmnDiagram);
+		}
+	}
+	
+	protected void removeDesignPage(final BPMNDiagram bpmnDiagram) {
+		final int pageIndex = bpmnDiagrams.indexOf(bpmnDiagram);
+		if (pageIndex>0) {
+			// go back to "Design" page - the only page that can't be removed
+			Display.getCurrent().asyncExec( new Runnable() {
+				@Override
+				public void run() {
+					setActivePage(0);
+					
+					IEditorPart editor = getEditor(pageIndex);
+					if (editor instanceof DesignEditor) {
+						((DesignEditor)editor).deleteBpmnDiagram(bpmnDiagram);
+					}
+					
+					// 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);
+				}
+			});
+		}
+	}
+
+	public int getDesignPageCount() {
+		int count = getPageCount();
+		if (sourceViewer!=null)
+			--count;
+		return count;
+	}
+
+	protected void createSourceViewer() {
+		if (sourceViewer==null) {
+			sourceViewer = new SourceViewer(this);
+
+			try {
+				int pageIndex = tabFolder.getItemCount();
+				FileEditorInput input = new FileEditorInput(designEditor.getModelFile());
+				addPage(pageIndex, sourceViewer, input);
+				tabFolder.getItem(pageIndex).setShowClose(true);
+				
+				setPageText(pageIndex,"Source");
+				setActivePage(pageIndex);
+
+				updateTabs();
+			}
+			catch (Exception e) {
+				e.printStackTrace();
+				if (sourceViewer!=null)
+					sourceViewer.dispose();
+			}
+		}
+	}
+	
+	public SourceViewer getSourceViewer() {
+		return sourceViewer;
+	}
+
+	public void removeSourceViewer() {
+		// there will only be one source page and it will always be the last page in the tab folder
+		if (sourceViewer!=null) {
+			int pageIndex = tabFolder.getItemCount() - 1;
+			if (pageIndex>0) {
+				removePage(pageIndex);
+				sourceViewer = null;
+			}
+		}
+	}
+
+	public void addPage(int pageIndex, IEditorPart editor, IEditorInput input)
+			throws PartInitException {
+		super.addPage(pageIndex,editor,input);
+		if (editor instanceof DesignEditor) {
+			bpmnDiagrams.add(pageIndex,((DesignEditor)editor).getBpmnDiagram());
+		}
+	}
+	
+	@Override
+	public void removePage(int pageIndex) {
+		Object page = tabFolder.getItem(pageIndex).getData();
+		super.removePage(pageIndex);
+		updateTabs();
+		if (page instanceof DesignEditor) {
+			bpmnDiagrams.remove(pageIndex);
+		}
+	}
+
+	@Override
+	protected void pageChange(int newPageIndex) {
+		super.pageChange(newPageIndex);
+
+		IEditorPart editor = getEditor(newPageIndex);
+		if (editor instanceof DesignEditor) {
+			BPMNDiagram bpmnDiagram = bpmnDiagrams.get(newPageIndex);
+			((DesignEditor)editor).pageChange(bpmnDiagram);
+//			Diagram diagram = DIUtils.findDiagram(designEditor, bpmnDiagram);
+//			if (diagram != null)
+//				designEditor.selectPictogramElements(new PictogramElement[] {(PictogramElement)diagram});
+		}
+	}
+
+	public int getPageCount() {
+		return tabFolder.getItemCount();
+	}
+	
+	public CTabItem getTabItem(int pageIndex) {
+		return tabFolder.getItem(pageIndex);
+	}
+	
+	public BPMNDiagram getBpmnDiagram(int i) {
+		if (i>=0 && i<bpmnDiagrams.size()) {
+			return bpmnDiagrams.get(i);
+		}
+		return null;
+	}
+	
+	private void updateTabs() {
+		if (!tabFolder.getLayoutDeferred()) {
+			if (tabFolder.getItemCount()==1) {
+				tabFolder.setTabHeight(0);
+			}
+			else
+				tabFolder.setTabHeight(defaultTabHeight);
+		}
+		tabFolder.layout();
+	}
+	
+	public CTabFolder getTabFolder() {
+		return tabFolder;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	@Override
+	public void doSave(IProgressMonitor monitor) {
+		designEditor.doSave(monitor);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
+	 */
+	@Override
+	public void doSaveAs() {
+		IEditorPart activeEditor = getActiveEditor();
+		activeEditor.doSaveAs();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
+	 */
+	@Override
+	public boolean isSaveAsAllowed() {
+		
+		/* 
+		 * Depending upon the active page in multipage editor, call the saveAsAllowed. 
+		 * It helps to see whether a particular editor allows 'save as' feature 
+		 */
+		IEditorPart activeEditor = getActiveEditor();
+		return activeEditor.isSaveAsAllowed();
+	}
+
+	@Override
+	public void dispose() {
+		designEditor.dispose();
+		if (sourceViewer!=null)
+			sourceViewer.dispose();
+	}
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2PersistencyBehavior.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2PersistencyBehavior.java
deleted file mode 100644
index 5aa95e9..0000000
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2PersistencyBehavior.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.eclipse.bpmn2.modeler.ui.editor;
-
-import java.util.Arrays;
-
-import org.eclipse.bpmn2.modeler.core.validation.BPMN2ProjectValidator;
-import org.eclipse.bpmn2.modeler.core.validation.BPMN2ValidationStatusLoader;
-import org.eclipse.bpmn2.modeler.ui.Activator;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.graphiti.mm.pictograms.Diagram;
-import org.eclipse.graphiti.ui.editor.DefaultPersistencyBehavior;
-import org.eclipse.graphiti.ui.editor.DiagramEditor;
-
-public class BPMN2PersistencyBehavior extends DefaultPersistencyBehavior {
-
-	BPMN2Editor editor;
-	
-	public BPMN2PersistencyBehavior(DiagramEditor diagramEditor) {
-		super(diagramEditor);
-		editor = (BPMN2Editor)diagramEditor;
-	}
-    @Override
-    public Diagram loadDiagram(URI modelUri) {
-    	Diagram diagram = super.loadDiagram(modelUri);
-
-    	return diagram;
-    }
-
-}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
index c4df3e5..fde041b 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
@@ -420,7 +420,7 @@
 
 	@Override
 	protected ContextMenuProvider createContextMenuProvider() {
-		return new DiagramEditorContextMenuProvider(getGraphicalViewer(), getActionRegistry(), getDiagramTypeProvider()) {
+		return new DiagramEditorContextMenuProvider(getGraphicalViewer(), getActionRegistry(), getConfigurationProvider()) {
 			@Override
 			public void buildContextMenu(IMenuManager manager) {
 				super.buildContextMenu(manager);
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/Bpmn2DiagramEditorInput.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/Bpmn2DiagramEditorInput.java
index d47155b..229630b 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/Bpmn2DiagramEditorInput.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/Bpmn2DiagramEditorInput.java
@@ -1,104 +1,110 @@
-/******************************************************************************* 
- * 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.wizards;
-
-import org.eclipse.bpmn2.di.BPMNDiagram;
-import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
-import org.eclipse.ui.part.FileEditorInput;
-
-public final class Bpmn2DiagramEditorInput extends DiagramEditorInput {
-
-	private final TransactionalEditingDomain domain;
-	private Bpmn2DiagramType initialDiagramType = Bpmn2DiagramType.NONE;
-	private String targetNamespace;
-	private BPMNDiagram bpmnDiagram;
-	private URI modelUri;
-	
-	Bpmn2DiagramEditorInput(URI modelUri, URI diagramUri, TransactionalEditingDomain domain, String providerId) {
-		super(diagramUri, providerId);
-		this.domain = domain;
-		this.modelUri = modelUri;
-	}
-	
-	public Bpmn2DiagramType getInitialDiagramType() {
-		return initialDiagramType;
-	}
-
-	public void setInitialDiagramType(Bpmn2DiagramType initialDiagramType) {
-		this.initialDiagramType = initialDiagramType;
-	}
-
-	public String getTargetNamespace() {
-		return targetNamespace;
-	}
-
-	public void setTargetNamespace(String targetNamespace) {
-		this.targetNamespace = targetNamespace;
-	}
-
-	public URI  getModelUri() {
-		return modelUri;
-	}
-	
-	public String getToolTipText() {
-		return modelUri.toPlatformString(true);
-	}
-	
-	public String getName() {
-		return URI.decode(modelUri.trimFileExtension().lastSegment());
-	}
-	
-	public void updateUri(URI diagramFileUri) {
-		if (diagramFileUri.isPlatformResource()) {
-			modelUri = diagramFileUri;
-		}
-		else
-			super.updateUri(diagramFileUri);
-	}
-	
-	@Override
-	public boolean equals(Object obj) {
-		boolean superEquals = super.equals(obj);
-		if (superEquals) {
-			return true;
-		}
-
-		// Eclipse makes FileEditorInputs for files to be opened. Here we check if the file is actually the same
-		// as the DiagramEditorInput uses. This is for preventing opening new editors for the same file.
-		if (obj instanceof FileEditorInput) {
-
-			String path = ((FileEditorInput) obj).getFile().getFullPath().toString();
-			URI platformUri = URI.createPlatformResourceURI(path, true);
-
-			for (Resource resource : domain.getResourceSet().getResources()) {
-				if (resource.getURI().equals(platformUri)) {
-					return true;
-				}
-			}
-
-		}
-		return false;
-	}
-
-	public BPMNDiagram getBpmnDiagram() {
-		return bpmnDiagram;
-	}
-
-	public void setBpmnDiagram(BPMNDiagram bpmnDiagram) {
-		this.bpmnDiagram = bpmnDiagram;
-	}
+/******************************************************************************* 
+ * 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.wizards;
+
+import org.eclipse.bpmn2.di.BPMNDiagram;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
+import org.eclipse.ui.part.FileEditorInput;
+
+public final class Bpmn2DiagramEditorInput extends DiagramEditorInput {
+
+	private final TransactionalEditingDomain domain;
+	private Bpmn2DiagramType initialDiagramType = Bpmn2DiagramType.NONE;
+	private String targetNamespace;
+	private BPMNDiagram bpmnDiagram;
+	private URI modelUri;
+	private URI diagramUri;
+	
+	Bpmn2DiagramEditorInput(URI modelUri, URI diagramUri, TransactionalEditingDomain domain, String providerId) {
+		super(diagramUri.appendFragment("/0"), domain, providerId);
+		this.domain = domain;
+		this.modelUri = modelUri;
+		this.diagramUri = diagramUri;
+	}
+	
+	public Bpmn2DiagramType getInitialDiagramType() {
+		return initialDiagramType;
+	}
+
+	public void setInitialDiagramType(Bpmn2DiagramType initialDiagramType) {
+		this.initialDiagramType = initialDiagramType;
+	}
+
+	public String getTargetNamespace() {
+		return targetNamespace;
+	}
+
+	public void setTargetNamespace(String targetNamespace) {
+		this.targetNamespace = targetNamespace;
+	}
+
+	public URI  getModelUri() {
+		return modelUri;
+	}
+	
+	public URI getUri() {
+		return diagramUri;
+	}
+	
+	public String getToolTipText() {
+		return modelUri.toPlatformString(true);
+	}
+	
+	public String getName() {
+		return URI.decode(modelUri.trimFileExtension().lastSegment());
+	}
+	
+	public void updateUri(URI diagramFileUri) {
+		if (diagramFileUri.isPlatformResource()) {
+			modelUri = diagramFileUri;
+		}
+//		else
+//			super.updateUri(diagramFileUri);
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+		boolean superEquals = super.equals(obj);
+		if (superEquals) {
+			return true;
+		}
+
+		// Eclipse makes FileEditorInputs for files to be opened. Here we check if the file is actually the same
+		// as the DiagramEditorInput uses. This is for preventing opening new editors for the same file.
+		if (obj instanceof FileEditorInput) {
+
+			String path = ((FileEditorInput) obj).getFile().getFullPath().toString();
+			URI platformUri = URI.createPlatformResourceURI(path, true);
+
+			for (Resource resource : domain.getResourceSet().getResources()) {
+				if (resource.getURI().equals(platformUri)) {
+					return true;
+				}
+			}
+
+		}
+		return false;
+	}
+
+	public BPMNDiagram getBpmnDiagram() {
+		return bpmnDiagram;
+	}
+
+	public void setBpmnDiagram(BPMNDiagram bpmnDiagram) {
+		this.bpmnDiagram = bpmnDiagram;
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/FileService.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/FileService.java
index 1fb2a39..7596213 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/FileService.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/FileService.java
@@ -1,374 +1,378 @@
-/******************************************************************************* 
- * 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.wizards;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceSetImpl;
-import org.eclipse.bpmn2.modeler.ui.Activator;
-import org.eclipse.bpmn2.modeler.ui.editor.BPMN2Editor;
-import org.eclipse.core.commands.operations.DefaultOperationHistory;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.transaction.RecordingCommand;
-import org.eclipse.emf.transaction.Transaction;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
-import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.workspace.WorkspaceEditingDomainFactory;
-import org.eclipse.graphiti.mm.pictograms.Diagram;
-import org.eclipse.emf.workspace.IWorkspaceCommandStack;
-import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
-import org.eclipse.graphiti.ui.internal.editor.GFWorkspaceCommandStackImpl;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IStorageEditorInput;
-import org.eclipse.ui.part.FileEditorInput;
-
-public class FileService {
-
-	public static TransactionalEditingDomain createEmfFileForDiagram(URI diagramResourceUri, final Diagram diagram, BPMN2Editor diagramEditor) {
-
-		ResourceSet resourceSet = null;
-		TransactionalEditingDomain editingDomain = null;
-		if (diagramEditor==null) {
-			// Create a resource set and EditingDomain
-			resourceSet = new Bpmn2ModelerResourceSetImpl();
-			editingDomain = TransactionUtil.getEditingDomain(resourceSet);
-			if (editingDomain == null) {
-				// Not yet existing, create one
-				editingDomain = TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(resourceSet);
-			}
-		}
-		else {
-			editingDomain = diagramEditor.getEditingDomain();
-			resourceSet = diagramEditor.getResourceSet();
-		}
-		
-		// Create a resource for this file.
-		final Resource resource = resourceSet.createResource(diagramResourceUri);
-		CommandStack commandStack = editingDomain.getCommandStack();
-		commandStack.execute(new RecordingCommand(editingDomain) {
-
-			@Override
-			protected void doExecute() {
-				resource.setTrackingModification(true);
-				resource.getContents().add(diagram);
-
-			}
-		});
-
-		save(editingDomain, Collections.<Resource, Map<?, ?>> emptyMap());
-		return editingDomain;
-	}
-
-	private static void save(TransactionalEditingDomain editingDomain, Map<Resource, Map<?, ?>> options) {
-		saveInWorkspaceRunnable(editingDomain, options);
-	}
-
-	private static void saveInWorkspaceRunnable(final TransactionalEditingDomain editingDomain,
-			final Map<Resource, Map<?, ?>> options) {
-
-		final Map<URI, Throwable> failedSaves = new HashMap<URI, Throwable>();
-		final IWorkspaceRunnable wsRunnable = new IWorkspaceRunnable() {
-			@Override
-			public void run(final IProgressMonitor monitor) throws CoreException {
-
-				final Runnable runnable = new Runnable() {
-
-					@Override
-					public void run() {
-						Transaction parentTx;
-						if (editingDomain != null
-								&& (parentTx = ((TransactionalEditingDomainImpl) editingDomain).getActiveTransaction()) != null) {
-							do {
-								if (!parentTx.isReadOnly()) {
-									throw new IllegalStateException(
-											"FileService.save() called from within a command (likely produces a deadlock)"); //$NON-NLS-1$
-								}
-							} while ((parentTx = ((TransactionalEditingDomainImpl) editingDomain)
-									.getActiveTransaction().getParent()) != null);
-						}
-
-						final EList<Resource> resources = editingDomain.getResourceSet().getResources();
-						// Copy list to an array to prevent
-						// ConcurrentModificationExceptions
-						// during the saving of the dirty resources
-						Resource[] resourcesArray = new Resource[resources.size()];
-						resourcesArray = resources.toArray(resourcesArray);
-						final Set<Resource> savedResources = new HashSet<Resource>();
-						for (int i = 0; i < resourcesArray.length; i++) {
-							// In case resource modification tracking is
-							// switched on, we can check if a resource
-							// has been modified, so that we only need to same
-							// really changed resources; otherwise
-							// we need to save all resources in the set
-							final Resource resource = resourcesArray[i];
-							if (resource.isModified()) {
-								try {
-									resource.save(options.get(resource));
-									savedResources.add(resource);
-								} catch (final Throwable t) {
-									failedSaves.put(resource.getURI(), t);
-								}
-							}
-						}
-					}
-				};
-
-				try {
-					editingDomain.runExclusive(runnable);
-				} catch (final InterruptedException e) {
-					throw new RuntimeException(e);
-				}
-				editingDomain.getCommandStack().flush();
-			}
-		};
-		try {
-			ResourcesPlugin.getWorkspace().run(wsRunnable, null);
-			if (!failedSaves.isEmpty()) {
-				throw new WrappedException(createMessage(failedSaves), new RuntimeException());
-			}
-		} catch (final CoreException e) {
-			final Throwable cause = e.getStatus().getException();
-			if (cause instanceof RuntimeException) {
-				throw (RuntimeException) cause;
-			}
-			throw new RuntimeException(e);
-		}
-	}
-
-	private static String createMessage(Map<URI, Throwable> failedSaves) {
-		final StringBuilder buf = new StringBuilder("The following resources could not be saved:");
-		for (final Entry<URI, Throwable> entry : failedSaves.entrySet()) {
-			buf.append("\nURI: ").append(entry.getKey().toString()).append(", cause: \n")
-					.append(getExceptionAsString(entry.getValue()));
-		}
-		return buf.toString();
-	}
-
-	private static String getExceptionAsString(Throwable t) {
-		final StringWriter stringWriter = new StringWriter();
-		final PrintWriter printWriter = new PrintWriter(stringWriter);
-		t.printStackTrace(printWriter);
-		final String result = stringWriter.toString();
-		try {
-			stringWriter.close();
-		} catch (final IOException e) {
-			// $JL-EXC$ ignore
-		}
-		printWriter.close();
-		return result;
-	}
-
-	public static InputStream getInputContents(IEditorInput input) {
-		try {
-			if (input instanceof Bpmn2DiagramEditorInput) {
-				URI uri = getInputUri(input);
-				String fileName = null;
-				if (uri.isFile())
-					fileName = uri.toFileString();
-				else if (uri.isPlatformResource())
-					fileName = uri.toPlatformString(false);
-				
-				File file = new File(fileName);
-				if (file.exists()) {
-					InputStream is = new FileInputStream(file);
-					return is;
-				}
-			} else if (input instanceof FileEditorInput) {
-				return ((FileEditorInput) input).getFile().getContents();
-			} else if (input instanceof IStorageEditorInput) {
-				return ((IStorageEditorInput) input).getStorage().getContents();
-			}
-		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		
-		return null;
-	}
-	
-	public static URI getInputUri(IEditorInput input) {
-		if (input instanceof Bpmn2DiagramEditorInput) {
-			URI uri = ((Bpmn2DiagramEditorInput) input).getModelUri();
-			return uri.trimFragment();
-		} else if (input instanceof FileEditorInput) {
-			IPath path =  ((FileEditorInput) input).getFile().getFullPath();
-			return URI.createPlatformResourceURI(path.toString(), true);
-		} else if (input instanceof IStorageEditorInput) {
-			IStorageEditorInput sei = (IStorageEditorInput) input;
-
-			try {
-				IPath path = sei.getStorage().getFullPath();
-				if (path!=null)
-					return URI.createPlatformResourceURI(path.toString(), true);
-
-				// the input is not a local file. Create a temp file and copy its contents
-				String name = sei.getStorage().getName();
-				InputStream istream = sei.getStorage().getContents();
-				File file = createTempFile(name, istream);
-				return URI.createFileURI(file.getPath());
-			}
-			catch (Exception e) {
-			}
-		}
-		return null;
-	}
-	
-	public static String createTempName(String name) {
-		String tempDir = System.getProperty("java.io.tmpdir");
-		if (!tempDir.endsWith(File.separator))
-			tempDir += File.separator;
-		String tempName = tempDir + name + "." + EcoreUtil.generateUUID();
-		return tempName;
-	}
-	
-	public static File createTempFile(String name) {
-		return createTempFile(name,null);
-	}
-	
-	public static File createTempFile(String name, InputStream istream) {
-		File tempFile = null;
-		try {
-			tempFile = File.createTempFile(name, ".bpmn");
-			if (istream!=null) {
-				OutputStream ostream = new FileOutputStream(tempFile);
-	
-				int read = 0;
-				byte[] bytes = new byte[1024];
-	
-				while ((read = istream.read(bytes)) != -1) {
-					ostream.write(bytes, 0, read);
-				}
-	
-				istream.close();
-
-				ostream.flush();
-				ostream.close();
-			}
-		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		return tempFile;
-	}
-	
-	public static boolean isTempFile(URI uri) {
-		String tempDir = System.getProperty("java.io.tmpdir");
-		String uriDir = uri.trimFragment().trimSegments(1).devicePath();
-		return tempDir!=null && tempDir.compareToIgnoreCase(uriDir)==0;
-	}
-	
-	public static void deleteTempFile(URI uri) {
-		File file = new File(uri.toFileString());
-		if (file.exists())
-			file.delete();
-	}
-	
-//	public static IFile getFileFromInput(IEditorSite site, IEditorInput input) {
-//		if (input instanceof DiagramEditorInput) {
-//			URI uri = ((DiagramEditorInput) input).getUri();
-//			String uriString = uri.trimFragment().toPlatformString(true);
-//			return BPMN2DiagramCreator.getModelFile(new Path(uriString));
-//		} else if (input instanceof FileEditorInput) {
-//			return ((FileEditorInput) input).getFile();
-//		} else if (input instanceof IStorageEditorInput) {
-//			IStorageEditorInput sei = (IStorageEditorInput) input;
-//
-//			try {
-//				String name = sei.getStorage().getName();
-//				InputStream istream = sei.getStorage().getContents();
-//
-//				// Object sel = site.getPage().getSelection();
-//				File tempFile = File.createTempFile(name, ".bpmn");
-//				OutputStream ostream = new FileOutputStream(tempFile);
-//
-//				int read = 0;
-//				byte[] bytes = new byte[1024];
-//
-//				while ((read = istream.read(bytes)) != -1) {
-//					ostream.write(bytes, 0, read);
-//				}
-//
-//				istream.close();
-//				ostream.flush();
-//				ostream.close();
-//
-//				IProject project = createTempProject();
-//				IPath location = new Path(tempFile.getAbsolutePath());
-//				IFile workspaceFile = project.getFile(location.lastSegment());
-//				workspaceFile.createLink(location, IResource.NONE, null);
-//				return workspaceFile;
-//				// return new FileEditorInput(workspaceFile);
-//			} catch (Exception e) {
-//				// TODO Auto-generated catch block
-//				e.printStackTrace();
-//			}
-//		}
-//
-//		return null;
-//	}
-//	
-//	public static IProject getTempProject() {
-//		IWorkspace ws = ResourcesPlugin.getWorkspace();
-//		IProject project = ws.getRoot().getProject(".bpmn2.modeler.temp");
-//		return project;
-//	}
-//	
-//	public static IProject createTempProject() {
-//		try {
-//			IProject project = getTempProject();
-//			if (!project.exists())
-//				project.create(null);
-//			if (!project.isOpen())
-//				project.open(null);
-//			return project;
-//		}
-//		catch (Exception e) {
-//			Activator.logError(e);
-//		}
-//		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.wizards;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceSetImpl;
+import org.eclipse.bpmn2.modeler.ui.Activator;
+import org.eclipse.bpmn2.modeler.ui.editor.BPMN2Editor;
+import org.eclipse.core.commands.operations.DefaultOperationHistory;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.command.CommandStack;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.common.util.WrappedException;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.Transaction;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
+import org.eclipse.emf.transaction.util.TransactionUtil;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.workspace.WorkspaceEditingDomainFactory;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.ui.editor.DiagramEditorFactory;
+import org.eclipse.emf.workspace.IWorkspaceCommandStack;
+import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
+import org.eclipse.graphiti.ui.internal.editor.GFWorkspaceCommandStackImpl;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.part.FileEditorInput;
+
+public class FileService {
+
+	public static class MyDiagramEditorFactory extends DiagramEditorFactory {
+		public static TransactionalEditingDomain createResourceSetAndEditingDomain() {
+			final ResourceSet resourceSet = new Bpmn2ModelerResourceSetImpl();
+			final IWorkspaceCommandStack workspaceCommandStack = new GFWorkspaceCommandStackImpl(new DefaultOperationHistory());
+
+			final TransactionalEditingDomainImpl editingDomain = new TransactionalEditingDomainImpl(new ComposedAdapterFactory(
+					ComposedAdapterFactory.Descriptor.Registry.INSTANCE), workspaceCommandStack, resourceSet);
+			WorkspaceEditingDomainFactory.INSTANCE.mapResourceSet(editingDomain);
+			return editingDomain;
+		}
+	}
+	
+	public static TransactionalEditingDomain createEmfFileForDiagram(URI diagramResourceUri, final Diagram diagram, BPMN2Editor diagramEditor) {
+
+		ResourceSet resourceSet = null;
+		TransactionalEditingDomain editingDomain = null;
+		
+		// Create a resource set and EditingDomain
+		editingDomain = MyDiagramEditorFactory.createResourceSetAndEditingDomain();
+		resourceSet = editingDomain.getResourceSet();
+		
+		// Create a resource for this file.
+		final Resource resource = resourceSet.createResource(diagramResourceUri);
+		CommandStack commandStack = editingDomain.getCommandStack();
+		commandStack.execute(new RecordingCommand(editingDomain) {
+
+			@Override
+			protected void doExecute() {
+				resource.setTrackingModification(true);
+				resource.getContents().add(diagram);
+
+			}
+		});
+
+		save(editingDomain, Collections.<Resource, Map<?, ?>> emptyMap());
+		return editingDomain;
+	}
+
+	private static void save(TransactionalEditingDomain editingDomain, Map<Resource, Map<?, ?>> options) {
+		saveInWorkspaceRunnable(editingDomain, options);
+	}
+
+	private static void saveInWorkspaceRunnable(final TransactionalEditingDomain editingDomain,
+			final Map<Resource, Map<?, ?>> options) {
+
+		final Map<URI, Throwable> failedSaves = new HashMap<URI, Throwable>();
+		final IWorkspaceRunnable wsRunnable = new IWorkspaceRunnable() {
+			@Override
+			public void run(final IProgressMonitor monitor) throws CoreException {
+
+				final Runnable runnable = new Runnable() {
+
+					@Override
+					public void run() {
+						Transaction parentTx;
+						if (editingDomain != null
+								&& (parentTx = ((TransactionalEditingDomainImpl) editingDomain).getActiveTransaction()) != null) {
+							do {
+								if (!parentTx.isReadOnly()) {
+									throw new IllegalStateException(
+											"FileService.save() called from within a command (likely produces a deadlock)"); //$NON-NLS-1$
+								}
+							} while ((parentTx = ((TransactionalEditingDomainImpl) editingDomain)
+									.getActiveTransaction().getParent()) != null);
+						}
+
+						final EList<Resource> resources = editingDomain.getResourceSet().getResources();
+						// Copy list to an array to prevent
+						// ConcurrentModificationExceptions
+						// during the saving of the dirty resources
+						Resource[] resourcesArray = new Resource[resources.size()];
+						resourcesArray = resources.toArray(resourcesArray);
+						final Set<Resource> savedResources = new HashSet<Resource>();
+						for (int i = 0; i < resourcesArray.length; i++) {
+							// In case resource modification tracking is
+							// switched on, we can check if a resource
+							// has been modified, so that we only need to same
+							// really changed resources; otherwise
+							// we need to save all resources in the set
+							final Resource resource = resourcesArray[i];
+							if (resource.isModified()) {
+								try {
+									resource.save(options.get(resource));
+									savedResources.add(resource);
+								} catch (final Throwable t) {
+									failedSaves.put(resource.getURI(), t);
+								}
+							}
+						}
+					}
+				};
+
+				try {
+					editingDomain.runExclusive(runnable);
+				} catch (final InterruptedException e) {
+					throw new RuntimeException(e);
+				}
+				editingDomain.getCommandStack().flush();
+			}
+		};
+		try {
+			ResourcesPlugin.getWorkspace().run(wsRunnable, null);
+			if (!failedSaves.isEmpty()) {
+				throw new WrappedException(createMessage(failedSaves), new RuntimeException());
+			}
+		} catch (final CoreException e) {
+			final Throwable cause = e.getStatus().getException();
+			if (cause instanceof RuntimeException) {
+				throw (RuntimeException) cause;
+			}
+			throw new RuntimeException(e);
+		}
+	}
+
+	private static String createMessage(Map<URI, Throwable> failedSaves) {
+		final StringBuilder buf = new StringBuilder("The following resources could not be saved:");
+		for (final Entry<URI, Throwable> entry : failedSaves.entrySet()) {
+			buf.append("\nURI: ").append(entry.getKey().toString()).append(", cause: \n")
+					.append(getExceptionAsString(entry.getValue()));
+		}
+		return buf.toString();
+	}
+
+	private static String getExceptionAsString(Throwable t) {
+		final StringWriter stringWriter = new StringWriter();
+		final PrintWriter printWriter = new PrintWriter(stringWriter);
+		t.printStackTrace(printWriter);
+		final String result = stringWriter.toString();
+		try {
+			stringWriter.close();
+		} catch (final IOException e) {
+			// $JL-EXC$ ignore
+		}
+		printWriter.close();
+		return result;
+	}
+
+	public static InputStream getInputContents(IEditorInput input) {
+		try {
+			if (input instanceof Bpmn2DiagramEditorInput) {
+				URI uri = getInputUri(input);
+				String fileName = null;
+				if (uri.isFile())
+					fileName = uri.toFileString();
+				else if (uri.isPlatformResource())
+					fileName = uri.toPlatformString(false);
+				
+				File file = new File(fileName);
+				if (file.exists()) {
+					InputStream is = new FileInputStream(file);
+					return is;
+				}
+			} else if (input instanceof FileEditorInput) {
+				return ((FileEditorInput) input).getFile().getContents();
+			} else if (input instanceof IStorageEditorInput) {
+				return ((IStorageEditorInput) input).getStorage().getContents();
+			}
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		return null;
+	}
+	
+	public static URI getInputUri(IEditorInput input) {
+		if (input instanceof Bpmn2DiagramEditorInput) {
+			URI uri = ((Bpmn2DiagramEditorInput) input).getModelUri();
+			return uri.trimFragment();
+		} else if (input instanceof FileEditorInput) {
+			IPath path =  ((FileEditorInput) input).getFile().getFullPath();
+			return URI.createPlatformResourceURI(path.toString(), true);
+		} else if (input instanceof IStorageEditorInput) {
+			IStorageEditorInput sei = (IStorageEditorInput) input;
+
+			try {
+				IPath path = sei.getStorage().getFullPath();
+				if (path!=null)
+					return URI.createPlatformResourceURI(path.toString(), true);
+
+				// the input is not a local file. Create a temp file and copy its contents
+				String name = sei.getStorage().getName();
+				InputStream istream = sei.getStorage().getContents();
+				File file = createTempFile(name, istream);
+				return URI.createFileURI(file.getPath());
+			}
+			catch (Exception e) {
+			}
+		}
+		return null;
+	}
+	
+	public static String createTempName(String name) {
+		String tempDir = System.getProperty("java.io.tmpdir");
+		if (!tempDir.endsWith(File.separator))
+			tempDir += File.separator;
+		String tempName = tempDir + name + "." + EcoreUtil.generateUUID();
+		return tempName;
+	}
+	
+	public static File createTempFile(String name) {
+		return createTempFile(name,null);
+	}
+	
+	public static File createTempFile(String name, InputStream istream) {
+		File tempFile = null;
+		try {
+			tempFile = File.createTempFile(name, ".bpmn");
+			if (istream!=null) {
+				OutputStream ostream = new FileOutputStream(tempFile);
+	
+				int read = 0;
+				byte[] bytes = new byte[1024];
+	
+				while ((read = istream.read(bytes)) != -1) {
+					ostream.write(bytes, 0, read);
+				}
+	
+				istream.close();
+
+				ostream.flush();
+				ostream.close();
+			}
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return tempFile;
+	}
+	
+	public static boolean isTempFile(URI uri) {
+		String tempDir = System.getProperty("java.io.tmpdir");
+		String uriDir = uri.trimFragment().trimSegments(1).devicePath();
+		return tempDir!=null && tempDir.compareToIgnoreCase(uriDir)==0;
+	}
+	
+	public static void deleteTempFile(URI uri) {
+		File file = new File(uri.toFileString());
+		if (file.exists())
+			file.delete();
+	}
+	
+//	public static IFile getFileFromInput(IEditorSite site, IEditorInput input) {
+//		if (input instanceof DiagramEditorInput) {
+//			URI uri = ((DiagramEditorInput) input).getUri();
+//			String uriString = uri.trimFragment().toPlatformString(true);
+//			return BPMN2DiagramCreator.getModelFile(new Path(uriString));
+//		} else if (input instanceof FileEditorInput) {
+//			return ((FileEditorInput) input).getFile();
+//		} else if (input instanceof IStorageEditorInput) {
+//			IStorageEditorInput sei = (IStorageEditorInput) input;
+//
+//			try {
+//				String name = sei.getStorage().getName();
+//				InputStream istream = sei.getStorage().getContents();
+//
+//				// Object sel = site.getPage().getSelection();
+//				File tempFile = File.createTempFile(name, ".bpmn");
+//				OutputStream ostream = new FileOutputStream(tempFile);
+//
+//				int read = 0;
+//				byte[] bytes = new byte[1024];
+//
+//				while ((read = istream.read(bytes)) != -1) {
+//					ostream.write(bytes, 0, read);
+//				}
+//
+//				istream.close();
+//				ostream.flush();
+//				ostream.close();
+//
+//				IProject project = createTempProject();
+//				IPath location = new Path(tempFile.getAbsolutePath());
+//				IFile workspaceFile = project.getFile(location.lastSegment());
+//				workspaceFile.createLink(location, IResource.NONE, null);
+//				return workspaceFile;
+//				// return new FileEditorInput(workspaceFile);
+//			} catch (Exception e) {
+//				// TODO Auto-generated catch block
+//				e.printStackTrace();
+//			}
+//		}
+//
+//		return null;
+//	}
+//	
+//	public static IProject getTempProject() {
+//		IWorkspace ws = ResourcesPlugin.getWorkspace();
+//		IProject project = ws.getRoot().getProject(".bpmn2.modeler.temp");
+//		return project;
+//	}
+//	
+//	public static IProject createTempProject() {
+//		try {
+//			IProject project = getTempProject();
+//			if (!project.exists())
+//				project.create(null);
+//			if (!project.isOpen())
+//				project.open(null);
+//			return project;
+//		}
+//		catch (Exception e) {
+//			Activator.logError(e);
+//		}
+//		return null;
+//	}
+}
diff --git a/org.eclipse.bpmn2.modeler.updatesite.feature/associate.properties b/org.eclipse.bpmn2.modeler.updatesite.feature/associate.properties
index 1a94f7d..c9784fe 100644
--- a/org.eclipse.bpmn2.modeler.updatesite.feature/associate.properties
+++ b/org.eclipse.bpmn2.modeler.updatesite.feature/associate.properties
@@ -1,4 +1,4 @@
-# associate site(s) - use comma to separate list - to add to the resulting repo 
-# TODO: change bpmn2 metamodel download location as soon as an official update site is available
-# https://hudson.eclipse.org/hudson/job/bpmn2-nightly/ws/org.eclipse.bpmn2.site/target/site/ should point to an download.eclipse.org update site 
-associate.sites=http://download.eclipse.org/graphiti/updates/0.9.0/,https://hudson.eclipse.org/hudson/job/bpmn2-nightly/lastSuccessfulBuild/artifact/org.eclipse.bpmn2.site/target/site/,http://download.eclipse.org/bpmn2-modeler/site/,http://download.eclipse.org/bpel/site/,http://download.eclipse.org/releases/indigo,http://download.eclipse.org/eclipse/updates/3.7
+# associate site(s) - use comma to separate list - to add to the resulting repo 
+# TODO: change bpmn2 metamodel download location as soon as an official update site is available
+# https://hudson.eclipse.org/hudson/job/bpmn2-nightly/ws/org.eclipse.bpmn2.site/target/site/ should point to an download.eclipse.org update site 
+associate.sites=http://download.eclipse.org/graphiti/updates/0.8.2/,https://hudson.eclipse.org/hudson/job/bpmn2-nightly/lastSuccessfulBuild/artifact/org.eclipse.bpmn2.site/target/site/,http://download.eclipse.org/bpmn2-modeler/site/,http://download.eclipse.org/bpel/site/,http://download.eclipse.org/releases/helios,http://download.eclipse.org/eclipse/updates/3.6
diff --git a/pom.xml b/pom.xml
index d2872bf..8d412fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,247 +1,247 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-
-	<prerequisites>
-		<maven>3.0</maven>
-	</prerequisites>
-
-	<groupId>org.eclipse.bpmn2.modeler</groupId>
-	<artifactId>org.eclipse.bpmn2.modeler.parent</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<packaging>pom</packaging>
-
-	<name>BPMN2 Modeler Parent</name>
-	<description>Parent POM for the Eclipse BPMN2 Modeler Project</description>
-
-	<licenses>
-		<license>
-			<name>Eclipse Public License v1.0</name>
-			<comments>
-       All rights reserved.
-
-       This program and the accompanying materials are 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.htm
-      </comments>
-		</license>
-	</licenses>
-
-	<properties>
-		<tycho-version>0.13.0</tycho-version>
-	</properties>
-
-	<profiles>
-		<profile>
-			<id>platform-helios</id>
-			<activation>
-				<property>
-					<name>platform-version-name</name>
-					<value>helios</value>
-				</property>
-			</activation>
-			<properties>
-				<eclipse-site>http://download.eclipse.org/releases/helios</eclipse-site>
-				<platform-version>[3.6,3.7)</platform-version>
-			</properties>
-		</profile>
-		<profile>
-			<id>platform-indigo</id>
-			<activation>
-				<property>
-					<name>platform-version-name</name>
-					<value>indigo</value>
-				</property>
-			</activation>
-			<properties>
-				<eclipse-site>http://download.eclipse.org/releases/indigo</eclipse-site>
-				<platform-version>[3.7,3.8)</platform-version>
-			</properties>
-		</profile>
-	</profiles>
-
-	<modules>
-		<module>org.eclipse.bpmn2.modeler.core</module>
-		<module>org.eclipse.bpmn2.modeler.ui</module>
-		<module>org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5</module>
-		<module>org.eclipse.bpmn2.modeler.feature</module>
-		<module>org.eclipse.bpmn2.modeler.updatesite.feature</module>
-	</modules>
-
-	<repositories>
-		<repository>
-			<id>eclipse-platform</id>
-			<layout>p2</layout>
-			<url>${eclipse-site}</url>
-		</repository>
-
-		<repository>
-			<id>eclipse-bpmn2</id>
-			<!--  TODO: change this when BPMN2 metamodel finds a permanent home -->
-			<url>https://hudson.eclipse.org/hudson/job/bpmn2-nightly/lastSuccessfulBuild/artifact/org.eclipse.bpmn2.site/target/site/</url>
-			<layout>p2</layout>
-			<snapshots>
-				<enabled>true</enabled>
-			</snapshots>
-			<releases>
-				<enabled>true</enabled>
-			</releases>
-		</repository>
-
-		<repository>
-			<id>eclipse-bpel</id>
-			<url>http://download.eclipse.org/bpel/update-site</url>
-			<layout>p2</layout>
-			<snapshots>
-				<enabled>true</enabled>
-			</snapshots>
-			<releases>
-				<enabled>true</enabled>
-			</releases>
-		</repository>
-
-		<repository>
-			<id>eclipse-graphiti</id>
-			<url>http://download.eclipse.org/graphiti/updates/0.9.0</url>
-			<layout>p2</layout>
-			<snapshots>
-				<enabled>true</enabled>
-			</snapshots>
-			<releases>
-				<enabled>true</enabled>
-			</releases>
-		</repository>
-
-		<repository>
-			<id>eclipse-emf</id>
-			<url>http://download.eclipse.org/modeling/emf/updates/releases/</url>
-			<layout>p2</layout>
-			<snapshots>
-				<enabled>true</enabled>
-			</snapshots>
-			<releases>
-				<enabled>true</enabled>
-			</releases>
-		</repository>
-
-		<repository>
-			<id>eclipse-gef</id>
-			<url>http://download.eclipse.org/tools/gef/updates/releases/</url>
-			<layout>p2</layout>
-			<snapshots>
-				<enabled>true</enabled>
-			</snapshots>
-			<releases>
-				<enabled>true</enabled>
-			</releases>
-		</repository>
-
-	</repositories>
-
-	<pluginRepositories>
-		<pluginRepository>
-			<!-- need maven-findbugs-2.3.2-SNAPSHOT, see http://jira.codehaus.org/browse/MFINDBUGS-122 
-				remove this when this version is released -->
-			<id>codehaus.snapshots</id>
-			<url>http://snapshots.repository.codehaus.org/</url>
-		</pluginRepository>
-	</pluginRepositories>
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.eclipse.tycho</groupId>
-				<artifactId>tycho-maven-plugin</artifactId>
-				<version>${tycho-version}</version>
-				<extensions>true</extensions>
-			</plugin>
-			<plugin>
-				<groupId>org.eclipse.tycho</groupId>
-				<artifactId>target-platform-configuration</artifactId>
-				<version>${tycho-version}</version>
-				<configuration>
-					<resolver>p2</resolver>
-				</configuration>
-			</plugin>
-		</plugins>
-		<pluginManagement>
-			<plugins>
-				<plugin>
-					<groupId>org.eclipse.tycho</groupId>
-					<artifactId>maven-osgi-compiler-plugin</artifactId>
-					<version>${tycho-version}</version>
-					<configuration>
-						<encoding>UTF-8</encoding>
-					</configuration>
-				</plugin>
-				<plugin>
-					<!-- TODO remove workaround when https://issues.sonatype.org/browse/TYCHO-473 
-						is fixed -->
-					<groupId>org.eclipse.tycho</groupId>
-					<artifactId>maven-osgi-source-plugin</artifactId>
-					<version>${tycho-version}</version>
-					<executions>
-						<execution>
-							<id>attach-source</id>
-							<phase>process-classes</phase>
-							<goals>
-								<goal>plugin-source</goal>
-							</goals>
-						</execution>
-					</executions>
-				</plugin>
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-resources-plugin</artifactId>
-					<version>2.4.1</version>
-					<configuration>
-						<encoding>ISO-8859-1</encoding>
-					</configuration>
-				</plugin>
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-antrun-plugin</artifactId>
-					<version>1.3</version>
-				</plugin>
-				<plugin>
-					<groupId>org.codehaus.mojo</groupId>
-					<artifactId>findbugs-maven-plugin</artifactId>
-					<version>2.3.2-SNAPSHOT</version>
-					<configuration>
-						<findbugsXmlOutput>true</findbugsXmlOutput>
-						<failOnError>false</failOnError>
-					</configuration>
-					<executions>
-						<execution>
-							<goals>
-								<goal>check</goal>
-							</goals>
-						</execution>
-					</executions>
-				</plugin>
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-pmd-plugin</artifactId>
-					<version>2.5</version>
-					<configuration>
-						<sourceEncoding>utf-8</sourceEncoding>
-						<minimumTokens>100</minimumTokens>
-						<targetJdk>1.5</targetJdk>
-						<format>xml</format>
-						<failOnViolation>false</failOnViolation>
-					</configuration>
-					<executions>
-						<execution>
-							<goals>
-								<goal>cpd-check</goal>
-							</goals>
-						</execution>
-					</executions>
-				</plugin>
-			</plugins>
-		</pluginManagement>
-	</build>
-
-
-</project>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<prerequisites>
+		<maven>3.0</maven>
+	</prerequisites>
+
+	<groupId>org.eclipse.bpmn2.modeler</groupId>
+	<artifactId>org.eclipse.bpmn2.modeler.parent</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<packaging>pom</packaging>
+
+	<name>BPMN2 Modeler Parent</name>
+	<description>Parent POM for the Eclipse BPMN2 Modeler Project</description>
+
+	<licenses>
+		<license>
+			<name>Eclipse Public License v1.0</name>
+			<comments>
+       All rights reserved.
+
+       This program and the accompanying materials are 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.htm
+      </comments>
+		</license>
+	</licenses>
+
+	<properties>
+		<tycho-version>0.13.0</tycho-version>
+	</properties>
+
+	<profiles>
+		<profile>
+			<id>platform-helios</id>
+			<activation>
+				<property>
+					<name>platform-version-name</name>
+					<value>helios</value>
+				</property>
+			</activation>
+			<properties>
+				<eclipse-site>http://download.eclipse.org/releases/helios</eclipse-site>
+				<platform-version>[3.6,3.7)</platform-version>
+			</properties>
+		</profile>
+		<profile>
+			<id>platform-indigo</id>
+			<activation>
+				<property>
+					<name>platform-version-name</name>
+					<value>indigo</value>
+				</property>
+			</activation>
+			<properties>
+				<eclipse-site>http://download.eclipse.org/releases/indigo</eclipse-site>
+				<platform-version>[3.7,3.8)</platform-version>
+			</properties>
+		</profile>
+	</profiles>
+
+	<modules>
+		<module>org.eclipse.bpmn2.modeler.core</module>
+		<module>org.eclipse.bpmn2.modeler.ui</module>
+		<module>org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5</module>
+		<module>org.eclipse.bpmn2.modeler.feature</module>
+		<module>org.eclipse.bpmn2.modeler.updatesite.feature</module>
+	</modules>
+
+	<repositories>
+		<repository>
+			<id>eclipse-platform</id>
+			<layout>p2</layout>
+			<url>${eclipse-site}</url>
+		</repository>
+
+		<repository>
+			<id>eclipse-bpmn2</id>
+			<!--  TODO: change this when BPMN2 metamodel finds a permanent home -->
+			<url>https://hudson.eclipse.org/hudson/job/bpmn2-nightly/lastSuccessfulBuild/artifact/org.eclipse.bpmn2.site/target/site/</url>
+			<layout>p2</layout>
+			<snapshots>
+				<enabled>true</enabled>
+			</snapshots>
+			<releases>
+				<enabled>true</enabled>
+			</releases>
+		</repository>
+
+		<repository>
+			<id>eclipse-bpel</id>
+			<url>http://download.eclipse.org/bpel/update-site</url>
+			<layout>p2</layout>
+			<snapshots>
+				<enabled>true</enabled>
+			</snapshots>
+			<releases>
+				<enabled>true</enabled>
+			</releases>
+		</repository>
+
+		<repository>
+			<id>eclipse-graphiti</id>
+			<url>http://download.eclipse.org/graphiti/updates/0.8.2</url>
+			<layout>p2</layout>
+			<snapshots>
+				<enabled>true</enabled>
+			</snapshots>
+			<releases>
+				<enabled>true</enabled>
+			</releases>
+		</repository>
+
+		<repository>
+			<id>eclipse-emf</id>
+			<url>http://download.eclipse.org/modeling/emf/updates/releases/</url>
+			<layout>p2</layout>
+			<snapshots>
+				<enabled>true</enabled>
+			</snapshots>
+			<releases>
+				<enabled>true</enabled>
+			</releases>
+		</repository>
+
+		<repository>
+			<id>eclipse-gef</id>
+			<url>http://download.eclipse.org/tools/gef/updates/releases/</url>
+			<layout>p2</layout>
+			<snapshots>
+				<enabled>true</enabled>
+			</snapshots>
+			<releases>
+				<enabled>true</enabled>
+			</releases>
+		</repository>
+
+	</repositories>
+
+	<pluginRepositories>
+		<pluginRepository>
+			<!-- need maven-findbugs-2.3.2-SNAPSHOT, see http://jira.codehaus.org/browse/MFINDBUGS-122 
+				remove this when this version is released -->
+			<id>codehaus.snapshots</id>
+			<url>http://snapshots.repository.codehaus.org/</url>
+		</pluginRepository>
+	</pluginRepositories>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-maven-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<extensions>true</extensions>
+			</plugin>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>target-platform-configuration</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<resolver>p2</resolver>
+				</configuration>
+			</plugin>
+		</plugins>
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<groupId>org.eclipse.tycho</groupId>
+					<artifactId>maven-osgi-compiler-plugin</artifactId>
+					<version>${tycho-version}</version>
+					<configuration>
+						<encoding>UTF-8</encoding>
+					</configuration>
+				</plugin>
+				<plugin>
+					<!-- TODO remove workaround when https://issues.sonatype.org/browse/TYCHO-473 
+						is fixed -->
+					<groupId>org.eclipse.tycho</groupId>
+					<artifactId>maven-osgi-source-plugin</artifactId>
+					<version>${tycho-version}</version>
+					<executions>
+						<execution>
+							<id>attach-source</id>
+							<phase>process-classes</phase>
+							<goals>
+								<goal>plugin-source</goal>
+							</goals>
+						</execution>
+					</executions>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-resources-plugin</artifactId>
+					<version>2.4.1</version>
+					<configuration>
+						<encoding>ISO-8859-1</encoding>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-antrun-plugin</artifactId>
+					<version>1.3</version>
+				</plugin>
+				<plugin>
+					<groupId>org.codehaus.mojo</groupId>
+					<artifactId>findbugs-maven-plugin</artifactId>
+					<version>2.3.2-SNAPSHOT</version>
+					<configuration>
+						<findbugsXmlOutput>true</findbugsXmlOutput>
+						<failOnError>false</failOnError>
+					</configuration>
+					<executions>
+						<execution>
+							<goals>
+								<goal>check</goal>
+							</goals>
+						</execution>
+					</executions>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-pmd-plugin</artifactId>
+					<version>2.5</version>
+					<configuration>
+						<sourceEncoding>utf-8</sourceEncoding>
+						<minimumTokens>100</minimumTokens>
+						<targetJdk>1.5</targetJdk>
+						<format>xml</format>
+						<failOnViolation>false</failOnViolation>
+					</configuration>
+					<executions>
+						<execution>
+							<goals>
+								<goal>cpd-check</goal>
+							</goals>
+						</execution>
+					</executions>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+
+
+</project>
