https://bugs.eclipse.org/bugs/show_bug.cgi?id=378997 - this just gets us
"over the hump" so we can have a working juno build. We still need to
rewrite the embedded editor functionality.
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/.classpath b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/.classpath
new file mode 100644
index 0000000..751c8f2
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/.project b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/.project
new file mode 100644
index 0000000..44042cc
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.bpel.common.ui.noEmbeddedEditors</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/META-INF/MANIFEST.MF b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9a1f9b2
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/META-INF/MANIFEST.MF
@@ -0,0 +1,33 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Common UI
+Bundle-SymbolicName: org.eclipse.bpel.common.ui; singleton:=true 
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.bpel.common.ui.CommonUIPlugin
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.ui.ide;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.gef;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.emf.ecore.change;bundle-version="[2.4.0,3.0.0)",
+ org.eclipse.bpel.model;bundle-version="1.0.0"
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.bpel.common.ui,
+ org.eclipse.bpel.common.ui.assist,
+ org.eclipse.bpel.common.ui.calendar,
+ org.eclipse.bpel.common.ui.command,
+ org.eclipse.bpel.common.ui.decorator,
+ org.eclipse.bpel.common.ui.details,
+ org.eclipse.bpel.common.ui.details.viewers,
+ org.eclipse.bpel.common.ui.details.widgets,
+ org.eclipse.bpel.common.ui.editmodel,
+ org.eclipse.bpel.common.ui.figures,
+ org.eclipse.bpel.common.ui.flatui,
+ org.eclipse.bpel.common.ui.layouts,
+ org.eclipse.bpel.common.ui.markers,
+ org.eclipse.bpel.common.ui.palette,
+ org.eclipse.bpel.common.ui.tray
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-Vendor: eclipse.org
+Bundle-ClassPath: .
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/about.html b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/about.html
new file mode 100644
index 0000000..363bc9d
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 22, 2011</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/build.properties b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/build.properties
new file mode 100644
index 0000000..70cd167
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/build.properties
@@ -0,0 +1,21 @@
+###############################################################################
+# Copyright (c) 2005 IBM Corporation and others.
+# 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.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               icons/,\
+               plugin.properties,\
+               plugin.xml,\
+               schema/,\
+               .,\
+               bin/,\
+               about.html
+src.includes = schema/
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/add.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/add.gif
new file mode 100644
index 0000000..0a9a02d
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/add.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/palette.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/palette.gif
new file mode 100644
index 0000000..29f8a97
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/palette.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/remove.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/remove.gif
new file mode 100644
index 0000000..6e86a47
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/remove.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/showproperties_obj.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/showproperties_obj.gif
new file mode 100644
index 0000000..d94ff10
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/showproperties_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/zoomin.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/zoomin.gif
new file mode 100644
index 0000000..999661a
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/zoomin.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/zoomout.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/zoomout.gif
new file mode 100644
index 0000000..034b8ab
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/dlcl16/zoomout.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/add.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/add.gif
new file mode 100644
index 0000000..ceb3d1d
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/add.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/palette.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/palette.gif
new file mode 100644
index 0000000..29f8a97
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/palette.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/remove.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/remove.gif
new file mode 100644
index 0000000..2cd9c54
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/remove.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/showproperties_obj.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/showproperties_obj.gif
new file mode 100644
index 0000000..1dc19a3
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/showproperties_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/zoomin.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/zoomin.gif
new file mode 100644
index 0000000..96953c9
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/zoomin.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/zoomout.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/zoomout.gif
new file mode 100644
index 0000000..31db140
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/elcl16/zoomout.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_blank.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_blank.gif
new file mode 100644
index 0000000..9bbca24
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_blank.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_error.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_error.gif
new file mode 100644
index 0000000..50bc54b
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_error.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_greencheck.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_greencheck.gif
new file mode 100644
index 0000000..34c6a03
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_greencheck.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_greycheck.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_greycheck.gif
new file mode 100644
index 0000000..4237282
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_greycheck.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_info.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_info.gif
new file mode 100644
index 0000000..74b3c58
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_info.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_warn.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_warn.gif
new file mode 100644
index 0000000..a341964
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/sm_warn.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/tray_expand.png b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/tray_expand.png
new file mode 100644
index 0000000..41c404c
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj/tray_expand.png
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj16/add_exe.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj16/add_exe.gif
new file mode 100644
index 0000000..5cf4180
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj16/add_exe.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj16/remove_exe.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj16/remove_exe.gif
new file mode 100644
index 0000000..52dbd01
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/obj16/remove_exe.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/ovr/error.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/ovr/error.gif
new file mode 100644
index 0000000..7ba208d
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/ovr/error.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/ovr/info.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/ovr/info.gif
new file mode 100644
index 0000000..a104e45
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/ovr/info.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/ovr/warning.gif b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/ovr/warning.gif
new file mode 100644
index 0000000..ee2dac4
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/icons/ovr/warning.gif
Binary files differ
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/plugin.properties b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/plugin.properties
new file mode 100644
index 0000000..b557e6b
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/plugin.properties
@@ -0,0 +1,13 @@
+
+# <copyright>
+# </copyright>
+#
+# $Id: plugin.properties,v 1.1 2011/04/29 12:27:25 vzurczak Exp $
+
+GRAPHICAL_MARKER_NAME = BPEL Graphical Markers
+MODEL_UI_MARKER_NAME = BPEL Model Markers
+TEXT_MARKER_NAME = BPEL Text Markers
+
+CONTENT_TYPE_NAME = BPEL Process
+BPEL_FILE_DECORATOR = BPEL File Decorator
+BPEL_FILE_DECORATOR_DESCRIPTION = Marks problems in BPEL files (as long as the JDT is not installed).
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/plugin.xml b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/plugin.xml
new file mode 100644
index 0000000..97b6668
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/plugin.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension-point id="paletteAdditions" name="Palette Additions" schema="schema/paletteAdditions.exsd"/>
+   <extension-point id="resourceSetProvider" name="Resource Set Provider" schema="schema/resourceSetProvider.exsd"/>
+   
+   <extension
+         id="uiModelMarker"
+         name="%MODEL_UI_MARKER_NAME"
+         point="org.eclipse.core.resources.markers">
+      <super
+            type="org.eclipse.bpel.common.model.modelMarker">
+      </super>
+      <attribute
+            name="org.eclipse.bpel.common.ui.priority">
+      </attribute>
+      <attribute
+            name="org.eclipse.bpel.common.ui.visible">
+      </attribute>
+      <!-- Bugzilla 330519 -->
+      <persistent value="true"/>
+   </extension>
+   <extension
+         id="graphicalMarker"
+         name="%GRAPHICAL_MARKER_NAME"
+         point="org.eclipse.core.resources.markers">
+      <super
+            type="org.eclipse.bpel.common.ui.uiModelMarker">
+      </super>
+      <attribute
+            name="org.eclipse.bpel.common.ui.anchorPoint">
+      </attribute>
+      <!-- Bugzilla 330519 -->
+      <persistent value="true"/>
+   </extension>
+   <extension
+         id="textMarker"
+         name="%TEXT_MARKER_NAME"
+         point="org.eclipse.core.resources.markers">
+      <super
+            type="org.eclipse.bpel.common.ui.uiModelMarker">
+      </super>
+      <super
+            type="org.eclipse.core.resources.textmarker">
+      </super>
+      <attribute
+            name="org.eclipse.bpel.common.ui.lineNumInObject">
+      </attribute>
+      <!-- Bugzilla 330519 -->
+      <persistent value="true"/>
+   </extension>
+   <extension
+         point="org.eclipse.core.contenttype.contentTypes">
+      <content-type
+            base-type="org.eclipse.core.runtime.xml"
+            default-charset="UTF-8"
+            file-extensions="bpel,bpel2"
+	        id="org.eclipse.bpel.contenttype"
+            name="%CONTENT_TYPE_NAME"
+            priority="normal"/>
+   </extension>
+
+   <!-- Bugzilla 330527 -->
+   <extension
+         point="org.eclipse.ui.decorators">
+      <decorator
+            adaptable="true"
+            location="BOTTOM_LEFT"
+            lightweight="true"
+            label="%BPEL_FILE_DECORATOR"
+            state="true"
+            class="org.eclipse.bpel.common.ui.ResourceMarkerDecorator"
+            id="org.eclipse.bpel.ui.decorators">
+         <enablement>
+            <and>
+               <objectClass name="org.eclipse.core.resources.IFile"/>
+               <objectState
+                  name="contentTypeId"
+                  value="org.eclipse.bpel.contenttype">
+               </objectState>
+               <not>
+                  <pluginState
+                        id="org.eclipse.jdt.ui"
+                        value="activated">
+                  </pluginState>
+               </not>
+            </and>
+         </enablement>
+         <description>
+            %BPEL_FILE_DECORATOR_DESCRIPTION
+         </description>
+      </decorator>
+    </extension>   
+</plugin>
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/pom.xml b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/pom.xml
new file mode 100644
index 0000000..35b8040
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/pom.xml
@@ -0,0 +1,14 @@
+<project
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion> 
+	<parent>
+	  <groupId>org.eclipse.bpel</groupId>
+	  <artifactId>org.eclipse.bpel.parent.pom</artifactId>
+	  <version>0.0.1-SNAPSHOT</version>
+	  <relativePath>../../parent/pom.xml</relativePath>
+	</parent>
+	<groupId>org.eclipse.bpel.plugins</groupId>
+	<artifactId>org.eclipse.bpel.common.ui</artifactId> 
+	<version>1.0.0-SNAPSHOT</version>
+	<packaging>eclipse-plugin</packaging>
+</project>
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/readme.txt b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/readme.txt
new file mode 100644
index 0000000..8324ae9
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/readme.txt
@@ -0,0 +1,3 @@
+This plugin is essentially a duplicate of org.eclipse.bpel.common.ui with the embedded editor functionality removed.
+This was necessary because of breaking org.eclipse.ui API changes in Eclipse Juno.
+After this feature is rewritten to work with Juno, this plugin must be removed and the plugins/pom.xml restored to its original.
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/schema/modelMarkerContentProviders.exsd b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/schema/modelMarkerContentProviders.exsd
new file mode 100644
index 0000000..a467bbb
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/schema/modelMarkerContentProviders.exsd
@@ -0,0 +1,109 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.bpel.common.ui">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.bpel.common.ui" id="modelMarkerContentProviders" name="Model Marker Content Providers"/>
+      </appInfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="modelMarkerContentProvider"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="modelMarkerContentProvider">
+      <complexType>
+         <attribute name="markerType" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.bpel.common.ui.markers.IModelMarkerContentProvider"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/schema/paletteAdditions.exsd b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/schema/paletteAdditions.exsd
new file mode 100644
index 0000000..17927e1
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/schema/paletteAdditions.exsd
@@ -0,0 +1,176 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.bpel.common.ui">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.bpel.common.ui" id="paletteAdditions" name="Palette Additions"/>
+      </appInfo>
+      <documentation>
+         This exension point allows for contributing BPEL pallette items. You can either create an individual addition for each palette element or you can create a bulk addition by specifying a palette provider.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="additions"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="additions">
+      <annotation>
+         <documentation>
+            Additions represents the palette additions that will be made by this extension. Either &lt;b&gt;provider&lt;/b&gt; must be set or a list of &lt;tt&gt;addition&lt;/tt&gt; childrens must be specified. When setting &lt;b&gt;provider&lt;/b&gt; it allows for bulk in-code creation of the palette items and categories.
+         </documentation>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="addition" minOccurs="0" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="targetEditor" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The target editor for the palette additions (the editor id). While this value must be set, it currently does not have any affect other then it must much the BPEL editor id, which is org.eclipse.bpel.ui.bpeleditor.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="provider" type="string">
+            <annotation>
+               <documentation>
+                  The provider is a class which implements IPaletteProvider.
+It allows for &quot;bulk&quot; creation and addition of palette items to the BPEL palette.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.bpel.common.ui.palette.IPaletteProvider"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="importance" type="string">
+            <annotation>
+               <documentation>
+                  An importance assigned to these palette additions. A lower number means a contribution is more important and will be added first. The default value for importance is 10. It is a numeric value. The BPEL palette additions which the editor itself provides are of importance 5.
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="addition">
+      <annotation>
+         <appInfo>
+            <meta.element labelAttribute="class"/>
+         </appInfo>
+         <documentation>
+            A palette addition.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A class which extends org.eclipse.gef.palette.CreationToolEntry.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.gef.palette.CreationToolEntry"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="category" type="string">
+            <annotation>
+               <documentation>
+                  The label of the category id that will be used for this category. Note that only the first tool entry with the category id will be used to create a palette container in the palette. 
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="default" type="boolean">
+            <annotation>
+               <documentation>
+                  Whether this single tool addition is the default tool for the category. Last tool setting this value to &lt;b&gt;true&lt;/b&gt; within a palette container wins.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="categoryId" type="string">
+            <annotation>
+               <documentation>
+                  The categoryid represents an internal category specification. The format of this entry is a dotted identifier, something like &lt;tt&gt;bpel.actions&lt;/tt&gt; or &lt;tt&gt;bpel.faults&lt;/tt&gt; or &lt;tt&gt;user.macros&lt;/tt&gt;. It is used instead of the category as a way of slotting and creating new categories in the palette. The category attribute is the actual label of the category.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="categoryOrder" type="string">
+            <annotation>
+               <documentation>
+                  Represents the category order. Default order is 100. The built-in BPEL categories are 10,20,30 respectively and have category ids &lt;tt&gt;bpel.actions&lt;/tt&gt;, &lt;tt&gt;bpel.control&lt;/tt&gt;, and &lt;tt&gt;bpel.faults&lt;/tt&gt;. 
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         0.0.1
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/schema/resourceSetProvider.exsd b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/schema/resourceSetProvider.exsd
new file mode 100644
index 0000000..c56ae9a
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/schema/resourceSetProvider.exsd
@@ -0,0 +1,110 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.bpel.common.ui">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.bpel.common.ui" id="resourceSetProvider" name="resourceSetProvider"/>
+      </appInfo>
+      <documentation>
+         This extension point provides for a ResourceSet to the underlying edit model which must be a sub-class of BPELResourceSetImpl.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="provider"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The extension point name.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  Extension point id.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  Extension point name
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="provider">
+      <annotation>
+         <documentation>
+            The provider for the resourceSet extension point.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The class the implements IResourceSetProvider.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.emf.ecore.resource.ResourceSet"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         0.0.4
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/ColorUtils.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/ColorUtils.java
new file mode 100644
index 0000000..0c65bf0
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/ColorUtils.java
@@ -0,0 +1,358 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Device;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * General color utilities.
+ */
+public final class ColorUtils {
+
+	/**
+	 * Gets a different color shade by changing its brightness
+	 * with the provided variation. 
+	 */
+	public static Color getShade(Color original, float brightnessVariation, Display display) {
+		brightnessVariation  = isInvertedColorScheme() ? -brightnessVariation : brightnessVariation;
+		return new Color(display, getShadeRGB(original.getRGB(), brightnessVariation));
+	}
+
+	/**
+	 * Gets a different color shade by changing its brightness
+	 * with the provided variation. 
+	 */
+	public static RGB getShadeRGB(RGB original, float brightnessVariation) {
+//		System.out.println("started " + original);
+		brightnessVariation  = isInvertedColorScheme() ? -brightnessVariation : brightnessVariation;
+		float[] hsb = RGBtoHSB(original.red, original.green, original.blue, null);
+		hsb[2] += brightnessVariation;
+		int rgb = HSBtoRGB(hsb[0], hsb[1], hsb[2]);
+//		System.out.println(new RGB(getRed(rgb), getGreen(rgb), getBlue(rgb)));
+		return new RGB(getRed(rgb), getGreen(rgb), getBlue(rgb));
+	}
+
+	/**
+	 * Returns an array of gradient colors from source to destination.
+	 * The source and destination colors are not included in the array.
+	 */
+	public static Color[] getColorShades(Color source, Color destination, int n, Display display) {
+		float interval = getBrightnessInterval(source.getRGB(), destination.getRGB());
+		interval = interval / (n+2);
+		Color[] result = new Color[n];
+		Color base = source;
+		for (int i = 0; i < result.length; i++) {
+			result[i] = getShade(base, interval, display);
+			base = result[i];
+		}
+		return result;
+	}
+
+	/**
+	 * Returns an array of gradient colors from source to destination.
+	 * The source and destination colors are not included in the array.
+	 */
+	public static float getBrightnessInterval(RGB source, RGB destination) {
+		float[] sourceHSB = RGBtoHSB(source.red, source.green, source.blue, null);
+		float[] destinationHSB = RGBtoHSB(destination.red, destination.green, destination.blue, null);
+		return (destinationHSB[2] - sourceHSB[2]);
+	}
+
+	/**
+	 * Returns an array of gradient colors from source to middle and from middle to destination.
+	 * The middle color is included but the source and destination are not.
+	 */
+	public static Color[] getColorShades(Color source, Color middle, Color destination, int n, Display display) {
+		Color[] result = new Color[n+1];
+		Color[] temp = getColorShades(source, middle, (n/2), display);
+		System.arraycopy(temp, 0, result, 0, temp.length);
+		int pos = temp.length;
+		result[pos] = new Color(display, middle.getRGB());
+		temp = getColorShades(middle, destination, (n - temp.length), display);
+		System.arraycopy(temp, 0, result, (pos+1), temp.length);
+		return result;
+	}
+
+	/**
+	 * Takes the source color and calculates the brightness interval with each
+	 * color of the shades array. Then creates a new color array based on the
+	 * destination color and the brightness intervals.  
+	 */
+	public static RGB[] getColorShades(RGB source, RGB[] shades, RGB destination) {
+		RGB[] result = new RGB[shades.length];
+		for (int i = 0; i < shades.length; i++) {
+			RGB shade = shades[i];
+			float interval = getBrightnessInterval(source, shade);
+			result[i] = getShadeRGB(destination, interval);
+		}
+		return result;
+	}
+
+	/**
+	 * Converts the specified HSB values to a RBG value.
+	 *
+	 * @version 	initial
+	 *
+	 * @param	hue			the hue component
+	 * @param	saturation	the saturation component
+	 * @param	brightness	the brightness component
+	 *
+	 * @return	an <code>int</code> which is the converted RGB value
+	 */
+	public static int HSBtoRGB(float hue, float saturation, float brightness) {
+		float s = saturation;
+		float v = brightness;
+
+		int x = Math.round(v * 255);
+
+		if (s == 0) {
+			return 0xff000000 | (x << 16) | (x << 8) | x;
+		} else {
+			float h;
+			if (hue == 1.0f)
+				h = 0f;
+			else
+				h = (hue - (float)Math.floor(hue)) * 6.0f;
+
+			int i = (int)Math.floor(h);
+			float f = h - i;
+
+			int p = Math.round(255 * (v * (1 - s)));
+			int q = Math.round(255 * (v * (1 - (s * f))));
+			int t = Math.round(255 * (v * (1 - (s * (1 - f)))));
+			switch(i){
+				case 0: return 0xff000000 | (x << 16) | (t << 8) | p;
+				case 1: return 0xff000000 | (q << 16) | (x << 8) | p;
+				case 2: return 0xff000000 | (p << 16) | (x << 8) | t;
+				case 3: return 0xff000000 | (p << 16) | (q << 8) | x;
+				case 4: return 0xff000000 | (t << 16) | (p << 8) | x;
+				case 5: return 0xff000000 | (x << 16) | (p << 8) | q;
+				default: return 0;
+			}
+		}
+	}
+
+	/**
+	 * Fill and return the specified array with the specified RGB values
+	 * converted to HSB. Create, fill and return a new array if <code>null</code>
+	 * is passed in.
+	 * <p>
+	 * Color components must be in the range (0 - 255).
+	 *
+	 * @version 	initial
+	 *
+	 * @param	red		the red component
+	 * @param	green	the green component
+	 * @param	blue	the blue component
+	 * @param	hsb		the return value or <code>null</code>
+	 *
+	 * @return	an <code>float[]</code> containing the converted HSB values
+	 *
+	 * @throws	IllegalArgumentException	if any of the components are invalid
+	 */
+	public static float[] RGBtoHSB(int red, int green, int blue, float hsb[]) {
+		if ((red < 0 || red > 255) ||
+			(green < 0 || green > 255) ||
+			(blue < 0 || blue > 255))
+				throw new IllegalArgumentException();
+
+		float r = red / 255f;
+		float g = green / 255f;
+		float b = blue / 255f;
+
+		float h = 0; // hue
+		float s; // saturation
+		float v; // brightnees
+
+		float max = Math.max(r, Math.max(g, b));
+		float min = Math.min(r, Math.min(g, b));
+
+		// Calculate brightness
+		v = max;
+
+		// Calculate saturation
+		if (max != 0)
+			s = (max - min)/max;
+		else
+			s = 0;
+
+		// Calculate hue
+		if (s != 0) {
+			float delta = max - min;
+			if (r == max)
+				h = (g - b)/delta;
+			else if (g == max)
+				h = 2 + (b - r)/delta;
+			else if (b == max)
+				h = 4 + (r - g)/delta;
+
+			h = h * 60f;
+			if (h < 0)
+				h = h + 360f;
+			h /= 360f;
+		}
+
+		// Fill return value
+		if (hsb == null)
+			return new float[]{h, s, v};
+		else {
+			hsb[0] = h;
+			hsb[1] = s;
+			hsb[2] = v;
+			return hsb;
+		}
+	}
+
+	/**
+	 * Answers the blue component of the receiver.
+	 *
+	 * @version 	initial
+	 *
+	 * @return	an <code>int</code> which is the blue component of the receiver
+	 * 			in the range (0 - 255)
+	 *
+	 */
+	private static final int getBlue(int rgb) {
+		return rgb & 0xff;
+	}
+
+	/**
+	 * Answers the green component of the receiver.
+	 *
+	 * @version 	initial
+	 *
+	 * @return	an <code>int</code> which is the green component of the receiver
+	 * 			in the range (0 - 255)
+	 */
+	private static final int getGreen(int rgb) {
+		return (rgb & 0xff00) >> 8;
+	}
+
+	/**
+	 * Answers the red component of the receiver.
+	 *
+	 * @version 	initial
+	 *
+	 * @return	an <code>int</code> which is the red component of the receiver
+	 * 			in the range (0 - 255)
+	 */
+	private static final int getRed(int rgb) {
+		return (rgb & 0xff0000) >> 16;
+	}
+
+	/**
+	 * Replaces the given color in the image data.
+	 */
+	public static void replaceColor(ImageData data, RGB from, RGB to) {
+		for (int x = 0; x < data.width; x++) {
+			for (int y = 0; y < data.height; y++) {
+				int pixel = data.getPixel(x, y);
+				RGB rgb = data.palette.getRGB(pixel);
+				if (rgb.equals(from)) {
+					pixel = data.palette.getPixel(to);
+				}
+				data.setPixel(x, y, pixel);
+			}
+		}
+	}
+	
+	/**
+	 *  scales the colors to be relative to the background and foreground colors (used to handle
+	 *  high contrast mode)
+	 *  
+	 **/
+	public static Color getRelativeColor(Device device, int r, int g, int b) {
+		Color baseForeground = Display.getCurrent().getSystemColor(SWT.COLOR_LIST_FOREGROUND);
+		Color baseBackground = Display.getCurrent().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+		int fr = baseForeground.getRed();
+		int fg = baseForeground.getGreen();
+		int fb = baseForeground.getBlue();
+		int br = baseBackground.getRed();
+		int bg = baseBackground.getGreen();
+		int bb = baseBackground.getBlue();
+		
+		int nr = (int) (fr + ((float)r * (br-fr) / 255));
+		int ng = (int) (fg + ((float)g * (bg-fg) / 255));
+		int nb = (int) (fb + ((float)b * (bb-fb) / 255));
+		
+		// safety check, make sure all colors are in the correct range (in case we change the calculation above
+		nr = Math.max(0, nr);
+		nr = Math.min(255, nr);
+		ng = Math.max(0, ng);
+		ng = Math.min(255, ng);
+		nb = Math.max(0, nb);
+		nb = Math.min(255, nb);
+		return new Color(null, nr, ng, nb);
+	}
+	
+	/**
+	 *  Scales the colors to be relative to the background and foreground colors (used to handle
+	 *  high contrast mode)
+	 */
+	public static RGB getRelativeRGB(int r, int g, int b) {
+		Color baseForeground = Display.getCurrent().getSystemColor(SWT.COLOR_LIST_FOREGROUND);
+		Color baseBackground = Display.getCurrent().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+		int fr = baseForeground.getRed();
+		int fg = baseForeground.getGreen();
+		int fb = baseForeground.getBlue();
+		int br = baseBackground.getRed();
+		int bg = baseBackground.getGreen();
+		int bb = baseBackground.getBlue();
+		
+		int nr = (int) (fr + ((float)r * (br-fr) / 255));
+		int ng = (int) (fg + ((float)g * (bg-fg) / 255));
+		int nb = (int) (fb + ((float)b * (bb-fb) / 255));
+		
+		// safety check, make sure all colors are in the correct range (in case we change the calculation above
+		nr = Math.max(0, nr);
+		nr = Math.min(255, nr);
+		ng = Math.max(0, ng);
+		ng = Math.min(255, ng);
+		nb = Math.max(0, nb);
+		nb = Math.min(255, nb);
+		return new RGB(nr, ng, nb);
+	}
+
+	public static Color getRelativeColor(Color c) {
+		Color cr = getRelativeColor(null, c.getRed(), c.getGreen(), c.getBlue());
+		c.dispose();
+		return cr;
+	}
+	
+	public static Color getRelativeColorFromSystem(Color c) {
+		return getRelativeColor(null, c.getRed(), c.getGreen(), c.getBlue());
+	}
+
+	public static boolean isInvertedColorScheme() {
+		Color baseForeground = Display.getCurrent().getSystemColor(SWT.COLOR_LIST_FOREGROUND);
+		Color baseBackground = Display.getCurrent().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+		
+		// normally, the foreground color is dark, compare the sums to see which one is "lighter"
+		if ((baseForeground.getRed() + baseForeground.getBlue() + baseForeground.getGreen()) >
+			(baseBackground.getRed() + baseBackground.getBlue() + baseBackground.getGreen())) {
+				return true;
+			}
+		return false;
+	}
+	
+	public static RGB getLightShade(RGB rgb, int numerator, int denominator) {
+		int light = 255 * numerator;
+		int red = (rgb.red + light) / denominator;
+		int green = (rgb.green + light) / denominator;
+		int blue = (rgb.blue + light) / denominator;
+		return new RGB(red, green, blue);
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/CommonUIPlugin.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/CommonUIPlugin.java
new file mode 100644
index 0000000..f3dddcb
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/CommonUIPlugin.java
@@ -0,0 +1,272 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui;
+
+import java.lang.reflect.Field;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.bpel.common.ui.details.IDetailsColors;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plug-in class to be used in the desktop.
+ */
+
+@SuppressWarnings("nls")
+
+public class CommonUIPlugin extends AbstractUIPlugin {
+	
+	/** Our plug-in id */
+	public static final String PLUGIN_ID = "org.eclipse.bpel.common.ui"; //$NON-NLS-1$
+
+	//The shared instance.
+	private static CommonUIPlugin plugin;
+	
+	private ColorRegistry colorRegistry;
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=330813
+	private ImageRegistry imageRegistry;
+	
+	/**
+	 * The constructor.
+	 */
+	public CommonUIPlugin() {
+		// nothing
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 * @return the plugin singleton
+	 */
+	public static CommonUIPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path.
+	 *
+	 * @param path the path
+	 * @return the image descriptor
+	 */
+	
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.bpel.common.ui", path);
+	}
+	
+	/**
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#getImageRegistry()
+	 */
+	@Override
+	public synchronized ImageRegistry getImageRegistry() {
+		if (imageRegistry == null) {
+			imageRegistry = super.getImageRegistry();
+			initializeImages(Display.getCurrent());
+		}
+		return imageRegistry;
+	}
+
+	/**
+	 * Return color registry.
+	 * @return the color registry.
+	 */
+	public synchronized ColorRegistry getColorRegistry() {
+		if (colorRegistry == null) {
+			colorRegistry = new ColorRegistry();
+			registerColors(Display.getCurrent());
+		}
+		return colorRegistry;
+	}
+
+	/**
+	 * Creates an image and places it in the image registry.
+	 */
+	private void createImageDescriptor(String id, URL baseURL) {
+		URL url = null;
+		try {
+			url = new URL(baseURL, ICommonUIConstants.ICON_PATH + id);
+		} catch (MalformedURLException e) {
+		}
+		ImageDescriptor desc = ImageDescriptor.createFromURL(url);
+		getImageRegistry().put(id, desc);
+	}
+
+	/**
+	 * Initializes the table of images used in this plugin.
+	 */
+	private void initializeImages (Display display) {
+		URL baseURL = getBundle().getEntry("/"); //$NON-NLS-1$
+
+		// A little reflection magic ... so that we don't
+		// have to add the createImageDescriptor every time
+		// we add it to the IBPELUIConstants ..
+		Field fields[] = ICommonUIConstants.class.getFields();	
+		for(int i=0; i < fields.length; i++) {
+			Field f = fields[i];
+			if (f.getType() != String.class) { 
+				continue;
+			}
+			String name = f.getName();
+			if (name.startsWith("ICON_") || name.startsWith("CURSOR_")) {   //$NON-NLS-1$ //$NON-NLS-2$
+				try {
+					String value = (String) f.get(null);
+					createImageDescriptor(value, baseURL);
+				} catch (Exception e) {
+					log(e);
+				}
+			}			
+		}
+		
+		//	tray buttons
+		ImageRegistry registry = getImageRegistry();
+		ImageDescriptor desc = registry.getDescriptor(ICommonUIConstants.ICON_TRAY_EXPAND_ARROW);
+		
+		registry.remove(ICommonUIConstants.ICON_KEY_TRAY_COLLAPSE_BUTTON );
+		registry.remove(ICommonUIConstants.ICON_KEY_TRAY_EXPAND_BUTTON );
+		
+		registry.put(ICommonUIConstants.ICON_KEY_TRAY_COLLAPSE_BUTTON, desc.createImage());
+		ImageData data = ImageUtils.flip(desc.getImageData());
+		registry.put(ICommonUIConstants.ICON_KEY_TRAY_EXPAND_BUTTON, new Image(display, data));		
+	}
+	
+	/**
+	 * Register the colors used by the details editor and its parts. 
+	 */
+	private void registerColors(Display display) {
+		RGB light = display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND).getRGB();
+		RGB dark = ColorUtils.getShadeRGB(light, -0.09019605f);
+		RGB shadow = ColorUtils.getShadeRGB(light, -0.20f);
+		RGB scrollBtn = ColorUtils.getShadeRGB(light, -0.1921568f);
+
+		ColorRegistry registry = getColorRegistry();
+		registry.put(IDetailsColors.COLOR_LIGHT_BACKGROUND, light);
+		registry.put(IDetailsColors.COLOR_DARK_BACKGROUND, dark);
+		registry.put(IDetailsColors.COLOR_DARK_SHADOW, shadow);
+		registry.put(IDetailsColors.COLOR_TOOL_SELECTED_1, light);
+		registry.put(IDetailsColors.COLOR_TOOL_SELECTED_2, dark);
+		registry.put(IDetailsColors.COLOR_SCROLL_BUTTON, scrollBtn);
+		registry.put(IDetailsColors.COLOR_TOOL_SELECTED_BORDER, display.getSystemColor(SWT.COLOR_LIST_BACKGROUND).getRGB());
+		RGB canvas = display.getSystemColor(SWT.COLOR_LIST_BACKGROUND).getRGB();
+		registry.put(IDetailsColors.COLOR_CANVAS, canvas);
+		registry.put(IDetailsColors.COLOR_TEXT, display.getSystemColor(SWT.COLOR_LIST_FOREGROUND).getRGB());
+		
+		// tray
+		registry.put(IDetailsColors.COLOR_TRAY_BACKGROUND, ColorUtils.getLightShade(light, 2, 3));
+		
+		// selection handler
+		Color selectionColor = Display.getCurrent().getSystemColor(SWT.COLOR_LIST_SELECTION);
+		colorRegistry.put(ICommonUIConstants.COLOR_SELECTION_HANDLE_CORNER, ColorUtils.getLightShade(selectionColor.getRGB(), 2, 3));
+	}
+
+	/**
+	 * Method to create an error status object and write an error message to the log
+	 * based on the passed boolean value.  
+	 * Return the IStatus that is created.
+	 * 
+	 * @param message message that describes the error 
+	 * @param e Exception
+	 * @param writeToLog boolean, whether or not to write the exception and message to the log
+	 * @return IStatus
+	 */
+	public IStatus createErrorStatus(String message, Exception e, boolean writeToLog){
+		IStatus status = new Status(
+			IStatus.ERROR,
+			CommonUIPlugin.PLUGIN_ID, 
+			0, 
+			message, 
+			e);
+		
+		if (writeToLog)
+			CommonUIPlugin.plugin.getLog().log(status);
+		return status;
+	}
+	
+	/**
+	 * Utility methods for logging exceptions.
+	 * @param e exception
+	 * @param severity severity
+	 */
+	public static void log(Exception e, int severity) {
+		IStatus status = null;
+		if (e instanceof CoreException) {
+			status = ((CoreException)e).getStatus();
+		} else {
+			String m = e.getMessage();
+			status = new Status(severity, PLUGIN_ID, 0, m==null? "<no message>" : m, e);
+		}
+		System.out.println(e.getClass().getName()+": "+status);
+		CommonUIPlugin.getDefault().getLog().log(status);
+	}
+
+	/**
+	 * Log an exception.
+	 * 
+	 * @param e
+	 */
+	
+	public static void log(Exception e) { 
+		log(e, IStatus.ERROR); 
+	}
+	
+	
+	/**
+	 * The configuration elements for our extension points
+	 * 
+	 * @param extensionPointId our extension points 
+	 * 
+	 * @return the configuration elements.
+	 * 
+	 */
+	
+	public static IConfigurationElement[] getConfigurationElements (String extensionPointId) {
+		
+		IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(PLUGIN_ID, extensionPointId);
+		if (extensionPoint == null) {
+			return new IConfigurationElement[0];
+		}
+		return extensionPoint.getConfigurationElements();
+	}
+	
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/ICommonUIConstants.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/ICommonUIConstants.java
new file mode 100644
index 0000000..c8b29b9
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/ICommonUIConstants.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui;
+
+
+/**
+ * General constants for the common.ui plug-in.
+ */
+public interface ICommonUIConstants {
+
+	// Image path
+	public final String ICON_PATH = "icons/"; //$NON-NLS-1$
+
+	//-----------------------------------------------------------------------------------
+
+	// tray icons
+	public final String ICON_TRAY_CATEGORY_ADD_BUTTON = "obj16/add_exe.gif"; //$NON-NLS-1$
+	public final String ICON_TRAY_CATEGORY_REMOVE_BUTTON = "obj16/remove_exe.gif"; //$NON-NLS-1$
+	public final String ICON_TRAY_EXPAND_ARROW = "obj/tray_expand.png"; //$NON-NLS-1$
+	public final String ICON_KEY_TRAY_EXPAND_BUTTON = "expandTray"; //$NON-NLS-1$
+	public final String ICON_KEY_TRAY_COLLAPSE_BUTTON = "collapseTray"; //$NON-NLS-1$
+
+	//-----------------------------------------------------------------------------------
+	// Message icons
+	public final String ICON_SM_BLANK = "obj/sm_blank.gif"; //$NON-NLS-1$
+	public final String ICON_SM_INFO = "obj/sm_info.gif"; //$NON-NLS-1$
+	public final String ICON_SM_WARN = "obj/sm_warn.gif"; //$NON-NLS-1$
+	public final String ICON_SM_ERROR = "obj/sm_error.gif"; //$NON-NLS-1$
+
+	//-----------------------------------------------------------------------------------
+	// image keys
+	
+	// marker icons
+	public final String ICON_ERROR = "ovr/error.gif"; //$NON-NLS-1$
+	public final String ICON_WARNING = "ovr/warning.gif"; //$NON-NLS-1$
+	public final String ICON_INFO = "ovr/info.gif"; //$NON-NLS-1$
+	
+	// The color of the corners selection handle
+	public final String COLOR_SELECTION_HANDLE_CORNER = "selectionHandlerCorner"; //$NON-NLS-1$
+	
+	// actions
+	public final String ICON_SHOW_PROP_VIEW_D = "dlcl16/showproperties_obj.gif"; //$NON-NLS-1$
+	public final String ICON_SHOW_PROP_VIEW_E = "elcl16/showproperties_obj.gif"; //$NON-NLS-1$
+
+	public final String ICON_SHOW_PALETTE_VIEW_D = "dlcl16/palette.gif"; //$NON-NLS-1$
+	public final String ICON_SHOW_PALETTE_VIEW_E = "elcl16/palette.gif"; //$NON-NLS-1$
+
+	// tools icons
+	public final String ICON_ZOOM_IN_TOOL = "elcl16/zoomin.gif"; //$NON-NLS-1$
+	public final String ICON_ZOOM_OUT_TOOL = "elcl16/zoomout.gif"; //$NON-NLS-1$
+
+	public final String ICON_ZOOM_IN_TOOL_DISABLED = "dlcl16/zoomin.gif"; //$NON-NLS-1$
+	public final String ICON_ZOOM_OUT_TOOL_DISABLED = "dlcl16/zoomout.gif"; //$NON-NLS-1$
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/IUtilsHelpContextIDs.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/IUtilsHelpContextIDs.java
new file mode 100644
index 0000000..40efdc3
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/IUtilsHelpContextIDs.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui;
+
+
+public interface IUtilsHelpContextIDs {
+
+    public static final String PREFIX = CommonUIPlugin.PLUGIN_ID+".";
+    
+    public static final String CONDITION_BUILDER = PREFIX+"CBD010";
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/ImageUtils.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/ImageUtils.java
new file mode 100644
index 0000000..83b85c4
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/ImageUtils.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+
+/**
+ * General image utilities.
+ */
+public final class ImageUtils {
+
+	/**
+	 * Rotates the image data in 90 degrees.
+	 */
+	public static ImageData rotateLeft(ImageData source) {
+		ImageData result = new ImageData(source.height, source.width, source.depth, source.palette);
+		result.transparentPixel = source.transparentPixel;
+		for (int x = 0; x < source.width; x++) {
+			for (int y = 0; y < source.height; y++) {
+				int newX = y;
+				int newY = result.height - x - 1;
+				result.setPixel(newX, newY, source.getPixel(x, y));
+				result.setAlpha(newX, newY, source.getAlpha(x, y));
+			}
+		}
+		return result;
+	}
+	
+	/**
+	 * Inverts the image left to right. 
+	 */
+	public static ImageData flip(ImageData source) {
+		ImageData result = (ImageData)source.clone();
+		result.transparentPixel = source.transparentPixel;
+		for (int y = 0; y < source.height; y++) {
+			for (int x = 0; x < source.width; x++) {
+				int newX = source.width - x - 1;
+				result.setPixel(newX, y, source.getPixel(x, y));
+				result.setAlpha(newX, y, source.getAlpha(x, y));
+			}
+		}
+		return result;
+	}
+	
+	/**
+	 * Creates an image with a transparent background. The given color
+	 * is considered the transparent color.
+	 */
+	public static Image createTransparentImage(int width, int height, Color transparent) {
+		Image tmp = new Image(null, width, height);
+		ImageData data = tmp.getImageData();
+		tmp.dispose();
+		data.transparentPixel = data.palette.getPixel(transparent.getRGB());
+		for(int i = 0; i < data.width; i++) {
+			for (int j = 0; j < data.height; j++) {
+				data.setPixel(i, j, data.transparentPixel);
+			}
+		}
+		return new Image(null, data);
+	}
+
+	/**
+	 * Return an image according to the given a marker severity.
+	 */
+	public static Image getImage(IMarker marker) {
+		switch (marker.getAttribute(IMarker.SEVERITY, -1)) {
+			case IMarker.SEVERITY_ERROR:
+				return CommonUIPlugin.getDefault().getImageRegistry().get(ICommonUIConstants.ICON_ERROR);
+			case IMarker.SEVERITY_WARNING:
+				return CommonUIPlugin.getDefault().getImageRegistry().get(ICommonUIConstants.ICON_WARNING);
+			case IMarker.SEVERITY_INFO:
+				return CommonUIPlugin.getDefault().getImageRegistry().get(ICommonUIConstants.ICON_INFO);
+		}
+		return null;
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/Messages.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/Messages.java
new file mode 100644
index 0000000..bd01365
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/Messages.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+public final class Messages extends NLS {
+
+	private static final String BUNDLE_NAME = "org.eclipse.bpel.common.ui.messages";//$NON-NLS-1$
+	
+
+	private Messages() {
+		// Do not instantiate
+	}
+
+	public static String SynchronizationManager_deleted_title;
+	public static String CompositeEditorManager_Could_not_find_editor;
+	public static String ModelMarkerUtil_8;
+	public static String ModelMarkerUtil_5;
+	public static String ModelMarkerUtil_6;
+	public static String ModelMarkerUtil_7;
+	public static String SynchronizationManager_deleted_message;
+	public static String CalendarPopup_todayButton_text;
+	public static String EditModelCommandStack_validateEdit_message1;
+	public static String EditModelCommandStack_validateEdit_message0;
+	public static String EditPartMarkerEectorator_1 ;
+	public static String CompositeEditor_3;
+	public static String CompositeEditor_2;
+	public static String DatePicker_button_text;
+	public static String CompositeEditor_0;
+	public static String EditModelCommandStack_validateEdit_title;
+	public static String CalendarPopup_noneButton_text;
+	public static String CalendarControl_title;
+	public static String SynchronizationManager_refresh_title;
+	public static String CompositeEditor_Cannot_disconnect_active_editor;
+	public static String SynchronizationManager_refresh_message;
+	public static String SynchronizationManager_saveButtonLabel;
+	public static String CompositeEditorManager_5;
+	public static String DatePicker_noDateSelected;
+
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/Policy.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/Policy.java
new file mode 100644
index 0000000..d91910c
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/Policy.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+
+public class Policy {
+
+	public Policy() {
+	}
+
+	public static IProgressMonitor monitorFor(IProgressMonitor monitor) {
+		if (monitor == null)
+			return new NullProgressMonitor();
+		return monitor;
+	}
+
+	public static IProgressMonitor subMonitorFor(IProgressMonitor monitor, int ticks) {
+		if (monitor == null)
+			return new NullProgressMonitor();
+		if (monitor instanceof NullProgressMonitor)
+			return monitor;
+		return new SubProgressMonitor(monitor, ticks);
+	}
+
+	public static IProgressMonitor subMonitorFor(IProgressMonitor monitor, int ticks, int style) {
+		if (monitor == null)
+			return new NullProgressMonitor();
+		if (monitor instanceof NullProgressMonitor)
+			return monitor;
+		return new SubProgressMonitor(monitor, ticks, style);
+	}
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/ResourceMarkerDecorator.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/ResourceMarkerDecorator.java
new file mode 100644
index 0000000..288e99c
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/ResourceMarkerDecorator.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2010 JBoss, Inc. and others
+ * 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.html
+ */
+package org.eclipse.bpel.common.ui;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ILightweightLabelDecorator;
+
+/**
+ * Lightweight icon decorator for error/warning/info icons in Navigator view
+ *
+ * @see https://jira.jboss.org/browse/JBIDE-6016
+ * @author Bob Brodt
+ * @date Nov 16, 2010
+ */
+public class ResourceMarkerDecorator implements ILightweightLabelDecorator, ICommonUIConstants {
+
+	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=330813
+	// Do not initialize these in constructor - BPEL plugin may not be available yet
+	private static ImageDescriptor img_error = null;
+	private static ImageDescriptor img_warning = null;
+	private static ImageDescriptor img_info = null;
+	
+	public ResourceMarkerDecorator()
+	{
+		super();
+	}
+	
+	public void addListener(ILabelProviderListener listener) {
+	}
+
+	public void dispose() {
+	}
+
+	public boolean isLabelProperty(Object arg0, String arg1) {
+		return false;
+	}
+
+	public void removeListener(ILabelProviderListener listener) {
+	}
+
+	public void decorate(Object element, IDecoration decoration) {
+		try {
+			int severity = ((IResource)element).findMaxProblemSeverity(IMarker.PROBLEM, true, IResource.DEPTH_ONE);
+			switch (severity) {
+			case IMarker.SEVERITY_ERROR:
+				if (img_error==null)
+					img_error = CommonUIPlugin.getDefault().getImageRegistry().getDescriptor(ICommonUIConstants.ICON_ERROR);
+				decoration.addOverlay(img_error);
+				break;
+			case IMarker.SEVERITY_WARNING:
+				if (img_warning==null)
+					img_warning = CommonUIPlugin.getDefault().getImageRegistry().getDescriptor(ICommonUIConstants.ICON_WARNING);
+				decoration.addOverlay(img_warning);
+				break;
+			case IMarker.SEVERITY_INFO:
+				if (img_info==null)
+					img_info = CommonUIPlugin.getDefault().getImageRegistry().getDescriptor(ICommonUIConstants.ICON_INFO);
+				decoration.addOverlay(img_info);
+				break;
+			}
+		}
+		catch(Exception e) {
+		}
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/Utils.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/Utils.java
new file mode 100644
index 0000000..15f3777
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/Utils.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui;
+
+import java.util.StringTokenizer;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * Utility class.
+ */
+public final class Utils {
+
+	/**
+	 * Given an extension point name returns its configuration elements.
+	 */
+	public static IConfigurationElement[] getConfigurationElements(String extensionPointId) {
+		IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(CommonUIPlugin.PLUGIN_ID, extensionPointId);
+		if (extensionPoint == null) {
+			return null;
+		}
+		return extensionPoint.getConfigurationElements();
+	}
+
+	/**
+	 * Stuff for manipulating generated code
+	 * 
+	 * The format for generated code is:
+
+			//@generated:id
+			// <generator 
+			//       source (model)
+			//             goes 
+			//                 here>
+			//@generated:end
+			<generated java code here>
+
+	 */
+    /**
+     * additional tags we need for the model serialization to be stored as Java comments
+     */
+    public static final String GEN_TAG = "//@generated:"; //$NON-NLS-1$
+    /*
+     * Note: GEN_TAG_MID assumed to be substring of the other GEN_TAG's in code below, don't change it without adjusting the logic
+     * Also, adjust the similar code in the embedded editor if any.
+     */
+    public static final String GEN_TAG_MID = "//";  //$NON-NLS-1$
+    public static final String GEN_TAG_END = "//@generated:end"; //$NON-NLS-1$
+    public static final String EMBEDDED_SMAP_PREFIX = "//!SMAP!";	//$NON-NLS-1$
+    
+    /** 
+	 * Utility function that strips out the generated comments for the generated Java code with embedded model.
+	 * @param string - pass the entire block of Java code that is generated from the embedded's getCode function
+	 * @return - returns the Java code with the embedded code subtracted out
+	 */
+	public static String getGeneratedCode(String string) {
+	    StringBuffer sb = new StringBuffer();
+	    StringTokenizer stringTokenizer = new StringTokenizer(string, "\n"); //$NON-NLS-1$
+	    boolean inside = false;
+	    while (stringTokenizer.hasMoreTokens()) {
+	        String s = stringTokenizer.nextToken();
+	        if (s.startsWith(GEN_TAG_MID) && !(s.startsWith(EMBEDDED_SMAP_PREFIX))) {
+	        	// test for end first since GEN_TAG is a prefix of GEN_TAG_END	
+	        	if (inside && s.startsWith(GEN_TAG_END)) {
+	                inside = false;
+	                continue;
+	            }
+	            if (s.startsWith(GEN_TAG)) {
+	                inside = true;
+	                continue; // with next line
+	            }
+	        } else if (!s.startsWith(EMBEDDED_SMAP_PREFIX)){ 
+	            // it's not a commented line, so just regular Java code
+	            sb.append(s);
+	            sb.append("\n");
+	            continue;
+	        }
+	            
+	        if (!inside && !(s.startsWith(EMBEDDED_SMAP_PREFIX))) {
+	            sb.append(s);
+	            sb.append("\n");
+	        }
+	    }
+	    return sb.toString();
+	}
+    
+    /** 
+     * Utility function that returns the id of the generator for the given generated Java code.
+     * Returns <code>null</code> if no generator id is found
+     * @param string - pass the entire block of Java code that is generated
+     * @return - returns the Java code with the generated comment code subtracted out
+     */
+    public static String getGeneratorId(String string) {
+    	if (string != null) {
+            StringTokenizer stringTokenizer = new StringTokenizer(string, "\n"); //$NON-NLS-1$
+            while (stringTokenizer.hasMoreTokens()) {
+                String s = stringTokenizer.nextToken();
+                if (s.startsWith(GEN_TAG_MID)) {
+                    if (s.startsWith(GEN_TAG)) {
+                        return s.substring(GEN_TAG.length()); 
+                    }
+                } 
+            }
+    	}
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/assist/FieldAssistAdapter.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/assist/FieldAssistAdapter.java
new file mode 100644
index 0000000..8b2ec51
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/assist/FieldAssistAdapter.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Oracle Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.assist;
+
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
+import org.eclipse.jface.fieldassist.IControlContentAdapter;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
+
+/**
+ * This is a field assist adapter which extends the core SWT content
+ * assist adapter and allows programmatic opening of the assist dialog 
+ * as well as automatic width sizing.
+ * 
+ * @author Michal Chmielewski (michal.chmielewski@oracle.com)
+ * @date Aug 9, 2006
+ *
+ */
+public class FieldAssistAdapter extends ContentAssistCommandAdapter {
+
+	
+	/**
+	 * @param control
+	 * @param controlContentAdapter
+	 * @param proposalProvider
+	 * @param commandId
+	 * @param autoActivationCharacters
+	 */
+	public FieldAssistAdapter(Control control, IControlContentAdapter controlContentAdapter, IContentProposalProvider proposalProvider, String commandId, char[] autoActivationCharacters) {
+		super(control, controlContentAdapter, proposalProvider, commandId,
+				autoActivationCharacters);
+	}
+
+	/**
+	 * @param control
+	 * @param controlContentAdapter
+	 * @param proposalProvider
+	 * @param commandId
+	 * @param autoActivationCharacters
+	 * @param installDecoration
+	 */
+	public FieldAssistAdapter(Control control, IControlContentAdapter controlContentAdapter, IContentProposalProvider proposalProvider, String commandId, char[] autoActivationCharacters, boolean installDecoration) {
+		super(control, controlContentAdapter, proposalProvider, commandId,
+				autoActivationCharacters, installDecoration);
+	}
+
+	public void  openProposals () {
+		openProposalPopup();
+		getControl().setFocus();
+	}
+	
+	
+	@Override
+	protected void openProposalPopup () {
+		
+		Point popupSize = getPopupSize();
+		popupSize.x = getProposalWidth();
+		
+		super.openProposalPopup();
+	}
+	
+	public int getProposalWidth () {
+		Point size = getControl().getSize();
+		return size.x + 20;
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/calendar/CalendarControl.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/calendar/CalendarControl.java
new file mode 100644
index 0000000..e8f5800
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/calendar/CalendarControl.java
@@ -0,0 +1,763 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.calendar;
+
+import java.text.DateFormatSymbols;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+import org.eclipse.bpel.common.ui.Messages;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Region;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+
+
+/**
+ * Creates a control that allows the user to select a date from a visual 
+ * calendar control.  The control displays a month in a given year as well as
+ * a list of days for that month.  Users can select a date by clicking on a day
+ * or navigating around the calendar with the arrow keys.
+ * 
+ * The text graphic below outlines the key features of the calendar control.
+ * 
+ * <pre>
+ *  |-----------------------|
+ *  | <|    Month Year   |> |
+ *  |-----------------------|
+ *  |  S  M  T  W  T  F  S  |
+ *  | |------------------|  |
+ *  | |                  |  |
+ *  | |                  |  |
+ *  | |       Days       |  |
+ *  | |                  |  |
+ *  | |                  |  |
+ *  | |------------------|  |
+ *  |-----------------------|
+ * </pre>
+ *
+ * These features include:
+ *  <ul>
+ *		<li> arrow buttons to move to the previous/next month
+ *		<li> a title showing the month and year that is displayed in the calendar
+ *		<li> a list of the names of each day of the week
+ *		<li> a day matrix allowing the user to select days in the current month
+ *			 or the last/first days of the next/previous month.
+ *	</ul>
+ *
+ * The length of the day names can be set to a long name (3 characters long) or a 
+ * short name (1 character long).  The setLongDayNames provides this functionality.
+ */
+public class CalendarControl extends Canvas {
+	/** The dayMargin size when long day names are used */
+	private static final int LONG_DAY_MARGIN = 1;
+	
+	/** The dayMargin size when short day names are used */
+	private static final int SHORT_DAY_MARGIN = 5;
+
+	/** The default number of rows to display in the calendar*/
+	private static final int ROW_COUNT = 6;
+	
+	/** The number of pixels off the edge of the title the next/previous 
+	 * arrows will be drawn*/
+	private static final int ARROW_OFFSET = 5;
+	
+	/** The number of pixels between rows in the day matrix */
+	private static final int ROW_SPACING = 5;
+	
+	/** The width of the line separating each column in the day matrix */
+	private static final int LINE_WIDTH = 1;
+	
+	/** The margin size around the days of the week */
+	private static final int DAY_MARGIN = 3;	
+	
+	/** The margin size around the month name*/
+	private static final int MONTH_MARGIN = 4;
+		
+	Calendar calendar = Calendar.getInstance();
+	
+	private ArrayList<SelectionListener> selectionListeners = new ArrayList<SelectionListener>();
+	private CalendarPainter painter;
+	private CalendarMouseAdapter mouseListener;
+		
+	int cellWidth;
+	int cellHeight;
+	int titleHeight;
+	int width;
+	int height;
+	int lineStart;
+	int lineEnd;
+	int dayOfMonthMin;
+	int dayOfMonthMax; 
+	int dayOfWeekMax;
+	int startDayOfWeek; 
+	int lastDayOfPreviousMonth;
+	int[] previousMonth;
+	int[] nextMonth;
+	
+	String title;
+	String[] days;
+	private String[] months;
+
+	/** The width used to separate day names */
+	private int dayMargin;
+
+	/** The selected day of the month */
+	int day;
+	
+	public CalendarControl(Composite parent) {
+		super(parent, SWT.NO_BACKGROUND);
+
+		initializeControlContents();
+		hookControlListener();
+				
+		updateVisuals();
+	}
+	
+	public void setTimeZone(String tz) {
+		calendar.setTimeZone(TimeZone.getTimeZone(tz));
+	}
+	
+	private void initializeControlContents() {		
+		dayOfWeekMax = calendar.getActualMaximum(Calendar.DAY_OF_WEEK);
+		
+		DateFormatSymbols symbols = new DateFormatSymbols();
+		months = symbols.getMonths();
+		setLongDayNames(true);
+	
+		GC gc = new GC(this);
+		Point dayMax = findMaximumSize(gc, days);
+		Point monthMax = findMaximumSize(gc, months);
+		gc.dispose();
+		
+		cellWidth = dayMax.x + (dayMargin * 2) + LINE_WIDTH;
+		cellHeight = dayMax.y + ROW_SPACING;
+		
+		titleHeight = monthMax.y + (MONTH_MARGIN * 2);
+		
+		width = dayOfWeekMax * cellWidth;
+		
+		height = (MONTH_MARGIN * 2) + monthMax.y
+			+ (DAY_MARGIN * 2) + dayMax.y
+			+ ROW_COUNT * (dayMax.y + ROW_SPACING);
+		
+		lineStart = titleHeight + dayMax.y + (DAY_MARGIN * 2);
+		lineEnd = lineStart + ((dayMax.y + ROW_SPACING) * 6);
+		
+		// Calculate the length of the lines that make up
+		// the triangle button.
+		int lineLength = titleHeight - (ARROW_OFFSET * 2); 
+		
+		// Calculate points of previous button polygon
+		previousMonth = new int[6];
+		previousMonth[0] = ARROW_OFFSET;
+		previousMonth[1] = titleHeight / 2;
+		previousMonth[2] = ARROW_OFFSET + (lineLength / 2);
+		previousMonth[3] = ARROW_OFFSET;
+		previousMonth[4] = ARROW_OFFSET + (lineLength / 2);
+		previousMonth[5] = ARROW_OFFSET + lineLength;
+		
+		// Calculate points of next button polygon
+		nextMonth = new int[6];
+		nextMonth[0] = width - ARROW_OFFSET;
+		nextMonth[1] = titleHeight / 2;
+		nextMonth[2] = width - ARROW_OFFSET - (lineLength / 2);
+		nextMonth[3] = ARROW_OFFSET;
+		nextMonth[4] = width - ARROW_OFFSET - (lineLength / 2);
+		nextMonth[5] = ARROW_OFFSET + lineLength;
+	}
+	
+	private void hookControlListener() {
+		addKeyListener(new CalendarKeyAdapter());
+		
+		mouseListener = new CalendarMouseAdapter();
+		addMouseListener(mouseListener);
+		
+		painter = new CalendarPainter(getDisplay());
+		addPaintListener(painter);
+	}
+
+	private Point findMaximumSize(GC gc, String[] displayStrings) {
+		Point max = new Point(0, 0);
+		for (int i = 0; i < displayStrings.length; i++) {
+			Point size = gc.stringExtent(displayStrings[i]);			
+			if (size.x > max.x) {
+				max.x = size.x;
+			}
+			if (size.y > max.y) {
+				max.y = size.y;
+			}
+		}
+		return max;
+	}
+	
+	int getMatrixIndex(int x, int y) {
+		if (lineStart <= y && lineEnd >= y && x >= 0 && x <= width) {
+			int row = (y - lineStart) / cellHeight;
+			int col = x / cellWidth;
+			
+			return (row * dayOfWeekMax) + col + 1;	
+		}
+		return -1;
+	}
+	
+	void changeMonth(boolean next) {
+		if (day > dayOfMonthMax) {
+			day = dayOfMonthMax;
+		} else if (day < dayOfMonthMin) {
+			day = dayOfMonthMin;
+		}
+		
+		if (next) {
+			calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
+		} else {
+			calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
+		}
+		updateVisuals();
+	}
+		
+	void updateVisuals() {		
+		// Set calendar to first day of month so no wrapping occurs
+		// whem the month is set
+		calendar.set(Calendar.DAY_OF_MONTH, dayOfMonthMin);
+		
+		// Find first and last days of month
+		dayOfMonthMin = calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
+		dayOfMonthMax = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+		
+		// Find the day which the first of the month falls on
+		calendar.set(Calendar.DAY_OF_MONTH, dayOfMonthMin);
+		startDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
+
+		// Find the last day of the previous month
+		calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
+		lastDayOfPreviousMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+		calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
+						
+		// Reset the day of the month.  If the day is greater
+		// than the last day in the month (i.e. current day is 31
+		// and switched to a month with 30 days), set day to the
+		// last day of the month.
+		if (day > dayOfMonthMax) {
+			day = dayOfMonthMax;
+		}
+
+		// Cache new title and title width
+		title = NLS.bind(Messages.CalendarControl_title, (new Object[] { months[calendar.get(Calendar.MONTH)], String.valueOf(calendar.get(Calendar.YEAR)) })); 
+		
+		// Redraw the calendar
+		CalendarControl.this.redraw();
+	}
+	
+	void fireSelectionChanged() {
+		Event e = new Event();
+		e.widget = this;
+		e.data = getSelectedDate();
+		
+		for (int i = 0; i < selectionListeners.size(); i++) {
+			SelectionListener listener = selectionListeners.get(i);
+			SelectionEvent se = new SelectionEvent(e);
+			listener.widgetSelected(se);
+			
+			if (!se.doit) break;
+		}
+	}
+	
+	/**
+	 * Adds the listener to the collection of listeners who will be notified when the 
+	 * receiver's selection changes, by sending it one of the messages defined in the 
+	 * SelectionListener interface.
+	 * 
+	 * @param listener the listener which should be notified 
+	 */
+	public void addSelectionListener(SelectionListener listener) {
+		if (listener != null && !selectionListeners.contains(listener)) {
+			selectionListeners.add(listener);
+		}
+	}
+	
+	/**
+	 * Removes the listener from the collection of listeners who will be notified when
+	 * the receiver's selection changes. 
+	 * 
+	 * @param listener the listener which should no longer be notified 
+	 */
+	public void removeSelectionListener(SelectionListener listener) {
+		if (listener != null) {
+			selectionListeners.remove(listener);
+		}
+	}
+	
+	/**
+	 * Returns the date selected in the calendar control.
+	 * 
+	 * @return the date selected in the calendar control.
+	 */
+	public Date getSelectedDate() {
+		calendar.set(Calendar.DAY_OF_MONTH, day);
+		Date date = calendar.getTime();
+		calendar.set(Calendar.DAY_OF_MONTH, dayOfMonthMin);
+		
+		return date;
+	}
+	
+	/**
+	 * Sets the date that is selected in the calendar control. If the date is null
+	 * the current date will be used as the selected date.
+	 * 
+	 * @param the new selected date for the calendar.
+	 */
+	public void setSelectedDate(Date selectedDate) {
+		if (selectedDate == null) {
+			selectedDate = new Date();
+		}
+		calendar.setTime(selectedDate);
+		
+		day = calendar.get(Calendar.DAY_OF_MONTH);
+		
+		updateVisuals();
+	}
+	
+	/**
+	 * Determines whether the calendar is set to use short or long 
+	 * day names.
+	 * 
+	 * A short day name is the first character of a day name.  For example,
+	 * the short day name for Saturday would be S. Long day names are a compressed 
+	 * form of the full day name. For example, the long day name for Saturday would
+	 * be Sat.
+	 * 
+	 * @return Returns true if the calendar is displaying long names or false if it
+	 * 		   is displaying short names.
+	 */
+	public boolean isLongDayNames() {
+		return dayMargin == LONG_DAY_MARGIN;
+	}
+	
+	/**
+	 * Configures the calendar to use either short or long day names.
+	 * 
+	 * @param useLongDayNames If useLongDayNames is true, the calendar will display
+	 * 						  long day names, else it will display short day names.
+	 */
+	public void setLongDayNames(boolean useLongDayNames) {
+		DateFormatSymbols symbols = new DateFormatSymbols();
+		days = symbols.getShortWeekdays();
+		
+		if (useLongDayNames) {
+			dayMargin = LONG_DAY_MARGIN;
+		} else {
+			dayMargin = SHORT_DAY_MARGIN;
+			
+			for (int i = 0; i < days.length; i++) {
+				if (days[i].length() != 0) {
+					days[i] = days[i].substring(0, 1);	
+				}
+			}
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	@Override
+	public void dispose() {	
+		painter.dispose();
+		mouseListener.dispose();
+		
+		super.dispose();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#computeSize(int, int, boolean)
+	 */
+	@Override
+	public Point computeSize(int wHint, int hHint, boolean changed) {
+		return new Point(width, height);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Control#computeSize(int, int)
+	 */
+	@Override
+	public Point computeSize(int wHint, int hHint) {
+		return new Point(width, height);
+	}
+	
+
+	/**
+	 * Responsible for handling all keyboard events of the calendar. The following
+	 * are a list of commands the key adapter listens for and their associated actions.
+	 * 
+	 * <ul>
+	 * 	<li>Shift+Left - Change the calendar month to the previous month.
+	 *  <li>Shift+Right - Change the calendar month to the next month.
+	 *  <li>Up/Down - Move the day selection in the calendar up or down.
+	 *  <li>Left/Right - Move the day selection in the calendar left or right.
+	 * </ul>
+	 * 
+	 * If the new day that is selected is in the next/previous month, the calendar will
+	 * change its display to show that month.
+	 */
+	private class CalendarKeyAdapter extends KeyAdapter {
+		@Override
+		public void keyPressed(KeyEvent e) {
+			int dayChange = 0;
+			int monthChange = 0;
+			
+			switch (e.keyCode) {
+				case SWT.ARROW_UP:
+					if (day - dayOfWeekMax >= dayOfMonthMin) {
+						dayChange -= dayOfWeekMax;
+					} else {
+						calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
+						int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 
+						calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
+						
+						day = (day - dayOfWeekMax) + lastDay;
+
+						monthChange = -1;
+					}
+					break;
+				case SWT.ARROW_DOWN:
+					if (day + dayOfWeekMax <= dayOfMonthMax) {
+						dayChange += dayOfWeekMax;
+					} else {
+						day = (day + dayOfWeekMax) - dayOfMonthMax;
+						monthChange = 1;
+					}
+					break;
+				case SWT.ARROW_LEFT:
+					if ((e.stateMask & SWT.SHIFT) != 0) {
+						changeMonth(false);
+					} else {
+						if (day != dayOfMonthMin) {
+							dayChange--;
+						} else {
+							calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
+							day = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 
+							calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
+							
+							monthChange = -1;
+						}
+					}
+					break;
+				case SWT.ARROW_RIGHT:
+					if ((e.stateMask & SWT.SHIFT) != 0) {
+						changeMonth(true);
+					} else {
+						if (day != dayOfMonthMax) {
+							dayChange++;
+						} else {
+							day = dayOfMonthMin;
+							monthChange = 1;
+						}	
+					}
+					break;
+			}
+			
+			if (dayChange != 0) {
+				day += dayChange;
+				CalendarControl.this.redraw();
+			}
+			
+			if (monthChange != 0) {
+				calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + monthChange);
+				updateVisuals();
+			}
+			
+			if (dayChange != 0 || monthChange != 0) {
+				fireSelectionChanged();
+			}
+		}
+	}
+	
+	/**
+	 * Responsible for handling all mouse events of the calendar.  The mouse adapter 
+	 * implements the following behaviour:
+	 * 
+	 * <ul>
+	 * 	<li>On mouse down on the left/right arrows in the title, the month displayed
+	 * 		on the calendar will shift to the previous/next month.
+	 * 	<li>On mouse down on a day, the day that is clicked is selected.
+	 * </ul>  
+	 * 
+	 * Note: dispose must be called on this object to release operating system 
+	 * 		 resources.
+	 */
+	private class CalendarMouseAdapter extends MouseAdapter {
+		private Region previousRegion;
+		private Region nextRegion;
+		
+		public CalendarMouseAdapter() {
+			previousRegion = new Region();
+			previousRegion.add(previousMonth);
+			
+			nextRegion = new Region();
+			nextRegion.add(nextMonth);
+		}
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
+		 */
+		@Override
+		public void mouseDown(MouseEvent e) {
+			boolean selectionChanged = false;
+			
+			if (e.y > lineStart && e.y < lineEnd) {
+				int offset = (startDayOfWeek == calendar.getFirstDayOfWeek()) ? dayOfWeekMax : 0;
+				
+				int selectedDay = getMatrixIndex(e.x, e.y) - startDayOfWeek + 1 - offset;
+				if (selectedDay > dayOfMonthMax) {
+					day = selectedDay - dayOfMonthMax;
+					changeMonth(true);
+				} else if (selectedDay < dayOfMonthMin) {
+					calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
+					day = calendar.getActualMaximum(Calendar.DAY_OF_MONTH) + selectedDay;
+					calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
+					changeMonth(false);
+				} else {
+					day = selectedDay;
+				}
+				
+				selectionChanged = true;
+				CalendarControl.this.redraw();
+			} else if (nextRegion.contains(e.x, e.y)) {
+				calendar.set(Calendar.MONTH,
+						calendar.get(Calendar.MONTH) + 1);
+				updateVisuals();
+				selectionChanged = true;
+			} else if (previousRegion.contains(e.x, e.y)) {
+				calendar.set(Calendar.MONTH, 
+						calendar.get(Calendar.MONTH) - 1);
+				updateVisuals();
+				selectionChanged = true;
+			}
+			
+			if (selectionChanged) {
+				fireSelectionChanged();
+			}
+		}
+		
+		public void dispose() {
+			if (previousRegion != null) {
+				previousRegion.dispose();
+				previousRegion = null;
+			}
+			
+			if (nextRegion != null) {
+				nextRegion.dispose();
+				nextRegion = null;
+			}
+		}
+	}
+	
+	/**
+	 * The paint listener for the control.  It is responsible for drawing the 
+	 * calendar control on the canvas.  It is also responsible for creating and
+	 * disposing of the resources (i.e. colours, fonts, images) that are required
+	 * for drawing the control.
+	 * 
+	 * Note: dispose must be called on this object to release operating system 
+	 * 		 resources.
+	 */
+	private class CalendarPainter implements PaintListener {
+
+		private int currentDay;
+		private int currentMonth;
+		private int currentYear;
+		
+		private Color background;
+		private Color foreground;
+		private Color titleBackground;
+		private Color titleForeground;
+		private Color lineForeground;
+		private Color disabledForeground;
+		private Font currentDayFont;
+		private Image buffer;
+				
+		public CalendarPainter(Display display) {
+			currentDay = calendar.get(Calendar.DAY_OF_MONTH);
+			currentMonth = calendar.get(Calendar.MONTH);
+			currentYear = calendar.get(Calendar.YEAR);
+			
+			foreground = display.getSystemColor(SWT.COLOR_LIST_FOREGROUND);
+			background = display.getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+			titleBackground = display.getSystemColor(SWT.COLOR_LIST_SELECTION);
+			titleForeground = display.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT);
+			
+			// FIXME The SWT.COLOR_GRAY should be replaced with the disabled color for text.
+			//		 Bug 72207 requests this color constant (https://bugs.eclipse.org/bugs/show_bug.cgi?id=72207)
+			lineForeground = display.getSystemColor(SWT.COLOR_GRAY);
+			disabledForeground = display.getSystemColor(SWT.COLOR_GRAY);
+			currentDayFont = createBoldFont(getFont());
+			
+			buffer = new Image(display, width, height);
+		}
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.swt.events.PaintListener#paintControl(org.eclipse.swt.events.PaintEvent)
+		 */
+		public void paintControl(PaintEvent e) {
+			GC gc = new GC(buffer);
+			gc.setBackground(background);
+			gc.setForeground(foreground);
+			gc.fillRectangle(0, 0, width, height);
+			
+			drawMonthName(gc);
+			drawDayNames(gc);
+			
+			int predayCount = (startDayOfWeek == calendar.getFirstDayOfWeek()) ? dayOfWeekMax : startDayOfWeek - 1;
+			
+			drawDayRange(gc, 0, lastDayOfPreviousMonth - predayCount + 1, predayCount, true);				
+			drawDayRange(gc, predayCount, dayOfMonthMin, dayOfMonthMax, false);
+			drawDayRange(gc, dayOfMonthMax + predayCount, 1, (ROW_COUNT * dayOfWeekMax) - predayCount - dayOfMonthMax, true);
+			
+			drawDayLines(gc);
+			
+			e.gc.drawImage(buffer, 0, 0);
+			gc.dispose();
+		}
+		
+		public void dispose() {
+			if (currentDayFont != null) {
+				currentDayFont.dispose();
+				currentDayFont = null;
+			}
+			
+			if (buffer != null) {
+				buffer.dispose();
+				buffer = null;
+			}
+		}
+		
+		private void drawMonthName(GC gc) {
+			Color gcBackground = gc.getBackground();
+			Color gcForeground = gc.getForeground();
+
+			// Draw title rectangle and month name
+			gc.setBackground(titleBackground);
+			gc.setForeground(titleForeground);		
+			gc.fillRectangle(0, 0, width, titleHeight);
+			gc.drawString(title, (width - gc.stringExtent(title).x) / 2, MONTH_MARGIN);
+			gc.setBackground(gcBackground);
+			gc.setForeground(gcForeground);
+
+			// Draw next/previous month arrows
+			gc.fillPolygon(previousMonth);
+			gc.fillPolygon(nextMonth);
+		}
+		
+		private void drawDayNames(GC gc) {
+			int x = 0;
+			int y = titleHeight + DAY_MARGIN;
+
+			int i = calendar.getFirstDayOfWeek();
+			do {
+				if (days[i] != null && days[i].length() != 0) {
+					Point size = gc.stringExtent(days[i]);
+					
+					gc.drawString(days[i], ((cellWidth - size.x) / 2) + 1 + x, y);
+					x += cellWidth;
+				}
+				i = (i + 1) % days.length;
+			} while (i != calendar.getFirstDayOfWeek());
+		}
+		
+		private void drawDayRange(GC gc, int index, int startDay, int length, boolean disabled) {
+			int x = (index % dayOfWeekMax) * cellWidth;
+			int y = (index / dayOfWeekMax) * cellHeight + lineStart;
+			int dayOfWeek = (index % dayOfWeekMax) + 1;
+			
+			Color gcBackground = gc.getBackground();
+			Color gcForeground = gc.getForeground();
+			Font gcFont = gc.getFont();
+					
+			if (disabled) {
+				gc.setForeground(disabledForeground);
+			}
+			
+			for (int i = startDay; i < startDay + length; i++) {
+				String displayString = String.valueOf(i);
+				
+				if (!disabled && i == day) {
+					gc.setBackground(titleBackground);
+					gc.setForeground(titleForeground);
+				}
+				if (!disabled && currentDay == i && currentMonth == calendar.get(Calendar.MONTH) && currentYear == calendar.get(Calendar.YEAR)) {
+					gc.setFont(currentDayFont);
+				}
+				
+				Point size = gc.stringExtent(displayString);			
+				gc.drawString(displayString, ((cellWidth - size.x) / 2) + 1 + x, y);
+
+				if (!disabled && i == day) {
+					gc.setBackground(gcBackground);
+					gc.setForeground(gcForeground);
+				}
+				if (!disabled && currentDay == i && currentMonth == calendar.get(Calendar.MONTH) && currentYear == calendar.get(Calendar.YEAR)) {
+					gc.setFont(gcFont);
+				}
+				
+				if (dayOfWeek % dayOfWeekMax == 0 && i != dayOfMonthMax) {
+					y += cellHeight;
+					x = 0;
+				} else {
+					x += cellWidth;
+				}
+				dayOfWeek = (dayOfWeek + 1) % dayOfWeekMax;
+			}
+			
+			if (disabled) {
+				gc.setForeground(gcForeground);	
+			}
+		}
+		
+		private void drawDayLines(GC gc) {
+			int x = cellWidth;
+			Color gcForeground = gc.getForeground();
+			
+			gc.setForeground(lineForeground);
+			for (int i = 1; i < dayOfWeekMax; i++) {
+				gc.drawLine(x, lineStart, x, lineEnd);
+				x += cellWidth;
+			}
+			gc.setForeground(gcForeground);
+		}
+		
+		private Font createBoldFont(Font font) {
+			FontData[] data = font.getFontData();
+			for (int i = 0; i < data.length; i++) {
+				data[i].setStyle(data[i].getStyle() | SWT.BOLD);
+			}
+			return new Font(Display.getCurrent(), data);
+		}
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/calendar/CalendarPopup.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/calendar/CalendarPopup.java
new file mode 100644
index 0000000..3dd1b63
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/calendar/CalendarPopup.java
@@ -0,0 +1,292 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.calendar;
+
+import java.util.Date;
+
+import org.eclipse.bpel.common.ui.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Monitor;
+import org.eclipse.swt.widgets.Shell;
+
+
+/**
+ * The CalendarPopup is designed to easily allow other controls to provide
+ * a calendar popup.  The CalendarPopup is responsible for displaying a calendar 
+ * control popup.  
+ * 
+ * The control that uses this class must provide a reference control as an anchor 
+ * point to determine where the popup should be displayed.
+ */
+public class CalendarPopup {
+	
+	Date date;
+	CalendarControl calendar;
+	Shell popupShell;
+	Shell shell;
+	Rectangle bounds;
+	int borderWidth;
+	
+	private Button todayButton;
+	private Button noneButton;
+	
+	/**
+	 * 
+	 * @param shell shell containing the anchor
+	 * @param absoluteBounds anchor bounds relative to the display
+	 * @param borderWidth anchor border width
+	 * @param initialDate
+	 * @return
+	 */
+	public static Date openCalendarPopup(Shell shell, Rectangle absoluteBounds, int borderWidth, Date initialDate) {
+		return openCalendarPopup(shell, absoluteBounds, borderWidth, initialDate, null);
+	}
+	
+	/**
+	 * 
+	 * @param shell shell containing the anchor
+	 * @param absoluteBounds anchor bounds relative to the display
+	 * @param borderWidth anchor border width
+	 * @param initialDate
+	 * @return
+	 */
+	public static Date openCalendarPopup(Shell shell, Rectangle absoluteBounds, int borderWidth, Date initialDate,
+		String timezone) 
+	{
+		CalendarPopup popup = new CalendarPopup(shell, absoluteBounds, borderWidth, initialDate,
+			timezone);
+		popup.open();
+		 
+		Display display = shell.getDisplay();
+		while (!popup.popupShell.isDisposed()) {
+			if (!display.readAndDispatch()) { 
+		 		display.sleep();
+		 	}
+		}
+		
+		popup.dispose();
+		return popup.date;
+	}
+	
+	public static Date openCalendarPopup(Control anchor, Date initialDate) {
+	    Rectangle anchorBounds = anchor.getBounds();
+	    Point absolute = anchor.toDisplay(anchorBounds.x, anchorBounds.y);
+	    anchorBounds.x = absolute.x;
+	    anchorBounds.y = absolute.y;
+	    return openCalendarPopup(anchor.getShell(), anchorBounds, anchor.getBorderWidth(), initialDate);
+	}
+	
+	private CalendarPopup(Shell shell, Rectangle bounds, int borderWidth, Date initialDate,
+		String timezone) 
+	{	
+		this.shell = shell;
+		this.bounds = bounds;
+		this.borderWidth = borderWidth;
+		this.date = initialDate;
+		
+		createShell();
+		hookListeners();
+
+		if (timezone != null)
+			calendar.setTimeZone(timezone);
+		calendar.setSelectedDate(initialDate);
+	}
+	
+	private void createShell() {
+		popupShell = new Shell(shell, SWT.ON_TOP);
+		popupShell.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+		GridLayout gl = new GridLayout(2, true);
+		popupShell.setLayout(gl);
+		
+		calendar = new CalendarControl(popupShell);
+		GridData gd = new GridData();
+		gd.horizontalSpan = 2;
+		calendar.setLayoutData(gd);
+		
+		todayButton = new Button(popupShell, SWT.PUSH);
+		todayButton.setText(Messages.CalendarPopup_todayButton_text); 
+		
+		noneButton = new Button(popupShell, SWT.PUSH);
+		noneButton.setText(Messages.CalendarPopup_noneButton_text); 
+
+		int width = calculateButtonWidthHint();
+		
+		gd = new GridData();
+		gd.horizontalAlignment = GridData.END;
+		gd.widthHint = width;
+		todayButton.setLayoutData(gd);
+		
+		gd = new GridData();
+		gd.horizontalAlignment = GridData.BEGINNING;
+		gd.widthHint = width;
+		noneButton.setLayoutData(gd);
+		
+		popupShell.pack();
+	}
+	
+	private void hookListeners() {
+		popupShell.addListener(SWT.Deactivate,new Listener() {
+			public void handleEvent(final Event e) {
+				e.widget.getDisplay().asyncExec(new Runnable() {
+					public void run() {
+						Shell activeShell = Display.getCurrent().getActiveShell();
+						if(activeShell == null || (activeShell != popupShell)) {
+							selectAndClose(date);
+						}
+					}
+				});
+			}
+		});
+		
+		popupShell.addTraverseListener(new TraverseListener() {
+			public void keyTraversed(TraverseEvent e) {
+				switch (e.keyCode) {
+					case SWT.ESC:
+						selectAndClose(date);
+						e.doit = false;
+						break;
+				}
+			}
+		});
+		
+		calendar.addMouseListener(new MouseAdapter() {
+			private int index = -1;
+			
+			@Override
+			public void mouseDown(MouseEvent e) {
+				index = calendar.getMatrixIndex(e.x, e.y);
+			}
+			
+			@Override
+			public void mouseUp(MouseEvent e) {
+				if (index != -1 && index == calendar.getMatrixIndex(e.x, e.y)) {
+					selectAndClose(calendar.getSelectedDate());
+				} else {
+					index = -1;
+				}
+			}
+		});
+		
+		calendar.addKeyListener(new KeyAdapter() {
+			@Override
+			public void keyPressed(KeyEvent e) {
+				// TODO Is this Platform independent?
+				if (e.keyCode == SWT.CR) {
+					selectAndClose(calendar.getSelectedDate());
+				}
+			}
+		});
+	
+		todayButton.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				selectAndClose(new Date());
+			}
+		});
+		
+		noneButton.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				selectAndClose(null);
+			}
+		});
+	}
+	
+	private int calculateButtonWidthHint() {
+		Point todaySize = todayButton.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+		Point noneSize = noneButton.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+
+		return (todaySize.x > noneSize.x) ? todaySize.x : noneSize.x;	
+	}
+	
+	void selectAndClose(Date date) {		
+		this.date = date;
+		close();
+	}
+		
+	/**
+	 * Shows a popup that contains the calendar control as well as
+	 * "Today" and "None" buttons.
+	 * 
+	 * The popup is displayed in a position that it is fully visible on the screen.  
+	 * It uses the anchor control as a reference point to display the popup.
+	 */
+	private void open() {		
+		calendar.setFocus();
+		
+		Monitor monitor = shell.getMonitor();
+		
+		Rectangle size = popupShell.getBounds();
+		Rectangle monitorBounds = monitor.getBounds();
+		Point location = new Point(bounds.x, bounds.y + bounds.height); 
+				
+		if (location.x + size.width > monitorBounds.x + monitorBounds.width) {
+			location.x = monitorBounds.x + monitorBounds.width - size.width;
+		} else if (location.x < monitorBounds.x) {
+			location.x = monitorBounds.x;
+		} else {
+			location.x -= borderWidth;
+		}
+		
+		if (location.y + size.height > monitorBounds.y + monitorBounds.height) {
+			location.y = location.y - size.height - bounds.height - (borderWidth * 2);
+		} else if (location.y < monitorBounds.y) {
+			location.y = monitorBounds.y;
+		}
+		
+		popupShell.setLocation(location.x, location.y);
+		popupShell.open();
+	}
+	
+	/**
+	 * Hides the calendar popup from view.
+	 */
+	private void close() {
+		if (popupShell == null || popupShell.isDisposed())
+			return;
+		
+		popupShell.setVisible(false);
+		popupShell.dispose();
+	}
+	
+	/**
+	 * Disposes of the resources used by this class.  This method must be called
+	 * when the client is finished with the calendar popup.  
+	 */
+	private void dispose() {
+		if (calendar != null) {
+			calendar.dispose();
+			calendar = null;
+		}
+		
+		if (popupShell != null) {
+			popupShell.dispose();
+			popupShell = null;
+		}
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/calendar/DatePicker.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/calendar/DatePicker.java
new file mode 100644
index 0000000..73a0082
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/calendar/DatePicker.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.calendar;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.util.Date;
+
+import org.eclipse.bpel.common.ui.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+
+
+/**
+ * Creates a control that allows a user to either enter a date in a text 
+ * field or use a popup calendar to select a date.  The image used in the 
+ * show calendar button and the date format style used to format/parse the 
+ * date are configurable.
+ */
+public class DatePicker extends Composite {
+	
+	/** Default date format style used to format date */
+	private static final int DEFAULT_DATE_STYLE = DateFormat.SHORT;
+	
+	private int dateStyle;
+	
+	Text dateDisplayField;
+	private Button showCalendarButton;
+	
+	public DatePicker(Composite parent) {	
+		super(parent, SWT.NONE);
+		
+		dateStyle = DEFAULT_DATE_STYLE;
+		
+		createControls();
+		hookControlListeners();
+	}
+	
+	private void createControls() {
+		GridLayout gl = new GridLayout(2, false);
+		gl.horizontalSpacing = 3;
+		setLayout(gl);
+
+		dateDisplayField = new Text(this, SWT.BORDER | SWT.SINGLE);
+		dateDisplayField.setText(getDateDisplayString(new Date()));
+		GridData gd = new GridData();
+		gd.grabExcessHorizontalSpace = true;
+		gd.horizontalAlignment = GridData.FILL;
+		dateDisplayField.setLayoutData(gd);
+
+		showCalendarButton = new Button(this, SWT.PUSH);
+		showCalendarButton.setText(Messages.DatePicker_button_text); 
+		gd = new GridData();
+		gd.grabExcessHorizontalSpace = false;
+		gd.horizontalAlignment = GridData.BEGINNING;
+		showCalendarButton.setLayoutData(gd);
+	}
+	
+	private void hookControlListeners() {
+		showCalendarButton.addSelectionListener(new SelectionAdapter() { 
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				setDate(CalendarPopup.openCalendarPopup(dateDisplayField, getDate()));
+			}
+		});
+	}
+	
+	private String getDateDisplayString(Date date) {
+		if (date != null) {
+			DateFormat formatter = DateFormat.getDateInstance(dateStyle);
+			return formatter.format(date);	
+		} else {
+			return Messages.DatePicker_noDateSelected; 
+		}
+	}
+		
+	/**
+	 * Returns the date format style that the date picker uses to 
+	 * display its date. This value is style constant from the
+	 * java.text.DateFormat class.  The default style is DateFormat.SHORT. 
+	 * 
+	 * @return Returns the date format style which is used to format the date.
+	 */
+	public int getDateStyle() {
+		return dateStyle;
+	}
+	
+	/**
+	 * Sets the date format style that the picker users to display
+	 * its date. This value is style constant from the 
+	 * java.text.DateFormat class.
+	 * 
+	 * @param style The date format style to be used to format the date
+	 */
+	public void setDateStyle(int style) {
+		dateStyle = style;
+	}
+	
+	/**
+	 * Returns the image that is displayed in the show calendar button.
+	 * 
+	 * @return the image that is displayed in the show calendar button.
+	 */
+	public Image getImage() {
+		return showCalendarButton.getImage();
+	}
+	
+	/**
+	 * Sets the image that is display in the show calendar button.  If null
+	 * is specified, the existing image is removed and the button text is set
+	 * to "..."
+	 *  
+	 * @param image The image to display in the show calendar button or null
+	 * 				if no image should be displayed.
+	 */
+	public void setImage(Image image) {
+		showCalendarButton.setImage(image);
+		
+		if (image != null) {
+			showCalendarButton.setText( "" );
+		} else {
+			showCalendarButton.setText(Messages.DatePicker_button_text); 
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 */
+	@Override
+	public void dispose() {	
+		super.dispose();
+	}
+	
+	/**
+	 * Returns the current date entered in the picker or null if no date or
+	 * an invalid date is entered.
+	 * 
+	 * @return the date of the picker
+	 */
+	public Date getDate() {
+		try {
+			// TODO Should we possibbly attempt to parse the string with
+			//		other date format styles?  That way, a user would be 
+			//		able to enter a valid date that does not conform to 
+			//		the format used by the control 
+			DateFormat formatter = DateFormat.getDateInstance(dateStyle);
+			return formatter.parse(dateDisplayField.getText());	
+		} catch (ParseException e) {
+			return null;
+		}
+	}
+	
+	/**
+	 * Sets the date of the picker or if null is specified, sets the selected
+	 * date to "None"
+	 * 
+	 * @param date The new selected date for the picker
+	 */
+	public void setDate(Date date) {	
+		dateDisplayField.setText(getDateDisplayString(date));
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/command/EditModelCommandFramework.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/command/EditModelCommandFramework.java
new file mode 100644
index 0000000..acfd36b
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/command/EditModelCommandFramework.java
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.command;
+
+import java.util.EventObject;
+
+import org.eclipse.bpel.common.ui.details.IOngoingChange;
+import org.eclipse.bpel.common.ui.editmodel.EditModelCommandStack;
+import org.eclipse.bpel.common.ui.editmodel.PlaceHolderCommand;
+import org.eclipse.bpel.common.ui.editmodel.EditModelCommandStack.SharedCommandStackChangedEvent;
+import org.eclipse.bpel.common.ui.editmodel.EditModelCommandStack.SharedCommandStackListener;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.CommandStack;
+import org.eclipse.gef.commands.CommandStackListener;
+
+
+/**
+ * Support for using IOngoingChange with the EditModel framework.
+ */
+public class EditModelCommandFramework implements ICommandFramework {
+
+	IOngoingChange fCurrentChange;
+	
+	CommandStack fCommandStack;
+	
+	boolean fIgnoreEvents = false;
+	
+	/**
+	 * @param editModelCommandStack
+	 */
+	
+	public EditModelCommandFramework (EditModelCommandStack editModelCommandStack) {
+		
+		fCommandStack = editModelCommandStack;
+		
+		editModelCommandStack.addCommandStackListener(new CommandStackListener() {
+			
+			public void commandStackChanged(EventObject event) {
+				
+				if (fIgnoreEvents || event instanceof SharedCommandStackChangedEvent == false) {
+					return;
+				}
+
+				/** 
+				 * The most important thing to consider here is that we may have pending 
+				 * change through the ChangeHelper mechanism being played on the the stack.
+				 * If we are about to execute a new command or undo the last command, we 
+				 * have to apply any current change (that is execute the new command) before
+				 * either execute or undo is called.
+				 */
+				SharedCommandStackChangedEvent e = (SharedCommandStackChangedEvent) event;
+				
+				/**
+				 * The use case here is that we are about to run a command on the stack and 
+				 * have some pending changes to do. We have to finish the current change first.
+				 * 
+				 */
+				if (e.getProperty() == SharedCommandStackListener.EVENT_START_EXECUTE) {
+					applyCurrentChange();
+				} 
+				
+				
+				/** 
+				 * The use case for applying the currently pending edit is simply that a 
+				 * pending edit may not be applied but an undo is called. 
+				 * In this case, we have to apply the pending command, then undo it.
+				 * 
+				 */
+				
+				if(e.getProperty() == SharedCommandStackListener.EVENT_START_UNDO) {
+					applyCurrentChange();
+				}
+				
+				// FIXME: what about redo?
+				
+			}
+		});
+		
+	}
+	
+	/**
+	 * Forward these to the implementation.
+	 * 
+	 * @see org.eclipse.bpel.common.ui.command.ICommandFramework#abortCurrentChange()
+	 */
+	public void abortCurrentChange() {
+		finishCurrentChange(true);
+	}
+	
+	/**
+	 * @see org.eclipse.bpel.common.ui.command.ICommandFramework#applyCurrentChange()
+	 */
+	
+	public void applyCurrentChange() {
+		finishCurrentChange(false);
+	}
+	
+	/**
+	 * @see org.eclipse.bpel.common.ui.command.ICommandFramework#notifyChangeInProgress(org.eclipse.bpel.common.ui.details.IOngoingChange)
+	 */
+	public void notifyChangeInProgress(IOngoingChange ongoingChange) {
+		
+		if (fCurrentChange != ongoingChange) {
+			applyCurrentChange();
+			
+			if (fCommandStack.getUndoCommand() instanceof PlaceHolderCommand) {
+				throw new IllegalStateException();
+			}
+			
+			PlaceHolderCommand placeholderCommand = new PlaceHolderCommand(ongoingChange.getLabel());
+			
+			fIgnoreEvents = true;
+			try {
+				fCommandStack.execute(placeholderCommand);
+			} finally {
+				fIgnoreEvents = false;
+			}
+			
+			fCurrentChange = ongoingChange;
+		}
+	}
+	
+	/**
+	 * @see org.eclipse.bpel.common.ui.command.ICommandFramework#notifyChangeDone(org.eclipse.bpel.common.ui.details.IOngoingChange)
+	 */
+	
+	public void notifyChangeDone(IOngoingChange ongoingChange) {
+		if (fCurrentChange == ongoingChange) {
+			applyCurrentChange();
+		}
+	}
+	
+	/**
+	 * @see org.eclipse.bpel.common.ui.command.ICommandFramework#execute(org.eclipse.gef.commands.Command)
+	 */
+	public void execute(Command command) {
+		fCommandStack.execute(command);
+	}
+	
+	protected void finishCurrentChange(boolean changeUndone) {
+		
+		if (fCurrentChange == null) {
+			return;
+		}
+		
+		IOngoingChange change = fCurrentChange;
+		
+		// Null out the current change. This is important !!
+		fCurrentChange = null;
+		
+		// Make sure there's a placeholder on the stack.
+		if (fIgnoreEvents) {
+			throw new IllegalStateException();
+		}
+		
+		if (!(fCommandStack.getUndoCommand() instanceof PlaceHolderCommand)) {
+			throw new IllegalStateException();
+		}
+		
+		fIgnoreEvents = true;
+		try {
+			fCommandStack.undo(); // Remove placeholder.
+		} finally {
+			fIgnoreEvents = false;
+		}
+		
+		Command cmd = change.createApplyCommand();
+		if (cmd != null) {
+			cmd.setLabel(change.getLabel());
+			if (changeUndone) {
+				change.restoreOldState();
+			} else {
+				// TODO: if the command is not actually executable, should we call
+				// restoreOldState() instead?  I'm inclined not to because we've been
+				// using !canExecute() to elide no-op commands.  But maybe we should
+				// rethink that (especially since IOngoingChange makes it much less
+				// common, and maybe confusing, to elide a command in that way?).
+
+				// TODO: above comment is obsolete.  Now that no-ops are handled in
+				// a different way by EditModelCommandStack, we should consider calling
+				// restoreOldState() if canExecute() fails.
+				fCommandStack.execute(cmd);
+			}
+		} else {
+			change.restoreOldState();
+		}
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/command/ICommandFramework.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/command/ICommandFramework.java
new file mode 100644
index 0000000..89760a4
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/command/ICommandFramework.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.command;
+
+import org.eclipse.bpel.common.ui.details.IOngoingChange;
+import org.eclipse.gef.commands.Command;
+
+
+/**
+ * This interface captures command-related functionality (and other miscellaneous
+ * functionality of DetailsArea which is not supported by xtools.common.ui.properties).
+ * 
+ * It will be a base interface of the old IDetailsArea, and editors porting to the xtools
+ * TabbedPropertySheet stuff can also use it directly.
+ */
+public interface ICommandFramework {
+
+	/**
+	 * This is meant to be called by details sections, e.g. in response to
+	 * an SWT.Modify event.
+	 * 
+	 * Notifies the details area that some part of ongoingChange is occurring.
+	 * If the currentChange is ongoingChange already, this method has no effect.
+	 * Otherwise, the currentChange (if any) is applied and ongoingChange is
+	 * set as the new currentChange. 
+	 */
+	public void notifyChangeInProgress(IOngoingChange ongoingChange);
+
+	/**
+	 * This is meant to be called by details sections, e.g. in response to
+	 * an SWT.FocusOut event.
+	 * 
+	 * Notifies the details area that the provider of ongoingChange thinks it
+	 * should be ended.  If the currentChange is ongoingChange, it is applied.
+	 * 
+	 * Otherwise (i.e. if the currentChange is NOT ongoingChange), then
+	 * ongoingChange must already be ended, or perhaps it was never started.
+	 * In either case, this method has no effect.
+	 * 
+	 */
+	public void notifyChangeDone(IOngoingChange ongoingChange);
+
+	/**
+	 * Cause the currentChange, if any, to be applied.  This is meant to be
+	 * called by external actions (such as Save) which are not Commands.
+	 */
+	public void applyCurrentChange();
+
+	/**
+	 * Cause the currentChange, if any, to be aborted.  This is meant to be
+	 * called by the Undo action.
+	 */
+	public void abortCurrentChange();
+
+	/**
+	 * Executes a Command on the details editor's CommandStack.  Details sections should
+	 * use this method rather than calling Command.execute() themselves, so the Command
+	 * can participate in the Undo/Redo process.
+	 */
+	public void execute(Command command);
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/decorator/DecorationLayout.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/decorator/DecorationLayout.java
new file mode 100644
index 0000000..8e3b625
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/decorator/DecorationLayout.java
@@ -0,0 +1,202 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.decorator;
+
+import org.eclipse.draw2d.AbstractHintLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+/**
+ * This layout is to assist in the placement of decorations in a layer over top
+ * of a particular figure.
+ * 
+ * There are nine possible locations for a decoration, as defined in the constants.
+ * 
+ * Subclasses should implement the calculateLocation method to specify where a
+ * decoration of a given size should go in the given container, taking into
+ * account the location hint.
+ */
+public class DecorationLayout extends AbstractHintLayout {
+	protected IFigure center, left, top, bottom, right, topLeft, topRight, bottomLeft, bottomRight;
+
+	public DecorationLayout() {
+		super();
+	}
+	
+	/** 
+	 * Calculate an x+y location for a decoration. This method should take into account the location hint,
+	 * which specifies which of nine locations the decoration should go. Different edit parts could
+	 * consider those locations to be at different x+y coordinates depending on the visuals of that edit
+	 * part. For example, in a leaf edit part which has a round rectangle surrounding the activity label,
+	 * the top left should be considered to be just inside the top left corner of the rectangle, as opposed
+	 * to in the top left corner of the figure, which would lie outside this rectangle.
+	 * 
+	 * @param locationHint  one of the nine location constants defining where the decoration should go
+	 * @param container  the containing figure into which the decoration will be inserted
+	 * @param childDimension  the preferred size of the decoration
+	 * @return the preferred location of the decoration based on the input
+	 */
+	protected Point calculateLocation(int locationHint, IFigure container, Dimension childDimension) {
+		Rectangle area = container.getClientArea();
+		switch (locationHint) {
+			case PositionConstants.CENTER: // Center
+				return new Point(area.x + area.width / 2 - childDimension.width / 2, area.y + area.height / 2 - childDimension.height / 2);
+			case PositionConstants.TOP: // Top Center
+				return new Point(area.x + area.width / 2 - childDimension.width / 2, area.y );
+			case PositionConstants.BOTTOM: // Bottom Center
+				return new Point(area.x + area.width / 2 - childDimension.width / 2, area.y + area.height - childDimension.height);
+			case PositionConstants.LEFT: // Center Left
+				return new Point(area.x, area.y + area.height / 2 - childDimension.width / 2);
+			case PositionConstants.RIGHT: // Center Right
+				return new Point(area.x + area.width - childDimension.width, area.y + area.height / 2 - childDimension.height / 2);
+			case PositionConstants.TOP | PositionConstants.LEFT: // Top Left
+				return new Point(area.x, area.y); 
+			case PositionConstants.TOP | PositionConstants.RIGHT: // Top Right
+				return new Point(area.x + area.width - childDimension.width, area.y );
+			case PositionConstants.BOTTOM | PositionConstants.LEFT: // Bottom Left
+				return new Point(area.x, area.y + area.height - childDimension.height);
+			case PositionConstants.BOTTOM | PositionConstants.RIGHT: // Bottom Right
+				return new Point(area.x + area.width - childDimension.width, area.y + area.height - childDimension.height);
+			default:
+				return new Point(area.x, area.y);
+		}
+	}
+	
+	@Override
+	protected Dimension calculatePreferredSize(IFigure container, int wHint, int hHint) {
+		return new Dimension(0, 0);
+	}
+
+	public void layout(IFigure container) {
+		Rectangle rect = new Rectangle();
+		if (top != null && top.isVisible()) {
+			Dimension d = top.getPreferredSize(-1, -1);
+			rect.setLocation(calculateLocation(IMarkerConstants.TOP.intValue(), container, d));
+			rect.setSize(d);
+			top.setBounds(rect);
+		}
+		if (bottom != null && bottom.isVisible()) {
+			Dimension d = bottom.getPreferredSize(-1, -1);
+			rect.setLocation(calculateLocation(IMarkerConstants.BOTTOM.intValue(), container, d));
+			rect.setSize(d);
+			bottom.setBounds(rect);
+		}
+		if (left != null && left.isVisible()) {
+			Dimension d = left.getPreferredSize(-1, -1);
+			rect.setLocation(calculateLocation(IMarkerConstants.LEFT.intValue(), container, d));
+			rect.setSize(d);
+			left.setBounds(rect);
+		}
+		if (right != null && right.isVisible()) {
+			Dimension d = right.getPreferredSize(-1, -1);
+			rect.setLocation(calculateLocation(IMarkerConstants.RIGHT.intValue(), container, d));
+			rect.setSize(d);
+			right.setBounds(rect);
+		}
+		if (center != null && center.isVisible()) {
+			Dimension d = center.getPreferredSize(-1, -1);
+			rect.setLocation(calculateLocation(IMarkerConstants.CENTER.intValue(), container, d));
+			rect.setSize(d);
+			center.setBounds(rect);
+		}
+		if (topLeft != null && topLeft.isVisible()) {
+			Dimension d = topLeft.getPreferredSize(-1, -1);
+			rect.setLocation(calculateLocation(IMarkerConstants.TOP_LEFT.intValue(), container, d));
+			rect.setSize(d);
+			topLeft.setBounds(rect);
+		}
+		if (topRight != null && topRight.isVisible()) {
+			Dimension d = topRight.getPreferredSize(-1, -1);
+			rect.setLocation(calculateLocation(IMarkerConstants.TOP_RIGHT.intValue(), container, d));
+			rect.setSize(d);
+			topRight.setBounds(rect);
+		}
+		if (bottomLeft != null && bottomLeft.isVisible()) {
+			Dimension d = bottomLeft.getPreferredSize(-1, -1);
+			rect.setLocation(calculateLocation(IMarkerConstants.BOTTOM_LEFT.intValue(), container, d));
+			rect.setSize(d);
+			bottomLeft.setBounds(rect);
+		}
+		if (bottomRight != null && bottomRight.isVisible()) {
+			Dimension d = bottomRight.getPreferredSize(-1, -1);
+			rect.setLocation(calculateLocation(IMarkerConstants.BOTTOM_RIGHT.intValue(), container, d));
+			rect.setSize(d);
+			bottomRight.setBounds(rect);
+		}
+	}
+	
+	@Override
+	public void remove(IFigure child) {
+		if (center == child) {
+			center = null;
+		} else if (top == child) {
+			top = null;
+		} else if (bottom == child) {
+			bottom = null;
+		} else if (right == child) {
+			right = null;
+		} else if (left == child) {
+			left = null;
+		} else if (topLeft == child) {
+			topLeft = null;
+		} else if (topRight == child) {
+			topRight = null;
+		} else if (bottomLeft == child) {
+			bottomLeft = null;
+		} else if (bottomRight == child) {
+			bottomRight = null;
+		}
+	}
+	
+	@Override
+	public void setConstraint(IFigure child, Object constraint) {
+		remove(child);
+		super.setConstraint(child, constraint);
+		if (constraint == null) {
+			return;
+		}
+	
+		switch (((Integer) constraint).intValue()) {
+			case PositionConstants.CENTER :
+				center = child;
+				break;
+			case PositionConstants.TOP :
+				top = child;
+				break;
+			case PositionConstants.BOTTOM :
+				bottom = child;
+				break;
+			case PositionConstants.RIGHT :
+				right = child;
+				break;
+			case PositionConstants.LEFT :
+				left = child;
+				break;
+			case PositionConstants.TOP | PositionConstants.LEFT :
+				topLeft = child;
+				break;
+			case PositionConstants.TOP | PositionConstants.RIGHT :
+				topRight = child;
+				break;
+			case PositionConstants.BOTTOM | PositionConstants.LEFT :
+				bottomLeft = child;
+				break;
+			case PositionConstants.BOTTOM | PositionConstants.RIGHT :
+				bottomRight = child;
+				break;
+			default :
+				break;
+		}
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/decorator/EditPartMarkerDecorator.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/decorator/EditPartMarkerDecorator.java
new file mode 100644
index 0000000..a779a22
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/decorator/EditPartMarkerDecorator.java
@@ -0,0 +1,529 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.decorator;
+ 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.bpel.common.ui.Messages;
+import org.eclipse.bpel.common.ui.layouts.AlignedFlowLayout;
+import org.eclipse.bpel.common.ui.layouts.FillParentLayout;
+import org.eclipse.bpel.common.ui.markers.IModelMarkerConstants;
+import org.eclipse.bpel.common.ui.markers.ModelMarkerUtil;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.draw2d.AbstractLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.ImageFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.Layer;
+import org.eclipse.draw2d.LayeredPane;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.graphics.Image;
+
+
+/**
+ * A class to encapsulate marker support for an <code>EditPart</code>. 
+ * The <code>EditPart</code> should hold an instance of this class in a field.
+ * It makes use of the EMF markers support.
+ * 
+ * <p> 
+ * In its <code>refreshVisuals()</code> method, the <code>EditPart</code> should call <code>refresh().</code>
+ * 
+ * In its <code>createFigure()</code> method, the <code>EditPart</code> should call the 
+ * <code>createFigure(IFigure)</code> of this class to decorate its figure.
+ * </p>
+ */
+
+public class EditPartMarkerDecorator {
+
+	protected EObject modelObject;
+	
+	// Multiple model objects that use this decorator to display markers
+	private List<EObject> modelObjects = new ArrayList<EObject>();
+	
+	private boolean fillParent = false;
+	
+	// A Layer to contain the Marker Images.
+	protected Layer decorationLayer;
+	// The layout for the decorationLayer
+	private AbstractLayout decorationLayout;
+	
+	//The layout for the layer that contains the figure to be decorated.
+	private AbstractLayout figureLayout;
+	
+	// by default, the children are bounded to their natural size, otherwise, the size of the children are not
+	// touched and somebody else is responsible for sizing them
+	protected boolean resizeChildren = true; 
+
+	private Object defaultConstraint = IMarkerConstants.CENTER;
+
+	/**
+	 * Brand new shiny EditPartMarkerDecorator with the model object given.
+	 * 
+	 * @param aModelObject  the model object.
+	 */
+	
+	public EditPartMarkerDecorator(EObject aModelObject) {
+		this(aModelObject, null, null);
+	}
+	
+	/**
+	 * Brand new shiny EditPartMarkerDecorator with a list of model objects.
+	 * 
+	 * @param aListOfModelObjects  the model object list.
+	 */
+
+	public EditPartMarkerDecorator(List<EObject> aListOfModelObjects) {
+		this(aListOfModelObjects, null, null);
+	}
+	
+	/**
+	 * Brand new shiny EditPartMarkerDecorator with a model object and a layout.
+	 * 
+	 * @param aModelObject
+	 * @param aLayout  the layout to use.
+	 */
+
+	public EditPartMarkerDecorator (EObject aModelObject, AbstractLayout aLayout) {
+		this(aModelObject, aLayout, null);
+	}
+	
+	/**
+	 * Brand new shiny EditPartMarkerDecorator with a list of model objects and a
+	 * layout.
+	 * 
+	 * @param aListOfModelObjects
+	 *            the list of model objects
+	 * @param aLayout
+	 *            the layout to use.
+	 */
+	
+	public EditPartMarkerDecorator(List<EObject> aListOfModelObjects, AbstractLayout aLayout) {
+		this(aListOfModelObjects, aLayout, null);
+	}
+	
+	/**
+	 * @param aModelObject
+	 * @param aFigureLayout
+	 * @param aDecorationLayout
+	 */
+	
+	public EditPartMarkerDecorator(EObject aModelObject, AbstractLayout aFigureLayout, AbstractLayout aDecorationLayout) {
+		this.modelObject = aModelObject;
+		
+		setFigureLayout(aFigureLayout);
+		
+		if (aDecorationLayout == null) {
+			aDecorationLayout = new DecorationLayout();
+		}
+		setDecorationLayout(aDecorationLayout);
+	}
+	
+	/**
+	 * @param aListOfModelObjects
+	 * @param aLayout
+	 * @param aDecorationLayout
+	 */
+	
+	public EditPartMarkerDecorator(List<EObject> aListOfModelObjects, AbstractLayout aLayout, AbstractLayout aDecorationLayout) {
+		this((EObject)null, aLayout, aDecorationLayout);
+		this.modelObjects = aListOfModelObjects;
+	}
+
+	
+    /**
+     * 
+     * @param fillParentSwitch
+     */
+    public void setFillParent(boolean fillParentSwitch) {
+        this.fillParent = fillParentSwitch;
+    }
+
+    
+    static IMarker[] EMPTY_MARKERS = {};
+    
+    
+	/**
+	 * Draws the markers. 
+	 * This method should be called from the EditPart's refreshVisuals() method.
+	 */
+    
+	protected void refreshMarkers() {
+		
+		if (decorationLayer == null) {
+			return ;
+		}
+		
+		for (List<IMarker> markerList : sortByType ( getMarkers())) {
+			
+			IMarker[] list = markerList.toArray( EMPTY_MARKERS );
+			Object constraint = getConstraint(list[0]);
+			IFigure markerFigure = createFigureForMarkers(list);
+			if (markerFigure != null) {
+				decorationLayer.add(markerFigure, constraint);
+			}
+		}
+	}
+	
+	
+	/**
+	 * Subclasses may override this. Here we sort the  markers by type into several lists.
+	 * Equivalent markers are displayed as "multiple" errors.
+	 * 
+	 * @param markers an array of markers.
+	 * @return a collection of lists of markers.
+	 */
+	
+	protected Collection<List<IMarker>> sortByType ( IMarker[] markers ) {
+		
+		Map <String,List<IMarker>> sorter = new HashMap<String,List<IMarker>>();
+		
+		for(IMarker m : markers) {
+			String type = null;
+			try {
+				type = m.getType();
+			} catch (CoreException e) {
+				continue;
+			}
+			List<IMarker> list = sorter.get(type);
+			if (list == null) {
+				list = new ArrayList<IMarker>();
+				sorter.put(type, list);
+			}
+			list.add(m);			
+		}
+		return sorter.values();		
+	}
+	
+	
+	/**
+	 * Draws the markers. This method should be called from the EditPart's
+	 * refreshVisuals() method.
+	 */
+	public void refresh(){
+		 if(decorationLayer != null) {
+		 	 decorationLayer.removeAll();
+		 }
+		 refreshMarkers();
+	}
+	
+	/** 
+	 * Get the image to be drawn for the marker's figure.  This is obtained 
+	 * from an IModelMarkerContentProvider that must be implemented by the client. 
+	 * If we can't find an image using the content provider we check to see if the
+	 * marker is a problem marker and get the correct icon for it.
+	 * 
+	 * May be overridden by subclasses to change the image.
+	 * 
+	 * @param marker 
+	 * @return an image representing the marker or null if none is available
+	 */
+	protected Image getImage(IMarker marker) {
+		return ModelMarkerUtil.getImage(marker);
+	}
+	
+	protected IMarker[] getMarkers() {
+		return getMarkerMap().values().toArray(EMPTY_MARKERS);
+		
+	}
+
+	/**
+	 * The EditPart's createFigure() method should call this method in order to decorate
+	 * it's figure.
+	 * 
+	 * @param figure The figure to be decorated
+	 * @return the created figure.
+	 */
+	
+	public IFigure createFigure(IFigure figure) {
+		LayeredPane pane = new LayeredPane();
+		Layer layer = new Layer();
+		if (figureLayout == null) {
+		    if (fillParent) {
+		        figureLayout = new FillParentLayout();
+		    } else {
+				figureLayout = new AlignedFlowLayout() {
+					
+					@Override
+					protected void setBoundsOfChild(IFigure parent,	IFigure child,	Rectangle bounds) {
+						parent.getClientArea(Rectangle.SINGLETON);
+						bounds.translate(Rectangle.SINGLETON.x, Rectangle.SINGLETON.y);
+						if (resizeChildren)
+							child.setBounds(bounds);
+						else 
+							child.setLocation(bounds.getLocation());
+					}
+				};
+		    }
+		}
+		layer.setLayoutManager(figureLayout);
+		pane.add(layer);
+		layer.add(figure);
+		if (decorationLayer == null) {
+			decorationLayer = new Layer();
+		}
+		decorationLayer.setLayoutManager(decorationLayout);
+		
+		pane.add(decorationLayer);
+		
+		return pane;
+	}
+
+	/**
+	 * Set the decoration layout.
+	 * 
+	 * @param layout the layout to use
+	 */
+	
+	public void setDecorationLayout(AbstractLayout layout) {
+		decorationLayout = layout;
+		if(decorationLayer != null) {
+			decorationLayer.setLayoutManager(decorationLayout);
+		}
+	}
+
+	/**
+	 * Resize children flag.
+	 * 
+	 * @param resizeChildrenFlag
+	 */
+	
+	public void setResizeChildren (boolean resizeChildrenFlag) {
+		this.resizeChildren = resizeChildrenFlag;
+	}
+
+	/**
+	 * Set the figure layout the layout given.
+	 * 
+	 * @param layout
+	 */
+	
+	public void setFigureLayout(AbstractLayout layout) {
+		figureLayout = layout;
+	}
+
+	/**
+	 * @return Returns the modelObject.
+	 */
+	public EObject getModelObject() {
+		return modelObject;
+	}
+	
+	/**
+	 * Return the list of model objects.
+	 * @return the list of model objects.
+	 */
+	
+	public List<EObject> getModelObjects() {
+		return modelObjects;
+	}
+
+	/**
+	 * Returns a map where the keys are layout constraints and the values are the
+	 * IMarkers that should be displayed for the corresponding constraint.
+	 * 
+	 * May be overridden by subclasses.
+	 * 
+	 * @return Map
+	 */
+	
+	protected Map<Object,IMarker> getMarkerMap() {
+		return Collections.emptyMap();
+	}
+	
+	/**
+	 * Returns the priority of the given marker
+	 * @param marker
+	 * @return the marker priority.
+	 */
+	protected int getPriority (IMarker marker) {
+		
+		Integer priority = null;
+		// first see if we have a priority attribute
+		try {
+			priority = (Integer)marker.getAttribute(IModelMarkerConstants.DECORATION_MARKER_PRIORITY_ATTR);
+		} catch	(CoreException e) {
+			// do nothing
+		} catch (ClassCastException e) {
+			// do nothing
+		}
+		if (priority != null)
+			return priority.intValue();
+
+		// now see if is a problem marker 
+		try {
+			if (marker.isSubtypeOf(IMarker.PROBLEM)) {
+				int severity = marker.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO);
+				if (severity == IMarker.SEVERITY_ERROR)
+					return IMarkerConstants.PRIORITY_ERROR_INDICATOR;
+				if (severity == IMarker.SEVERITY_WARNING)
+					return IMarkerConstants.PRIORITY_WARNING_INDICATOR;
+				if (severity == IMarker.SEVERITY_INFO)
+					return IMarkerConstants.PRIORITY_INFO_INDICATOR;
+			}
+		} catch (CoreException e) {
+			// do nothing
+		}
+		
+		// return the default priority
+		return IMarkerConstants.PRIORITY_DEFAULT;
+	}
+
+	/**
+	 * Default behavior.  May be overridden by subclasses.
+	 * 
+	 * @param marker 
+	 * @return a layout constraint
+	 */
+	protected Object getConstraint (IMarker marker) {
+		
+		try {
+			if (marker.isSubtypeOf(IModelMarkerConstants.DECORATION_GRAPHICAL_MARKER_ID)) {
+				String key = marker.getAttribute(IModelMarkerConstants.DECORATION_GRAPHICAL_MARKER_ANCHOR_POINT_ATTR, ""); //$NON-NLS-1$
+				Object constraint = convertAnchorKeyToConstraint(key);
+				if (constraint != null) {
+					return constraint;
+				}
+			}
+		} catch (CoreException e) {
+        	// Just ignore exceptions getting marker info.
+        	// It is possible that the marker no longer exists.
+        	// Eventually the UI will be notified that the
+        	// marker is removed and it will update.
+		}
+		return defaultConstraint;
+	}
+
+	protected Object convertAnchorKeyToConstraint(String key) {
+		if (key.equals(IMarkerConstants.MARKER_ANCHORPOINT_TOP_CENTRE)) return IMarkerConstants.TOP;
+		if (key.equals(IMarkerConstants.MARKER_ANCHORPOINT_BOTTOM_CENTRE)) return IMarkerConstants.BOTTOM;
+		if (key.equals(IMarkerConstants.MARKER_ANCHORPOINT_LEFT)) return IMarkerConstants.LEFT;
+		if (key.equals(IMarkerConstants.MARKER_ANCHORPOINT_RIGHT)) return IMarkerConstants.RIGHT;
+		if (key.equals(IMarkerConstants.MARKER_ANCHORPOINT_CENTRE)) return IMarkerConstants.CENTER;
+		if (key.equals(IMarkerConstants.MARKER_ANCHORPOINT_TOP_LEFT)) return IMarkerConstants.TOP_LEFT;
+		if (key.equals(IMarkerConstants.MARKER_ANCHORPOINT_TOP_RIGHT)) return IMarkerConstants.TOP_RIGHT;
+		if (key.equals(IMarkerConstants.MARKER_ANCHORPOINT_BOTTOM_LEFT)) return IMarkerConstants.BOTTOM_LEFT;
+		if (key.equals(IMarkerConstants.MARKER_ANCHORPOINT_BOTTOM_RIGHT)) return IMarkerConstants.BOTTOM_RIGHT;
+		return null;
+	}
+	
+	/**
+	 * Return the default constraint.
+	 * 
+	 * @return the default constraint.
+	 */
+	
+	public Object getDefaultConstraint() {
+		return defaultConstraint;
+	}
+
+	/**
+	 * Set the default constraint.
+	 * 
+	 * @param aDefaultContraint the new default constraint.
+	 */
+	
+	public void setDefaultConstraint(Object aDefaultContraint) {
+		this.defaultConstraint = aDefaultContraint;
+	}
+
+	/**
+	 * Creates a figure for the given marker.
+	 * 
+	 * May be overridden by subclasses to change the figure created.
+	 * @param marker
+	 * @return the figure for the marker
+	 */
+	
+	protected IFigure createFigureForMarker(IMarker marker) {
+		Image image = getImage(marker);
+		String text = getText(marker);
+		if (image != null) {
+			ImageFigure imageFigure = new ImageFigure(image);
+			if (text != null) {
+				imageFigure.setToolTip(new Label(text));
+			}
+			return imageFigure;
+		}
+		return null;
+	}
+
+	/**
+	 * Creates a figure for the given markers.
+	 * 
+	 * May be overridden by subclasses to change the figure created.
+	 * @param marker
+	 * @return the figure for the marker
+	 */
+	
+	@SuppressWarnings({ "boxing", "nls" })
+	protected IFigure createFigureForMarkers ( IMarker[] markers ) {
+		
+		if (markers.length == 1) {
+			return createFigureForMarker(markers[0]);
+		}
+		
+		Image image = null;
+		
+		StringBuilder builder = new StringBuilder(128);				
+		builder.append( NLS.bind(Messages.EditPartMarkerEectorator_1, (new Object[] { markers.length })) );
+		
+		for(IMarker m : markers) {
+			if (image == null) {
+				image = getImage(m);
+			}
+			String text = getText(m);
+			if (text != null) {
+				builder.append("\no ").append(text);
+			}
+		}
+				
+		if (image != null) {
+			ImageFigure imageFigure = new ImageFigure(image);
+			imageFigure.setToolTip(new Label( builder.toString() ));
+			return imageFigure;
+		}
+		return null;
+	}
+	
+	/** 
+	 * Get the tooltip text for the marker's figure.  This is obtained 
+	 * from an IModelMarkerContentProvider that must be implemented by the client. 
+	 * If we can't get the text using a content provider we check to see if the
+	 * marker is a problem marker and get the correct text for it.
+	 * 
+	 * May be overridden by subclasses to change the tooltip text.
+	 * 
+	 * @param  marker for which to retrieve the tooltip text
+	 * @return a String of text to display as a tooltip for the marker
+	 */
+	protected String getText(IMarker marker) {
+		return ModelMarkerUtil.getText(marker);
+	}
+
+	/**
+	 * Determines whether the marker is acceptable and should be shown
+	 * for this edit part.
+	 *
+	 * @param marker the marker
+	 * @return <code>true</code> if the marker is acceptable
+	 */
+	protected boolean isAcceptable(IMarker marker) {
+		return true;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/decorator/IMarkerConstants.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/decorator/IMarkerConstants.java
new file mode 100644
index 0000000..5fbe2fa
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/decorator/IMarkerConstants.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.decorator;
+ 
+import org.eclipse.draw2d.PositionConstants;
+
+/**
+ * Useful constants for markers and for the DecorationLayout
+ */
+public interface IMarkerConstants {
+	/**
+	 * @deprecated use IModelMarkerConstants.DECORATION_GRAPHICAL_MARKER_ANCHOR_POINT_ATTR
+	 */
+	@Deprecated
+	public final String MARKER_ANCHORPOINT = "anchorPoint"; //$NON-NLS-1$
+
+	// The following anchor point values should be used for the 
+	// IModelMarkerConstants.DECORATION_GRAPHICAL_MARKER_ANCHOR_POINT_ATTR
+	// marker attribute
+	public final String MARKER_ANCHORPOINT_TOP_CENTRE = "TOP_CENTRE"; //$NON-NLS-1$
+	public final String MARKER_ANCHORPOINT_BOTTOM_CENTRE = "BOTTOM_CENTRE"; //$NON-NLS-1$
+	public final String MARKER_ANCHORPOINT_LEFT = "LEFT"; //$NON-NLS-1$
+	public final String MARKER_ANCHORPOINT_RIGHT = "RIGHT"; //$NON-NLS-1$
+	public final String MARKER_ANCHORPOINT_CENTRE = "CENTRE"; //$NON-NLS-1$
+	public final String MARKER_ANCHORPOINT_TOP_LEFT = "TOP_LEFT"; //$NON-NLS-1$
+	public final String MARKER_ANCHORPOINT_TOP_RIGHT = "TOP_RIGHT"; //$NON-NLS-1$
+	public final String MARKER_ANCHORPOINT_BOTTOM_LEFT = "BOTTOM_LEFT"; //$NON-NLS-1$
+	public final String MARKER_ANCHORPOINT_BOTTOM_RIGHT = "BOTTOM_RIGHT"; //$NON-NLS-1$
+	// Marker attributes for connections
+	public final String MARKER_ANCHORPOINT_SOURCE = "SOURCE"; //$NON-NLS-1$
+	public final String MARKER_ANCHORPOINT_TARGET = "TARGET"; //$NON-NLS-1$
+	
+	public static final Integer CENTER = Integer.valueOf( PositionConstants.CENTER);
+	public static final Integer TOP = Integer.valueOf( PositionConstants.TOP);
+	public static final Integer BOTTOM = Integer.valueOf( PositionConstants.BOTTOM);
+	public static final Integer LEFT = Integer.valueOf( PositionConstants.LEFT);
+	public static final Integer RIGHT = Integer.valueOf( PositionConstants.RIGHT);
+	public static final Integer TOP_LEFT = Integer.valueOf( PositionConstants.TOP | PositionConstants.LEFT);
+	public static final Integer TOP_RIGHT = Integer.valueOf( PositionConstants.TOP | PositionConstants.RIGHT);
+	public static final Integer BOTTOM_LEFT = Integer.valueOf( PositionConstants.BOTTOM | PositionConstants.LEFT);
+	public static final Integer BOTTOM_RIGHT = Integer.valueOf( PositionConstants.BOTTOM | PositionConstants.RIGHT);
+	
+	// The following priority values may be used for the 
+	// IModelMarkerConstants.DECORATION_MARKER_PRIORITY_ATTR
+	// marker attribute
+	// Clients may define their own
+	public static final int PRIORITY_CURRENT_EXECUTION_INDICATOR = 80;
+	public static final int PRIORITY_STATUS_EXECUTION_INDICATOR = 70;
+	public static final int PRIORITY_ERROR_INDICATOR = 60;
+	public static final int PRIORITY_WARNING_INDICATOR = 50;
+	public static final int PRIORITY_OCCURANCE_INDICATOR = 40;
+	public static final int PRIORITY_BREAKPOINT_INDICATOR = 30;
+	public static final int PRIORITY_INFO_INDICATOR = 20;
+	public static final int PRIORITY_SEARCH_RESULT_INDICATOR = 10;
+	public static final int PRIORITY_DEFAULT = 5;  //  priority used if marker has no priority attribute value
+	public static final int PRIORITY_NONE = 0;
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/decorator/LinkEditPartMarkerDecorator.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/decorator/LinkEditPartMarkerDecorator.java
new file mode 100644
index 0000000..553e391
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/decorator/LinkEditPartMarkerDecorator.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.decorator;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.bpel.common.ui.markers.IModelMarkerConstants;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.draw2d.Connection;
+import org.eclipse.draw2d.ConnectionEndpointLocator;
+import org.eclipse.draw2d.ConnectionLocator;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.emf.ecore.EObject;
+
+
+/**
+ * Default implementation of marker behavior for a connection edit part. 
+ * 
+ */
+public class LinkEditPartMarkerDecorator extends EditPartMarkerDecorator {
+	
+	private Connection fConnection;
+	private List<IFigure> fMarkerFigures = new ArrayList<IFigure>();
+	
+	/**
+	 * Brand new shiny LinkEditPartMarkerDecorator
+	 * @param aModelObject
+	 * @param aConnection
+	 */
+	
+	public LinkEditPartMarkerDecorator(EObject aModelObject, Connection aConnection) {
+		super(aModelObject);
+		this.fConnection = aConnection;
+	}
+	
+	/**
+	 * May be overridden by subclasses.
+	 * 
+	 * @param marker 
+	 * @return a layout constraint
+	 */
+	
+	@Override
+	protected Object getConstraint(IMarker marker) {
+		try {
+			if (marker.isSubtypeOf(IModelMarkerConstants.DECORATION_GRAPHICAL_MARKER_ID)) {
+				String anchorString = (String)marker.getAttribute(IModelMarkerConstants.DECORATION_GRAPHICAL_MARKER_ANCHOR_POINT_ATTR);
+				if (anchorString != null) {
+					if (anchorString.equals(IMarkerConstants.MARKER_ANCHORPOINT_SOURCE)) {
+						ConnectionEndpointLocator locator = new ConnectionEndpointLocator(fConnection, false);
+						locator.setUDistance(4);
+						locator.setVDistance(0);
+						return locator;
+					}
+					if (anchorString.equals(IMarkerConstants.MARKER_ANCHORPOINT_TARGET)) {
+						ConnectionEndpointLocator locator = new ConnectionEndpointLocator(fConnection, true);
+						locator.setUDistance(4);
+						locator.setVDistance(0);
+						return locator;
+					}
+					if (anchorString.equals(IMarkerConstants.MARKER_ANCHORPOINT_CENTRE)) return new ConnectionLocator(fConnection, ConnectionLocator.MIDDLE);
+				}
+			}
+		} catch (CoreException e) {
+			// ignore this exception since the marker may no longer exist
+		}
+
+		// default
+		return new ConnectionLocator(fConnection, ConnectionLocator.MIDDLE);
+	}
+
+	/**
+	 * 
+	 */
+	public void removeAllMarkerFigures() {
+		for (IFigure figure : fMarkerFigures) {
+			fConnection.remove(figure);
+		}
+		fMarkerFigures.clear();
+	}
+	
+	/**
+	 * Add marker figure.
+	 * 
+	 * @param figure
+	 */
+	
+	public void addMarkerFigure(IFigure figure){
+		fMarkerFigures.add(figure);
+	}
+	
+	/**
+	 * @return Returns the conn.
+	 */
+	public Connection getConnection() {
+		return fConnection;
+	}
+	
+	
+	/**
+	 * Draws the markers. This method should be called from the EditPart's refreshVisuals()
+	 * method.
+	 */
+	@Override
+	protected void refreshMarkers() {
+		//	Refresh any decorations on this edit part
+		 if(getConnection() != null) {
+		 	 removeAllMarkerFigures();
+	
+		 	 Map<Object, IMarker> constraintToMarkerMap = getMarkerMap();
+			 for(Iterator iter = constraintToMarkerMap.entrySet().iterator(); iter.hasNext(); ) {
+			 	Map.Entry entry = (Map.Entry) iter.next();
+			 	Object constraint = entry.getKey();
+			 	IMarker marker = (IMarker) entry.getValue();
+			 	IFigure markerFigure = createFigureForMarker(marker);
+			 	if (markerFigure != null) {
+			 		addMarkerFigure(markerFigure);
+			 		getConnection().add(markerFigure, constraint);
+			 	}
+			 }
+		 }
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/ButtonIValue.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/ButtonIValue.java
new file mode 100644
index 0000000..6a6887f
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/ButtonIValue.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Oracle Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details;
+
+import org.eclipse.swt.widgets.Button;
+
+/**
+ * @author Michal Chmielewski (michal.chmielewski@oracle.com)
+ * @date Jul 27, 2007
+ *
+ */
+
+public class ButtonIValue implements IValue {
+	
+	Button fWidget;
+
+	/**
+	 * @param w
+	 */
+	public ButtonIValue ( Button w ) {
+		fWidget = w;
+	}
+
+	/**
+	 * @see org.eclipse.bpel.common.ui.details.IValue#get()
+	 */
+	@SuppressWarnings("boxing")
+	public Object get() {
+		return fWidget.getSelection();
+	}
+
+	/** 
+	 * @see org.eclipse.bpel.common.ui.details.IValue#set(java.lang.Object)
+	 */
+	@SuppressWarnings({ "nls", "boxing" })
+	public void set( Object object ) {
+		if (object instanceof Boolean) {
+			Boolean b = (Boolean) object;
+			fWidget.setSelection(b);
+		} else if (object instanceof String) {
+			Boolean b = Boolean.valueOf((String) object);
+			fWidget.setSelection(b);
+		} else if (object == null) {
+			fWidget.setSelection(false);
+		}
+	}
+	
+	
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/ChangeHelper.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/ChangeHelper.java
new file mode 100644
index 0000000..6c21b13
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/ChangeHelper.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details;
+
+import org.eclipse.bpel.common.ui.command.ICommandFramework;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * An abstract IOngoingChange that is also a Listener.  ChangeHelper notifies the
+ * details area of IOngoingChange lifecycle events on behalf of the widget(s) it
+ * listens to.
+ */
+public abstract class ChangeHelper implements IOngoingChange, Listener {
+
+	protected ICommandFramework fCommandFramework;
+	protected int fNonUserChange = 0;
+	
+	/**
+	 * Marks the start of a programmatic change to the widget contents.  Clients must
+	 * call startNonUserChange() before directly setting the widget contents to avoid
+	 * unwanted IOngoingChange lifecycle events.  (Only some widgets/viewers will send the
+	 * unwanted notifications, but all clients should use this pattern anyway).
+	 * Currently, changes may not be nested.
+	 * 
+	 */
+	
+	public void startNonUserChange()  {
+		fNonUserChange += 1;
+	}
+	
+	/**
+	 * Clients who call startNonUserChange() should call finishNonUserChange() as soon
+	 * as possible after the change is done.
+	 * 
+	 * @throws IllegalArgumentException if no change is in progress.
+	 */
+	@SuppressWarnings("nls")
+	public void finishNonUserChange()  {
+		if (fNonUserChange == 0) {
+			throw new IllegalStateException("Non-matching call to finishNonUserChange()") ;
+		}
+		fNonUserChange -= 1;		
+	}
+
+	/** 
+	 * @return true if a programmatic change is in progress.
+	 */
+	public boolean isNonUserChange() {
+		return fNonUserChange > 0;
+	}
+	
+	/**
+	 * 
+	 * @param commandFramework
+	 */
+	public ChangeHelper (ICommandFramework commandFramework) {
+		fCommandFramework = commandFramework;
+	}
+	
+	
+	/**
+	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+	 */
+	public void handleEvent(Event event) {
+		if (isNonUserChange()) {
+			return ;
+		}
+		
+		switch (event.type) {
+		case SWT.KeyDown:
+			if (event.character == SWT.CR) {
+				finish();
+			}
+			break;
+		case SWT.FocusOut:
+			finish(); 
+			break;
+		case SWT.Modify:
+		case SWT.Selection:
+		case SWT.DefaultSelection:
+			modify(); 
+			break;
+		case SWT.Dispose :
+			abort();
+			break;
+		}
+	}
+	
+	/**
+	 * 
+	 */
+	void finish() {		
+		fCommandFramework.notifyChangeDone(this);
+	}
+	
+	/**
+	 * 
+	 */
+	void modify() {		
+		fCommandFramework.notifyChangeInProgress(this);
+	}
+	
+	void abort () {
+		fCommandFramework.abortCurrentChange();
+	}
+	
+	protected boolean isModifyBasedControl(Control c) {
+		if (c instanceof CCombo) {
+			return (c.getStyle() & SWT.READ_ONLY) == 0; // if not read only
+		}
+		return (c instanceof Text);
+	}
+
+	protected boolean isSelectionBasedControl(Control c) {
+		return !(c instanceof Text);
+	}
+
+	/**
+	 * Registers this ChangeHelper with the given control to listen for events
+	 * which indicate that a change is in progress (or done).
+	 * 
+	 * @param controls 
+	 */
+	
+	public void startListeningTo (Control ... controls ) {
+		
+		for (Control control : controls) {
+			
+			control.addListener(SWT.FocusOut, this);
+			control.addListener(SWT.Dispose, this);
+			if (isModifyBasedControl(control)) {
+				control.addListener(SWT.Modify, this);
+			}
+			if (isSelectionBasedControl(control)) {
+				control.addListener(SWT.Selection, this);
+				control.addListener(SWT.DefaultSelection, this);
+			}
+		}
+	}
+	
+	/**
+	 * Registers this ChangeHelper with the given control to listen for the
+	 * Enter key.  When Enter is pressed, the change is considered done (this
+	 * is appropriate for single-line Text widgets).
+	 * @param controls 
+	 */
+	public void startListeningForEnter (Control ... controls) {
+		// NOTE: KeyDown rather than KeyUp, because of similar usage in CCombo.
+		for(Control control : controls) {
+			control.addListener(SWT.KeyDown, this);
+		}
+	}
+	
+	/**
+	 * Unregisters this ChangeHelper from a control previously passed to
+	 * startListeningTo() and/or startListeningForEnter().
+	 * @param controls 
+	 */
+	public void stopListeningTo (Control ...controls ) {
+		for(Control control : controls) {
+			
+			control.removeListener(SWT.FocusOut, this);
+			if (isModifyBasedControl(control)) {
+				control.removeListener(SWT.Modify, this);
+			}
+			if (isSelectionBasedControl(control)) {
+				control.removeListener(SWT.Selection, this);
+				control.removeListener(SWT.DefaultSelection, this);
+			}
+			control.removeListener(SWT.KeyDown, this);
+			
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/DelegateIValue.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/DelegateIValue.java
new file mode 100644
index 0000000..6a1968f
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/DelegateIValue.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Oracle Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details;
+
+/**
+ * @author Michal Chmielewski (michal.chmielewski@oracle.com)
+ * @date Jul 27, 2007
+ *
+ */
+public class DelegateIValue implements IValue {
+	
+	protected IValue fDelegate;
+	
+	/**
+	 * 
+	 */
+	public DelegateIValue () {
+		fDelegate = null;
+	}
+	
+	/**
+	 * @param value
+	 */
+	public DelegateIValue ( IValue value ) {
+		fDelegate = value;
+	}
+	
+	/**
+	 * @return the value in the delegate.
+	 */
+	public Object get () {
+		return fDelegate != null ? fDelegate.get() : null ;		
+	}
+	
+	/**
+	 * @param object
+	 */
+	
+	public void set (Object object) {
+		if (fDelegate == null) {
+			return ;
+		}
+		fDelegate.set(object);
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/FocusContext.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/FocusContext.java
new file mode 100644
index 0000000..b7bdaff
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/FocusContext.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Oracle Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * @author Michal Chmielewski (michal.chmielewski@oracle.com)
+ * @date Jul 27, 2007
+ *
+ */
+@SuppressWarnings("nls")
+public class FocusContext implements IValue , Listener {
+	
+	/** The widget name */
+	public static final String NAME = "name";
+
+	Control [] fControls;
+	
+	Control fFocussed;
+	
+	/**
+	 * @param args
+	 */
+	public FocusContext ( Control ... args ) {
+		
+		fControls = args;
+		
+		for(Control control : fControls) {
+			control.addListener(SWT.FocusIn, this);
+		}
+	}
+	
+	
+	
+	/**
+	 * @see org.eclipse.bpel.common.ui.details.IValue#get()
+	 */
+	@SuppressWarnings("boxing")
+	public Object get () {
+		if (fFocussed == null) {
+			return null;
+		}
+		return fFocussed.getData(NAME);
+	}
+	
+	/**
+	 * @param obj
+	 */
+	
+	public void set ( Object obj ) {
+		for (Control c : fControls) {
+			Object name = c.getData(NAME);
+			if (name == null || name.equals(obj) == false) {
+				continue;
+			}
+			c.setFocus();
+			return ;
+		}
+	}
+
+
+
+	/**
+	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+	 */
+	public void handleEvent (Event event) {
+		if (event.widget instanceof Control) {
+			fFocussed = (Control) event.widget;
+		} else {
+			fFocussed = null;
+		}
+	}
+	
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/IDetailsAreaConstants.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/IDetailsAreaConstants.java
new file mode 100644
index 0000000..bb39bfc
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/IDetailsAreaConstants.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details;
+
+/**
+ * Constants used by the DetailsArea and/or implementors of IDetailsSection.
+ */
+public interface IDetailsAreaConstants {
+
+	/**
+	 * These values are used for the margin around the DetailsArea composite.
+	 * Each details section should use a margin of 0, 0.
+	 */
+	public static final int HMARGIN = 6;
+	public static final int VMARGIN = 6;
+
+	/**
+	 * Space to leave between related widgets.  Each details section should
+	 * use these values for spacing its widgets.  For example, you can use
+	 * +/- HSPACE as the offset of a left or right FlatFormAttachment.
+	 * 
+	 * The DetailsArea composite also inserts VSPACE pixels between section
+	 * composites if more than one section is displayed.  
+	 */
+	public static final int HSPACE = 5;
+	public static final int VSPACE = 4;
+
+	/**
+	 * Space to leave between the center of the details page and the closest
+	 * widget to the left or right.  I.e. for a details page whose widgets are
+	 * logically divided into two halves, the total space between the halves
+	 * should be 2*CENTER_SPACE.
+	 */
+	public static final int CENTER_SPACE = 10;
+
+	// error codes
+	public static final int MISSING_ATTRIBUTE = 1;
+	public static final int COULD_NOT_INSTANTIATE_SECTION = 2;
+	public static final int EDITOR_DOES_NOT_EXIST = 3;
+	public static final int PAGE_DOES_NOT_EXIST = 4;
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/IDetailsColors.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/IDetailsColors.java
new file mode 100644
index 0000000..775be1b
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/IDetailsColors.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details;
+
+/**
+ * Color keys used by the details editor framework.
+ */
+public interface IDetailsColors {
+
+	public static final String COLOR_CANVAS = "canvas"; //$NON-NLS-1$
+	public static final String COLOR_TEXT = "text"; //$NON-NLS-1$
+	public static final String COLOR_DARK_BACKGROUND = "dark_background"; //$NON-NLS-1$
+	public static final String COLOR_LIGHT_BACKGROUND = "light_background"; //$NON-NLS-1$
+	public static final String COLOR_DARK_SHADOW = "dark_shadow"; //$NON-NLS-1$
+	public static final String COLOR_TOOL_SELECTED_1 = "tool_selected_1"; //$NON-NLS-1$
+	public static final String COLOR_TOOL_SELECTED_2 = "tool_selected_2"; //$NON-NLS-1$
+	public static final String COLOR_TOOL_SELECTED_BORDER = "tool_selected_border"; //$NON-NLS-1$
+	public static final String COLOR_SCROLL_BUTTON = "scroll_button"; //$NON-NLS-1$
+
+	// tray
+	public static final String COLOR_TRAY_BACKGROUND = "trayBackground"; //$NON-NLS-1$
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/IOngoingChange.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/IOngoingChange.java
new file mode 100644
index 0000000..7d0647a
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/IOngoingChange.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details;
+
+import org.eclipse.bpel.common.ui.command.ICommandFramework;
+import org.eclipse.gef.commands.Command;
+
+/**
+ * Represents an ongoing change in the widget(s) of the details section.
+ * 
+ * Details sections should notify the details area of the ongoing change
+ * by calling <code>detailsArea.notifyChangeInProgress()</code>.  They
+ * should notify the details area that they think the change must be ended
+ * with <code>detailsArea.notifyChangeDone()</code>.  They are not required
+ * to know if the change is actually in progress when they call
+ * <code>notifyChangeDone()</code>; spurious calls are ignored.
+ * 
+ * Typically they would call <code>notifyChangeInProgress()</code> when they
+ * receive an <code>SWT.Modify</code> or <code>SWT.Selection</code> event 
+ * (depending on the type of widget) and call <code>notifyChangeDone()</code>
+ * from an <code>SWT.FocusOut<code> listener.
+ * 
+ * @see ICommandFramework#notifyChangeInProgress
+ * @see ICommandFramework#notifyChangeDone
+ */
+public interface IOngoingChange {
+
+	/**
+	 * Returns a label which describes the type of change occurring.
+	 * This is used to describe the change in Undo menu items, etc.
+	 * After the change is completed, this label will also be used
+	 * to describe the Command which did the work for the change.  
+	 */
+	public String getLabel();
+
+	/**
+	 * Called by the details area when this change is ended.
+	 * 
+	 * If the current state of the widget(s) is valid, this method should
+	 * construct a Command which will apply the change to the model, and
+	 * return it, otherwise it should return null.
+	 * 
+	 * If createApplyCommand() returns null, OR if createApplyCommand() returns
+	 * a Command which will not immediately be executed, the restoreOldState()
+	 * method will be called, giving clients a chance to restore the contents
+	 * of their widgets.
+	 */
+	public Command createApplyCommand();
+
+	/**
+	 * Called by the details area in either of two situations:
+	 *   (1) createApplyCommand() was just called and it returned null.
+	 *   (2) createApplyCommand() was called and it returned a Command, but the
+	 *     Command will not be immediately executed.
+	 * 
+	 * Most clients would normally update their widgets as a side effect
+	 * of the Command returned from createApplyCommand() being executed (i.e.
+	 * because this fires a listener on something modified by the Command).
+	 * 
+	 * Those clients should refresh their widgets in their implementation of
+	 * this method, since it is called in exactly the situations where the
+	 * update won't be accomplished by the execution of a Command.  
+	 */
+	public void restoreOldState();
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/IValue.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/IValue.java
new file mode 100644
index 0000000..9797493
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/IValue.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Oracle Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details;
+
+/**
+ * @author Michal Chmielewski (michal.chmielewski@oracle.com)
+ * @date Jul 27, 2007
+ *
+ */
+public interface IValue {
+	
+	/**
+	 * Get a value.
+	 * @return the value held
+	 */
+	Object get ();
+	
+	/**
+	 * Set a value
+	 * @param object the value to set
+	 */
+	void set (Object object);
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/RadioButtonIValue.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/RadioButtonIValue.java
new file mode 100644
index 0000000..1b07b99
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/RadioButtonIValue.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Oracle Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details;
+
+import org.eclipse.swt.widgets.Button;
+
+/**
+ * @author Michal Chmielewski (michal.chmielewski@oracle.com)
+ * @date Jul 27, 2007
+ *
+ */
+
+@SuppressWarnings("nls")
+public class RadioButtonIValue implements IValue {
+	
+	/**
+	 * The value key used to lookup the assigned value of
+	 * a radio button via getData() on the widget.
+	 */
+	static public final String VALUE = "value";
+	
+	/** Unset object value, equivalent to null */
+	static public final Object UNSET_VALUE = new Object();
+	
+	Button[] fWidgets;
+
+	/**
+	 * @param args
+	 */
+	public RadioButtonIValue ( Button ... args ) {
+		fWidgets = args;
+	}
+
+	/**
+	 * @see org.eclipse.bpel.common.ui.details.IValue#get()
+	 */
+	@SuppressWarnings("boxing")
+	public Object get() {
+		for(Button n : fWidgets) {
+			if (n.getSelection()) {
+				Object value = n.getData(VALUE);
+				return value == UNSET_VALUE ? null : value;				
+			}
+		}
+		return null;
+	}
+
+	/** 
+	 * @see org.eclipse.bpel.common.ui.details.IValue#set(java.lang.Object)
+	 */
+	@SuppressWarnings({ "nls", "boxing" })
+	public void set ( Object object ) {
+		for (Button n : fWidgets) {
+			Object v = n.getData(VALUE);			
+			n.setSelection( v.equals(object) || (v == UNSET_VALUE && object == null) );
+		}		
+	}
+	
+	
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/TextIValue.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/TextIValue.java
new file mode 100644
index 0000000..724905e
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/TextIValue.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Oracle Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details;
+
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Michal Chmielewski (michal.chmielewski@oracle.com)
+ * @date Jul 27, 2007
+ *
+ */
+
+public class TextIValue implements IValue {
+	
+	Text fWidget;
+
+	/**
+	 * @param w
+	 */
+	public TextIValue ( Text w ) {
+		fWidget = w;
+	}
+
+	/**
+	 * @see org.eclipse.bpel.common.ui.details.IValue#get()
+	 */
+	public Object get() {
+		return fWidget.getText().trim();
+	}
+
+	/** 
+	 * @see org.eclipse.bpel.common.ui.details.IValue#set(java.lang.Object)
+	 */
+	@SuppressWarnings("nls")
+	public void set( Object text ) {
+		if (text == null) {
+			fWidget.setText("");
+		} else {
+			fWidget.setText( text.toString() );
+		}
+	}
+	
+	
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/ViewerIValue.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/ViewerIValue.java
new file mode 100644
index 0000000..2e6896a
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/ViewerIValue.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Oracle Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details;
+
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+
+/**
+ * @author Michal Chmielewski (michal.chmielewski@oracle.com)
+ * @date Jul 27, 2007
+ *
+ */
+public class ViewerIValue implements IValue {
+
+	StructuredViewer fViewer;
+	
+	/**
+	 * @param viewer
+	 */
+	public ViewerIValue ( StructuredViewer viewer ) {
+		fViewer = viewer;
+	}
+	
+	/**
+	 * @see org.eclipse.bpel.common.ui.details.IValue#get()
+	 */
+	public Object get() {
+		StructuredSelection ss = (StructuredSelection) fViewer.getSelection();
+		return ss.getFirstElement();
+	}
+
+	/**
+	 * @see org.eclipse.bpel.common.ui.details.IValue#set(java.lang.Object)
+	 */
+	public void set (Object object) {
+		fViewer.setSelection( object == null ? StructuredSelection.EMPTY : new StructuredSelection(object), true);
+	}
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/viewers/CComboViewer.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/viewers/CComboViewer.java
new file mode 100644
index 0000000..6407e85
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/viewers/CComboViewer.java
@@ -0,0 +1,409 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details.viewers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * A concrete viewer based on an SWT custom <code>CCombo</code> control.
+ */
+public class CComboViewer extends StructuredViewer {
+
+	private org.eclipse.swt.custom.CCombo combo;
+
+	private List<Object> comboMap = new ArrayList<Object>();
+
+	/**
+	 * Creates a combo viewer on a newly-created combo control under the given parent.
+	 * The combo control is created using the SWT style bits <code>H_SCROLL, V_SCROLL,</code> and <code>BORDER</code>.
+	 * The viewer has no input, no content provider, a default label provider, 
+	 * no sorter, and no filters.
+	 *
+	 * @param parent the parent control
+	 */
+	public CComboViewer(Composite parent) {
+		this(parent, SWT.H_SCROLL | SWT.V_SCROLL /* | SWT.BORDER*/
+		);
+	}
+	/**
+	 * Creates a combo viewer on a newly-created combo control under the given parent.
+	 * The combo control is created using the given SWT style bits.
+	 * The viewer has no input, no content provider, a default label provider, 
+	 * no sorter, and no filters.
+	 *
+	 * @param parent the parent control
+	 * @param style the SWT style bits
+	 */
+	public CComboViewer(Composite parent, int style) {
+		this(new org.eclipse.swt.custom.CCombo(parent, style));
+	}
+	/**
+	 * Creates a combo viewer on the given combo control.
+	 * The viewer has no input, no content provider, a default label provider, 
+	 * no sorter, and no filters.
+	 *
+	 * @param combo the combo control
+	 */
+	public CComboViewer(org.eclipse.swt.custom.CCombo curCombo) {
+		this.combo = curCombo;
+		hookControl(curCombo);
+		
+		
+		Listener curListener = new Listener() {
+			public void handleEvent(Event event) {
+
+				switch (event.type) {
+					case SWT.FocusIn :
+						{
+							combo.setFocus();  //* activates the text widget of the combo
+							break;
+						}
+				}
+			}
+		};
+		curCombo.addListener(SWT.FocusIn, curListener);
+		curCombo.addListener(SWT.FocusOut, curListener);
+
+	}
+
+
+	/**
+	 * Adds the given elements to this combo viewer.
+	 * If this viewer does not have a sorter, the elements are added at the end
+	 * in the order given; otherwise the elements are inserted at appropriate positions.
+	 * <p>
+	 * This method should be called (by the content provider) when elements 
+	 * have been added to the model, in order to cause the viewer to accurately
+	 * reflect the model. This method only affects the viewer, not the model.
+	 * </p>
+	 *
+	 * @param elements the elements to add
+	 */
+	public void add(Object[] elements) {
+		Object[] filtered = filter(elements);
+		ILabelProvider labelProvider = (ILabelProvider) getLabelProvider();
+		for (int i = 0; i < filtered.length; i++) {
+			Object element = filtered[i];
+			int ix = indexForElement(element);
+			combo.add(labelProvider.getText(element), ix);
+			comboMap.add(ix, element);
+			mapElement(element, combo); // must map it, since findItem only looks in map, if enabled
+		}
+	}
+	/**
+	 * Adds the given element to this combo viewer.
+	 * If this viewer does not have a sorter, the element is added at the end;
+	 * otherwise the element is inserted at the appropriate position.
+	 * <p>
+	 * This method should be called (by the content provider) when a single element 
+	 * has been added to the model, in order to cause the viewer to accurately
+	 * reflect the model. This method only affects the viewer, not the model.
+	 * Note that there is another method for efficiently processing the simultaneous
+	 * addition of multiple elements.
+	 * </p>
+	 *
+	 * @param element the element
+	 */
+	public void add(Object element) {
+		add(new Object[] { element });
+	}
+	/* (non-Javadoc)
+	 * Method declared on StructuredViewer.
+	 * Since SWT.Combo doesn't use items we always return the Combo itself.
+	 */
+	@Override
+	protected Widget doFindInputItem(Object element) {
+		if (element != null && element.equals(getRoot()))
+			return getCCombo();
+		return null;
+	}
+	/* (non-Javadoc)
+	 * Method declared on StructuredViewer.
+	 * Since SWT.Combo doesn't use items we always return the Combo itself.
+	 */
+	@Override
+	protected Widget doFindItem(Object element) {
+		if (element != null) {
+			if (comboMap.contains(element))
+				return getCCombo();
+		}
+		return null;
+	}
+	/* (non-Javadoc)
+	 * Method declared on StructuredViewer.
+	 */
+	@Override
+	protected void doUpdateItem(Widget data, Object element, boolean fullMap) {
+		if (element != null) {
+			int ix = comboMap.indexOf(element);
+			if (ix >= 0) {
+				ILabelProvider labelProvider = (ILabelProvider) getLabelProvider();
+				combo.setItem(ix, labelProvider.getText(element));
+			}
+		}
+	}
+	/* (non-Javadoc)
+	 * Method declared on Viewer.
+	 */
+	@Override
+	public Control getControl() {
+		return combo;
+	}
+	/**
+	 * Returns the element with the given index from this combo viewer.
+	 * Returns <code>null</code> if the index is out of range.
+	 *
+	 * @param index the zero-based index
+	 * @return the element at the given index, or <code>null</code> if the
+	 *   index is out of range
+	 */
+	public Object getElementAt(int index) {
+		if (index >= 0 && index < comboMap.size())
+			return comboMap.get(index);
+		return null;
+	}
+	/**
+	 * The combo viewer implementation of this <code>Viewer</code> framework
+	 * method returns the label provider, which in the case of combo
+	 * viewers will be an instance of <code>ILabelProvider</code>.
+	 */
+	@Override
+	public IBaseLabelProvider getLabelProvider() {
+		return super.getLabelProvider();
+	}
+	/**
+	 * Returns this combo viewer's combo control.
+	 *
+	 * @return the combo control
+	 */
+	public org.eclipse.swt.custom.CCombo getCCombo() {
+		return combo;
+	}
+	/* (non-Javadoc)
+	 * Method declared on StructuredViewer.
+	 */
+	@Override
+	protected List<Object> getSelectionFromWidget() {
+		int idx = getCCombo().getSelectionIndex();
+		if (idx < 0)
+			return new ArrayList<Object>(0);
+
+		ArrayList<Object> list = new ArrayList<Object>(1);
+		Object e = getElementAt(idx);
+		if (e != null)
+			list.add(e);
+		return list;
+	}
+	/*
+	 * Returns the index where the item should be inserted.
+	*/
+	protected int indexForElement(Object element) {
+		ViewerSorter sorter = getSorter();
+		if (sorter == null)
+			return combo.getItemCount();
+		int count = combo.getItemCount();
+		int min = 0, max = count - 1;
+		while (min <= max) {
+			int mid = (min + max) / 2;
+			Object data = comboMap.get(mid);
+			int compare = sorter.compare(this, data, element);
+			if (compare == 0) {
+				// find first item > element
+				while (compare == 0) {
+					++mid;
+					if (mid >= count) {
+						break;
+					}
+					data = comboMap.get(mid);
+					compare = sorter.compare(this, data, element);
+				}
+				return mid;
+			}
+			if (compare < 0)
+				min = mid + 1;
+			else
+				max = mid - 1;
+		}
+		return min;
+	}
+	/* (non-Javadoc)
+	 * Method declared on Viewer.
+	 */
+	@Override
+	protected void inputChanged(Object input, Object oldInput) {
+		comboMap.clear();
+		Object[] children = getSortedChildren(getRoot());
+		int size = children.length;
+		org.eclipse.swt.custom.CCombo combo = getCCombo();
+		combo.removeAll();
+		String[] labels = new String[size];
+		for (int i = 0; i < size; i++) {
+			Object el = children[i];
+			labels[i] = ((ILabelProvider) getLabelProvider()).getText(el);
+			comboMap.add(el);
+			mapElement(el, combo); // must map it, since findItem only looks in map, if enabled
+		}
+		combo.setItems(labels);
+	}
+	/* (non-Javadoc)
+	 * Method declared on StructuredViewer.
+	 */
+	@Override
+	protected void internalRefresh(Object element) {
+		if (element == null || element.equals(getRoot())) {
+			// the parent
+			if (comboMap != null)
+				comboMap.clear();
+			unmapAllElements();
+			List selection = getSelectionFromWidget();
+			combo.setRedraw(false);
+			combo.removeAll();
+			Object[] children = getSortedChildren(getRoot());
+			ILabelProvider labelProvider = (ILabelProvider) getLabelProvider();
+			for (int i = 0; i < children.length; i++) {
+				Object el = children[i];
+				combo.add(labelProvider.getText(el), i);
+				comboMap.add(el);
+				mapElement(el, combo); // must map it, since findItem only looks in map, if enabled
+			}
+			combo.setRedraw(true);
+			setSelectionToWidget(selection, false);
+		} else {
+			doUpdateItem(combo, element, true);
+		}
+	}
+	/**
+	 * Removes the given elements from this combo viewer.
+	 *
+	 * @param elements the elements to remove
+	 */
+	private void internalRemove(final Object[] elements) {
+		Object input = getInput();
+		for (int i = 0; i < elements.length; ++i) {
+			if (elements[i].equals(input)) {
+				setInput(null);
+				return;
+			}
+			int ix = comboMap.indexOf(elements[i]);
+			if (ix >= 0) {
+				combo.remove(ix);
+				comboMap.remove(ix);
+				unmapElement(elements[i], combo);
+			}
+		}
+	}
+	/**
+	 * Removes the given elements from this combo viewer.
+	 * The selection is updated if required.
+	 * <p>
+	 * This method should be called (by the content provider) when elements 
+	 * have been removed from the model, in order to cause the viewer to accurately
+	 * reflect the model. This method only affects the viewer, not the model.
+	 * </p>
+	 *
+	 * @param elements the elements to remove
+	 */
+	public void remove(final Object[] elements) {
+		preservingSelection(new Runnable() {
+			public void run() {
+				internalRemove(elements);
+			}
+		});
+	}
+	/**
+	 * Removes the given element from this combo viewer.
+	 * The selection is updated if necessary.
+	 * <p>
+	 * This method should be called (by the content provider) when a single element 
+	 * has been removed from the model, in order to cause the viewer to accurately
+	 * reflect the model. This method only affects the viewer, not the model.
+	 * Note that there is another method for efficiently processing the simultaneous
+	 * removal of multiple elements.
+	 * </p>
+	 *
+	 * @param element the element
+	 */
+	public void remove(Object element) {
+		remove(new Object[] { element });
+	}
+	/*
+	 * Non-Javadoc.
+	 * Method defined on StructuredViewer.
+	 */
+	@Override
+	public void reveal(Object element) {
+		// Combos do not implement reveal.
+	}
+	/**
+	 * The combo viewer implementation of this <code>Viewer</code> framework
+	 * method ensures that the given label provider is an instance
+	 * of <code>ILabelProvider</code>.
+	 */
+	@Override
+	public void setLabelProvider(IBaseLabelProvider labelProvider) {
+		Assert.isTrue(labelProvider instanceof ILabelProvider);
+		super.setLabelProvider(labelProvider);
+	}
+	/* (non-Javadoc)
+	 * Method declared on StructuredViewer.
+	 */
+	@Override
+	protected void setSelectionToWidget(List in, boolean reveal) {
+		org.eclipse.swt.custom.CCombo combo = getCCombo();
+		if (in == null || in.size() == 0) { // clear selection
+			combo.deselectAll();
+		} else {
+			int n = in.size();
+			int[] ixs = new int[n];
+			int count = 0;
+			for (int i = 0; i < n; ++i) {
+				Object el = in.get(i);
+				int ix = comboMap.indexOf(el);
+				if (ix >= 0)
+					ixs[count++] = ix;
+			}
+			if (count < n) {
+				System.arraycopy(ixs, 0, ixs = new int[count], 0, count);
+			}
+			if (ixs.length > 0) {
+				combo.select(ixs[0]);
+				// wdg test hack: this might be needed if the combo widget
+				// is not READ_ONLY. (?)
+				//combo.setText(combo.getItem(ixs[0]));
+			}
+		}
+	}
+
+	/**
+	 * HACK: This is equivalent to setSelection() EXCEPT that it doesn't fire any
+	 * notifications.  We have a lot of details pages which are depending on this
+	 * behaviour when they programmatically set the combo's selection through the
+	 * DetailsSectionImpl.refreshCCombo() method.
+	 */
+	public void setSelectionNoNotify(ISelection selection, boolean reveal) {
+		setSelectionToWidget(selection, reveal);
+	}
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/viewers/ComboViewer.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/viewers/ComboViewer.java
new file mode 100644
index 0000000..70ec734
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/viewers/ComboViewer.java
@@ -0,0 +1,376 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details.viewers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * A concrete viewer based on an SWT <code>Combo</code> widget.
+ * 
+ * @see CComboViewer
+ */
+public class ComboViewer extends StructuredViewer {
+
+	private org.eclipse.swt.widgets.Combo combo;
+	
+	private List<Object> comboMap = new ArrayList<Object>();
+
+	/**
+	 * Creates a combo viewer on a newly-created combo control under the given parent.
+	 * The combo control is created using the SWT style bits <code>MULTI, H_SCROLL, V_SCROLL,</code> and <code>BORDER</code>.
+	 * The viewer has no input, no content provider, a default label provider, 
+	 * no sorter, and no filters.
+	 *
+	 * @param parent the parent control
+	 */
+	public ComboViewer(Composite parent) {
+		this(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL/* | SWT.BORDER*/);
+	}
+	/**
+	 * Creates a combo viewer on a newly-created combo control under the given parent.
+	 * The combo control is created using the given SWT style bits.
+	 * The viewer has no input, no content provider, a default label provider, 
+	 * no sorter, and no filters.
+	 *
+	 * @param parent the parent control
+	 * @param style the SWT style bits
+	 */
+	public ComboViewer(Composite parent, int style) {
+		this(new org.eclipse.swt.widgets.Combo(parent, style));
+	}
+	/**
+	 * Creates a combo viewer on the given combo control.
+	 * The viewer has no input, no content provider, a default label provider, 
+	 * no sorter, and no filters.
+	 *
+	 * @param combo the combo control
+	 */
+	public ComboViewer(org.eclipse.swt.widgets.Combo combo) {
+		this.combo = combo;
+		hookControl(combo);
+	}
+
+	/**
+	 * Adds the given elements to this combo viewer.
+	 * If this viewer does not have a sorter, the elements are added at the end
+	 * in the order given; otherwise the elements are inserted at appropriate positions.
+	 * <p>
+	 * This method should be called (by the content provider) when elements 
+	 * have been added to the model, in order to cause the viewer to accurately
+	 * reflect the model. This method only affects the viewer, not the model.
+	 * </p>
+	 *
+	 * @param elements the elements to add
+	 */
+	public void add(Object[] elements) {
+		Object[] filtered = filter(elements);
+		ILabelProvider labelProvider = (ILabelProvider) getLabelProvider();
+		for (int i = 0; i < filtered.length; i++){
+			Object element = filtered[i];
+			int ix = indexForElement(element);
+			combo.add(labelProvider.getText(element), ix);
+			comboMap.add(ix, element);
+			mapElement(element, combo); // must map it, since findItem only looks in map, if enabled
+		}
+	}
+	/**
+	 * Adds the given element to this combo viewer.
+	 * If this viewer does not have a sorter, the element is added at the end;
+	 * otherwise the element is inserted at the appropriate position.
+	 * <p>
+	 * This method should be called (by the content provider) when a single element 
+	 * has been added to the model, in order to cause the viewer to accurately
+	 * reflect the model. This method only affects the viewer, not the model.
+	 * Note that there is another method for efficiently processing the simultaneous
+	 * addition of multiple elements.
+	 * </p>
+	 *
+	 * @param element the element
+	 */
+	public void add(Object element) {
+		add(new Object[] { element });
+	}
+	/* (non-Javadoc)
+	 * Method declared on StructuredViewer.
+	 * Since SWT.Combo doesn't use items we always return the Combo itself.
+	 */
+	@Override
+	protected Widget doFindInputItem(Object element) {
+		if (element != null && element.equals(getRoot()))
+			return getCombo();
+		return null;
+	}
+	/* (non-Javadoc)
+	 * Method declared on StructuredViewer.
+	 * Since SWT.Combo doesn't use items we always return the Combo itself.
+	 */
+	@Override
+	protected Widget doFindItem(Object element) {
+		if (element != null) {
+			if (comboMap.contains(element))
+				return getCombo();
+		}
+		return null;
+	}
+	/* (non-Javadoc)
+	 * Method declared on StructuredViewer.
+	 */
+	@Override
+	protected void doUpdateItem(Widget data, Object element, boolean fullMap) {
+		if (element != null) {
+			int ix = comboMap.indexOf(element);
+			if (ix >= 0) {
+				ILabelProvider labelProvider = (ILabelProvider) getLabelProvider();
+				combo.setItem(ix, labelProvider.getText(element));
+			}
+		}
+	}
+	/* (non-Javadoc)
+	 * Method declared on Viewer.
+	 */
+	@Override
+	public Control getControl() {
+		return combo;
+	}
+	/**
+	 * Returns the element with the given index from this combo viewer.
+	 * Returns <code>null</code> if the index is out of range.
+	 *
+	 * @param index the zero-based index
+	 * @return the element at the given index, or <code>null</code> if the
+	 *   index is out of range
+	 */
+	public Object getElementAt(int index) {
+		if (index >= 0 && index < comboMap.size())
+			return comboMap.get(index);
+		return null;
+	}
+	/**
+	 * The combo viewer implementation of this <code>Viewer</code> framework
+	 * method returns the label provider, which in the case of combo
+	 * viewers will be an instance of <code>ILabelProvider</code>.
+	 */
+	@Override
+	public IBaseLabelProvider getLabelProvider() {
+		return super.getLabelProvider();
+	}
+	/**
+	 * Returns this combo viewer's combo control.
+	 *
+	 * @return the combo control
+	 */
+	public org.eclipse.swt.widgets.Combo getCombo() {
+		return combo;
+	}
+	/* (non-Javadoc)
+	 * Method declared on StructuredViewer.
+	 */
+	@Override
+	protected List<Object> getSelectionFromWidget() {
+		int idx = getCombo().getSelectionIndex();
+		if (idx < 0)  return new ArrayList<Object>(0);
+		
+		ArrayList<Object> list = new ArrayList<Object>(1);
+		Object e = getElementAt(idx);
+		if (e != null)  list.add(e);
+		return list;
+	}
+	/*
+	 * Returns the index where the item should be inserted.
+	*/
+	protected int indexForElement(Object element) {
+		ViewerSorter sorter = getSorter();
+		if(sorter == null)
+			return combo.getItemCount();
+		int count = combo.getItemCount();
+		int min = 0, max = count - 1;
+		while (min <= max) {
+			int mid = (min + max) / 2;
+			Object data = comboMap.get(mid);
+			int compare = sorter.compare(this, data, element);
+			if (compare == 0) {
+				// find first item > element
+				while (compare == 0) {
+					++mid;
+					if (mid >= count) {
+						break;
+					}
+					data = comboMap.get(mid);
+					compare = sorter.compare(this, data, element);
+				}
+				return mid;
+			}
+			if (compare < 0)
+				min = mid + 1;
+			else
+				max = mid - 1;
+		}
+		return min;
+	}
+	/* (non-Javadoc)
+	 * Method declared on Viewer.
+	 */
+	@Override
+	protected void inputChanged(Object input, Object oldInput) {
+		comboMap.clear();
+		Object[] children = getSortedChildren(getRoot());
+		int size = children.length;
+		org.eclipse.swt.widgets.Combo combo = getCombo();
+		combo.removeAll();
+		String[] labels = new String[size];
+		for (int i = 0; i < size; i++) {
+			Object el = children[i];
+			labels[i] = ((ILabelProvider) getLabelProvider()).getText(el);
+			comboMap.add(el);
+			mapElement(el, combo); // must map it, since findItem only looks in map, if enabled
+		}
+		combo.setItems(labels);
+	}
+	/* (non-Javadoc)
+	 * Method declared on StructuredViewer.
+	 */
+	@Override
+	protected void internalRefresh(Object element) {
+		if (element == null || element.equals(getRoot())) {
+			// the parent
+			if (comboMap != null)
+				comboMap.clear();
+			unmapAllElements();
+			List selection = getSelectionFromWidget();
+			combo.setRedraw(false);
+			combo.removeAll();
+			Object[] children = getSortedChildren(getRoot());
+			ILabelProvider labelProvider= (ILabelProvider) getLabelProvider();
+			for (int i= 0; i < children.length; i++) {
+				Object el = children[i];
+				combo.add(labelProvider.getText(el), i);
+				comboMap.add(el);
+				mapElement(el, combo); // must map it, since findItem only looks in map, if enabled
+			}
+			combo.setRedraw(true);
+			setSelectionToWidget(selection, false);
+		} else {
+			doUpdateItem(combo, element, true);
+		}
+	}
+	/**
+	 * Removes the given elements from this combo viewer.
+	 *
+	 * @param elements the elements to remove
+	 */
+	private void internalRemove(final Object[] elements) {
+		Object input = getInput();
+		for (int i = 0; i < elements.length; ++i) {
+			if (elements[i].equals(input)) {
+				setInput(null);
+				return;
+			}
+			int ix = comboMap.indexOf(elements[i]);
+			if (ix >= 0) {
+				combo.remove(ix);
+				comboMap.remove(ix);
+				unmapElement(elements[i], combo);
+			}
+		}
+	}
+	/**
+	 * Removes the given elements from this combo viewer.
+	 * The selection is updated if required.
+	 * <p>
+	 * This method should be called (by the content provider) when elements 
+	 * have been removed from the model, in order to cause the viewer to accurately
+	 * reflect the model. This method only affects the viewer, not the model.
+	 * </p>
+	 *
+	 * @param elements the elements to remove
+	 */
+	public void remove(final Object[] elements) {
+		preservingSelection(new Runnable() {
+			public void run() {
+				internalRemove(elements);
+			}
+		});
+	}
+	/**
+	 * Removes the given element from this combo viewer.
+	 * The selection is updated if necessary.
+	 * <p>
+	 * This method should be called (by the content provider) when a single element 
+	 * has been removed from the model, in order to cause the viewer to accurately
+	 * reflect the model. This method only affects the viewer, not the model.
+	 * Note that there is another method for efficiently processing the simultaneous
+	 * removal of multiple elements.
+	 * </p>
+	 *
+	 * @param element the element
+	 */
+	public void remove(Object element) {
+		remove(new Object[] { element });
+	}
+	/*
+	 * Non-Javadoc.
+	 * Method defined on StructuredViewer.
+	 */
+	@Override
+	public void reveal(Object element) {
+		// Combos do not implement reveal.
+	}
+	/**
+	 * The combo viewer implementation of this <code>Viewer</code> framework
+	 * method ensures that the given label provider is an instance
+	 * of <code>ILabelProvider</code>.
+	 */
+	@Override
+	public void setLabelProvider(IBaseLabelProvider labelProvider) {
+		Assert.isTrue(labelProvider instanceof ILabelProvider);
+		super.setLabelProvider(labelProvider);
+	}
+	/* (non-Javadoc)
+	 * Method declared on StructuredViewer.
+	 */
+	@Override
+	protected void setSelectionToWidget(List in, boolean reveal) {
+		org.eclipse.swt.widgets.Combo combo = getCombo();
+		if (in == null || in.size() == 0) { // clear selection
+			combo.deselectAll();
+		} else {
+			int n = in.size();
+			int[] ixs = new int[n];
+			int count = 0;
+			for (int i = 0; i < n; ++i) {
+				Object el = in.get(i);
+				int ix = comboMap.indexOf(el);
+				if (ix >= 0)
+					ixs[count++] = ix;
+			}
+			if (count < n) {
+				System.arraycopy(ixs, 0, ixs = new int[count], 0, count);
+			}
+			if (ixs.length > 0) {
+				combo.select(ixs[0]);
+				// wdg test hack: this might be needed if the combo widget
+				// is not READ_ONLY. (?)
+				//combo.setText(combo.getItem(ixs[0]));
+			}
+		}
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/viewers/ComboViewerCellEditor.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/viewers/ComboViewerCellEditor.java
new file mode 100644
index 0000000..8e4031a
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/viewers/ComboViewerCellEditor.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details.viewers;
+
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * A ComboBoxCellEditor which is based on a CComboViewer rather than direct
+ * interaction with the underlying CCombo.  This allows the use of content
+ * and label providers, filters, etc. with ComboViewerCellEditor. 
+ */
+public class ComboViewerCellEditor extends ComboBoxCellEditor {
+	
+	CComboViewer viewer;
+
+	public ComboViewerCellEditor() {
+		super();
+	}
+
+	public ComboViewerCellEditor(Composite parent) {
+		super(parent, new String[0]);
+	}
+
+	@Override
+	protected Object doGetValue() {
+		return ((IStructuredSelection)viewer.getSelection()).getFirstElement();
+	}
+
+	@Override
+	protected void doSetValue(Object value) {
+		viewer.refresh();
+		String s = ((ILabelProvider)viewer.getLabelProvider()).getText(value);
+		viewer.getCCombo().setText(s);
+	}
+
+	@Override
+	protected Control createControl(Composite parent) {
+		CCombo combo = (CCombo)super.createControl(parent);
+		viewer = new CComboViewer(combo);
+		return combo;
+	}
+
+	public CComboViewer getViewer() {
+		return viewer;
+	}
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/widgets/DecoratedLabel.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/widgets/DecoratedLabel.java
new file mode 100644
index 0000000..7564e99
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/widgets/DecoratedLabel.java
@@ -0,0 +1,817 @@
+package org.eclipse.bpel.common.ui.details.widgets;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.accessibility.ACC;
+import org.eclipse.swt.accessibility.Accessible;
+import org.eclipse.swt.accessibility.AccessibleAdapter;
+import org.eclipse.swt.accessibility.AccessibleControlAdapter;
+import org.eclipse.swt.accessibility.AccessibleControlEvent;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * A Label which supports aligned text and/or an image and different border styles.
+ * <p>
+ * If there is not enough space a CLabel uses the following strategy to fit the 
+ * information into the available space:
+ * <pre>
+ * 		ignores the indent in left align mode
+ * 		ignores the image and the gap
+ * 		shortens the text by replacing the center portion of the label with an ellipsis
+ * 		shortens the text by removing the center portion of the label
+ * </pre>
+ * <p>
+ * <dl>
+ * <dt><b>Styles:</b>
+ * <dd>LEFT, RIGHT, CENTER, SHADOW_IN, SHADOW_OUT, SHADOW_NONE</dd>
+ * <dt><b>Events:</b>
+ * <dd></dd>
+ * </dl>
+ * 
+ * </p><p>
+ * IMPORTANT: This class is <em>not</em> intended to be subclassed.
+ * </p>
+ */
+public class DecoratedLabel extends Canvas {
+
+	/** Gap between icon and text */
+	private static final int GAP = 5;
+	/** Left and right margins */
+	private static final int INDENT = 2;
+	/** a string inserted in the middle of text that has been shortened */
+	private static final String ELLIPSIS = "..."; //$NON-NLS-1$ // could use the ellipsis glyph on some platforms "\u2026"
+	/** the alignment. Either CENTER, RIGHT, LEFT. Default is LEFT*/
+	private int align = SWT.LEFT;
+	private int hIndent = 0;
+	private int vIndent = INDENT;
+	/** the current text */
+	private String text;
+	/** the current icon */
+	private Image image;
+	// The tooltip is used for two purposes - the application can set
+	// a tooltip or the tooltip can be used to display the full text when the
+	// the text has been truncated due to the label being too short.
+	// The appToolTip stores the tooltip set by the application.  Control.tooltiptext 
+	// contains whatever tooltip is currently being displayed.
+	private String appToolTipText;
+	
+	private Image backgroundImage;
+	private Color[] gradientColors;
+	private int[] gradientPercents;
+	private boolean gradientVertical;
+	private Color background;
+	
+	private static int DRAW_FLAGS = SWT.DRAW_MNEMONIC | SWT.DRAW_TAB | SWT.DRAW_TRANSPARENT | SWT.DRAW_DELIMITER;
+
+/**
+ * Constructs a new instance of this class given its parent
+ * and a style value describing its behavior and appearance.
+ * <p>
+ * The style value is either one of the style constants defined in
+ * class <code>SWT</code> which is applicable to instances of this
+ * class, or must be built by <em>bitwise OR</em>'ing together 
+ * (that is, using the <code>int</code> "|" operator) two or more
+ * of those <code>SWT</code> style constants. The class description
+ * lists the style constants that are applicable to the class.
+ * Style bits are also inherited from superclasses.
+ * </p>
+ *
+ * @param parent a widget which will be the parent of the new instance (cannot be null)
+ * @param style the style of widget to construct
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
+ * </ul>
+ *
+ * @see SWT#LEFT
+ * @see SWT#RIGHT
+ * @see SWT#CENTER
+ * @see SWT#SHADOW_IN
+ * @see SWT#SHADOW_OUT
+ * @see SWT#SHADOW_NONE
+ * @see #getStyle()
+ */
+public DecoratedLabel(Composite parent, int style) {
+	super(parent, checkStyle(style));
+	if ((style & (SWT.CENTER | SWT.RIGHT)) == 0) style |= SWT.LEFT;
+	if ((style & SWT.CENTER) != 0) align = SWT.CENTER;
+	if ((style & SWT.RIGHT) != 0)  align = SWT.RIGHT;
+	if ((style & SWT.LEFT) != 0)   align = SWT.LEFT;
+	
+	addPaintListener(new PaintListener(){
+		public void paintControl(PaintEvent event) {
+			onPaint(event);
+		}
+	});
+	
+	addDisposeListener(new DisposeListener(){
+		public void widgetDisposed(DisposeEvent event) {
+			onDispose(event);
+		}
+	});
+
+	addTraverseListener(new TraverseListener() {
+		public void keyTraversed(TraverseEvent event) {
+			if (event.detail == SWT.TRAVERSE_MNEMONIC) {
+				onMnemonic(event);
+			}
+		}
+	});
+	
+	initAccessible();
+
+}
+/**
+ * Check the style bits to ensure that no invalid styles are applied.
+ */
+private static int checkStyle (int style) {
+	if ((style & SWT.BORDER) != 0) style |= SWT.SHADOW_IN;
+	int mask = SWT.SHADOW_IN | SWT.SHADOW_OUT | SWT.SHADOW_NONE | SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT;
+	style = style & mask;
+	style |= SWT.NO_FOCUS | SWT.DOUBLE_BUFFERED;
+	return style;
+}
+
+//protected void checkSubclass () {
+//	String name = getClass().getName ();
+//	String validName = CLabel.class.getName();
+//	if (!validName.equals(name)) {
+//		SWT.error (SWT.ERROR_INVALID_SUBCLASS);
+//	}
+//}
+
+@Override
+public Point computeSize(int wHint, int hHint, boolean changed) {
+	checkWidget();
+	Point e = getTotalSize(image, text);
+	if (wHint == SWT.DEFAULT){
+		e.x += 2*hIndent;
+	} else {
+		e.x = wHint;
+	}
+	if (hHint == SWT.DEFAULT) {
+		e.y += 2*vIndent;
+	} else {
+		e.y = hHint;
+	}
+	return e;
+}
+/**
+ * Draw a rectangle in the given colors.
+ */
+private void drawBevelRect(GC gc, int x, int y, int w, int h, Color topleft, Color bottomright) {
+	gc.setForeground(bottomright);
+	gc.drawLine(x+w, y,   x+w, y+h);
+	gc.drawLine(x,   y+h, x+w, y+h);
+	
+	gc.setForeground(topleft);
+	gc.drawLine(x, y, x+w-1, y);
+	gc.drawLine(x, y, x,     y+h-1);
+}
+/*
+ * Return the lowercase of the first non-'&' character following
+ * an '&' character in the given string. If there are no '&'
+ * characters in the given string, return '\0'.
+ */
+char _findMnemonic (String string) {
+	if (string == null) return '\0';
+	int index = 0;
+	int length = string.length ();
+	do {
+		while (index < length && string.charAt (index) != '&') index++;
+		if (++index >= length) return '\0';
+		if (string.charAt (index) != '&') return Character.toLowerCase (string.charAt (index));
+		index++;
+	} while (index < length);
+ 	return '\0';
+}
+/**
+ * Returns the alignment.
+ * The alignment style (LEFT, CENTER or RIGHT) is returned.
+ * 
+ * @return SWT.LEFT, SWT.RIGHT or SWT.CENTER
+ */
+public int getAlignment() {
+	//checkWidget();
+	return align;
+}
+/**
+ * Return the CLabel's image or <code>null</code>.
+ * 
+ * @return the image of the label or null
+ */
+public Image getImage() {
+	//checkWidget();
+	return image;
+}
+/**
+ * Compute the minimum size.
+ */
+private Point getTotalSize(Image image, String text) {
+	Point size = new Point(0, 0);
+
+	if (image != null) {
+		Rectangle r = image.getBounds();
+		size.x += r.width;
+		size.y += r.height;
+	}
+		
+	GC gc = new GC(this);
+	if (text != null && text.length() > 0) {
+		Point e = gc.textExtent(text, DRAW_FLAGS);
+		size.x += e.x;
+		size.y = Math.max(size.y, e.y);
+		if (image != null) size.x += GAP;
+	} else {
+		size.y = Math.max(size.y, gc.getFontMetrics().getHeight());
+	}
+	gc.dispose();
+	
+	return size;
+}
+@Override
+public int getStyle () {
+	int style = super.getStyle();
+	switch (align) {
+		case SWT.RIGHT: style |= SWT.RIGHT; break;
+		case SWT.CENTER: style |= SWT.CENTER; break;
+		case SWT.LEFT: style |= SWT.LEFT; break;
+	}
+	return style;
+}
+
+/**
+ * Return the Label's text.
+ * 
+ * @return the text of the label or null
+ */
+public String getText() {
+	//checkWidget();
+	return text;
+}
+@Override
+public String getToolTipText () {
+	checkWidget();
+	return appToolTipText;
+}
+private void initAccessible() {
+	Accessible accessible = getAccessible();
+	accessible.addAccessibleListener(new AccessibleAdapter() {
+		@Override
+		public void getName(AccessibleEvent e) {
+			e.result = getText();
+		}
+		
+		@Override
+		public void getHelp(AccessibleEvent e) {
+			e.result = getToolTipText();
+		}
+		
+		@Override
+		public void getKeyboardShortcut(AccessibleEvent e) {
+			char mnemonic = _findMnemonic(DecoratedLabel.this.text);	
+			if (mnemonic != '\0') {
+				e.result = "Alt+"+mnemonic; //$NON-NLS-1$
+			}
+		}
+	});
+		
+	accessible.addAccessibleControlListener(new AccessibleControlAdapter() {
+		@Override
+		public void getChildAtPoint(AccessibleControlEvent e) {
+			e.childID = ACC.CHILDID_SELF;
+		}
+		
+		@Override
+		public void getLocation(AccessibleControlEvent e) {
+			Rectangle rect = getDisplay().map(getParent(), null, getBounds());
+			e.x = rect.x;
+			e.y = rect.y;
+			e.width = rect.width;
+			e.height = rect.height;
+		}
+		
+		@Override
+		public void getChildCount(AccessibleControlEvent e) {
+			e.detail = 0;
+		}
+		
+		@Override
+		public void getRole(AccessibleControlEvent e) {
+			e.detail = ACC.ROLE_LABEL;
+		}
+		
+		@Override
+		public void getState(AccessibleControlEvent e) {
+			e.detail = ACC.STATE_READONLY;
+		}
+	});
+}
+void onDispose(DisposeEvent event) {
+	gradientColors = null;
+	gradientPercents = null;
+	backgroundImage = null;
+	text = null;
+	image = null;
+	appToolTipText = null;
+}
+void onMnemonic(TraverseEvent event) {
+	char mnemonic = _findMnemonic(text);
+	if (mnemonic == '\0') return;
+	if (Character.toLowerCase(event.character) != mnemonic) return;
+	Composite control = this.getParent();
+	while (control != null) {
+		Control [] children = control.getChildren();
+		int index = 0;
+		while (index < children.length) {
+			if (children [index] == this) break;
+			index++;
+		}
+		index++;
+		if (index < children.length) {
+			if (children [index].setFocus ()) {
+				event.doit = true;
+				event.detail = SWT.TRAVERSE_NONE;
+			}
+		}
+		control = control.getParent();
+	}
+}
+
+void onPaint(PaintEvent event) {
+	Rectangle rect = getClientArea();
+	if (rect.width == 0 || rect.height == 0) return;
+	
+	boolean shortenText = false;
+	String t = text;
+	Image img = image;
+	int availableWidth = Math.max(0, rect.width - 2*hIndent);
+	Point extent = getTotalSize(img, t);
+	if (extent.x > availableWidth) {
+		img = null;
+		extent = getTotalSize(img, t);
+		if (extent.x > availableWidth) {
+			shortenText = true;
+		}
+	}
+	
+	GC gc = event.gc;
+	String[] lines = text == null ? null : splitString(text); 
+	
+	// shorten the text
+	if (shortenText) {
+		extent.x = 0;
+	    for(int i = 0; i < lines.length; i++) {
+	    	Point e = gc.textExtent(lines[i], DRAW_FLAGS);
+	    	if (e.x > availableWidth) {
+	    		lines[i] = shortenText(gc, lines[i], availableWidth);
+	    		extent.x = Math.max(extent.x, getTotalSize(null, lines[i]).x);
+	    	} else {
+	    		extent.x = Math.max(extent.x, e.x);
+	    	}
+	    }
+		if (appToolTipText == null) {
+			super.setToolTipText(text);
+		}
+	} else {
+		super.setToolTipText(appToolTipText);
+	}
+		
+	// determine horizontal position
+	int x = rect.x + hIndent;
+	if (align == SWT.CENTER) {
+		x = (rect.width - extent.x)/2;
+	}
+	if (align == SWT.RIGHT) {
+		x = rect.width - hIndent - extent.x;
+	}
+	
+	// draw a background image behind the text
+	try {
+		if (backgroundImage != null) {
+			// draw a background image behind the text
+			Rectangle imageRect = backgroundImage.getBounds();
+			// tile image to fill space
+			gc.setBackground(getBackground());
+			gc.fillRectangle(rect);
+			int xPos = 0;
+			while (xPos < rect.width) {
+				int yPos = 0;
+				while (yPos < rect.height) {
+					gc.drawImage(backgroundImage, xPos, yPos);
+					yPos += imageRect.height;
+				}
+				xPos += imageRect.width;
+			}
+		} else if (gradientColors != null) {
+			// draw a gradient behind the text
+			final Color oldBackground = gc.getBackground();
+			if (gradientColors.length == 1) {
+				if (gradientColors[0] != null) gc.setBackground(gradientColors[0]);
+				gc.fillRectangle(0, 0, rect.width, rect.height);
+			} else {
+				final Color oldForeground = gc.getForeground();
+				Color lastColor = gradientColors[0];
+				if (lastColor == null) lastColor = oldBackground;
+				int pos = 0;
+				for (int i = 0; i < gradientPercents.length; ++i) {
+					gc.setForeground(lastColor);
+					lastColor = gradientColors[i + 1];
+					if (lastColor == null) lastColor = oldBackground;
+					gc.setBackground(lastColor);
+					if (gradientVertical) {
+						final int gradientHeight = (gradientPercents[i] * rect.height / 100) - pos;
+						gc.fillGradientRectangle(0, pos, rect.width, gradientHeight, true);
+						pos += gradientHeight;
+					} else {
+						final int gradientWidth = (gradientPercents[i] * rect.width / 100) - pos;
+						gc.fillGradientRectangle(pos, 0, gradientWidth, rect.height, false);
+						pos += gradientWidth;
+					}
+				}
+				if (gradientVertical && pos < rect.height) {
+					gc.setBackground(getBackground());
+					gc.fillRectangle(0, pos, rect.width, rect.height - pos);
+				}
+				if (!gradientVertical && pos < rect.width) {
+					gc.setBackground(getBackground());
+					gc.fillRectangle(pos, 0, rect.width - pos, rect.height);
+				}
+				gc.setForeground(oldForeground);
+			}
+			gc.setBackground(oldBackground);
+		} else {
+			if (background != null || (getStyle() & SWT.DOUBLE_BUFFERED) == 0) {
+				gc.setBackground(getBackground());
+				gc.fillRectangle(rect);
+			}
+		}
+	} catch (SWTException e) {
+		if ((getStyle() & SWT.DOUBLE_BUFFERED) == 0) {
+			gc.setBackground(getBackground());
+			gc.fillRectangle(rect);
+		}
+	}
+
+	// draw border
+	int style = getStyle();
+	if ((style & SWT.SHADOW_IN) != 0 || (style & SWT.SHADOW_OUT) != 0) {
+		paintBorder(gc, rect);
+	}
+
+	// draw the image
+	if (img != null) {
+		Rectangle imageRect = img.getBounds();
+		gc.drawImage(img, 0, 0, imageRect.width, imageRect.height, 
+		                x, (rect.height-imageRect.height)/2, imageRect.width, imageRect.height);
+		x +=  imageRect.width + GAP;
+		extent.x -= imageRect.width + GAP;
+	}
+	// draw the text
+	if (lines != null) {
+		int lineHeight = gc.getFontMetrics().getHeight();
+		int textHeight = lines.length * lineHeight;
+		int lineY = Math.max(vIndent, rect.y + (rect.height - textHeight) / 2);
+		gc.setForeground(getForeground());
+		for (int i = 0; i < lines.length; i++) {
+			int lineX = x;
+			if (lines.length > 1) {
+				if (align == SWT.CENTER) {
+					int lineWidth = gc.textExtent(lines[i], DRAW_FLAGS).x;
+					lineX = x + Math.max(0, (extent.x - lineWidth) / 2);
+				}
+				if (align == SWT.RIGHT) {
+					int lineWidth = gc.textExtent(lines[i], DRAW_FLAGS).x;
+					lineX = Math.max(x, rect.x + rect.width - hIndent - lineWidth);
+				}
+			}
+			gc.drawText(lines[i], lineX, lineY, DRAW_FLAGS);
+			lineY += lineHeight;
+		}
+	}
+}
+/**
+ * Paint the Label's border.
+ */
+private void paintBorder(GC gc, Rectangle r) {
+	Display disp= getDisplay();
+
+	Color c1 = null;
+	Color c2 = null;
+	
+	int style = getStyle();
+	if ((style & SWT.SHADOW_IN) != 0) {
+		c1 = disp.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW);
+		c2 = disp.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW);
+	}
+	if ((style & SWT.SHADOW_OUT) != 0) {		
+		c1 = disp.getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW);
+		c2 = disp.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW);
+	}
+		
+	if (c1 != null && c2 != null) {
+		gc.setLineWidth(1);
+		drawBevelRect(gc, r.x, r.y, r.width-1, r.height-1, c1, c2);
+	}
+}
+/**
+ * Set the alignment of the CLabel.
+ * Use the values LEFT, CENTER and RIGHT to align image and text within the available space.
+ * 
+ * @param align the alignment style of LEFT, RIGHT or CENTER
+ * 
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_INVALID_ARGUMENT - if the value of align is not one of SWT.LEFT, SWT.RIGHT or SWT.CENTER</li>
+ * </ul>
+ */
+public void setAlignment(int align) {
+	checkWidget();
+	if (align != SWT.LEFT && align != SWT.RIGHT && align != SWT.CENTER) {
+		SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+	}
+	if (this.align != align) {
+		this.align = align;
+		redraw();
+	}
+}
+
+@Override
+public void setBackground (Color color) {
+	super.setBackground (color);
+	// Are these settings the same as before?
+	if (backgroundImage == null && 
+		gradientColors == null && 
+		gradientPercents == null) {
+		if (color == null) {
+			if (background == null) return;
+		} else {
+			if (color.equals(background)) return;
+		}		
+	}
+	background = color;
+	backgroundImage = null;
+	gradientColors = null;
+	gradientPercents = null;
+	redraw ();
+}
+
+/**
+ * Specify a gradient of colours to be drawn in the background of the CLabel.
+ * <p>For example, to draw a gradient that varies from dark blue to blue and then to
+ * white and stays white for the right half of the label, use the following call 
+ * to setBackground:</p>
+ * <pre>
+ *	clabel.setBackground(new Color[]{display.getSystemColor(SWT.COLOR_DARK_BLUE), 
+ *		                           display.getSystemColor(SWT.COLOR_BLUE),
+ *		                           display.getSystemColor(SWT.COLOR_WHITE), 
+ *		                           display.getSystemColor(SWT.COLOR_WHITE)},
+ *		               new int[] {25, 50, 100});
+ * </pre>
+ *
+ * @param colors an array of Color that specifies the colors to appear in the gradient 
+ *               in order of appearance from left to right;  The value <code>null</code> 
+ *               clears the background gradient; the value <code>null</code> can be used 
+ *               inside the array of Color to specify the background color.
+ * @param percents an array of integers between 0 and 100 specifying the percent of the width 
+ *                 of the widget at which the color should change; the size of the percents 
+ *                 array must be one less than the size of the colors array.
+ * 
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_INVALID_ARGUMENT - if the values of colors and percents are not consistent</li>
+ * </ul>
+ */
+public void setBackground(Color[] colors, int[] percents) {
+	setBackground(colors, percents, false);
+}
+/**
+ * Specify a gradient of colours to be drawn in the background of the CLabel.
+ * <p>For example, to draw a gradient that varies from dark blue to white in the vertical,
+ * direction use the following call 
+ * to setBackground:</p>
+ * <pre>
+ *	clabel.setBackground(new Color[]{display.getSystemColor(SWT.COLOR_DARK_BLUE), 
+ *		                           display.getSystemColor(SWT.COLOR_WHITE)},
+ *		                 new int[] {100}, true);
+ * </pre>
+ *
+ * @param colors an array of Color that specifies the colors to appear in the gradient 
+ *               in order of appearance from left/top to right/bottom;  The value <code>null</code> 
+ *               clears the background gradient; the value <code>null</code> can be used 
+ *               inside the array of Color to specify the background color.
+ * @param percents an array of integers between 0 and 100 specifying the percent of the width/height 
+ *                 of the widget at which the color should change; the size of the percents 
+ *                 array must be one less than the size of the colors array.
+ * @param vertical indicate the direction of the gradient.  True is vertical and false is horizontal.
+ * 
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_INVALID_ARGUMENT - if the values of colors and percents are not consistent</li>
+ * </ul>
+ * 
+ * @since 3.0
+ */
+public void setBackground(Color[] colors, int[] percents, boolean vertical) {	
+	checkWidget();
+	if (colors != null) {
+		if (percents == null || percents.length != colors.length - 1) {
+			SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+		}
+		if (getDisplay().getDepth() < 15) {
+			// Don't use gradients on low color displays
+			colors = new Color[] {colors[colors.length - 1]};
+			percents = new int[] { };
+		}
+		for (int i = 0; i < percents.length; i++) {
+			if (percents[i] < 0 || percents[i] > 100) {
+				SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+			}
+			if (i > 0 && percents[i] < percents[i-1]) {
+				SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+			}
+		}
+	}
+	
+	// Are these settings the same as before?
+	final Color background = getBackground();
+	if (backgroundImage == null) {
+		if ((gradientColors != null) && (colors != null) && 
+			(gradientColors.length == colors.length)) {
+			boolean same = false;
+			for (int i = 0; i < gradientColors.length; i++) {
+				same = (gradientColors[i] == colors[i]) ||
+					((gradientColors[i] == null) && (colors[i] == background)) ||
+					((gradientColors[i] == background) && (colors[i] == null));
+				if (!same) break;
+			}
+			if (same) {
+				for (int i = 0; i < gradientPercents.length; i++) {
+					same = gradientPercents[i] == percents[i];
+					if (!same) break;
+				}
+			}
+			if (same && this.gradientVertical == vertical) return;
+		}
+	} else {
+		backgroundImage = null;
+	}
+	// Store the new settings
+	if (colors == null) {
+		gradientColors = null;
+		gradientPercents = null;
+		gradientVertical = false;
+	} else {
+		gradientColors = new Color[colors.length];
+		for (int i = 0; i < colors.length; ++i)
+			gradientColors[i] = (colors[i] != null) ? colors[i] : background;
+		gradientPercents = new int[percents.length];
+		for (int i = 0; i < percents.length; ++i)
+			gradientPercents[i] = percents[i];
+		gradientVertical = vertical;
+	}
+	// Refresh with the new settings
+	redraw();
+}
+/**
+ * Set the image to be drawn in the background of the label.
+ * 
+ * @param image the image to be drawn in the background
+ * 
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+public void setBackground(Image image) {
+	checkWidget();
+	if (image == backgroundImage) return;
+	if (image != null) {
+		gradientColors = null;
+		gradientPercents = null;
+	}
+	backgroundImage = image;
+	redraw();
+	
+}
+@Override
+public void setFont(Font font) {
+	super.setFont(font);
+	redraw();
+}
+/**
+ * Set the label's Image.
+ * The value <code>null</code> clears it.
+ * 
+ * @param image the image to be displayed in the label or null
+ * 
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+public void setImage(Image image) {
+	checkWidget();
+	if (image != this.image) {
+		this.image = image;
+		redraw();
+	}
+}
+/**
+ * Set the label's text.
+ * The value <code>null</code> clears it.
+ * 
+ * @param text the text to be displayed in the label or null
+ * 
+ * @exception SWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+public void setText(String text) {
+	checkWidget();
+	if (text == null) text = ""; //$NON-NLS-1$
+	if (! text.equals(this.text)) {
+		this.text = text;
+		redraw();
+	}
+}
+@Override
+public void setToolTipText (String string) {
+	super.setToolTipText (string);
+	appToolTipText = super.getToolTipText();
+}
+/**
+ * Shorten the given text <code>t</code> so that its length doesn't exceed
+ * the given width. The default implementation replaces characters in the
+ * center of the original string with an ellipsis ("...").
+ * Override if you need a different strategy.
+ * 
+ * @param gc the gc to use for text measurement
+ * @param t the text to shorten
+ * @param width the width to shorten the text to, in pixels
+ * @return the shortened text
+ */
+protected String shortenText(GC gc, String t, int width) {
+	if (t == null) return null;
+	int w = gc.textExtent(ELLIPSIS, DRAW_FLAGS).x;
+	int l = t.length();
+	int pivot = l/2;
+	int s = pivot;
+	int e = pivot+1;
+	while (s >= 0 && e < l) {
+		String s1 = t.substring(0, s);
+		String s2 = t.substring(e, l);
+		int l1 = gc.textExtent(s1, DRAW_FLAGS).x;
+		int l2 = gc.textExtent(s2, DRAW_FLAGS).x;
+		if (l1+w+l2 < width) {
+			t = s1 + ELLIPSIS + s2;
+			break;
+		}
+		s--;
+		e++;
+	}
+	return t;
+}
+
+private String[] splitString(String text) {
+    String[] lines = new String[1];
+    int start = 0, pos;
+    do {
+        pos = text.indexOf('\n', start);
+        if (pos == -1) {
+        	lines[lines.length - 1] = text.substring(start);
+        } else {
+            boolean crlf = (pos > 0) && (text.charAt(pos - 1) == '\r');
+            lines[lines.length - 1] = text.substring(start, pos - (crlf ? 1 : 0));
+            start = pos + 1;
+            String[] newLines = new String[lines.length+1];
+            System.arraycopy(lines, 0, newLines, 0, lines.length);
+       		lines = newLines;
+        }
+    } while (pos != -1);
+    return lines;
+}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/widgets/NoBorderButton.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/widgets/NoBorderButton.java
new file mode 100644
index 0000000..71b7376
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/widgets/NoBorderButton.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details.widgets;
+
+import org.eclipse.draw2d.Button;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.swt.graphics.Image;
+
+public class NoBorderButton extends Button {
+
+	public NoBorderButton(Image image) {
+		super(image);
+	}
+	@Override
+	protected void paintBorder(Graphics graphics) {
+		// Do nothing
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/widgets/StatusLabel2.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/widgets/StatusLabel2.java
new file mode 100644
index 0000000..aba5167
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/details/widgets/StatusLabel2.java
@@ -0,0 +1,457 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.details.widgets;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.bpel.common.ui.CommonUIPlugin;
+import org.eclipse.bpel.common.ui.ICommonUIConstants;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * Status label which holds information from text markers next to labels.
+ * 
+ * @author IBM
+ * @author Michal Chmielewski (michal.chmielewski@oracle.com)
+ * @date May 15, 2007
+ */
+public class StatusLabel2 {
+
+	final static private int MAX_MESSAGES = 5;
+	final static private String STATUS_MESSAGE_ID = "STATUS_MESSAGE"; //$NON-NLS-1$
+	final static private String NEW_LINE = "\n"; //$NON-NLS-1$
+	final static private String ETCETERA = "..."; //$NON-NLS-1$
+
+	protected DecoratedLabel label;
+	protected List<StatusMessage> statusMessageList;
+
+	protected static Image blankImage, infoImage, warnImage, errorImage;
+
+	/**
+	 * Inner class: StatusMessage which holds one message and its dedicated severity
+	 * 
+	 */
+	protected class StatusMessage {
+
+		protected String id;       //* e.g name of originator of message   
+		protected int severity;
+		protected String message;
+
+		/**
+		 * constructor
+		 * 
+		 */
+		protected StatusMessage(String messageId, int sev, String msg) {
+			setSeverity(messageId, sev, msg);
+		}
+
+		/**
+		 * constructor
+		 * 
+		 */
+		protected StatusMessage() {
+			setStatus(null);
+		}
+
+		/**
+		 * Sets the severity and (optional) message.
+		 * 
+		 * @param messageId message id
+		 * @param sev One of IStatus.OK, IStatus.INFO, IStatus.WARNING, IStatus.ERROR
+		 * @param msg A text message describing the condition (or null).
+		 * 
+		 */
+		protected void setSeverity(String messageId, int sev, String msg) {
+			setId(messageId);
+			setSeverity(sev);
+			setMessage(msg);
+		}
+
+		/**
+		 * Convenience method taking an IStatus as input.
+		 * 
+		 * @param IStatus
+		 */
+		protected void setStatus (IStatus status) {
+			if (status == null) {
+				setSeverity(STATUS_MESSAGE_ID, IStatus.OK, null);
+			} else {
+				setSeverity(STATUS_MESSAGE_ID, status.getSeverity(), status.getMessage());
+			}
+		}
+
+		/**
+		 * @return the severity
+		 */
+		protected int getSeverity() {
+			return severity;
+		}
+
+		/**
+		 * @param i the severity
+		 */
+		protected void setSeverity(int i) {
+			severity = i;
+		}
+
+		/**
+		 * @return String the message
+		 */
+		protected String getMessage() {
+			return message;
+		}
+
+		/**
+		 * @param String the message
+		 */
+		protected void setMessage(String string) {
+			message = string;
+		}
+		/**
+		 * @return String id of status message
+		 */
+		protected String getId() {
+			return id;
+		}
+
+		/**
+		 * @param string id of status message
+		 */
+		protected void setId(String string) {
+			id = string;
+		}
+
+	}
+
+	/**
+	 * constructor
+	 * 
+	 * @param aLabel to be wrapped
+	 * 
+	 */
+	
+	public StatusLabel2(DecoratedLabel aLabel) {
+		this.label = aLabel;
+
+		if (blankImage == null) {
+			initSharedImages();
+		}
+
+		setStatusMessageList(new ArrayList<StatusMessage>());
+		
+		clear();
+	}
+
+	/**
+	 * Initializes the images
+	 * 
+	 */
+	protected static void initSharedImages() {
+		ImageRegistry registry = CommonUIPlugin.getDefault().getImageRegistry();
+		// blankImage = registry.get(ICommonUIConstants.ICON_SM_BLANK);
+		
+		infoImage = registry.get(ICommonUIConstants.ICON_SM_INFO);
+		warnImage = registry.get(ICommonUIConstants.ICON_SM_WARN);
+		errorImage = registry.get(ICommonUIConstants.ICON_SM_ERROR);
+	}
+
+	/**
+	 * Returns the CLabel.
+	 * 
+	 * @return CLabel
+	 * 
+	 */
+	public DecoratedLabel getLabel() {
+		return label;
+	}
+
+	/**
+	 * Returns the primary control (e.g. maybe a composite).  In this implementation, the CLabel.
+	 * 
+	 * @return Control
+	 * 
+	 */
+	public Control getControl() {
+		return label;
+	}
+
+	/**
+	 * Returns the CLabel text
+	 * 
+	 * @return String
+	 * 
+	 */
+	public String getText() {
+		return label.getText();
+	}
+
+	/**
+	 * Sets the CLabel text
+	 * 
+	 * @param s the label text
+	 * 
+	 */
+	public void setText(String s) {
+		label.setText(s);
+	}
+
+	/**
+	 * Returns the CLabel LayoutData
+	 * 
+	 * @return Object LayoutData
+	 * 
+	 */
+	public Object getLayoutData() {
+		return label.getLayoutData();
+	}
+
+	/**
+	 * Sets the CLabel LayoutData
+	 * 
+	 * @param layoutData layout data
+	 * 
+	 */
+	public void setLayoutData(Object layoutData) {
+		label.setLayoutData(layoutData);
+	}
+
+	/**
+	 * clears (removes) all status messages
+	 * 
+	 */
+	public void clear() {
+		statusMessageList.clear();
+		updateLabel() ;
+	}
+
+	/**
+	 * clears all status message with a id equals to the passed messageId
+	 * 
+	 * @param messageId id of status message to be removed
+	 * 
+	 */
+	public void clear (String messageId) {
+
+		if (messageId == null) {
+			clear();
+			return ;
+		}
+		List<StatusMessage> removeList = new ArrayList<StatusMessage>();
+
+		// get all status messages to be removed
+		for(StatusMessage m : statusMessageList ) {
+			if (messageId.equals(m.getId())) {
+				removeList.add(m);
+			}
+		}
+		// remove all just now collected status messages
+		statusMessageList.removeAll(removeList);
+		// update label
+		updateLabel() ;
+	}
+
+	/**
+	 * Sets the severity and (optional) message.
+	 * 
+	 * @param messageId id of status message
+	 * @param severity  One of IStatus.OK, IStatus.INFO, IStatus.WARNING, IStatus.ERROR
+	 * @param message A text message describing the condition (or null).
+	 * 
+	 */
+	public void setSeverity(String messageId, int severity, String message) {
+		statusMessageList.clear();
+		addSeverity(severity,message);
+	}
+
+	/**
+	 * Sets the severity and (optional) message. The status message Id will be set to default
+	 * 
+	 * @param severity One of IStatus.OK, IStatus.INFO, IStatus.WARNING, IStatus.ERROR
+	 * @param message A text message describing the condition (or null).
+	 * 
+	 */
+	public void setSeverity(int severity, String message) {
+		setSeverity(STATUS_MESSAGE_ID, severity, message);
+	}
+
+	/**
+	 * Convenience method taking an IStatus as input.
+	 * 
+	 * @param status the status to set
+	 * 
+	 */
+	public void setStatus(IStatus status) {
+		if (status == null) {
+			setSeverity(STATUS_MESSAGE_ID, IStatus.OK, null);
+		} else {
+			setSeverity(STATUS_MESSAGE_ID, status.getSeverity(), status.getMessage());
+		}
+	}
+
+	
+	/**
+	 * Sets the severity and (optional) message.
+	 *
+	 * @param messageId id of status message  
+	 * @param severity One of IStatus.OK, IStatus.INFO, IStatus.WARNING, IStatus.ERROR
+	 * @param message A text message describing the condition (or null).
+	 * 
+	 */
+	public void addSeverity(String messageId, int severity, String message) {			
+		statusMessageList.add(new StatusMessage(messageId, severity, message) );
+		updateLabel();
+	}
+
+	/**
+	 * Sets the severity and (optional) message. The status message Id will be set to default
+	 * 
+	 * @param severity One of IStatus.OK, IStatus.INFO, IStatus.WARNING, IStatus.ERROR
+	 * @param message A text message describing the condition (or null).
+	 * 
+	 */
+	public void addSeverity(int severity, String message) {
+		addSeverity(STATUS_MESSAGE_ID, severity, message);
+	}
+
+	/**
+	 * Convenience method taking an IStatus as input.
+	 * @param status  
+	 */
+	
+	public void addStatus (IStatus status) {
+		if (status != null) {
+			addSeverity(status.getSeverity(), status.getMessage());
+		}
+	}
+
+	protected void updateLabel() {
+
+		label.setToolTipText(getToolTipText());
+
+		switch (getHighestSeverity()) {
+			case IStatus.OK :
+				label.setImage(blankImage);
+				break;
+			case IStatus.INFO :
+				label.setImage(infoImage);
+				break;
+			case IStatus.WARNING :
+				label.setImage(warnImage);
+				break;
+			default :
+				label.setImage(errorImage);
+				break;
+		}
+	}
+
+	/**
+	 * returns the tool tip text. Only a maximum of messages will be appended to the tool tip text. The different
+	 * messages are separated with a new line character. 
+	 * If there are more messages than the maximum number, than three
+	 * dots will be appended to the tool tip text.
+	 * 
+	 * @return the tool tip text from the status message list
+	 * 
+	 */
+	protected String getToolTipText() {
+
+		StringBuilder toolTipText = new StringBuilder(256);		
+		List<String> toolTipTextList = new ArrayList<String>();
+
+		appendToolTipTextList(toolTipTextList, IStatus.ERROR, MAX_MESSAGES);
+		appendToolTipTextList(toolTipTextList, IStatus.WARNING, MAX_MESSAGES);
+		appendToolTipTextList(toolTipTextList, IStatus.INFO, MAX_MESSAGES);
+		appendToolTipTextList(toolTipTextList, IStatus.OK, MAX_MESSAGES);
+
+		for (String t : toolTipTextList) {
+			toolTipText.append(t).append(NEW_LINE);
+		}
+		
+		if (statusMessageList.size() > toolTipTextList.size()) {
+			if (toolTipText.length() > 0) {
+				toolTipText.append(ETCETERA);
+			}
+		}
+
+		return toolTipText.toString().trim();
+	}
+
+	/**
+	 * reads all messaged according to the passed severity from the status message list and appends them to
+	 * the passed toolTipText
+	 * 
+	 * @param toolTipTextList where message must be appended to
+	 * @param severity of messages to be appended
+	 * @param maxMessages maximum number of messages to be appended
+	 * 
+	 */
+	protected void appendToolTipTextList(List<String> toolTipTextList, int severity, int maxMessages) {
+
+		for(String m : getMessageList(severity) ) {
+			if (toolTipTextList.size() < maxMessages) {
+				toolTipTextList.add(m);
+			} else {
+				break;
+			}
+		}
+	}
+
+	/**
+	 * returns messages according to the passed severity
+	 * 
+	 * @param severity of messages to be returned 
+	 * @return List of messages according to the passed severity
+	 * 
+	 */
+	
+	protected List<String> getMessageList (int severity) {
+		List<String> messageList = new ArrayList<String>();
+
+		for (StatusMessage m : statusMessageList ) {
+			if (m.getSeverity() == severity) {
+				messageList.add(m.getMessage());
+			}
+		}
+		return messageList;
+	}
+
+	/**
+	 * @return the highest severity in the status message list
+	 * 
+	 */
+	protected int getHighestSeverity() {
+		int severity = IStatus.OK;
+		for(StatusMessage m : statusMessageList) {
+			if (m.getSeverity() > severity) {
+				severity = m.getSeverity();
+			}			
+		}
+		return severity;
+	}
+
+	/**
+	 * @return List of status messages
+	 */
+	protected List<StatusMessage> getStatusMessageList() {
+		return statusMessageList;
+	}
+
+	/**
+	 * @param List of status messages
+	 */
+	protected void setStatusMessageList(List<StatusMessage> list) {
+		statusMessageList = list;
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/AbstractEditModelCommand.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/AbstractEditModelCommand.java
new file mode 100644
index 0000000..30bc307
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/AbstractEditModelCommand.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.editmodel;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.gef.commands.Command;
+
+/**
+ * Default implementation of IEditModelCommand. Clients of EditModel framework
+ * can either subclass AbstractEditModelCommand or implement IEditModelCommand
+ */
+public abstract class AbstractEditModelCommand extends Command implements
+		IEditModelCommand {
+
+	protected static Resource[] EMPTY_RESOURCE_ARRAY = new Resource[0];
+
+	/**
+	 * 
+	 */
+	
+	public AbstractEditModelCommand() {
+		super();
+	}
+
+	/**
+	 * @param label
+	 */
+	public AbstractEditModelCommand (String label) {
+		super(label);
+	}
+
+	/**
+	 * @see org.eclipse.bpel.common.ui.editmodel.IEditModelCommand#getResources()
+	 */
+	public Resource[] getResources() {
+		return EMPTY_RESOURCE_ARRAY;
+	}
+
+	/**
+	 * @see org.eclipse.bpel.common.ui.editmodel.IEditModelCommand#getModifiedResources()
+	 */
+	public Resource[] getModifiedResources() {
+		return getResources();
+	}
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/EditModel.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/EditModel.java
new file mode 100644
index 0000000..1686b38
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/EditModel.java
@@ -0,0 +1,572 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.editmodel;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.bpel.model.resource.BPELResourceSetImpl;
+import org.eclipse.bpel.common.ui.CommonUIPlugin;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarkerDelta;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+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.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+
+/**
+ * EditModel is shared between editor with the same primary file input. It holds
+ * on to a command stack, and a resource set.
+ * 
+ * This class has a reference count cache of EditModels. Once all editors that
+ * reference a editModel are closed all resource in the shared resource set are
+ * unloaded.
+ * 
+ * Life-cycle call getEditModel using its primary file. the shared resource set
+ * reference count is incremented; call getResourceInfo using any file that need
+ * to be loaded the shared resource reference count is incremented; call
+ * releaseReference the shared resource reference count is decremented; call
+ * release if it is the last reference the shared resource set is disposed
+ */
+public class EditModel {
+
+	protected static EditModelCache cache = new EditModelCache();
+
+	protected Map<IFile,ResourceInfo> fileToResourceInfo = new HashMap<IFile,ResourceInfo>();
+
+	protected ResourceSet resourceSet;
+
+	protected int referenceCount = 0;
+
+	protected IResource primaryFile;
+
+	protected EditModelCommandStack commandStack;
+
+	private List<IEditModelListener> updateListeners = null;
+
+	
+
+	
+	/**
+	 * Get the edit model based on the primary resource file.
+	 * 
+	 * @param primaryFile
+	 * @return the edit model
+	 */
+	
+	public static EditModel getEditModel(IResource primaryFile) {
+		return cache.getEditModel(primaryFile, new Factory());
+	}
+
+	/**
+	 * Get the edit model based on the primary resource file.
+	 * @param primaryFile primary file (the BPEL resource) 
+	 * @param factory factory
+	 * @return the editor model
+	 * 
+	 */
+	
+	public static EditModel getEditModel(IResource primaryFile, Factory factory) {
+		return cache.getEditModel(primaryFile, factory);
+	}
+
+	/**
+	 * Private constructor. Use the static factory methods.
+	 */
+	
+	protected EditModel(ResourceSet rSet, IResource bpelFile) {
+		this.resourceSet = rSet;
+		this.primaryFile = bpelFile;		
+		this.updateListeners = new ArrayList<IEditModelListener>();
+	}
+
+	/**
+	 * Add a model listener.
+	 * @param listener
+	 */
+	
+	public void addListener (IEditModelListener listener) {
+		if (updateListeners.contains(listener)) {
+			return;
+		}
+		updateListeners.add(listener);
+	}
+
+	/**
+	 * Remove a model listener.
+	 * @param listener
+	 */
+	
+	public void removeListener(IEditModelListener listener) {
+		updateListeners.remove(listener);
+	}
+
+	protected void fireModelDirtyStateChanged(ResourceInfo sr) {
+		for (IEditModelListener next : updateListeners ) {
+			next.modelDirtyStateChanged(sr);
+		}
+	}
+
+	protected void fireModelDeleted(ResourceInfo sr) {
+		// bugzilla 324006
+		// Prevent concurrent list modification exception:
+		// When a resource is deleted, the BPEL editor shuts itself down for no
+		// apparently good reason (I'm sure it's to avoid some other kinds of disasters
+		// that it isn't equipped to deal with!) This causes the editor to remove itself
+		// from our update listeners list.
+		ArrayList<IEditModelListener> listeners = new ArrayList<IEditModelListener>(updateListeners.size());
+		listeners.addAll(updateListeners);
+		for (IEditModelListener next : listeners ) {
+			next.modelDeleted(sr);
+		}
+	}
+	
+	protected void fireModelReloaded(ResourceInfo sr) {
+		ArrayList<IEditModelListener> listeners = new ArrayList<IEditModelListener>(updateListeners.size());
+		listeners.addAll(updateListeners);
+		for (IEditModelListener next : listeners ) {
+			next.modelReloaded(sr);
+		}
+	}
+
+	protected void fireModelLocationChanged(ResourceInfo sr, IFile movedToFile) {
+		ArrayList<IEditModelListener> listeners = new ArrayList<IEditModelListener>(updateListeners.size());
+		listeners.addAll(updateListeners);
+		for (IEditModelListener next : listeners ) {
+			next.modelLocationChanged(sr,movedToFile);
+		}
+	}
+
+	protected void fireModelMarkersChanged (ResourceInfo sr, IMarkerDelta[] markerDelta ) {
+		ArrayList<IEditModelListener> listeners = new ArrayList<IEditModelListener>(updateListeners.size());
+		listeners.addAll(updateListeners);
+		for (IEditModelListener next : listeners ) {
+			next.modelMarkersChanged(sr,markerDelta );
+		}
+	}
+
+	
+	/**
+	 * Return the resource set associated with this editModel.
+	 * @return the resource set used by this Edit Model client.
+	 */
+	
+	public ResourceSet getResourceSet() {
+		return resourceSet;
+	}
+
+	/**
+	 * Returns the cached ResourceInfo for <code>file</code>
+	 * 
+	 * Creates a new ResourceInfo it is not found in the cache, otherwise
+	 * increment the reference count and return it.
+	 */
+	
+	ResourceInfo getResourceInfoForLoadedResource(Resource resource) {
+		
+		URI uri = resource.getURI();
+		IFile file = getIFileForURI(uri);
+		if (file == null)
+			return null;
+		ResourceInfo resourceInfo = fileToResourceInfo.get(file);
+		if (resourceInfo == null) {
+			resourceInfo = new ResourceInfo(this, file);
+			resourceInfo.setResource(resource);
+			addResourceInfo(resourceInfo);
+			resourceInfo.resourceLoaded();
+		}
+		if (!resourceInfo.loading)
+			resourceInfo.referenceCount++;
+		return resourceInfo;
+	}
+
+	/**
+	 * Returns the cached ResourceInfo for <code>file</code>
+	 * 
+	 * Creates a new ResourceInfo it is not found in the cache, otherwise
+	 * increment the reference count and return it.
+	 * 
+	 * @param file the file
+	 * @return the cached resource info for that file.
+	 */
+	
+	public ResourceInfo getResourceInfo(IFile file) {
+		ResourceInfo resourceInfo = fileToResourceInfo.get(file);
+		if (resourceInfo == null) {
+			resourceInfo = new ResourceInfo(this, file);
+			addResourceInfo(resourceInfo);
+			try {
+				resourceInfo.load();
+			} catch (RuntimeException ex) {
+				resourceInfo.referenceCount++;
+				releaseReference(resourceInfo);
+				throw ex;
+			}
+		}
+		resourceInfo.referenceCount++;
+		return resourceInfo;
+	}
+
+	
+	static ResourceInfo [] EMPTY_RESOURCE_ARRAY = {};
+	
+	/**
+	 * 
+	 * @return The resource infos
+	 * 
+	 */
+	
+	public ResourceInfo[] getResourceInfos() {
+		return fileToResourceInfo.values().toArray(EMPTY_RESOURCE_ARRAY);
+	}
+
+	
+	private void setPrimaryFile(IFile newFile) {
+		IResource oldFile = primaryFile;
+		primaryFile = newFile;
+		cache.updatePrimaryFile(oldFile, newFile);
+	}
+
+	/**
+	 * @return the primary resource (primary file) for this edit model. 
+	 */
+	
+	public IResource getPrimaryFile() {
+		return primaryFile;
+	}
+
+	/**
+	 * Decrement the reference count for <code>resourceInfo</code> and dispose
+	 * if it is the last reference.
+	 * @param resourceInfo 
+	 */
+	public void releaseReference (ResourceInfo resourceInfo) {
+		resourceInfo.referenceCount--;
+		if (resourceInfo.referenceCount == 0) {
+			resourceInfo.dispose();
+			removeResourceInfo(resourceInfo);
+		}
+	}
+
+	/**
+	 * Add resourceInfo to the cache
+	 */
+	
+	protected void addResourceInfo(ResourceInfo sr) {
+		fileToResourceInfo.put(sr.getFile(), sr);
+	}
+
+	/*
+	 * Remove the resourceInfo from the cache.
+	 */
+	protected void removeResourceInfo(ResourceInfo sr) {
+		fileToResourceInfo.remove(sr.getFile());
+	}
+
+	/**
+	 * Dispose this EditModel if there is no other reference to it;
+	 */
+	public void release() {
+		referenceCount--;
+		if (referenceCount == 0) {
+			cache.remove(this);
+			for (ResourceInfo resourceInfo : fileToResourceInfo.values().toArray(EMPTY_RESOURCE_ARRAY) ) {
+				resourceInfo.dispose();
+			}
+			fileToResourceInfo.clear();
+		}
+		
+	}
+
+	public static IFile getIFileForURI(URI uri) {
+		String filePath = null;
+		String scheme = uri.scheme();
+		IFile file = null;
+		if ("file".equals(scheme)) { //$NON-NLS-1$
+			filePath = uri.toFileString();
+			if (filePath == null)
+				return null;
+			file = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(
+					new Path(filePath));
+		} else if ("platform".equals(scheme) && uri.segmentCount() > 1 && "resource".equals(uri.segment(0))) { //$NON-NLS-1$//$NON-NLS-2$
+			StringBuffer platformResourcePath = new StringBuffer();
+			for (int i = 1, size = uri.segmentCount(); i < size; ++i) {
+				platformResourcePath.append('/');
+				platformResourcePath.append(uri.segment(i));
+			}
+			filePath = platformResourcePath.toString();
+			if (filePath == null)
+				return null;
+			file = ResourcesPlugin.getWorkspace().getRoot().getFile(
+					new Path(filePath));
+		}
+		return file;
+	}
+
+	/**
+	 * Get the command stack.
+	 * 
+	 * @return the command stack.
+	 */
+	
+	public EditModelCommandStack getCommandStack() {
+		return commandStack;
+	}
+
+	
+	/**
+	 * Set the command stack.
+	 * 
+	 * @param stack the command stack.
+	 */
+	
+	public void setCommandStack(EditModelCommandStack stack) {
+		this.commandStack = stack;
+	}
+
+	/**
+	 * Saves the model
+	 * 
+	 * @param progressMonitor progress monitor. 
+	 * @return if all went OK true, false otherwise.  
+	 */
+	
+	public boolean saveAll(IProgressMonitor progressMonitor) {
+		WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
+			@Override
+			protected void execute(IProgressMonitor monitor)
+					throws InvocationTargetException {
+				getCommandStack().markSaveLocation();
+				try {
+					ResourceInfo[] sResource = getResourceInfos();
+					for (int i = 0; i < sResource.length; i++) {
+						ResourceInfo resource = sResource[i];
+						if (resource.isDirty())
+							resource.save();
+					}
+				} catch (IOException e) {
+					throw new InvocationTargetException(e);
+				}
+			}
+		};
+
+		try {
+			operation.run(progressMonitor);
+		} catch (InvocationTargetException e) {
+			return false;
+		} catch (InterruptedException e) {
+			return false;
+		}
+		return true;
+	}
+
+	
+	/**
+	 * Save primary resource as ...
+	 * 
+	 * @param resourceInfo
+	 * @param savedFile
+	 * @param progressMonitor
+	 * @return save result (true is OK).
+	 */
+	
+	public boolean savePrimaryResourceAs(final ResourceInfo resourceInfo,
+			final IFile savedFile, IProgressMonitor progressMonitor) {
+		boolean result = saveResourceAs(resourceInfo, savedFile,
+				progressMonitor);
+		if (result)
+			setPrimaryFile(savedFile);
+		return result;
+	}
+
+	/**
+	 * Save resource as ...
+	 * @param resourceInfo
+	 * @param savedFile
+	 * @param progressMonitor
+	 * @return the status of the save ...
+	 */
+	
+	public boolean saveResourceAs(final ResourceInfo resourceInfo,
+			final IFile savedFile, IProgressMonitor progressMonitor) {
+		WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
+			
+			@Override
+			protected void execute(IProgressMonitor monitor)
+					throws InvocationTargetException  {
+				try {
+					getCommandStack().markSaveLocation();
+					resourceInfo.saveAs(savedFile);
+				} catch (IOException e) {
+					throw new InvocationTargetException(e);
+				}
+			}
+		};
+
+		try {
+			operation.run(progressMonitor);
+		} catch (InvocationTargetException e) {
+			return false;
+		} catch (InterruptedException e) {
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * 
+	 * @author IBM
+	 *
+	 */
+	public static class Factory {
+		protected EditModel createEditModel(ResourceSet resourceSet,
+				IResource primaryFile) {
+			return new EditModel(resourceSet, primaryFile);
+		}
+	}
+
+	static class EditModelCache {
+
+		protected Map<ResourceSet,EditModel> resourceSetToEditModel = new HashMap<ResourceSet,EditModel>();
+
+		protected Map<IResource,ResourceSet> fileToResourceSet = new HashMap<IResource,ResourceSet>();
+
+		/**
+		 * Return a new ResourceSet for the specified file.
+		 * @param primaryFile 
+		 * @param factory 
+		 * @return the edit model.
+		 */
+		
+		public EditModel getEditModel(IResource primaryFile, Factory factory) {
+			ResourceSet resourceSet = getResourceSet(primaryFile);
+			return getEditModel(resourceSet, primaryFile, factory);
+		}
+
+		/**
+		 * Return the EditModel for specified resource set.
+		 * 
+		 * Creates a new EditModel it is not found in the cache, otherwise
+		 * increment the reference count and return it.
+		 */
+		
+		@SuppressWarnings("unchecked")
+		private EditModel getEditModel(ResourceSet resourceSet,
+				IResource primaryFile, Factory factory) {
+			EditModel editModel = resourceSetToEditModel.get(resourceSet);
+			if (editModel != null) {
+				editModel.referenceCount++;
+				return editModel;
+			}
+			editModel = factory.createEditModel(resourceSet, primaryFile);
+			editModel.referenceCount++;
+			resourceSetToEditModel.put(resourceSet, editModel);
+			final EditModel finalEditModel = editModel;
+			
+			resourceSet.eAdapters().add(new AdapterImpl() {
+				
+				@Override
+				public void notifyChanged(Notification msg) {
+					Resource r = (Resource) msg.getNewValue();
+					finalEditModel.getResourceInfoForLoadedResource(r);
+				}
+				
+			});
+			return editModel;
+		}
+
+	/*
+	 * Return a new ResourceSet for the specified file.
+	 */
+	private ResourceSet getResourceSet(IResource primaryFile) {
+		ResourceSet resourceSet = fileToResourceSet.get(primaryFile);
+		if(resourceSet != null)
+			return resourceSet;
+		// TODO: Extensibility
+		resourceSet = new BPELResourceSetImpl();
+		fileToResourceSet.put(primaryFile,resourceSet);
+		return resourceSet;	
+	}
+
+		/**
+		 * 
+		 * @param editModel
+		 */
+		public void remove(EditModel editModel) {
+			resourceSetToEditModel.remove(editModel.resourceSet);
+			fileToResourceSet.remove(editModel.primaryFile);
+		}
+
+		
+		void updatePrimaryFile(IResource oldFile, IResource newFile) {
+			ResourceSet rs = fileToResourceSet.get(oldFile);
+			fileToResourceSet.remove(oldFile);
+			fileToResourceSet.put(newFile, rs);
+		}
+	}
+	
+
+	
+	static String EXTPT_RESOURCE_SET_PROVIDER = "resourceSetProvider"; //$NON-NLS-1$
+	static String ELM_PROVIDER = "provider"; //$NON-NLS-1$
+	static String ATT_CLASS = "class"; //$NON-NLS-1$
+	
+	static private IResourceSetProvider gfResourceSetProvider;
+	
+	static IResourceSetProvider getResourceSetProvider () {
+		if (gfResourceSetProvider != null) {
+			return gfResourceSetProvider;
+		}
+		
+		for(IConfigurationElement elm : CommonUIPlugin.getConfigurationElements( EXTPT_RESOURCE_SET_PROVIDER)) {
+			
+			if (ELM_PROVIDER.equals(elm.getName()) == false) {
+				continue;
+			}
+			
+			String clazz = elm.getAttribute(ATT_CLASS);
+			if (clazz != null) {
+				try {
+					gfResourceSetProvider = (IResourceSetProvider) elm.createExecutableExtension(ATT_CLASS);						
+				} catch ( CoreException ce ) {
+					CommonUIPlugin.getDefault().getLog().log(ce.getStatus());
+				}								
+			}
+			
+			if (gfResourceSetProvider != null) {
+				break;
+			}
+		}
+		
+		if (gfResourceSetProvider == null) {
+			gfResourceSetProvider = new IResourceSetProvider () {
+
+				public ResourceSet getResourceSet (IResource resource) {
+					return new ResourceSetImpl();
+				}				
+			};
+		}
+		return gfResourceSetProvider;
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/EditModelClient.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/EditModelClient.java
new file mode 100644
index 0000000..f12da56
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/EditModelClient.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.editmodel;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.eclipse.bpel.common.ui.CommonUIPlugin;
+import org.eclipse.bpel.model.resource.BPELResourceSetImpl;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.ui.IEditorPart;
+
+public class EditModelClient {
+		
+	/** */
+	private ResourceInfo primaryResourceInfo;
+	/** */
+	private EditModel editModel;
+	/** */
+	private IEditModelListener modelListener;
+	/** */
+	private SynchronizationManager manager;
+	/** */
+	private IEditorPart editor;
+	
+
+/**
+ * Creates a new EditModelClient
+ * 
+ * @param editor the editor that is using this model manager
+ * @param file the editor's input
+ * @param modelListener the listener which is used to communicate back to the editor.
+ * @param loadOptions a Map of EMF load/save options. May be empty.
+ */
+public EditModelClient(IEditorPart editor,IEditModelListener modelListener) {
+	this.editor = editor;
+	this.modelListener = modelListener;
+}
+
+// Bugzilla 330513
+// separated this from constructor
+public void loadPrimaryResource(IFile file, Map loadOptions) throws RuntimeException {
+	editModel = getSharedResourceSet(file);
+	((BPELResourceSetImpl)editModel.getResourceSet()).setLoadOptions(loadOptions);
+	try {
+		SynchronizationHandler handler = new Synchronizer();
+		if(getCommandStack() == null) {
+			EditModelCommandStack commandStack = createCommandStack();
+			editModel.setCommandStack(commandStack);
+		}
+		primaryResourceInfo = editModel.getResourceInfo(file);
+		if(loadOptions != null)
+			primaryResourceInfo.setLoadOptions(loadOptions);
+		getEditModel().addListener(modelListener);
+		manager = new SynchronizationManager(editor,editModel,handler);
+	} catch (RuntimeException ex) {
+		if(editModel != null)
+			editModel.release();
+		throw ex;
+	}
+}
+protected EditModel getSharedResourceSet(IFile file) {
+	return EditModel.getEditModel(file);
+}
+/**
+ * Creates and returns a command stack to be used by this
+ * model manager and the editor.
+ */
+protected EditModelCommandStack createCommandStack() {
+	return new EditModelCommandStack();
+}
+/**
+ * Returns the command stack to be used by this
+ * model manager and the editor.
+ */
+public EditModelCommandStack getCommandStack() {
+	return editModel.getCommandStack();
+}
+/**
+ * Returns the EMFModel editModel used by this model manager.
+ * The EditModel is a model reference count cache.
+ */
+public EditModel getEditModel() {
+	return editModel;
+}
+/**
+ * Returns the ResourceInfo which is used by the EditModel
+ * and counts the reference for each model cached in the model
+ * editModel.
+ */
+public ResourceInfo getPrimaryResourceInfo() {
+	return primaryResourceInfo;
+}
+/**
+ * Disposes this model manager, its command stack, and 
+ * its model editModel.
+ */
+public void dispose() {
+	getEditModel().removeListener(modelListener);
+	editModel.releaseReference(primaryResourceInfo);
+	editModel.release();
+}
+/**
+ * Saves the model
+ */
+public boolean saveAll(IProgressMonitor progressMonitor) {
+	return editModel.saveAll(progressMonitor);
+}
+
+/**
+ * Saves the model with a new name
+ */
+public boolean savePrimaryResourceAs(IFile savedFile, IProgressMonitor progressMonitor) {
+	return editModel.savePrimaryResourceAs(primaryResourceInfo,savedFile,progressMonitor);
+}
+void close() {
+	editor.getSite().getPage().closeEditor(editor, false);
+}
+private class Synchronizer implements SynchronizationHandler {
+	public void closeEditor() {
+		EditModelClient.this.close();
+	}
+	public boolean saveFileAs(ResourceInfo resourceInfo,IFile file) throws CoreException, IOException {
+		if (resourceInfo.equals(primaryResourceInfo))
+			return savePrimaryResourceAs(file, null);
+		else {
+			resourceInfo.saveAs(file);
+			return true;
+		}
+	}
+	public void refresh(ResourceInfo resourceInfo) {
+		try {
+		resourceInfo.refresh();
+		}
+		catch (Exception e) {
+			CommonUIPlugin.log(e);
+		}
+		getCommandStack().flush();
+	}
+}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/EditModelCommandStack.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/EditModelCommandStack.java
new file mode 100644
index 0000000..4e65f0a
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/EditModelCommandStack.java
@@ -0,0 +1,521 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.editmodel;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EventObject;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.bpel.common.ui.CommonUIPlugin;
+import org.eclipse.bpel.common.ui.Messages;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.CommandStack;
+import org.eclipse.gef.commands.CommandStackListener;
+import org.eclipse.gef.commands.CompoundCommand;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchWindow;
+
+
+
+/**
+ * Implements the CommandStack API, adds extra notifications,
+ * supports validateEdit and update the resource's dirty state.
+ * 
+ * WDG: TODO: the GEF CommandStack has been extended with extra notifications.
+ * However, how are we supposed to use it since everything is still private?
+ */
+public class EditModelCommandStack extends CommandStack {
+
+	protected int saveLocation = 0;
+	protected int fCurrentLocation = 0;
+	
+	protected Set<Resource> dirtyUntilSave = new HashSet<Resource>();
+	
+	protected List<Context> fContexts = new ArrayList<Context>(30);
+	
+	/**
+	 * Brand new shiny EditModelCommandStack.
+	 */
+	public EditModelCommandStack() {
+		super();
+	}
+
+	/**
+	 * @see org.eclipse.gef.commands.CommandStack#getUndoCommand()
+	 */
+	@Override
+	public Command getUndoCommand() {
+		if (fCurrentLocation < 1) {
+			return null;
+		}
+		return fContexts.get(fCurrentLocation-1).fCommand;
+	}
+	
+	/**
+	 * @see org.eclipse.gef.commands.CommandStack#canUndo()
+	 */
+	@Override
+	public boolean canUndo() {
+		Command c = getUndoCommand();
+		return (c != null) && c.canUndo();
+	}
+
+	
+	/**
+	 * @see org.eclipse.gef.commands.CommandStack#getRedoCommand()
+	 */
+	@Override
+	public Command getRedoCommand() {
+		if (fCurrentLocation >= fContexts.size()) return null;
+		return fContexts.get(fCurrentLocation).fCommand;
+	}
+	
+	/**
+	 * @see org.eclipse.gef.commands.CommandStack#canRedo()
+	 */
+	@Override
+	public boolean canRedo() {
+		return (getRedoCommand() != null);
+	}
+
+	/**
+	 * @see org.eclipse.gef.commands.CommandStack#execute(org.eclipse.gef.commands.Command)
+	 */	
+	@Override
+	public void execute (Command command) {
+		SharedCommandStackChangedEvent event = notifyListeners(SharedCommandStackListener.EVENT_START_EXECUTE);
+		if (!event.doit) return;
+
+		if(getUndoCommand() instanceof PlaceHolderCommand) {
+			// This should never happen because the EditModelCommandFramework should
+			// remove the placeholder during the notifyListeners() call above.
+			throw new IllegalStateException();
+		}
+		if (command == null) return;
+		if (!validateEdit(command)) return;
+		if (!command.canExecute()) return;
+		drop(fCurrentLocation, fContexts.size());
+
+		// Paranoia check
+		if(getUndoCommand() instanceof PlaceHolderCommand) {
+			// This should never happen because the EditModelCommandFramework should
+			// remove the placeholder during the notifyListeners() call above.
+			throw new IllegalStateException();
+		}
+		command.execute();
+		if(getUndoCommand() instanceof PlaceHolderCommand) {
+			// This should never happen because the EditModelCommandFramework should
+			// remove the placeholder during the notifyListeners() call above.
+			throw new IllegalStateException();
+		}
+		int limit = getUndoLimit();
+		if (limit > 0) while (fCurrentLocation >= limit) {
+			if (saveLocation == 0) saveLocation = -1;
+			drop(0);
+			notifyListeners(SharedCommandStackListener.EVENT_DROP_LAST_UNDO_STACK_ENTRY);
+		}
+		if(getUndoCommand() instanceof PlaceHolderCommand) {
+			// This should never happen because the EditModelCommandFramework should
+			// remove the placeholder during the notifyListeners() call above.
+			throw new IllegalStateException();
+		}
+		Resource[] resources = getModifiedResources(command);
+		if ((resources.length > 0) || (command instanceof PlaceHolderCommand)) {
+			Context c = new Context(command, resources);
+			fContexts.add(c); fCurrentLocation = fContexts.size();
+			// mark resources as dirty/clean as appropriate.
+			c.setModifiedFlags(true);
+			//System.out.println("execute - markModified.  currentLocation="+currentLocation+", saveLocation="+saveLocation);
+		}
+		notifyListeners(SharedCommandStackListener.EVENT_FINISH_EXECUTE);
+	}
+	/*
+	 * call VCM validateEdit;
+	 * open the dialog to ask the user if he/she wants to procede
+	 * 		in case the file is readonly;
+	 * return true if the command should be executed otherwise returns false;
+	 */
+	protected boolean validateEdit(Command command) {
+		Resource[] resources = getResources(command);
+		if(resources.length == 0)
+			return true;
+		boolean disposeShell = false;
+		Shell shell;
+		IWorkbenchWindow win = CommonUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
+		if (win != null) {
+			shell = win.getShell();
+		} else {
+			disposeShell = true;
+			shell = new Shell();
+		}
+		try {
+			IFile[] files = new IFile[resources.length];
+			StringBuffer filesString = new StringBuffer();
+			for (int i = 0; i < resources.length; i++) {
+				Resource resource = resources[i];
+				files[i] = EditModel.getIFileForURI(resource.getURI());
+				filesString.append(files[i].getName());
+				if(i < resources.length - 1)
+					filesString.append(", "); //$NON-NLS-1$
+			}
+			IStatus stat = ResourcesPlugin.getWorkspace().validateEdit(files, shell);
+			if (stat.getSeverity() == IStatus.CANCEL) {
+				return false;
+			} else if (!stat.isOK()) {
+				String[] buttons = { IDialogConstants.OK_LABEL }; //
+				String msg;
+				if(files.length == 1)
+					msg = NLS.bind(Messages.EditModelCommandStack_validateEdit_message0, (new String[]{filesString.toString(),stat.getMessage()})); 
+				else
+					msg = NLS.bind(Messages.EditModelCommandStack_validateEdit_message1, (new String[]{filesString.toString(),stat.getMessage()})); 
+				MessageDialog dialog = new MessageDialog(
+						shell,
+						Messages.EditModelCommandStack_validateEdit_title, 
+						null, // accept the default windowing system icon
+						msg, 
+						MessageDialog.WARNING,
+						buttons,
+						0);
+				dialog.open();
+				return false;
+			}
+		} finally {
+			if(disposeShell)
+				shell.dispose();
+		}
+		return true;
+	}
+
+	/**
+	 * @see org.eclipse.gef.commands.CommandStack#dispose()
+	 */
+	@Override
+	public void dispose() {
+		drop(0,fContexts.size());
+	}
+
+	/**
+	 * @see org.eclipse.gef.commands.CommandStack#flush()
+	 */
+	@Override
+	public void flush() {
+		SharedCommandStackChangedEvent event = notifyListeners(SharedCommandStackListener.EVENT_START_FLUSH);
+		if (!event.doit) return;
+
+		drop(0, fContexts.size());
+		fContexts.clear();
+		saveLocation = -1;
+		fCurrentLocation = 0;
+		// TODO: should we mark all resources as clean?
+		notifyListeners(SharedCommandStackListener.EVENT_FINISH_FLUSH);
+	}
+
+	/**
+	 * @see org.eclipse.gef.commands.CommandStack#getCommands()
+	 */
+	@Override
+	public Object[] getCommands() {		
+		Object[] commands = new Object[fContexts.size()];
+		for (int i = 0; i < fContexts.size(); i++) {
+			commands[i] = fContexts.get(i).fCommand;
+		}
+		return commands;
+	}
+
+
+	/**
+	 * @see org.eclipse.gef.commands.CommandStack#isDirty()
+	 */
+	@Override
+	public boolean isDirty() {
+		//System.out.println("isDirty: C="+currentLocation+"  S="+saveLocation+"  dus="+dirtyUntilSave.size());
+		return (fCurrentLocation != saveLocation) || !dirtyUntilSave.isEmpty();
+	}
+
+	/**
+	 * @see org.eclipse.gef.commands.CommandStack#markSaveLocation()
+	 */
+	@Override
+	public void markSaveLocation() {
+//		// mark all the resources we know about as clean!
+//		for (int i = 0; i<contexts.size(); i++) {
+//			Context c = (Context)contexts.get(i);
+//			c.setModifiedFlags(false);
+//		}
+//		// that includes ones that fell off the bottom of the undo stack. 
+//		for (Iterator it = dirtyUntilSave.iterator(); it.hasNext(); ) {
+//			setResourceModified((Resource)it.next(), false);
+//		}
+		dirtyUntilSave.clear();
+
+		saveLocation = fCurrentLocation;
+		notifyListeners(SharedCommandStackListener.EVENT_MARK_SAVED);
+	}
+
+	/**
+	 * @see org.eclipse.gef.commands.CommandStack#undo()
+	 */
+	@Override
+	public void undo() {
+		SharedCommandStackChangedEvent event = notifyListeners(SharedCommandStackListener.EVENT_START_UNDO);
+		if (!event.doit) return;
+		
+		if (!canUndo()) return;
+		Context c = fContexts.get(fCurrentLocation-1);
+		c.fCommand.undo();
+		fCurrentLocation--;
+		// mark resources as dirty/clean as appropriate.
+		if (fCurrentLocation < saveLocation) {
+			// moving away from save location --> resources can only become dirty
+			c.setModifiedFlags(true);
+			// System.out.println("undo - markModified.  currentLocation="+currentLocation+", saveLocation="+saveLocation);
+		} else {
+			// moving towards save location --> resources can only become clean
+			updateModifiedFlags();
+		}
+		
+		notifyListeners();
+		notifyListeners(SharedCommandStackListener.EVENT_FINISH_UNDO);
+	}
+
+	
+	/**
+	 * @see org.eclipse.gef.commands.CommandStack#redo()
+	 */
+	@Override
+	public void redo() {
+		SharedCommandStackChangedEvent event = notifyListeners(SharedCommandStackListener.EVENT_START_REDO);
+		if (!event.doit) return;
+
+		if (!canRedo()) return;
+		Context c = fContexts.get(fCurrentLocation);
+		c.fCommand.redo();
+		fCurrentLocation++;
+		// mark resources as dirty/clean as appropriate.
+		if (fCurrentLocation > saveLocation) {
+			// moving away from save location --> resources can only become dirty
+			c.setModifiedFlags(true);
+			//System.out.println("redo - markModified.  currentLocation="+currentLocation+", saveLocation="+saveLocation);
+		} else {
+			// moving towards save location --> resources can only become clean
+			updateModifiedFlags();
+		}
+
+		if(getUndoCommand() instanceof PlaceHolderCommand) {
+			// This should never happen
+			throw new IllegalStateException();
+		}
+		notifyListeners();
+		notifyListeners(SharedCommandStackListener.EVENT_FINISH_REDO);
+	}
+
+	/**
+	 * Sends notification to all {@link CommandStackListener}s.
+	 */
+	protected SharedCommandStackChangedEvent notifyListeners(int property) {
+		SharedCommandStackChangedEvent event = new SharedCommandStackChangedEvent(this);
+		event.property = property;
+
+		for (Object next : listeners) {
+			CommandStackListener csl = (CommandStackListener) next;
+			csl.commandStackChanged(event);
+		}
+		
+		return event;
+	}
+
+	/*
+	 * Helper to remove a command from any point in the stack.
+	 */
+	protected void drop (int pos) {
+		//System.out.println("  (drop "+pos+") C="+currentLocation+" S="+saveLocation);
+		if ((pos < 0) || pos >= fContexts.size()) {
+			throw new IllegalArgumentException();
+		}
+		Context c = fContexts.get(pos);
+		int a = Math.min(saveLocation, fCurrentLocation);
+		int b = Math.max(saveLocation, fCurrentLocation);
+		if ((a <= pos) && (pos < b)) {
+			// we're dropping something between current and save point.
+			dirtyUntilSave.addAll(Arrays.asList(c.fResources));
+			//System.out.println("dus = "+dirtyUntilSave);
+		}
+		c.fCommand.dispose();
+		fContexts.remove(pos);
+		if (fCurrentLocation > pos) {
+			fCurrentLocation--;
+		}
+		if (saveLocation > pos) {
+			saveLocation--;
+		}
+	}
+
+	/*
+	 * Helper to remove a range of commands from anywhere in the stack.
+	 */
+	protected void drop(int from, int to) {
+		if (to < from) { int a=to; to=from; from=a; }
+		//System.out.println("drop: "+to+".."+from);
+		while (to > from) { drop(from); to--; }
+	}
+	
+	/*
+	 * Helper to mark a resource as clean or dirty (mostly for ease of debugging)
+	 */
+	protected static void setResourceModified(Resource r, boolean modified) {
+		if (r.isModified() != modified) {
+			//System.out.println("> "+modified+" : "+r);
+			r.setModified(modified);
+		}
+	}
+	
+	/*
+	 * Helper to calculate which resources should be marked as dirty
+	 */
+	protected void updateModifiedFlags() {
+		//System.out.println("calculateModifiedState()");
+		
+		Set<Resource> cleanResources = new HashSet<Resource>();
+		// for starters, treat everything as clean
+		for (Context c : fContexts) {
+			cleanResources.addAll(Arrays.asList(c.fResources));
+		}
+		
+		// mark things that fell off the bottom of the undo stack as dirty 
+		for (Resource resource : dirtyUntilSave) {
+			cleanResources.remove(resource);
+			setResourceModified(resource, true);
+		}
+		// mark things modified between saveLocation and currentLocation as dirty
+		int a = Math.min(fCurrentLocation, saveLocation);
+		int b = Math.max(fCurrentLocation, saveLocation);
+		
+		for (int i = Math.max(a,0); i<b; i++) {
+			Context c = fContexts.get(i);
+			cleanResources.removeAll(Arrays.asList(c.fResources));
+			c.setModifiedFlags(true);
+		}
+		// mark anything we still consider clean as clean
+		for (Resource resource : cleanResources) {
+			setResourceModified(resource, false);
+		}
+	}
+	
+	
+	/**
+	 * SharedCommandStackListener
+	 * 
+	 */
+	public static interface SharedCommandStackListener extends CommandStackListener {
+		
+		public static final int EVENT_START_EXECUTE = 1;
+		public static final int EVENT_FINISH_EXECUTE = 2;
+		public static final int EVENT_START_UNDO = 3;
+		public static final int EVENT_FINISH_UNDO = 4;
+		public static final int EVENT_START_REDO = 5;
+		public static final int EVENT_FINISH_REDO = 6;
+		public static final int EVENT_START_FLUSH = 7;
+		public static final int EVENT_FINISH_FLUSH = 8;
+		public static final int EVENT_START_MARK_SAVED = 9;
+		public static final int EVENT_FINISH_MARK_SAVED = 10;
+		
+		public static final int EVENT_DROP_LAST_UNDO_STACK_ENTRY = 11;
+		public static final int EVENT_MARK_SAVED = 12;
+		
+	}
+
+	public static class SharedCommandStackChangedEvent extends EventObject {
+		int property;
+		public boolean doit = true;
+		SharedCommandStackChangedEvent(Object source) {	super(source); }
+		public EditModelCommandStack getStack() {
+			return (EditModelCommandStack)getSource();
+		}
+		public int getProperty() { return property; }
+	}
+	
+	protected static Resource[] EMPTY_RESOURCE_ARRAY = new Resource[0];
+	
+	// TODO: should this be in a utility class?  Can it be made extensible?
+	public static Resource[] getResources(Command command) {
+		if (command instanceof IEditModelCommand) {
+			return ((IEditModelCommand)command).getResources();
+		}
+		if (command instanceof CompoundCommand) {
+			CompoundCommand ccmd = (CompoundCommand) command;
+			
+			Set<Resource> set = new HashSet<Resource>();			
+			for (Object n : ccmd.getChildren() ) {
+				for (Resource r : getResources((Command)n)) {
+					set.add(r);
+				}								
+			}
+			if (set.isEmpty()) {
+				return EMPTY_RESOURCE_ARRAY;
+			}
+			return set.toArray( EMPTY_RESOURCE_ARRAY );		}
+	
+		throw new IllegalArgumentException();
+	}
+	
+	// TODO: should this be in a utility class?  Can it be made extensible?
+	public static Resource[] getModifiedResources(Command command) {
+		
+		if (command instanceof IEditModelCommand) {
+			return ((IEditModelCommand)command).getModifiedResources();
+		}
+		if (command instanceof CompoundCommand) {
+			CompoundCommand ccmd = (CompoundCommand) command;
+			
+			Set<Resource> set = new HashSet<Resource>();			
+			for (Object n : ccmd.getChildren() ) {
+				for (Resource r : getModifiedResources((Command)n)) {
+					set.add(r);
+				}								
+			}
+			if (set.isEmpty()) {
+				return EMPTY_RESOURCE_ARRAY;
+			}
+			return set.toArray( EMPTY_RESOURCE_ARRAY );
+		}
+	
+		throw new IllegalArgumentException();
+	}
+
+	
+	protected static class Context {
+		
+		public Command fCommand;
+		public Resource[] fResources;
+		
+		public Context(Command command, Resource[] resources) {
+			this.fCommand = command; 
+			this.fResources = resources;
+		}
+		public void setModifiedFlags (boolean value) {
+			for (Resource r : fResources) {
+				setResourceModified(r, value);
+			}
+		}
+		
+	}
+	
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/IEditModelCommand.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/IEditModelCommand.java
new file mode 100644
index 0000000..40545e2
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/IEditModelCommand.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.editmodel;
+
+import org.eclipse.emf.ecore.resource.Resource;
+/**
+ * All commands used within EditModelCommandStack must
+ * implement this interface. It enables the command stack
+ * to track dirty resources and support validate edit.
+ */
+public interface IEditModelCommand {
+
+/**
+ * Returns the list of emf resource that this command my change.
+ * Called before the command is executed to validate edit.
+ */
+public abstract Resource[] getResources();
+/**
+ * Returns a list of resource that this command has modified.
+ * Usually returns the same list as in <code>getResources</code>
+ * but it may return a subset if, for example, a compound command 
+ * was not fully executed.
+ */
+public abstract Resource[] getModifiedResources();
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/IEditModelListener.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/IEditModelListener.java
new file mode 100644
index 0000000..05b4890
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/IEditModelListener.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.editmodel;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarkerDelta;
+
+/**
+ * The ResourceInfo, which is a reference count cache to a model,
+ * will call the model update listeners when the model
+ * is deleted, reloaded, moved, or its dirty state is changed. 
+ */
+public interface IEditModelListener {
+		
+	/**
+	 * The model has been deleted. All cached references to the model
+	 * should be deleted.
+	 * 
+	 * If this is model the primary model and the editor is not dirty,
+	 * the editor should be closed. If this is a secondary model,
+	 * the editor may not need to be closed.
+	 *  
+	 * @param resourceInfo the resource info
+	 */
+	public void modelDeleted (ResourceInfo resourceInfo);
+	
+	/**
+	 * The model was changed outside this framework and reloaded
+	 * by the edit model framework. It may be needed to refresh visuals.
+	 * @param resourceInfo the resource info
+	 */
+	
+	public void modelReloaded (ResourceInfo resourceInfo);
+	
+	/**
+	 * The model file was moved from its location. All references
+	 * to this file should be updated.
+	 * 
+	 * @param resourceInfo 
+	 * @param movedToFile 
+	 */
+	
+	public void modelLocationChanged (ResourceInfo resourceInfo,IFile movedToFile);
+	
+	/**
+	 * The model dirty state was changed.
+	 * @param resourceInfo 
+	 */
+	
+	public void modelDirtyStateChanged (ResourceInfo resourceInfo);
+	
+	/**
+	 * Notifies that markers have changed on the resource info.
+	 * 
+	 * @param resourceInfo
+	 * @param markerDelta 
+	 */
+	
+	public void modelMarkersChanged ( ResourceInfo resourceInfo , IMarkerDelta [] markerDelta );
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/IResourceSetProvider.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/IResourceSetProvider.java
new file mode 100644
index 0000000..1b2344e
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/IResourceSetProvider.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Oracle Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.editmodel;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+/**
+ * @author Michal Chmielewski (michal.chmielewski@oracle.com)
+ * @date May 30, 2007
+ *
+ */
+public interface IResourceSetProvider {
+
+	/**
+	 * Get the resource set for the given resource.
+	 * 
+	 * @param resource
+	 * @return the resource set.
+	 */
+	
+	ResourceSet getResourceSet( IResource resource );	
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/PlaceHolderCommand.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/PlaceHolderCommand.java
new file mode 100644
index 0000000..8985b74
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/PlaceHolderCommand.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.editmodel;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.gef.commands.Command;
+
+public final class PlaceHolderCommand extends Command implements IEditModelCommand {
+
+	private static Resource[] EMTPY_RESOURCE_ARRAY = new Resource[0];
+/**
+ * @param label
+ * @todo Generated comment
+ */
+public PlaceHolderCommand(String label) {
+	super(label);
+}
+
+@Override
+public final void execute() {}
+@Override
+public final void undo() {}
+@Override
+public final void redo() {}
+
+public Resource[] getResources() {
+	return EMTPY_RESOURCE_ARRAY;
+}
+
+public Resource[] getModifiedResources() {
+	return EMTPY_RESOURCE_ARRAY;
+}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/ResourceInfo.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/ResourceInfo.java
new file mode 100644
index 0000000..7bd99a0
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/ResourceInfo.java
@@ -0,0 +1,316 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.editmodel;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarkerDelta;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+
+/**
+ * Resource Info holds the information about the resource, the edit model it represents, and it listens
+ * on the resource modifications notifications from the workbench. Once the EMF resource is loaded,
+ * ResourceInfo will listen on any updates from it and propagate to the EditoModel as well.
+ * 
+ * @author IBM
+ */
+
+public class ResourceInfo {
+
+	/** The edit model */
+	EditModel editModel;
+
+	/** The emf resource */
+	Resource resource;
+
+	/** The workbench IFile that the resource came from */
+	IFile file;
+
+	/** Resource listener, notifications from workbench */
+	ResourceListener resourceListener;
+
+	/** The adapter on the EMF resource */
+	Adapter resourceAdapter;
+
+	/** Last synchronization stamp */
+	long synchronizeStamp = 0;
+
+	/** Load options */
+	Map loadOptions = new HashMap();
+
+	
+	protected int referenceCount = 0;
+
+	protected boolean loading = false;
+
+	protected boolean fileExists = false;
+
+	
+	/**
+	 * Brand new shiny ResourceInfo object.
+	 *  
+	 * @param editModel
+	 * @param file
+	 */
+	
+	ResourceInfo (EditModel anEditModel, IFile aFile) {
+		this.editModel = anEditModel;
+		this.file = aFile;
+		
+		resetSynchronizeStamp();
+		resourceListener = new ResourceListener(this, this.file);
+		ResourcesPlugin.getWorkspace().addResourceChangeListener (resourceListener);
+		
+		resourceAdapter = new AdapterImpl() {
+			
+			@Override
+			public void notifyChanged(Notification msg) {
+				if ((msg.getEventType() == Notification.SET)
+						&& (resource != null && msg.getNotifier() == resource)) {
+					if (msg.getFeatureID(Resource.class) == Resource.RESOURCE__IS_MODIFIED) {
+						ResourceInfo.this.editModel
+								.fireModelDirtyStateChanged(ResourceInfo.this);
+					}
+				}
+			}
+		};
+	}
+
+	/**
+	 * 
+	 * @return the file which represents this resource in the workspace.
+	 */
+	
+	public IFile getFile() {
+		return file;
+	}
+
+	
+	protected boolean getFileExists() {		
+		return fileExists;
+	}
+
+	/**
+	 * Answer if dirty.
+	 * 
+	 * @return  true if dirty, false if clean.
+	 */
+	
+	public boolean isDirty() {
+		if (resource == null) {
+			return false;
+		}
+		return resource.isModified();
+	}
+
+	
+	/**
+	 * Return the EMF resource that this resource info is holding onto.
+	 * 
+	 * @return the EMF resource.
+	 */
+	
+	public Resource getResource() {
+		return resource;
+	}
+
+	/**
+	 * Set the EMF resource that this resource is holding onto.
+	 * 
+	 * @param aResource the EMF resource.
+	 */
+	
+	protected void setResource (Resource aResource) {
+		this.resource = aResource;
+	}
+
+	/**
+	 * Return the EMF load options.
+	 * 
+	 * @return the EMF resource load options.
+	 */
+	
+	public Map getLoadOptions() {
+		return loadOptions;
+	}
+
+	
+	/**
+	 * Set the EMF load options.
+	 * 
+	 * @param loadOptions
+	 */
+	public void setLoadOptions(Map loadOptions) {
+		
+		this.loadOptions = loadOptions;
+	}
+
+	/**
+	 * The listener has notified us that the resource has moved in the Eclipse workbench. 
+	 * We need to take appropriate cover.
+	 * 
+	 * @param movedToFile the moved to file.
+	 */
+	
+	protected void move(IFile movedToFile) {
+		editModel.removeResourceInfo(this);
+		file = movedToFile;
+		resource.setURI(URI.createPlatformResourceURI(file.getFullPath().toString()));
+		resetSynchronizeStamp();
+		
+		resourceListener.setFile(movedToFile);
+		editModel.addResourceInfo(this);
+		editModel.fireModelLocationChanged(this, movedToFile);
+	}
+
+	/** 
+	 * The listener has notified us that the resource has been deleted in the Eclipse workbench.
+	 */
+	protected void deleted() {
+		if (editModel == null) {
+			return;
+		}
+		editModel.fireModelDeleted(this);
+	}
+
+	/**
+	 * The listener has notified us that the resource has had markers updated.
+	 * We need to let the edit model know about about this.
+	 * 
+	 */
+	
+	protected void markersChanged ( IMarkerDelta [] markerDelta ) {
+		if (editModel == null) {
+			return ;
+		}
+		editModel.fireModelMarkersChanged ( this, markerDelta );
+	}
+	
+	
+	/**
+	 * 
+	 * Should not be used by clients
+	 * 
+	 */
+	
+	public void refresh() {		
+		if (getSynchronizeStamp() == getCurrentFileModified()) {
+			return;
+		}
+		load();
+		editModel.fireModelReloaded(this);
+	}
+
+	
+	
+	protected void dispose() {
+		if (editModel == null) {
+			return;
+		}
+		if (resource != null) {
+			resource.eAdapters().clear();			
+		}
+		editModel.removeResourceInfo(this);
+		ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceListener);
+		if (resource != null) {
+			resource.unload();
+		}
+		editModel = null;
+		resource = null;
+		resourceListener = null;
+	}
+
+	
+	protected void load() {
+		if (resource != null) {
+			resource.unload();
+		}
+		try {
+			loading = true;
+			resource = editModel.getResourceSet().getResource(
+					URI
+							.createPlatformResourceURI(file.getFullPath()
+									.toString()), true);
+		} finally {
+			loading = false;
+		}
+		resourceLoaded();
+	}
+
+	
+	protected void resourceLoaded() {
+		
+		if (loading) {
+			return;
+		}
+		
+		resetSynchronizeStamp();
+		resource.eAdapters().add(resourceAdapter);
+		fileExists = file.exists();
+	}
+
+	/**
+	 * Should not be used by clients
+	 * 
+	 * @throws IOException 
+	 */
+	
+	public void save() throws IOException {
+		
+		getResource().save(getLoadOptions());
+		fileExists = true;
+		resetSynchronizeStamp();
+	}
+
+	/**
+	 * Should not be used by clients
+	 * @param savedFile 
+	 * @throws IOException 
+	 */
+	
+	public void saveAs(IFile savedFile) throws IOException {
+		// TODO Revert to old file name if save fails
+		move(savedFile);
+		save();
+	}
+
+	/**
+	 * Resets the synchronization stamp. Should not be used by clients
+	 */
+	
+	public void resetSynchronizeStamp() {
+		synchronizeStamp = getCurrentFileModified();
+	}
+
+	/**
+	 * Returns the last synchronization stamp. Should not be used by clients
+	 * @return the last synchronization stamp.
+	 */
+	
+	public long getSynchronizeStamp() {
+		return synchronizeStamp;
+	}
+
+	/*
+	 * Returns the resource current modified time.
+	 */
+	private long getCurrentFileModified() {
+		return file.getLocation().toFile().lastModified();
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/ResourceListener.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/ResourceListener.java
new file mode 100644
index 0000000..bfe4aee
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/ResourceListener.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.editmodel;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarkerDelta;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.swt.widgets.Display;
+/**
+ * A eclipse resource listener used by the shared resource framework
+ * to support updating/reloading the model, informing the user, or closing the editor
+ * when a resource is changed by another editor kind or outside the
+ * workspace.
+ * 
+ * Internal - Should not be used by clients.
+ */
+class ResourceListener implements IResourceChangeListener {
+	
+	ResourceInfo fModelInfo;
+	
+	IFile fFile;
+	
+	/**
+	 *  
+	 */
+	
+	static Runner runner = new Runner ( ) {
+		public void run(Runnable runnable) {
+			Display.getDefault().asyncExec(runnable);
+		}		
+	};
+	
+	
+	protected ResourceListener (ResourceInfo modelInfo,IFile fileResource) {
+		this.fModelInfo = modelInfo;
+		this.fFile = fileResource;
+	}
+	
+	/**
+	 * This method can be called if the file for a ResourceInfo changes.
+	 * @param file 
+	 */
+	
+	public void setFile(IFile file) {
+		this.fFile = file;
+	}
+	
+	/** (non-Javadoc)
+	 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
+	 */
+	
+	public void resourceChanged (IResourceChangeEvent e) {			
+		
+		IResourceDelta delta = e.getDelta();
+		
+		if (delta != null) {
+			delta = delta.findMember(fFile.getFullPath());
+		}
+
+		if (delta != null) {				
+			switch (delta.getKind()) {
+				 
+				case IResourceDelta.CHANGED:
+					if ((delta.getFlags() & IResourceDelta.CONTENT) != 0) {			
+						if (!isDirty())
+							fireModelRefresh();
+					}
+					
+					if ((delta.getFlags() & IResourceDelta.MARKERS) != 0) {
+						fireMarkerChange( delta.getMarkerDeltas() );
+					}
+					break;
+
+				case IResourceDelta.REMOVED:
+					if ((delta.getFlags() & IResourceDelta.MOVED_TO) != 0) {
+						fireModelMoved(delta.getMovedToPath());
+					} else if (!isDirty()) {
+						fireModelDeleted();	
+					}
+					break;
+			}
+		}
+	}
+	
+	private void fireMarkerChange ( final IMarkerDelta [] delta ) {
+		Runnable runnable = new Runnable () {
+			public void run() {
+				fModelInfo.markersChanged( delta );
+			}			
+		};
+		run(runnable);
+	}
+	
+	
+	private void fireModelRefresh() {
+		Runnable runnable = new Runnable() {
+			public void run() {
+				fModelInfo.refresh();
+			}
+		};
+		run(runnable);
+	}
+	
+	private void fireModelMoved(final IPath path) {
+		Runnable runnable = new Runnable() {
+			public void run() {
+				IFile movedTofile = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+				if (fFile == null) {
+					return;
+				}
+				fModelInfo.move(movedTofile);
+				fFile = movedTofile;
+			}
+		};
+		
+		run(runnable);
+	}
+	
+	private void fireModelDeleted() {
+		Runnable runnable = new Runnable() {
+			public void run() {
+				fModelInfo.deleted();
+				fModelInfo.dispose();
+			}
+		};
+		run(runnable);
+	}
+	protected boolean isDirty() {
+		// if we are not initialized we are not dirty
+		if (fModelInfo.getResource() == null)
+			return false;
+		return fModelInfo.getResource().isModified();
+	}
+	
+	/**
+	 * Run the runnable.
+	 * @param runnable
+	 */
+	public void run(Runnable runnable) {
+		if(runner == null) {
+			runnable.run();
+		} else {
+			runner.run(runnable);
+		}
+	}
+	
+	
+	interface Runner {
+		/**
+		 * @param runnable
+		 */
+		void run(Runnable runnable);
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/SynchronizationHandler.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/SynchronizationHandler.java
new file mode 100644
index 0000000..9319b39
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/SynchronizationHandler.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.editmodel;
+
+import java.io.IOException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * Used by the shared resource framework. Should not be implemented
+ * by clients.
+ */
+interface SynchronizationHandler {
+	/**
+	 * The file was changed from another editor. 
+	 * The user wants to close the editor.
+	 */
+	public void closeEditor();
+	/**
+	 * The file was changed from another editor.
+	 * The user wants to save this file with another name.
+	 */
+	public boolean saveFileAs(ResourceInfo resource,IFile file) throws CoreException, IOException;
+	/**
+	 * The file was changed from another editor.
+	 * The user wants to reload its content.
+	 */
+	public void refresh(ResourceInfo resource);
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/SynchronizationManager.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/SynchronizationManager.java
new file mode 100644
index 0000000..7f7667c
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/SynchronizationManager.java
@@ -0,0 +1,246 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.editmodel;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.bpel.common.ui.CommonUIPlugin;
+import org.eclipse.bpel.common.ui.Messages;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IWindowListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SaveAsDialog;
+
+
+
+/**
+ * Implements an activation listener and hooks it to an editor.
+ * 
+ * Calls the API in ISynchonizationHandler when needed to refresh
+ * the model, close the editor, and to save the model.
+ */
+class SynchronizationManager {
+	
+	/** */
+	private ActivationListener partListener;
+		
+public SynchronizationManager(IEditorPart editor,EditModel editModel,SynchronizationHandler handler) {
+	partListener = new ActivationListener(this,editor,handler,editModel);
+	editor.getSite().getWorkbenchWindow().getPartService().addPartListener(partListener);
+	PlatformUI.getWorkbench().addWindowListener(partListener);
+}
+protected void dispose() {
+	if (partListener.editor == null) 
+		throw new IllegalArgumentException("editor cannot be null");  //$NON-NLS-1$
+	partListener.editor.getSite().getWorkbenchWindow().getPartService().removePartListener(partListener);
+	PlatformUI.getWorkbench().removeWindowListener(partListener);		
+}
+private static class ActivationListener implements IPartListener, IWindowListener {
+	/** */
+	private boolean handlingActivation = false;
+	/** */
+	private IWorkbenchPart activePart = null;
+	/** */
+	private SynchronizationManager manager;
+	/** */
+	private IEditorPart editor;
+	/** */
+	private SynchronizationHandler handler;
+	/** */
+	private EditModel editModel;
+
+ActivationListener(SynchronizationManager manager,IEditorPart editor,SynchronizationHandler handler,EditModel editModel) {
+	this.editModel = editModel;
+	this.manager = manager;
+	this.editor = editor;
+	this.handler = handler;
+}
+	
+/* (non-Javadoc)
+ * @see org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart)
+ */
+public void partActivated(IWorkbenchPart part) {
+	activePart = part;		
+	handleActivated();
+}
+
+/* (non-Javadoc)
+ * @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart)
+ */
+public void partBroughtToTop(IWorkbenchPart part) {
+}
+
+/**
+ * When a WorkbenchPart is closed, check if that part is
+ * an editor using the model provided by the ResourceInfo object.
+ * If it is, remove that editor from the editor list.
+ */
+public void partClosed(IWorkbenchPart part) {
+	if (part instanceof IEditorPart) {
+		if(editor == part)
+			manager.dispose();
+	}
+}
+
+/* (non-Javadoc)
+ * @see org.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart)
+ */
+public void partDeactivated(IWorkbenchPart part) {
+	activePart = null;
+}
+
+/* (non-Javadoc)
+ * @see org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart)
+ */
+public void partOpened(IWorkbenchPart part) {		
+}
+
+/* (non-Javadoc)
+ * @see org.eclipse.ui.IWindowListener#windowActivated(org.eclipse.ui.IWorkbenchWindow)
+ */
+public void windowActivated(IWorkbenchWindow window) {		
+	if (!handlingActivation)
+		handleActivated();
+}
+
+/* (non-Javadoc)
+ * @see org.eclipse.ui.IWindowListener#windowDeactivated(org.eclipse.ui.IWorkbenchWindow)
+ */
+public void windowDeactivated(IWorkbenchWindow window) {
+}
+
+/* (non-Javadoc)
+ * @see org.eclipse.ui.IWindowListener#windowClosed(org.eclipse.ui.IWorkbenchWindow)
+ */
+public void windowClosed(IWorkbenchWindow window) {
+	if (editor.getSite().getWorkbenchWindow() == window) {
+		manager.dispose();
+	}
+}
+
+/* (non-Javadoc)
+ * @see org.eclipse.ui.IWindowListener#windowOpened(org.eclipse.ui.IWorkbenchWindow)
+ */
+public void windowOpened(IWorkbenchWindow window) {
+}
+/**
+ * Handles when the specified AbstractRulesEditor becomes active.
+ * The handler first checks to see if the editor input has been
+ * deleted, then refreshes the workspace cache of the input to 
+ * allow the ResourceChangeListener to handle any updates to the 
+ * file.
+ */
+void handleActivated() {
+	if (editor == activePart) {
+		handlingActivation = true;
+
+		try {
+			ResourceInfo[] resourceInfos = editModel.getResourceInfos();
+			for (int i = 0; i < resourceInfos.length; i++) {
+				handleActivated(resourceInfos[i]);
+			}
+		} catch (CoreException e) {
+			CommonUIPlugin.log(e);
+		} catch (IOException e) {
+			CommonUIPlugin.log(e);
+		}
+		handlingActivation = false;
+	}
+}
+void handleActivated(ResourceInfo resourceInfo) throws CoreException, IOException {
+	boolean exists = false;
+	long lastModified = 0;
+	IPath location = resourceInfo.getFile().getLocation();
+	if(location != null) {
+		File localFile = location.toFile();
+		exists = localFile.exists();
+		lastModified = localFile.lastModified();
+	}
+	
+	// Careful: avoid using editor.getFileInput().exists() since it causes
+	// the file cache to be updated and fires the resource change listener.
+	// This prevents us from prompting the user for action if the editor is
+	// visible.
+	if (resourceInfo.getFileExists() && !exists) { //File was deleted
+		String[] buttons = { Messages.SynchronizationManager_saveButtonLabel, IDialogConstants.CLOSE_LABEL }; 
+		
+		// Bugzilla 330513
+		// avoid using activeWindow to get a shell - there are cases where these
+		// error dialogs are opened before the active window has been created
+		// (e.g. resource load failures during editor startup)
+		while (true) {   
+			MessageDialog dialog = new MessageDialog(
+				editor.getEditorSite().getShell(),
+				Messages.SynchronizationManager_deleted_title, 
+				null, // accept the default windowing system icon
+				Messages.SynchronizationManager_deleted_message, 
+				MessageDialog.QUESTION,
+				buttons,
+				0);
+				
+			if (dialog.open() == Window.OK) {
+				SaveAsDialog saveAsDialog = new SaveAsDialog(editor.getEditorSite().getShell());
+				saveAsDialog.setOriginalFile(resourceInfo.getFile());
+				saveAsDialog.open();
+				
+				IPath path = saveAsDialog.getResult();
+				if (path != null) {
+					boolean saveSuccess = handler.saveFileAs(
+							resourceInfo,
+							ResourcesPlugin.getWorkspace().getRoot().getFile(path));
+					if (saveSuccess) {
+						resourceInfo.resetSynchronizeStamp();
+						break;
+					}
+				}
+			} else {
+				handler.closeEditor();
+				break;
+			}
+		}
+	} else if (lastModified != resourceInfo.getSynchronizeStamp()) {
+		String msg = NLS.bind(Messages.SynchronizationManager_refresh_message, (new String[]{ resourceInfo.getFile().toString()})); 
+		boolean refresh = MessageDialog.openQuestion(
+				editor.getEditorSite().getShell(), 
+				Messages.SynchronizationManager_refresh_title,  
+				msg);
+				
+		if (refresh) {
+			handler.refresh(resourceInfo);
+			resourceInfo.resetSynchronizeStamp();
+		} else {
+			/* 
+			 * Update Synchronize Stamp so further editor activations
+			 * will not display prompt to refresh. 
+			 */
+			resourceInfo.resetSynchronizeStamp();
+		}
+	}
+	IFile file = resourceInfo.getFile();
+	if (file.exists() && (!file.isLocal(IResource.DEPTH_ZERO) || !resourceInfo.getFile().isSynchronized(IResource.DEPTH_ZERO)))
+		file.refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());
+}
+}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/readme.txt b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/readme.txt
new file mode 100644
index 0000000..cbb0555
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/editmodel/readme.txt
@@ -0,0 +1,21 @@
+EditModel component.
+
+Features:
+	Support for ValidateEdit.
+	Support sharing model between editors. E.g Two editors of the same type 
+		on the same file in two eclipse windows.
+	Support for saving all dirty resources modified by the editor
+	Support notification of resource changes outside the editor. E.g reload
+		files from repository, save using another editor.
+	
+
+How to use it.
+	- Create a EditModelClient in the IEditorPart.init(...) passing the editor,
+	the fileInput, a IEditModelListener and load options if you have any (null or
+	empty otherwise).
+	- set the command stack
+		getEditDomain().setCommandStack(editModelClient.getCommandStack());
+		
+For users or IOngoingChange, OngoingChangeManager and ICommandFramework:	
+	Use EditModelCommandFramework instead of CommandFramework.
+	EditModelCommandFramework does not need a OngoingChangeManager.
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/figures/InsetRelativeHandleLocator.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/figures/InsetRelativeHandleLocator.java
new file mode 100644
index 0000000..6a8b081
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/figures/InsetRelativeHandleLocator.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.figures;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.PrecisionRectangle;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.handles.RelativeHandleLocator;
+
+/**
+ * Override the normal relative handle locator. This is required to move the
+ * handles out of the absolute corners and closer to the "apparent" bounds of
+ * the figure.
+ */
+public class InsetRelativeHandleLocator extends RelativeHandleLocator {
+
+	int fVerticalInset;
+
+	int fHorizontalInset;
+
+	int fLocation;
+
+	/**
+	 * @param reference
+	 * @param aLocation
+	 * @param verticalInset
+	 * @param horizontalInset
+	 */
+
+	public InsetRelativeHandleLocator(IFigure reference, int aLocation,
+			int verticalInset, int horizontalInset) {
+		super(reference, aLocation);
+
+		this.fVerticalInset = verticalInset;
+		this.fHorizontalInset = horizontalInset;
+		this.fLocation = aLocation;
+	}
+
+	/**
+	 * @see org.eclipse.draw2d.RelativeLocator#relocate(org.eclipse.draw2d.IFigure)
+	 */
+	@Override
+	public void relocate(IFigure target) {
+
+		IFigure reference = getReferenceFigure();
+		Rectangle targetBounds = new PrecisionRectangle(getReferenceBox()
+				.getResized(-1, -1));
+		reference.translateToAbsolute(targetBounds);
+		target.translateToRelative(targetBounds);
+		targetBounds.resize(1, 1);
+
+		Dimension targetSize = target.getPreferredSize();
+
+		switch (fLocation & PositionConstants.EAST_WEST) {
+			case PositionConstants.WEST:
+				targetBounds.x -= (targetSize.width) / 2;
+				targetBounds.x += fHorizontalInset;
+				break;
+			case PositionConstants.EAST:
+				targetBounds.x += targetBounds.width - (targetSize.width) / 2;
+				targetBounds.x -= fHorizontalInset;
+				break;
+			
+			// Only North || South is given
+			default :
+				targetBounds.x += targetBounds.width/2  ;
+				break;
+		}
+		switch (fLocation & PositionConstants.NORTH_SOUTH) {
+			case PositionConstants.NORTH:
+				targetBounds.y -= (targetSize.height) / 2;
+				targetBounds.y += fVerticalInset;
+				break;
+			case PositionConstants.SOUTH:
+				targetBounds.y += targetBounds.height - (targetSize.height + 2)	/ 2;
+				targetBounds.y -= fVerticalInset;
+				break;
+				
+				// Only West || East is given
+			default :
+				targetBounds.y += targetBounds.height/2 ;
+				break;
+				
+		}
+
+		targetBounds.setSize(targetSize);
+		target.setBounds(targetBounds);
+	}
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/figures/InsetResizeHandle.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/figures/InsetResizeHandle.java
new file mode 100644
index 0000000..e66f5af
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/figures/InsetResizeHandle.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.figures;
+
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.handles.ResizeHandle;
+
+
+/**
+ * Override the normal ResizeHandle to provide a custom handle
+ * locator. This is required to move the handles out of the absolute
+ * corners and closer to the actual figure outline.
+ */
+public class InsetResizeHandle extends ResizeHandle {
+	
+	protected int fDirection;	
+	
+	/**
+	 * 
+	 * @param owner
+	 * @param direction
+	 * @param verticalInset
+	 * @param horizontalInset
+	 */
+	public InsetResizeHandle(GraphicalEditPart owner, int direction, int verticalInset, int horizontalInset) {
+		
+		super (owner, direction);
+		this.fDirection = direction;
+		setLocator(new InsetRelativeHandleLocator(owner.getContentPane(), direction, verticalInset, horizontalInset));
+		
+//		selectionColor = Display.getCurrent().getSystemColor(SWT.COLOR_LIST_SELECTION);
+//		ColorRegistry registry = CommonUIPlugin.getDefault().getColorRegistry();
+//		selectionCornerColor = registry.get(ICommonUIConstants.COLOR_SELECTION_HANDLE_CORNER);
+	}
+	
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/BorderData.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/BorderData.java
new file mode 100644
index 0000000..8f01824
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/BorderData.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.flatui;
+
+public class BorderData implements IBorderConstants {
+	/**
+	 * Controls the type of border painted around this control
+	 * (and how much space is reserved for it).
+	 */
+	public int borderType;
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/BorderLayout.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/BorderLayout.java
new file mode 100644
index 0000000..7420095
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/BorderLayout.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.flatui;
+
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.custom.TableTree;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+
+
+/**
+ * Superclass for border-aware layout classes such as FlatFormLayout.
+ * Mainly useful for the getBorderType() method which selects the most
+ * appropriate default border type based on the type of control passed
+ * in.
+ */
+public abstract class BorderLayout extends Layout implements IBorderConstants {
+
+	static final int BT_NONE = 0;
+	static final int BT_1P1 = 1;
+	static final int BT_1P2 = 2;
+	static final int BT_2P2 = 3;
+	static final int BT_BLACK = 1;
+	static final int BT_SOFT = 2;
+	static final int BT_BKGND = 3;
+
+	static final int BorderColor[] = {
+		BT_NONE, BT_NONE, BT_BLACK, BT_SOFT, BT_BLACK, BT_SOFT, BT_BLACK, BT_SOFT, BT_BKGND
+	};
+	static final int BorderShape[] = {
+		BT_NONE, BT_NONE, BT_1P1, BT_1P1, BT_1P2, BT_1P2, BT_2P2, BT_2P2, BT_2P2
+	};
+
+	static final int LeftBorderSize[]   = { 0, 1, 1, 2 };
+	static final int RightBorderSize[]  = { 0, 1, 2, 2 };
+	static final int TopBorderSize[]    = { 0, 1, 1, 2 };
+	static final int BottomBorderSize[] = { 0, 1, 2, 2 };
+
+	public static final int getBorderType(int bt, Control control) {
+		if (bt != BORDER_DEFAULT) return bt;
+	
+		if (control instanceof CLabel)  return BORDER_NONE; // TODO: added this line
+		if (control instanceof Text)       return BORDER_2P2_BLACK;
+		if (control instanceof Canvas)     return BORDER_2P2_BLACK;
+		if (control instanceof CCombo)     return BORDER_2P2_BLACK;
+		if (control instanceof StyledText) return BORDER_2P2_BLACK;
+		if (control instanceof List)       return BORDER_2P2_BLACK;
+
+		if (control instanceof Table)      return BORDER_1P1_BLACK;
+		
+		if (control instanceof Tree)       return BORDER_2P2_BLACK;
+		if (control instanceof TableTree)  return BORDER_1P1_BLACK;
+	
+		return BORDER_NONE;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/FlatFormAttachment.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/FlatFormAttachment.java
new file mode 100644
index 0000000..ac8d5e3
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/FlatFormAttachment.java
@@ -0,0 +1,205 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.flatui;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Control;
+
+public final class FlatFormAttachment {
+
+	/**
+	 * numerator specifies the numerator of the "a" term in the
+	 * equation, y = ax + b, which defines the attachment.
+	 */
+	public int numerator;
+	/**
+	 * denominator specifies the denominator of the "a" term in the
+	 * equation, y = ax + b, which defines the attachment.
+	 * 
+	 * The default value is 100.
+	 */
+	public int denominator = 100;
+	/**
+	 * offset specifies the offset, in pixels, of the control side
+	 * from the attachment position.
+	 * If the offset is positive, then the control side is offset
+	 * to the right of or below the attachment position. If it is
+	 * negative, then the control side is offset to the left of or
+	 * above the attachment position.
+	 * 
+	 * This is equivalent to the "b" term in the equation y = ax + b.
+	 * The default value is 0.
+	 */
+	public int offset;
+	/**
+	 * control specifies the control to which the control side is
+	 * attached.
+	 */
+	public Control control;
+	/**
+	 * alignment specifies the alignment of the control side that is
+	 * attached to a control.
+	 * For top and bottom attachments, TOP, BOTTOM and CENTER are used. For left 
+	 * and right attachments, LEFT, RIGHT and CENTER are used. If any other case
+	 * occurs, the default will be used instead.
+	 * 
+	 * Possible values are:
+	 * 
+	 * TOP: Attach the side to the top side of the specified control.
+	 * BOTTOM : Attach the side to the bottom side of the specified control.
+	 * LEFT: Attach the side to the left side of the specified control.
+	 * RIGHT: Attach the side to the right side of the specified control.
+	 * CENTER: Attach the side at a position which will center the control on
+	 * the specified control.
+	 * DEFAULT: Attach the side to the adjacent side of the specified control.
+	 */
+	public int alignment;
+	
+FlatFormAttachment () {
+}
+
+/**
+ * Constructs a new instance of this class given a numerator 
+ * and denominator and an offset. The position of the side is
+ * given by the fraction of the form defined by the numerator
+ * and denominator.
+ *
+ * @param numerator the numerator of the position
+ * @param denominator the denominator of the position
+ * @param offset the offset of the side from the position
+ */
+public FlatFormAttachment (int numerator, int denominator, int offset) {
+	if (denominator == 0) SWT.error (SWT.ERROR_CANNOT_BE_ZERO);
+	this.numerator = numerator;
+	this.denominator = denominator;
+	this.offset = offset;
+}
+
+/**
+ * Constructs a new instance of this class given a numerator
+ * and an offset. Since no denominator is specified, the default
+ * is to read the numerator as a percentage of the form, with a 
+ * denominator of 100.
+ * 
+ * @param numerator the percentage of the position
+ * @param offset the offset of the side from the position
+ */
+public FlatFormAttachment (int numerator, int offset) {
+	this (numerator, 100, offset);
+}
+
+/**
+ * Constructs a new instance of this class given a control,
+ * an offset and an alignment.
+ * 
+ * @param control the control the side is attached to
+ * @param offset the offset of the side from the control
+ * @param alignment the alignment of the side to the control it is attached to
+ */
+public FlatFormAttachment (Control control, int offset, int alignment) {
+	this.control = control;
+	this.offset = offset;
+	this.alignment = alignment;
+}
+	
+/**
+ * Constructs a new instance of this class given a control
+ * and an offset. Since no alignment is specified, the default
+ * alignment is to attach the side to the adjacent side of the 
+ * specified control.
+ * 
+ * @param control the control the side is attached to
+ * @param offset the offset of the side from the control
+ */
+public FlatFormAttachment (Control control, int offset) {
+	this (control, offset, SWT.DEFAULT);
+}
+
+/**
+ * Constructs a new instance of this class given a control.
+ * Since no alignment is specified, the default alignment is
+ * to attach the side to the adjacent side of the specified 
+ * control. Since no offset is specified, an offset of 0 is
+ * used.
+ * 
+ * @param control the control the side is attached to
+ */
+public FlatFormAttachment (Control control) {
+	this (control, 0, SWT.DEFAULT);
+}
+
+FlatFormAttachment divide (int value) {
+	return new FlatFormAttachment (numerator, denominator * value, offset / value);
+}
+
+int gcd (int m, int n) {
+	int temp;
+	m = Math.abs (m); n = Math.abs (n);
+	if (m < n) {
+		temp = m;
+		m = n;
+		n = temp;
+	}
+	while (n != 0){
+		temp = m;
+		m = n;
+		n = temp % n;
+	}
+	return m;
+}
+
+FlatFormAttachment minus (FlatFormAttachment attachment) {
+	FlatFormAttachment solution = new FlatFormAttachment ();
+	solution.numerator = numerator * attachment.denominator - denominator * attachment.numerator;
+	solution.denominator = denominator * attachment.denominator;
+	int gcd = gcd (solution.denominator, solution.numerator);
+	solution.numerator = solution.numerator / gcd;
+	solution.denominator = solution.denominator / gcd;
+	solution.offset = offset - attachment.offset;
+	return solution;
+}
+
+FlatFormAttachment minus (int value) {
+	return new FlatFormAttachment (numerator, denominator, offset - value);
+}
+
+FlatFormAttachment plus (FlatFormAttachment attachment) {
+	FlatFormAttachment solution = new FlatFormAttachment ();
+	solution.numerator = numerator * attachment.denominator + denominator * attachment.numerator;
+	solution.denominator = denominator * attachment.denominator;
+	int gcd = gcd (solution.denominator, solution.numerator);
+	solution.numerator = solution.numerator / gcd;
+	solution.denominator = solution.denominator / gcd;
+	solution.offset = offset + attachment.offset;
+	return solution;
+}
+
+FlatFormAttachment plus (int value) {
+	return new FlatFormAttachment (numerator, denominator, offset + value);
+}
+
+int solveX (int value) {
+	if (denominator == 0) SWT.error (SWT.ERROR_CANNOT_BE_ZERO);
+	return ((numerator * value) / denominator) + offset;
+}
+
+int solveY (int value) {
+	if (numerator == 0) SWT.error (SWT.ERROR_CANNOT_BE_ZERO);
+	return (value - offset) * denominator / numerator;
+}
+	
+@Override
+public String toString () {
+ 	String string = control != null ? control.toString () : numerator + "/" + denominator; //$NON-NLS-1$
+	return "y = (" + string + (offset >= 0 ? ")x + " + offset: ")x - " + (-offset)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+}
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/FlatFormData.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/FlatFormData.java
new file mode 100644
index 0000000..47898ac
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/FlatFormData.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.flatui;
+ 
+import org.eclipse.swt.SWT;
+
+public final class FlatFormData extends BorderData {
+
+	/**
+	 * height specifies the desired height in pixels
+	 */
+	public int height;
+	/**
+	 * width specifies the desired width in pixels
+	 */
+	public int width;
+	/**
+	 * left specifies the attachment of the left side of 
+	 * the control.
+	 */
+	public FlatFormAttachment left;
+	/**
+	 * right specifies the attachment of the right side of
+	 * the control.
+	 */
+	public FlatFormAttachment right;
+	/**
+	 * top specifies the attachment of the top of the control.
+	 */
+	public FlatFormAttachment top;
+	/**
+	 * bottom specifies the attachment of the bottom of the
+	 * control.
+	 */
+	public FlatFormAttachment bottom;
+
+	int cacheHeight, cacheWidth;
+	boolean isVisited;
+	
+public FlatFormData () {
+	this (SWT.DEFAULT, SWT.DEFAULT);
+}
+	
+public FlatFormData (int width, int height) {
+	this.width = width;
+	this.height = height;
+}
+
+FlatFormAttachment getBottomAttachment () {
+	if (isVisited) return new FlatFormAttachment (0, cacheHeight);
+	if (bottom == null) {
+		if (top == null) return new FlatFormAttachment (0, cacheHeight);
+		return getTopAttachment ().plus (cacheHeight);
+	}
+	if (bottom.control == null) return bottom;
+	isVisited = true;
+	FlatFormData bottomData = (FlatFormData) bottom.control.getLayoutData ();
+	FlatFormAttachment topAttachment = bottomData.getTopAttachment ();
+	FlatFormAttachment bottomAttachment = bottomData.getBottomAttachment ();
+	isVisited = false;
+	if (bottom.alignment == SWT.BOTTOM) return bottomAttachment.plus (bottom.offset);
+	if (bottom.alignment == SWT.CENTER) {
+		FlatFormAttachment bottomHeight = bottomAttachment.minus (topAttachment);
+		return bottomAttachment.minus (bottomHeight.minus (cacheHeight).divide (2));
+	}
+	return topAttachment.plus (bottom.offset);	
+}
+
+FlatFormAttachment getLeftAttachment () {
+	if (isVisited) return new FlatFormAttachment (0, 0);
+	if (left == null) {
+		if (right == null) return new FlatFormAttachment (0, 0);
+		return getRightAttachment ().minus (cacheWidth);
+	}
+	if (left.control == null) return left;
+	isVisited = true;
+	FlatFormData leftData = (FlatFormData) left.control.getLayoutData ();
+	FlatFormAttachment rightAttachment = leftData.getRightAttachment ();
+	FlatFormAttachment leftAttachment = leftData.getLeftAttachment ();
+	isVisited = false; 
+	if (left.alignment == SWT.LEFT) return leftAttachment.plus (left.offset);
+	if (left.alignment == SWT.CENTER) {
+		FlatFormAttachment leftWidth = rightAttachment.minus (leftAttachment);
+		return leftAttachment.plus (leftWidth.minus (cacheWidth).divide (2));
+	}
+	return rightAttachment.plus (left.offset); 
+}	
+
+FlatFormAttachment getRightAttachment () {
+	if (isVisited) return new FlatFormAttachment (0, cacheWidth);
+	if (right == null) {
+		if (left == null) return new FlatFormAttachment (0, cacheWidth);
+		return getLeftAttachment ().plus (cacheWidth);
+	}
+	if (right.control == null) return right;
+	isVisited = true;
+	FlatFormData rightData = (FlatFormData) right.control.getLayoutData ();
+	FlatFormAttachment leftAttachment = rightData.getLeftAttachment ();
+	FlatFormAttachment rightAttachment = rightData.getRightAttachment ();
+	isVisited = false;
+	if (right.alignment == SWT.RIGHT) return rightAttachment.plus (right.offset);
+	if (right.alignment == SWT.CENTER) {
+		FlatFormAttachment rightWidth = rightAttachment.minus (leftAttachment);
+		return rightAttachment.minus (rightWidth.minus (cacheWidth).divide (2));
+	}
+	return leftAttachment.plus (right.offset);
+}
+
+FlatFormAttachment getTopAttachment () {
+	if (isVisited) return new FlatFormAttachment (0, 0);
+	if (top == null) {
+		if (bottom == null) return new FlatFormAttachment (0, 0);
+		return getBottomAttachment ().minus (cacheHeight);
+	}
+	if (top.control == null) return top;
+	isVisited = true;
+	FlatFormData topData = (FlatFormData) top.control.getLayoutData ();
+	FlatFormAttachment topAttachment = topData.getTopAttachment ();
+	FlatFormAttachment bottomAttachment = topData.getBottomAttachment ();
+	isVisited = false;
+	if (top.alignment == SWT.TOP) return topAttachment.plus (top.offset);
+	if (top.alignment == SWT.CENTER) {
+		FlatFormAttachment topHeight = bottomAttachment.minus (topAttachment);
+		return topAttachment.plus (topHeight.minus (cacheHeight).divide (2));
+	}
+	return bottomAttachment.plus (top.offset);
+}
+
+@Override
+public String toString () {
+ 	String string = getClass().getName ()+" {";
+ 	if (width != 0) string += "w=" + width + " " ;
+ 	if (height != 0) string += "h="+height+" ";
+ 	if (left != null) string += "L=(" + left + ") ";
+ 	if (right != null) string += "R=(" + right + ") ";
+ 	if (top != null) string += "T=(" + top + ") ";
+ 	if (bottom != null) string += "B=(" + bottom + ") ";
+ 	string = string.trim();
+ 	string += "}";
+ 	return string;
+}
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/FlatFormLayout.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/FlatFormLayout.java
new file mode 100644
index 0000000..73a76d3
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/FlatFormLayout.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.flatui;
+ 
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+public final class FlatFormLayout extends BorderLayout {
+	/**
+	 * marginWidth specifies the number of pixels of horizontal margin
+	 * that will be placed along the left and right edges of the layout.
+	 *
+	 * The default value is 0.
+	 */
+	public int marginWidth = 0;
+	/**
+	 * marginHeight specifies the number of pixels of vertical margin
+	 * that will be placed along the top and bottom edges of the layout.
+	 *
+	 * The default value is 0.
+	 */
+	public int marginHeight = 0;
+	
+/**
+ * Constructs a new instance of this class.
+ */
+public FlatFormLayout () {
+}
+
+/**
+ * Computes the preferred height of the form with
+ * respect to the preferred height of the control.
+ * 
+ * Given that the equations for top (T) and bottom (B)
+ * of the control in terms of the height of the form (X)
+ * are:
+ *		T = AX + B
+ *		B = CX + D
+ * 
+ * The equation for the height of the control (H)
+ * is bottom (B) minus top (T) or (H = B - T) or:
+ * 
+ *		H = (CX + D) - (AX + B)
+ * 
+ * Solving for (X), the height of the form, we get:
+ * 
+ *		X = (H + B - D) / (C - A)
+ * 
+ * When (A = C), (C - A = 0) and the equation has no
+ * solution for X.  This is a special case meaning that
+ * the control does not constrain the height of the
+ * form.  In this case, we need to arbitrarily define
+ * the height of the form (X):
+ * 
+ * Case 1: A = C, A = 0, C = 0
+ *
+ * 		Let X = D, the distance from the top of the form
+ * 		to the bottom edge of the control.  In this case,
+ * 		the control was attatched to the top of the form
+ * 		and the form needs to be large enough to show the
+ * 		bottom edge of the control.
+ * 
+ * Case 2: A = C, A = 1, C = 1
+ * 
+ * 		Let X = -B, the distance from the bottom of the
+ *		form to the top edge of the control.  In this case,
+ * 		the control was attached to the bottom of the form
+ * 		and the only way that the control would be visible
+ * 		is if the offset is negative.  If the offset is
+ * 		positive, there is no possible height for the form
+ * 		that will show the control as it will always be
+ * 		below the bottom edge of the form.
+ * 
+ * Case 3: A = C, A != 0, C != 0 and A != 1, C != 0
+ * 
+ * 		Let X = D / (1 - C), the distance from the top of the 
+ * 		form to the bottom edge of the control.  In this case, 
+ * 		since C is not 0 or 1, it must be a fraction, U / V.  
+ * 		The offset D is the distance from CX to the bottom edge 
+ * 		of the control.  This represents a fraction of the form 
+ * 		(1 - C)X. Since the height of a fraction of the form is 
+ * 		known, the height of the entire form can be found by setting
+ * 		(1 - C)X = D.  We solve this equation for X in terms of U 
+ * 		and V, giving us X = (U * D) / (U - V). Similarily, if the 
+ * 		offset D is	negative, the control is positioned above CX.
+ * 		The offset -B is the distance from the top edge of the control
+ * 		to CX. We can find the height of the entire form by setting 
+ * 		CX = -B. Solving in terms of U and V gives us X = (-B * V) / U.
+ */
+int computeHeight (FlatFormData data) {
+	FlatFormAttachment top = data.getTopAttachment ();
+	FlatFormAttachment bottom = data.getBottomAttachment ();
+	FlatFormAttachment height = bottom.minus (top);
+	if (height.numerator == 0) {
+		if (bottom.numerator == 0) return bottom.offset;
+		if (bottom.numerator == bottom.denominator) return -top.offset;
+		if (bottom.offset <= 0) {
+			return -top.offset * top.denominator / bottom.numerator;
+		}
+		int divider = bottom.denominator - bottom.numerator; 
+		return bottom.denominator * bottom.offset / divider;
+	}
+	return height.solveY (data.cacheHeight);
+}
+
+@Override
+protected Point computeSize (Composite composite, int wHint, int hHint, boolean flushCache) {
+	Point size = layout (composite, false, 0, 0, 0, 0, flushCache);
+	size.x += marginWidth * 2;
+	size.y += marginHeight * 2;
+	return size;
+}
+
+/**
+ * Computes the preferred height of the form with
+ * respect to the preferred height of the control.
+ */
+int computeWidth (FlatFormData data) {
+	FlatFormAttachment left = data.getLeftAttachment ();
+	FlatFormAttachment right = data.getRightAttachment ();
+	FlatFormAttachment width = right.minus (left);
+	if (width.numerator == 0) {
+		if (right.numerator == 0) return right.offset;
+		if (right.numerator == right.denominator) return -left.offset;
+		if (right.offset <= 0) {
+			return -left.offset * left.denominator / left.numerator;
+		}
+		int divider = right.denominator - right.numerator; 
+		return right.denominator * right.offset / divider;
+	}
+	return width.solveY (data.cacheWidth);
+}
+
+Point getSize (Control control, boolean flushCache) {
+	int wHint = SWT.DEFAULT, hHint = SWT.DEFAULT;
+	FlatFormData data = (FlatFormData) control.getLayoutData ();
+	if (data != null) {
+		wHint = data.width;
+		hHint = data.height;
+	}
+	/* Reserve additional space here for the border! */
+	Point pt = control.computeSize (wHint, hHint, flushCache);
+	int bshape = BorderShape[getBorderType(
+		(data==null)? BORDER_DEFAULT : data.borderType, control)];
+	pt.x += LeftBorderSize[bshape] + RightBorderSize[bshape];
+	pt.y += TopBorderSize[bshape] + BottomBorderSize[bshape];
+	return pt;
+}
+
+@Override
+protected void layout (Composite composite, boolean flushCache) {
+	Rectangle rect = composite.getClientArea ();
+	int x = rect.x + marginWidth;
+	int y = rect.y + marginHeight;
+	int width = Math.max (0, rect.width - 2 * marginWidth);
+	int height = Math.max (0, rect.height - 2 * marginHeight);
+	layout (composite, true, x, y, width, height, flushCache);
+}
+
+Point layout (Composite composite, boolean move, int x, int y, int width, int height, boolean flushCache) {
+	Control [] children = composite.getChildren ();
+	for (int i = 0; i < children.length; i++) {
+		Control child = children [i];
+		Point pt = getSize (child, false);
+		FlatFormData data = (FlatFormData) child.getLayoutData ();
+		if (data == null) {
+			child.setLayoutData (data = new FlatFormData ());
+		}
+		data.cacheWidth = pt.x;
+		data.cacheHeight = pt.y;
+	}
+	for (int i=0; i<children.length; i++) {
+		Control child = children [i];
+		FlatFormData data = (FlatFormData) child.getLayoutData ();
+		/* Adjust the child's position according to its border type! */
+		int bshape = BorderShape[getBorderType(
+			(data==null)? BORDER_DEFAULT : data.borderType, child)];
+		
+		if( data != null ) {
+			if( move ) {
+				int x1 = data.getLeftAttachment ().solveX (width) + LeftBorderSize[bshape];
+				int y1 = data.getTopAttachment ().solveX (height) + TopBorderSize[bshape];
+				int x2 = data.getRightAttachment ().solveX (width) - RightBorderSize[bshape];
+				int y2 = data.getBottomAttachment ().solveX (height) - BottomBorderSize[bshape];
+				child.setBounds (x + x1, y + y1, x2 - x1, y2 - y1);
+			} else {
+				width = Math.max (computeWidth (data), width);
+				height = Math.max (computeHeight (data), height);
+			}
+		}
+	}
+	
+	return move ? null : new Point (width, height);
+}
+	
+
+@Override
+public String toString () {
+ 	String string = getClass().getName ()+" {";
+ 	if (marginWidth != 0) string += "marginWidth=" + marginWidth + " " ;
+ 	if (marginHeight != 0) string += "marginHeight="+marginHeight+" ";
+ 	
+ 	string = string.trim();
+ 	string += "}";
+ 	return string;
+}
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/IBorderConstants.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/IBorderConstants.java
new file mode 100644
index 0000000..c3a413e
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/flatui/IBorderConstants.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.flatui;
+
+/**
+ * Constants for the types of border that can be painted around a widget
+ * by BorderPainter.  The space for these borders is reserved by BorderLayout.
+ */
+public interface IBorderConstants {
+
+	// NOTE: "2P2" etc. refers to the size of the border.  The first digit
+	// is the size reserved on the left and top, the second is the size reserved
+	// on the right and bottom.
+
+	public static final int BORDER_DEFAULT = 0;
+	public static final int BORDER_NONE = 1;
+	public static final int BORDER_1P1_BLACK = 2;
+	public static final int BORDER_1P1_SOFT  = 3;
+	public static final int BORDER_1P2_BLACK = 4;
+	public static final int BORDER_1P2_SOFT  = 5;
+	public static final int BORDER_2P2_BLACK = 6;
+	public static final int BORDER_2P2_SOFT  = 7;
+	public static final int BORDER_2P2_BKGND = 8;
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/layouts/AlignedFlowLayout.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/layouts/AlignedFlowLayout.java
new file mode 100644
index 0000000..539c202
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/layouts/AlignedFlowLayout.java
@@ -0,0 +1,411 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.layouts;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.AbstractHintLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.draw2d.geometry.Transposer;
+
+/** A version of FlowLayout that doesn't wrap the children 
+ * and allows aligning in both orientations
+ * as well as alignment of the children relative to each other
+ * 
+ * some parameters you can set:
+ * 
+ * horizontal - orientation of children
+ * 	if true, children laid across, and width respected
+ * 	if false. children laid downwards, height respected.
+ * 
+ * fill - if true and layout is horizontal, height not respected
+ * 		  if false and layout is horizontal, height respected
+ *        if true and layout is vertical, width not respected
+ * 
+ * fillParent - if true, tries to fill the child to the container size 
+ * 		
+ * horizontal or vertical alignment
+ * 	specifies which 1 of 3 areas the children are placed into
+ * 
+ * ALIGN_BEGIN means either left or top
+ * ALIGN_END means either right or bottom
+ * ALIGN_CENTER means in the middle
+ *  
+ * secondaryAlignment - how the children are lined up in secondary axis
+ *   if horizontal - specfies if children are aligned to their tops, center or bottom
+ * 	 if vertical - specifies if children are aligned to left, right or center.
+ * 
+ */
+
+public class AlignedFlowLayout extends AbstractHintLayout {
+	/*
+	 * Constants defining the alignment of the components
+	 */
+	public static final int ALIGN_CENTER = 0, ALIGN_BEGIN = 1, ALIGN_END = 2;
+	public static final boolean HORIZONTAL = true, VERTICAL = false;
+
+	protected boolean horizontal = true;
+	protected boolean fill = false;
+	protected boolean fillParent = false;
+
+	protected Transposer transposer;
+	{
+		transposer = new Transposer();
+		transposer.setEnabled(!horizontal);
+	}
+
+	/*
+	 * Internal state
+	 */
+	protected int horizontalAlignment = ALIGN_BEGIN;
+	protected int verticalAlignment = ALIGN_BEGIN;
+	protected int secondaryAlignment = ALIGN_BEGIN;
+	
+	
+	protected int horizontalSpacing = 5, verticalSpacing = 5;
+	private WorkingData data = null;
+
+	/**
+	 * Holds the necessary information for layout calculations.
+	 */
+	class WorkingData {
+		int rowHeight, rowWidth, rowCount, rowX, rowY; 
+		Rectangle bounds[], area;
+		IFigure row[];
+		Dimension spacing;
+	}
+
+	public AlignedFlowLayout() {
+	}
+
+	public AlignedFlowLayout(boolean isHorizontal) {
+		setHorizontal(isHorizontal);
+	}
+
+	@Override
+	protected Dimension calculatePreferredSize(IFigure container, int wHint, int hHint) {
+		int cHorizontalSpacing = horizontalSpacing;
+		if (!isHorizontal()) {
+			cHorizontalSpacing = verticalSpacing;
+		}
+		
+		// Subtract out the insets from the hints
+		if (wHint > -1)
+			wHint = Math.max(0, wHint - container.getInsets().getWidth());
+		if (hHint > -1)
+			hHint = Math.max(0, hHint - container.getInsets().getHeight());
+
+		// Figure out the new hint that we are interested in based on the orientation
+		// Ignore the other hint (by setting it to -1).  NOTE: The children of the
+		// parent figure will then be asked to ignore that hint as well.  
+		int maxWidth;
+		if (isHorizontal()) {
+			maxWidth = wHint;
+			hHint = -1;
+		} else {
+			maxWidth = hHint;
+			wHint = -1;
+		}
+		if (maxWidth <= 0) {
+			maxWidth = Integer.MAX_VALUE;
+		}
+
+		// The preferred dimension that is to be calculated and returned
+		Dimension prefSize = new Dimension();
+
+		List children = container.getChildren();
+		int width = 0;
+		int height = 0;
+		IFigure child;
+		Dimension childSize;
+
+		//Build the sizes for each row, and update prefSize accordingly
+		for (int i = 0; i < children.size(); i++) {
+			child = (IFigure) children.get(i);
+			childSize = transposer.t(getChildSize(child, wHint, hHint));
+			if (i == 0) {
+				width = childSize.width;
+				height = childSize.height;
+			} else 
+			{
+				// fit another child.
+				width += childSize.width + cHorizontalSpacing;
+				height = Math.max(height, childSize.height);
+			}
+		}
+
+		// Flush out the last row's data
+		prefSize.height += height;
+		prefSize.width = Math.max(prefSize.width, width);
+
+		// Transpose the dimension back, and compensate for the border.
+		prefSize = transposer.t(prefSize);
+		prefSize.width += container.getInsets().getWidth();
+		prefSize.height += container.getInsets().getHeight();
+		prefSize.union(getBorderPreferredSize(container));
+		return prefSize;
+	}
+
+	/**
+	 * Provides the given child's preferred size
+	 * 
+	 * @param child	The Figure whose preferred size needs to be calculated
+	 * @param wHint	The width hint to be used when calculating the child's preferred size
+	 * @param hHint	The height hint to be used when calculating the child's preferred size
+	 * @return the child's preferred size
+	 */
+	protected Dimension getChildSize(IFigure child, int wHint, int hHint) {
+		return child.getPreferredSize(wHint, hHint);
+	}
+
+	public int getHorizontalAlignment() {
+		return horizontalAlignment;
+	}
+
+	public int getVerticalSpacing() {
+		return verticalSpacing;
+	}
+
+	public int getVerticalAlignment() {
+		return verticalAlignment;
+	}
+
+	public int getHorizontalSpacing() {
+		return horizontalSpacing;
+	}
+
+	/**
+	 * Initializes the state of row data, which is internal
+	 * to the layout process. 
+	 */
+	private void initRow() {
+		data.rowX = 0;
+		data.rowHeight = 0;
+		data.rowWidth = 0;
+		data.rowCount = 0;
+	}
+
+	/**
+	 * Initializes state data for laying out children, based
+	 * on the Figure given as input.
+	 *
+	 * @param parent  Figure for which the children are to 
+	 *                 be arranged.
+	 * @since 2.0 
+	 */
+	private void initVariables(IFigure parent) {
+		data.row = new IFigure[parent.getChildren().size()];
+		data.bounds = new Rectangle[data.row.length];
+	}
+
+	public boolean isHorizontal() {
+		return horizontal;
+	}
+
+	@Override
+	protected boolean isSensitiveHorizontally(IFigure parent) {
+		return isHorizontal();
+	}
+
+	@Override
+	protected boolean isSensitiveVertically(IFigure parent) {
+		return !isHorizontal();
+	}
+
+	public void layout(IFigure parent) {
+		data = new WorkingData();
+		Rectangle relativeArea = parent.getClientArea();
+		data.area = transposer.t(relativeArea);
+		data.spacing = transposer.t(new Dimension(horizontalSpacing, verticalSpacing));
+
+		Iterator iterator = parent.getChildren().iterator();
+		int dx;
+
+		//Calculate the hints to be passed to children
+		int wHint = -1;
+		int hHint = -1;
+		if (isHorizontal())
+			wHint = parent.getClientArea().width;
+		else
+			hHint = parent.getClientArea().height;
+
+		initVariables(parent);
+		initRow();
+		int i = 0;
+		while (iterator.hasNext()) {
+			IFigure f = (IFigure) iterator.next();
+			Dimension pref = transposer.t(getChildSize(f, wHint, hHint));
+			Rectangle r = new Rectangle(0, 0, pref.width, pref.height);
+			r.x = data.rowX;
+			r.y = data.rowY;
+			dx = r.width + data.spacing.width;
+			data.rowX += dx;
+			data.rowWidth += dx;
+			data.rowHeight = Math.max(data.rowHeight, r.height);
+			if (fillParent)
+			    data.rowHeight = Math.max(data.area.height, r.height);
+			
+			data.row[data.rowCount] = f;
+			data.bounds[data.rowCount] = r;
+			data.rowCount++;
+			i++;
+		}
+		if (data.rowCount != 0)
+			layoutRow(parent);
+		data = null;
+	}
+
+	/**
+	 * Layouts one row of components. This is done based on
+	 * the layout's orientation, minor alignment and major alignment.
+	 *
+	 * @param parent  Figure whose children are to be placed.
+	 * @since 2.0
+	 */
+	protected void layoutRow(IFigure parent) {
+		int majorAdjustment = 0;
+		int minorAdjustment = 0;
+		int justification = 0;
+		int correctHorizontalAlignment = horizontalAlignment;
+		int correctVerticalAlignment = verticalAlignment;
+
+		majorAdjustment = data.area.width - data.rowWidth;
+		if (!isHorizontal()) {
+			correctHorizontalAlignment = verticalAlignment;
+			correctVerticalAlignment = horizontalAlignment;
+		}
+		switch (correctHorizontalAlignment) {
+			case ALIGN_BEGIN :
+				majorAdjustment = 0;
+				break;
+			case ALIGN_CENTER :
+				majorAdjustment /= 2;
+				break;
+			case ALIGN_END :
+				break;
+		}
+		minorAdjustment = data.area.height - data.rowHeight;
+		switch (correctVerticalAlignment) {
+			case ALIGN_BEGIN :
+				minorAdjustment = 0;
+				break;
+			case ALIGN_CENTER :
+				minorAdjustment /= 2;
+				break;
+			case ALIGN_END :
+				break;
+		}
+
+		for (int j = 0; j < data.rowCount; j++) {
+			if (fill) {
+				data.bounds[j].height = data.rowHeight;
+			} else {
+				justification = data.rowHeight - data.bounds[j].height;
+				switch (secondaryAlignment) {
+					case ALIGN_BEGIN :
+						justification = 0;
+						break;
+					case ALIGN_CENTER :
+						justification /= 2;
+						break;
+					case ALIGN_END :
+						break;
+				}
+				data.bounds[j].y += minorAdjustment + justification;
+			}
+			data.bounds[j].x += majorAdjustment;
+
+			setBoundsOfChild(parent, data.row[j], transposer.t(data.bounds[j]));
+		}
+		data.rowY += data.spacing.height + data.rowHeight;
+		initRow();
+	}
+
+	/**
+	 * Sets the given bounds for the child figure input.
+	 *
+	 * @param parent  Parent Figure which holds the child.
+	 * @param child   Child Figure whose bounds are to be set.
+	 * @param bounds  The size of the child to be set.
+	 * @since 2.0
+	 */
+	protected void setBoundsOfChild(IFigure parent, IFigure child, Rectangle bounds) {
+		parent.getClientArea(Rectangle.SINGLETON);
+		bounds.translate(Rectangle.SINGLETON.x, Rectangle.SINGLETON.y);
+		child.setBounds(bounds);
+	}
+
+	/**
+	 * Sets flag based on layout orientation.
+	 * If in Horizontal orientation, all Figures will have the same height.
+	 * If in vertical orientation, all Figures will have the same width.
+	 *
+	 * @param value  Fill state desired.
+	 * @since 2.0
+	 */
+	public void setStretchMinorAxis(boolean value) {
+		fill = value;
+	}
+
+	public void setHorizontal(boolean flag) {
+		if (horizontal == flag)
+			return;
+		invalidate();
+		horizontal = flag;
+		transposer.setEnabled(!horizontal);
+	}
+
+	public void setHorizontalAlignment(int align) {
+		horizontalAlignment = align;
+	}
+
+	/**
+	 * Sets the spacing in pixels to be used between children in 
+	 * the direction parallel to the layout's orientation.
+	 *
+	 * @param n  Amount of major space.
+	 * @see  #setHorizontalSpacing(int)
+	 * @since 2.0
+	 */
+	public void setVerticalSpacing(int n) {
+		verticalSpacing = n;
+	}
+
+	public void setVerticalAlignment(int align) {
+		verticalAlignment = align;
+	}
+
+	public void setHorizontalSpacing(int n) {
+		horizontalSpacing = n;
+	}
+	
+	public int getSecondaryAlignment() {
+		return secondaryAlignment;
+	}
+
+	public void setSecondaryAlignment(int i) {
+		secondaryAlignment = i;
+	}
+	
+	/**
+	 * 
+	 * @param fillParent - if setStretchMinorAxis is true, setting
+	 * this flag will make the stretch fill the client area of the container
+	 */
+    public void setStretchMinorAxisToParent(boolean fillParent) {
+        this.fillParent = fillParent;
+    }
+
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/layouts/FillParentLayout.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/layouts/FillParentLayout.java
new file mode 100644
index 0000000..bf9b2a7
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/layouts/FillParentLayout.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.layouts;
+
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+
+public class FillParentLayout extends ToolbarLayout { // TODO: probably shouldn't have to derive from toolbarlayout
+	public FillParentLayout() {
+		super();
+	}
+	
+	@Override
+	public void layout(IFigure parent) {
+		List children = parent.getChildren();
+		Rectangle clientArea = parent.getClientArea();
+		if(children.size() < 1)
+			return;
+
+		
+		for (int i = 0; i < children.size(); i++) {
+			IFigure lastChild = (IFigure)children.get(i);
+			Rectangle r = lastChild.getBounds().getCopy();
+			r.width = clientArea.width;
+			r.x = clientArea.x;
+			r.height = clientArea.height;			
+			r.y = clientArea.y;
+			lastChild.setBounds(r);
+		}
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/markers/IModelMarkerConstants.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/markers/IModelMarkerConstants.java
new file mode 100644
index 0000000..4feecf4
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/markers/IModelMarkerConstants.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.markers;
+
+import org.eclipse.bpel.common.ui.CommonUIPlugin;
+import org.eclipse.bpel.common.ui.decorator.IMarkerConstants;
+
+
+
+public interface IModelMarkerConstants {
+    
+    /**
+     * The unique ID for the base UI marker.
+     */
+    public static final String DECORATION_MARKER_ID = CommonUIPlugin.PLUGIN_ID + ".uiModelMarker";	 //$NON-NLS-1$
+    
+    public static final String DECORATION_GRAPHICAL_MARKER_ID = CommonUIPlugin.PLUGIN_ID + ".graphicalMarker";	 //$NON-NLS-1$
+    
+    public static final String DECORATION_TEXT_MARKER_ID = CommonUIPlugin.PLUGIN_ID + ".textMarker";	 //$NON-NLS-1$
+    
+    public static final String DECORATION_JAVABREAKPOINT_MARKER_ID = CommonUIPlugin.PLUGIN_ID + ".javaLineBreakpointMarker";	 //$NON-NLS-1$
+    
+    /**
+	 * The unique id of the model object that this marker references in the
+	 * marker resource.
+	 * 
+	 * The value of the objectId attribute uniquely identifies the
+	 * model element associated with the marker.  The scheme used by the
+	 * objectId attribute is determined by the model associated with the
+	 * resource on which the marker is placed.  For example, some resources
+	 * may use an EMF URI fragment as the value of the objectId attribute.
+	 */
+	public static final String DECORATION_MARKER_OBJECTID_ATTR = DECORATION_MARKER_ID + ".objectId";	 //$NON-NLS-1$
+    
+    public static final String DECORATION_MARKER_PRIORITY_ATTR = DECORATION_MARKER_ID + ".priority";	 //$NON-NLS-1$
+    
+    public static final int DECORATION_MARKER_PRIORITY_ATTR_DEFAULT = IMarkerConstants.PRIORITY_DEFAULT; 
+    
+    public static final String DECORATION_MARKER_VISIBLE_ATTR = DECORATION_MARKER_ID + ".visible";	 //$NON-NLS-1$
+    
+    public static final String DECORATION_GRAPHICAL_MARKER_ANCHOR_POINT_ATTR = DECORATION_GRAPHICAL_MARKER_ID + ".anchorPoint";	 //$NON-NLS-1$
+    
+    public static final String DECORATION_TEXT_MARKER_LINE_ATTR = DECORATION_TEXT_MARKER_ID + ".lineNumInObject";	 //$NON-NLS-1$
+    
+    public static final String DECORATION_MARKER_ACTIVE_ATTR = DECORATION_GRAPHICAL_MARKER_ID + ".active";	 //$NON-NLS-1$
+    
+    public static final String DECORATION_MARKER_INSTALLED_ATTR = DECORATION_GRAPHICAL_MARKER_ID + ".installed";	 //$NON-NLS-1$
+    
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/markers/IModelMarkerContentProvider.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/markers/IModelMarkerContentProvider.java
new file mode 100644
index 0000000..d28621b
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/markers/IModelMarkerContentProvider.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.markers;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.swt.graphics.Image;
+
+public interface IModelMarkerContentProvider {
+
+    /**
+     * Returns the text associated with this marker.
+     * 
+     * @param marker
+     * @return String
+     */
+    String getText(IMarker marker);
+    
+    /**
+     * Returns the image associated with this marker.
+     * 
+     * The implementor is responsible for disposing of the image resource.
+     * 
+     * @param marker
+     * @return Image
+     */
+    Image getImage(IMarker marker);
+    
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/markers/ModelMarkerUtil.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/markers/ModelMarkerUtil.java
new file mode 100644
index 0000000..b74ddf4
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/markers/ModelMarkerUtil.java
@@ -0,0 +1,307 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.markers;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.bpel.common.ui.CommonUIPlugin;
+import org.eclipse.bpel.common.ui.ImageUtils;
+import org.eclipse.bpel.common.ui.Messages;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.graphics.Image;
+
+
+public class ModelMarkerUtil {
+    
+    public static final String DECORATION_MARKER_PROVIDERS_EXTENSION_ID = "org.eclipse.bpel.common.ui.modelMarkerContentProviders";	 //$NON-NLS-1$  
+    public static final String DECORATION_MARKER_PROVIDER_CONFIG_NAME = "modelMarkerContentProvider";	 //$NON-NLS-1$
+    public static final String DECORATION_MARKER_PROVIDER_MARKER_TYPE_ATTR = "markerType";	 //$NON-NLS-1$
+    public static final String DECORATION_MARKER_PROVIDER_CLASS_ATTR = "class";	 //$NON-NLS-1$
+    
+    private static Map markerTypeMap;
+    
+    /**
+     * This class is not intended to be instantiated.
+     */
+    private ModelMarkerUtil() {
+        
+    }
+    
+    /**
+     * Returns the marker from the list that should be displayed.  This takes
+     * into account the priority, visible, and anchorPoint attributes of the
+     * markers.  All markers in the list must be subtypes of the
+     * graphicalMarker type defined in this plugin.
+     * 
+     * @param markers a list with each element implementing IMarker
+     * @return IMarker the marker that should be displayed
+     * @throws IllegalArgumentException a marker in the list was not
+     * 				a subtype of graphicalMarker
+     * @throws NullPointerException the anchorPoint was null
+     */
+    public static IMarker getDisplayMarker(List markers, String anchorPoint) {
+        if (anchorPoint == null)
+            throw new NullPointerException();
+        return getDisplayMarker(markers.iterator(), anchorPoint);
+    }
+    
+    /**
+     * Returns the marker from the list that should be displayed.  This takes
+     * into account the priority and visible attributes of the marker.
+     * 
+     * @param markers a list with each element implementing IMarker
+     * @return IMarker the marker that should be displayed
+     */
+    public static IMarker getDisplayMarker(List markers) {
+        return getDisplayMarker(markers.iterator(), null);
+    }
+    
+    private static IMarker getDisplayMarker(Iterator i, String anchorPoint) {
+        IMarker displayMarker = null;
+        int displayMarkerPriority = 0;
+        while(i.hasNext()) {
+            IMarker marker = (IMarker) i.next();
+            String visible = marker.getAttribute(IModelMarkerConstants.DECORATION_MARKER_VISIBLE_ATTR, "true");	 //$NON-NLS-1$
+            if (Boolean.valueOf(visible).equals(Boolean.FALSE))
+                continue;
+            
+            if (anchorPoint != null) {
+                // make sure that this marker is defined on the desired anchor point
+                try {
+	                String markerAnchorPoint = (String) marker.getAttribute(IModelMarkerConstants.DECORATION_GRAPHICAL_MARKER_ANCHOR_POINT_ATTR);
+	                if (markerAnchorPoint == null) {
+	                    // this attribute is not defined on this marker
+	                    throw new IllegalArgumentException(Messages.ModelMarkerUtil_5); 
+	                }
+	                if (!anchorPoint.equals(markerAnchorPoint))
+	                    continue;
+                } catch (CoreException e) {
+                }
+            }
+            
+            int priority = marker.getAttribute(IModelMarkerConstants.DECORATION_MARKER_PRIORITY_ATTR, IModelMarkerConstants.DECORATION_MARKER_PRIORITY_ATTR_DEFAULT);
+            if (displayMarker == null || priority > displayMarkerPriority) {
+                displayMarker = marker;
+                displayMarkerPriority = priority;
+            }
+        }
+        return displayMarker;
+    }
+    
+    /**
+	 * Returns the image associated with this marker.  This invokes the
+	 * getImage() method on the content provider for the marker type of
+	 * the given marker.
+	 * 
+	 * If we can't find an image using the content provider we check to see if the
+	 * marker is a problem marker and get the correct icon for it.
+	 * 
+	 * @param marker
+	 * @return Image
+	 */
+	public static Image getImage(IMarker marker) {
+	    try {
+	        String markerType = marker.getType();
+	        IModelMarkerContentProvider provider =
+	            getModelMarkerContentProvider(markerType);
+	
+	        Image image = null;
+	        
+	        if (provider != null)
+	            image = provider.getImage(marker);
+	        
+			if (image == null && marker.isSubtypeOf(IMarker.PROBLEM)) 
+				image = ImageUtils.getImage(marker);
+			
+			return image;
+	    } catch (CoreException e) {
+	    	// Just ignore exceptions getting marker info.
+	    	// It is possible that the marker no longer exists.
+	    	// Eventually the UI will be notified that the
+	    	// marker is removed and it will update.
+	    	return null;
+	    }
+	}
+    
+    /**
+	 * Returns the text associated with this marker.  This invokes the
+	 * getImage() method on the content provider for the marker type of
+	 * the given marker.
+	 * 
+	 * If we can't get the text using a content provider we check to see if the
+	 * marker is a problem marker and get the correct text for it.
+	 *
+	 * @param marker
+	 * @return String
+	 */
+	public static String getText(IMarker marker) {
+	    try {
+	    	
+	        String markerType = marker.getType();
+	        IModelMarkerContentProvider provider = getModelMarkerContentProvider(markerType);
+	
+	        String text = null;
+	
+	        if (provider != null) {
+	            text = provider.getText(marker);
+	        }
+	
+	    	if (text == null && marker.isSubtypeOf(IMarker.PROBLEM)) {
+				text = (String)marker.getAttribute(IMarker.MESSAGE);
+	    	}
+			
+	        return text;
+	        
+	    } catch (CoreException e) {
+	    	// Just ignore exceptions getting marker info.
+	    	// It is possible that the marker no longer exists.
+	    	// Eventually the UI will be notified that the
+	    	// marker is removed and it will update.
+	        return null;
+	    }
+	}
+
+    /**
+     * Returns the content provider registered for the given marker's type.
+     * If checkSupertypes is <code>true</code> then if no provider is found for the 
+     * marker's specific type, supertypes are checked (in random order - first match is returned).
+     * 
+     * @param marker
+     * @param checkSupertypes
+     * @return IModelMarkerContentProvider or <code>null</code>
+     */
+    public static IModelMarkerContentProvider getModelMarkerContentProvider(IMarker marker, boolean checkSupertypes) {
+    	
+        if (markerTypeMap == null) {
+            initializeMarkerTypeMap();
+        }
+        
+        Object provider;
+		try {
+			provider = markerTypeMap.get(marker.getType());
+			if (provider == null) {
+				if (checkSupertypes) {
+					// Check the supertypes
+					Iterator iterator = markerTypeMap.keySet().iterator();
+					while (iterator.hasNext() && provider == null) {
+						String type = (String)iterator.next();
+						if (marker.isSubtypeOf(type)) {
+							provider = markerTypeMap.get(type);
+							provider = checkProvider(type, provider);
+						}
+					}
+				}
+			} else {
+				provider = checkProvider(marker.getType(), provider);
+			}
+		} catch (CoreException e) {
+			// return null if the type cannot be determined
+			return null;
+		}
+			
+        return (IModelMarkerContentProvider) provider;
+    }
+    
+    /**
+     * Returns the content provider registered for the given marker type.
+     * 
+     * @param marker type
+     * @return IModelMarkerContentProvider or <code>null</code>
+     */
+     
+    public static IModelMarkerContentProvider getModelMarkerContentProvider(String markerType) {
+        if (markerTypeMap == null) {
+            initializeMarkerTypeMap();
+        }
+        if (markerTypeMap == null) {
+        	return null;
+        }
+        Object provider = markerTypeMap.get(markerType);
+        if (provider == null) {
+            return null;
+        }
+        
+        provider = checkProvider(markerType, provider); 
+        	
+        return (IModelMarkerContentProvider) provider;
+    }
+    
+    /**
+     * We lazily create marker content providers from the config element
+     */
+    private static IModelMarkerContentProvider checkProvider(String markerType, Object obj) {
+    	Object provider = obj;
+    	if (provider instanceof IConfigurationElement) {
+	        // content provider needs to be initialized
+	        IConfigurationElement config = (IConfigurationElement) provider;
+	        try {
+	            provider = config.createExecutableExtension(DECORATION_MARKER_PROVIDER_CLASS_ATTR);
+	            
+	            // replace the configuration element entry in the markerTypeMap with
+	            // the new instance of the content provider
+	            markerTypeMap.put(markerType, provider);
+	        } catch (CoreException e) {
+	            MultiStatus status = new MultiStatus(CommonUIPlugin.PLUGIN_ID, 0,
+	                    new IStatus[]{e.getStatus()},
+	                    NLS.bind(Messages.ModelMarkerUtil_6, (new Object[] { config.getDeclaringExtension().getUniqueIdentifier() })), 
+	                    e);
+	            CommonUIPlugin.getDefault().getLog().log(status);
+	            return null;
+	        } 
+	    }
+    	return (IModelMarkerContentProvider)provider;
+    }
+
+	private static void initializeMarkerTypeMap() {
+        // load marker content providers
+        IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(DECORATION_MARKER_PROVIDERS_EXTENSION_ID);
+        if (extensionPoint == null) {
+        	return ;
+        }
+        
+        IExtension[] extensions = extensionPoint.getExtensions();
+        markerTypeMap = new HashMap(extensions.length);
+        for (int i = 0; i < extensions.length; i++) {
+            IConfigurationElement[] configs = extensions[i].getConfigurationElements();
+            for (int j = 0; j < configs.length; j++) {
+                if (configs[j].getName().equals(DECORATION_MARKER_PROVIDER_CONFIG_NAME)) {
+                    String markerType = configs[j].getAttribute(DECORATION_MARKER_PROVIDER_MARKER_TYPE_ATTR);
+                    if (markerType == null) {
+                        CommonUIPlugin.getDefault().getLog().log(createErrorStatus(
+                            NLS.bind(Messages.ModelMarkerUtil_7, (new Object[] { extensions[i].getUniqueIdentifier() })))); 
+                    } else
+                    if (markerTypeMap.containsKey(markerType)) {
+                        CommonUIPlugin.getDefault().getLog().log(createErrorStatus(
+                            NLS.bind(Messages.ModelMarkerUtil_8, (new Object[] { markerType })))); 
+                    } else {
+                        markerTypeMap.put(markerType, configs[j]);
+                    }
+                }
+            }
+        }
+	}
+	
+    private static Status createErrorStatus(String message) {
+        return new Status(IStatus.ERROR, CommonUIPlugin.PLUGIN_ID, 0, message, null);
+    }
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/messages.properties b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/messages.properties
new file mode 100644
index 0000000..18f2936
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/messages.properties
@@ -0,0 +1,39 @@
+###############################################################################
+# Copyright (c) 2005 IBM Corporation and others.
+# 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.html
+#
+# Contributors:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+#
+#Tue Nov 08 15:35:59 EST 2005
+SynchronizationManager_deleted_title=File Deleted
+CompositeEditorManager_Could_not_find_editor=Could not find editor\: {0}
+ModelMarkerUtil_8=Multiple content providers for marker type {0}
+ModelMarkerUtil_5=Marker not subtype of graphicalMarker
+ModelMarkerUtil_6=Could not instantiate marker content provider from the extension {0}
+ModelMarkerUtil_7=Marker content provider with null markerType from the extension {0}
+EditPartMarkerEectorator_1=There are {0} issues here:
+SynchronizationManager_deleted_message=The file has been deleted from the file system. Do you want to save your changes or close the editor without saving?
+CalendarPopup_todayButton_text=&Today
+EditModelCommandStack_validateEdit_message1=The files {0} can not be changed. {1}
+EditModelCommandStack_validateEdit_message0=The file {0} can not be changed. {1}
+CompositeEditor_3=The editor is not connected to this composite editor.
+CompositeEditor_2=Saving...
+DatePicker_button_text=...
+CompositeEditor_0=The active editor cannot be removed
+EditModelCommandStack_validateEdit_title=Can not change files.
+CalendarPopup_noneButton_text=&No Date
+CalendarControl_title={0} {1}
+SynchronizationManager_refresh_title=File Changed
+CompositeEditor_Cannot_disconnect_active_editor=Cannot disconnect active editor\: {0}
+# Bugzilla 330513
+SynchronizationManager_refresh_message=The file {0} \n\
+     has been changed on the file system.\n\
+     Do you want to load the changes?
+SynchronizationManager_saveButtonLabel=Save
+CompositeEditorManager_5=Embedded editors must provide an id. Ignoring editor.
+DatePicker_noDateSelected=None
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/GraphicalEditorWithPalette.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/GraphicalEditorWithPalette.java
new file mode 100644
index 0000000..45613a4
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/GraphicalEditorWithPalette.java
@@ -0,0 +1,319 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.palette;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+
+import org.eclipse.bpel.common.ui.CommonUIPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
+import org.eclipse.gef.palette.PaletteContainer;
+import org.eclipse.gef.palette.PaletteRoot;
+import org.eclipse.gef.palette.ToolEntry;
+import org.eclipse.gef.ui.actions.ActionRegistry;
+import org.eclipse.gef.ui.palette.PaletteViewer;
+import org.eclipse.gef.ui.palette.PaletteViewerProvider;
+import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.part.IPageSite;
+
+
+/**
+ * Graphical editor to be integrated with a GEFDetailsEditor.
+ */
+@SuppressWarnings("nls")
+public abstract class GraphicalEditorWithPalette extends GraphicalEditorWithFlyoutPalette {
+
+	static final String EXTPT_PALETTE_ADDITIONS = "paletteAdditions";
+	static final String ELEMENT_ADDITIONS = "additions";
+	static final String ATT_PROVIDER = "provider"; 
+	static final String ATT_IMPORTANCE = "importance";
+	static final String ATT_CLASS = "class"; 
+	static final String ATT_DEFAULT = "default";
+	
+	static final String ATT_CATEGORY = "category";
+	static final String ATT_CATEGORY_ID = "categoryId";
+	static final String ATT_CATEGORY_ORDER = "categoryOrder";
+	
+	static final String ATT_TARGET_EDITOR = "targetEditor";
+		
+	
+	private PaletteRoot paletteRoot;
+
+	
+	/**
+	 * 
+	 */
+	public GraphicalEditorWithPalette() {
+		super();
+	}
+
+	
+	/**
+	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#dispose()
+	 */
+	@Override
+	public void dispose() {
+		super.dispose();
+		paletteRoot = null;
+	}
+
+	
+	@Override
+	protected CustomPalettePage createPalettePage() {
+		return new CustomPalettePage(getPaletteViewerProvider()) {
+			
+			@Override
+			public void init(IPageSite pageSite) {
+				super.init(pageSite);
+				
+				IAction copy = getActionRegistry().getAction(ActionFactory.COPY.getId());
+				pageSite.getActionBars().setGlobalActionHandler(
+						ActionFactory.COPY.getId(), copy);
+				
+			}
+		};
+	}
+
+	
+
+	/**
+	 * Get the action registry.
+	 * 
+	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#getActionRegistry()
+	 */
+	
+	@Override
+	protected ActionRegistry getActionRegistry() {		
+		return super.getActionRegistry();
+	}
+
+
+
+	@Override
+	protected PaletteViewerProvider createPaletteViewerProvider() {
+		
+		return new PaletteViewerProvider(getEditDomain()) {			
+			@Override
+			protected void configurePaletteViewer(PaletteViewer viewer) {
+				super.configurePaletteViewer(viewer);
+				// viewer.setCustomizer(new LogicPaletteCustomizer());
+				viewer.addDragSourceListener(new TemplateTransferDragSourceListener(viewer));
+			}
+		};
+	}
+	
+	/**
+	 * The implementation in new versions of GraphicalEditor assumes that 'this' will be
+	 * the top-level editor.  For us, the assumption is most likely wrong--a DetailsEditor
+	 * is probably the top-level editor...  
+	 */
+	
+	@Override
+	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+		// Bugzilla 330526
+		getSite().getShell().getDisplay().asyncExec(new Runnable() {
+			public void run() {
+				updateActions(getSelectionActions());
+			}
+		});
+	}
+	
+	@Override
+	protected PaletteRoot getPaletteRoot() {
+		if (paletteRoot == null) {
+			paletteRoot = new PaletteRoot();			
+			createPalette ();
+		}
+
+		return paletteRoot;
+	}
+
+	
+	
+	HashMap<String,IOrderedPaletteEntry> paletteContainers () {
+		
+		// Create extension items
+		HashMap<String,IOrderedPaletteEntry> map = new HashMap<String,IOrderedPaletteEntry>();		
+		
+		for(Object next : paletteRoot.getChildren()) {
+			if (next instanceof IOrderedPaletteEntry) {
+				IOrderedPaletteEntry entry = (IOrderedPaletteEntry)next;
+				map.put(entry.getCategoryId(), entry);
+			}
+		}
+		return map;
+	}
+	
+	
+	protected String getPaletteAdditionsContributorId() {
+		return getEditorSite().getId();
+	}
+	
+	
+	
+	
+	protected void createPalette ( ) {
+		
+		// Get the id of this editor
+		String id = getPaletteAdditionsContributorId();
+				
+		ArrayList<IConfigurationElement> listOfAdditions = new ArrayList<IConfigurationElement>();
+		
+		for( IConfigurationElement additions : getConfigurationElements(EXTPT_PALETTE_ADDITIONS) ) {	
+			
+			if (additions.getName().equals(ELEMENT_ADDITIONS) == false || 
+					id.equals ( additions.getAttribute(ATT_TARGET_EDITOR)) == false ) {
+				continue;
+			}										
+			listOfAdditions.add( additions );
+		}
+		
+		
+		// Sort the additions in order.
+		Collections.sort(listOfAdditions, new Comparator<IConfigurationElement> () {			
+			int getInt ( String n ) {
+				try {
+					return Integer.parseInt(n);
+				} catch (Throwable t) {
+					return 10;
+				}
+			}			
+			public int compare(IConfigurationElement o1, IConfigurationElement o2) {
+				return getInt ( o1.getAttribute(ATT_IMPORTANCE) ) - 
+				       getInt ( o2.getAttribute(ATT_IMPORTANCE) );
+			}			
+		});
+		
+		
+		HashMap<String,IOrderedPaletteEntry> containerMap = null;
+		
+		// Process the palette additions.
+		for(IConfigurationElement additions : listOfAdditions ) {
+				
+			String provider = additions.getAttribute(ATT_PROVIDER);
+			if (provider != null) {
+				try {
+					IPaletteProvider entry = (IPaletteProvider) additions.createExecutableExtension(ATT_PROVIDER);
+					entry.contributeItems( paletteRoot );
+					// Recompute the categories, added by this bulk-addition
+					containerMap = null;
+				} catch ( CoreException ce ) {
+					CommonUIPlugin.getDefault().getLog().log(ce.getStatus());
+				}
+			}
+
+			if (containerMap == null) {
+				containerMap = paletteContainers();
+			}
+						
+			// Now process individual additions.
+			
+			for (IConfigurationElement addition: additions.getChildren() ) {
+								
+				String def = addition.getAttribute(ATT_DEFAULT);
+				String categoryName = addition.getAttribute(ATT_CATEGORY);
+				String categoryId   = addition.getAttribute(ATT_CATEGORY_ID);
+				
+				int    categoryOrder = 100;
+				
+				try {
+					categoryOrder = Math.abs( Integer.parseInt( addition.getAttribute(ATT_CATEGORY_ORDER) ) );
+				} catch (Throwable t) {
+					categoryOrder = 100;
+				}
+				
+				if (categoryId == null) {
+					categoryId = "bpel.user";
+				}
+				
+
+				PaletteContainer container = null;				
+				PaletteCategory category = null;
+				
+				IOrderedPaletteEntry orderedContainer = containerMap.get(categoryId);
+				
+				if (orderedContainer == null) {
+					
+					container = category = new PaletteCategory(categoryName); //$NON-NLS-1$					
+					
+					category.setOrder ( categoryOrder );
+					category.setCategoryId ( categoryId );
+					
+					containerMap.put(categoryId, category);
+					
+					paletteRoot.add(container);		
+					
+				} else if (orderedContainer instanceof PaletteCategory) {
+					container = category = (PaletteCategory) orderedContainer;
+				} else if (orderedContainer instanceof PaletteContainer) {
+					container = (PaletteContainer) orderedContainer;
+				} 
+								
+				
+				try {
+					
+					ToolEntry entry = (ToolEntry)addition.createExecutableExtension(ATT_CLASS);
+					
+					// The container may be null. This is most likely due to some error in configruation.
+					if (container != null) {
+						container.add(entry);
+					}
+					
+					if (def != null && def.equals("true") && category != null) { //$NON-NLS-1$
+						category.setDefaultTool(entry);
+					}
+					
+				} catch (CoreException e) {
+					CommonUIPlugin.getDefault().getLog().log(e.getStatus());
+				}
+			}
+		}
+		
+		
+		// Now sort the palette categories within the list
+		
+		Collections.sort(paletteRoot.getChildren(), new Comparator () {
+			public int compare(Object o1, Object o2) {
+				try {				
+					IOrderedPaletteEntry e1 = (IOrderedPaletteEntry) o1;
+					IOrderedPaletteEntry e2 = (IOrderedPaletteEntry) o2;
+					return e1.getOrder() - e2.getOrder();
+				} catch (Throwable t) {
+					return 0;
+				}				
+			} 					
+		});		
+		
+	}
+	
+	
+	
+	
+	
+	private IConfigurationElement[] getConfigurationElements(String extensionPointId) {
+		
+		IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(CommonUIPlugin.PLUGIN_ID, extensionPointId);
+		if (extensionPoint == null) {
+			return new IConfigurationElement[0];
+		}
+		return extensionPoint.getConfigurationElements();
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/IOrderedPaletteEntry.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/IOrderedPaletteEntry.java
new file mode 100644
index 0000000..605e4ad
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/IOrderedPaletteEntry.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Oracle Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.palette;
+
+/**
+ * @author Michal Chmielewski (michal.chmielewski@oracle.com)
+ * @date May 29, 2007
+ *
+ */
+public interface IOrderedPaletteEntry {
+
+	/**
+	 * Return the order of this palette entry within the palette.
+	 * 
+	 * @return the order (lower means first).
+	 */
+	
+	int getOrder ();
+	
+	
+	
+	/**
+	 * Return the category id.
+	 * 
+	 * @return the category id.
+	 */
+	
+	String getCategoryId ();
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/IPaletteProvider.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/IPaletteProvider.java
new file mode 100644
index 0000000..56deab0
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/IPaletteProvider.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Oracle Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.palette;
+
+import org.eclipse.gef.palette.PaletteRoot;
+
+/**
+ * @author Michal Chmielewski (michal.chmielewski@oracle.com)
+ * @date May 21, 2007
+ *
+ */
+public interface IPaletteProvider {
+
+	/**
+	 * Contribute the palette items the the palette root.
+	 * 
+	 * @param paletteRoot
+	 */
+	
+	public void contributeItems ( PaletteRoot paletteRoot );
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/OrderedPaletteGroup.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/OrderedPaletteGroup.java
new file mode 100644
index 0000000..d140c5b
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/OrderedPaletteGroup.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Oracle Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.palette;
+
+import org.eclipse.gef.palette.PaletteGroup;
+
+/**
+ * @author Michal Chmielewski (michal.chmielewski@oracle.com)
+ * @date May 29, 2007
+ *
+ */
+public class OrderedPaletteGroup extends PaletteGroup implements IOrderedPaletteEntry {
+
+	/** Order of palette entry */
+	protected int fOrder = 100;
+	
+	/** the default category id */
+	protected String fCategoryId = "group.default"; //$NON-NLS-1$
+	
+	
+	/**
+	 * Brand new shiny Ordered Palette Group. This is a regular palette group but with ordering information.
+	 * 
+	 * @param label the name of the group.
+	 */
+	
+	public OrderedPaletteGroup (String label) {
+		super(label);		
+	}
+	
+	/**
+	 * Return the order of this palette category within the palette.
+	 * 
+	 * @return the palette category entry.
+	 */
+	
+	public int getOrder () {
+		return fOrder;
+	}
+
+	/**
+	 * Set the order of this palette category entry.
+	 * 
+	 * @param anOrder
+	 */
+	
+	public void setOrder (int anOrder ) {
+		fOrder = anOrder;
+	}
+	
+	/** 
+	 * Return the category id of this category.
+	 * 
+	 * @return the category id.
+	 */
+	
+	public String getCategoryId ( ) {		
+		return fCategoryId;
+	}
+	
+	
+	/**
+	 * Set the category Id.
+	 * 
+	 * @param aCategoryId the category id for this category.
+	 */
+	public void setCategoryId ( String aCategoryId ) {
+		fCategoryId = aCategoryId;
+	}
+	
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/PaletteCategory.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/PaletteCategory.java
new file mode 100644
index 0000000..501a25b
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/palette/PaletteCategory.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.palette;
+
+import org.eclipse.gef.palette.PaletteDrawer;
+import org.eclipse.gef.palette.ToolEntry;
+import org.eclipse.jface.resource.ImageDescriptor;
+
+/**
+ * Model object for a palette category.
+ */
+public class PaletteCategory extends PaletteDrawer implements IOrderedPaletteEntry {
+
+	protected ToolEntry defaultTool;
+	
+	/** The relative position of this category within the palette */
+	protected int fOrder = 10;
+	
+	/** The category id */
+	protected String fCategoryId = "bpel.user"; //$NON-NLS-1$
+	
+	/**
+	 * Create a brand new PaletteCategory label.
+	 * 
+	 * @param label
+	 */
+	
+	public PaletteCategory (String label) {
+		this(label, null);
+	}
+
+	/**
+	 * Create a brand new Palette Category with the label and an Image 
+	 * 
+	 * @param label the label
+	 * @param icon the icon
+	 */
+	public PaletteCategory(String label, ImageDescriptor icon) {
+		super(label, icon);
+	}
+
+	/**
+	 * Return the default tool for this Palette Category.
+	 * @return the default tool.
+	 */
+	
+	public ToolEntry getDefaultTool() {
+		if (defaultTool != null) {
+			return defaultTool;
+		}
+		if (getChildren().size() > 0) {
+			return (ToolEntry) getChildren().get(0);
+		}
+		return null;
+	}
+
+	/**
+	 * Set the default tool.
+	 * 
+	 * @param entry
+	 */
+	
+	public void setDefaultTool(ToolEntry entry) {
+		defaultTool = entry;
+	}
+	
+	/**
+	 * Return the order of this palette category within the palette.
+	 * 
+	 * @return the palette category entry.
+	 */
+	
+	public int getOrder () {
+		return fOrder;
+	}
+
+	/**
+	 * Set the order of this palette category entry.
+	 * 
+	 * @param anOrder
+	 */
+	
+	public void setOrder (int anOrder ) {
+		fOrder = anOrder;
+	}
+	
+	/** 
+	 * Return the category id of this category.
+	 * 
+	 * @return the category id.
+	 */
+	
+	public String getCategoryId ( ) {		
+		return fCategoryId;
+	}
+	
+	
+	/**
+	 * Set the category Id.
+	 * 
+	 * @param aCategoryId the category id for this category.
+	 */
+	public void setCategoryId ( String aCategoryId ) {
+		fCategoryId = aCategoryId;
+	}
+	
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/AdaptingSelectionProvider.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/AdaptingSelectionProvider.java
new file mode 100644
index 0000000..e12a69c
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/AdaptingSelectionProvider.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+
+/**
+ * The adapting selection provider is used by the BPEL graphical editor
+ * so that it can provide its selection in terms of model objects rather
+ * than in terms of EditPart objects. This class takes care of converting
+ * from model objects to EditParts, and vice versa, when necessary.
+ */
+public class AdaptingSelectionProvider extends MultiViewerSelectionProvider {
+
+	/**
+	 * Brand new shiny AdaptingSelectionProvider ...
+	 * @param viewer
+	 */
+	public AdaptingSelectionProvider(EditPartViewer viewer) {
+		super(viewer);
+	}
+	
+	/**
+	 * Brand new shiny AdaptingSelectionProvider ...
+	 */
+	public AdaptingSelectionProvider() {
+		super();
+	}
+	
+	
+	@Override
+	protected IStructuredSelection calculateSelection (IStructuredSelection selection) {
+		
+		if (selection == null || selection.isEmpty()) {
+			return StructuredSelection.EMPTY;
+		}
+		
+		List<EObject> list = new ArrayList<EObject>();		
+		Set<EObject>  newSet = new HashSet<EObject>();
+		
+		for (Object model : selection.toArray()) {							
+			if (model instanceof EditPart) {
+				model = ((EditPart)model).getModel();
+			} 
+			if (model instanceof EObject) { 
+				EObject eObj = (EObject) model;
+				if (newSet.add(eObj)) {
+					list.add(eObj);
+				}
+			}			
+		}
+		if (list.isEmpty()) {
+			return StructuredSelection.EMPTY;
+		}
+		return new StructuredSelection( list );
+	}
+	
+	/**
+	 * Set selection to each of the viewers and make sure we ignore callbacks
+	 * 
+	 */
+	
+	@Override
+	protected void internalSetSelection(IStructuredSelection selection) {
+		
+		if (selection == null || selection.isEmpty() ) {
+			return;
+		}
+		try {
+			changingSelection = true;
+			for(EditPartViewer viewer : viewers ) {
+				List<EditPart> newList = new ArrayList<EditPart>();
+				Map<Object,EditPart> registry = viewer.getEditPartRegistry();
+				
+				for(Object o : selection.toArray()) {					
+					EditPart editPart = registry.get(o);
+					if (editPart != null) {
+						newList.add(editPart);
+					}
+				}
+				viewer.setSelection(new StructuredSelection(newList));
+			}	
+		} finally {
+			changingSelection = false;
+		}
+	}	
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/AddChildInTrayAction.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/AddChildInTrayAction.java
new file mode 100644
index 0000000..3493575
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/AddChildInTrayAction.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.ui.actions.SelectionAction;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IWorkbenchPart;
+
+public class AddChildInTrayAction extends SelectionAction {
+	protected static final String ID = "org.eclipse.bpel.common.ui.tray.AddChildInTrayAction"; //$NON-NLS-1$
+	protected Class clazz;
+	protected TrayCategoryEditPart target;
+	
+	/**
+	 * @param part
+	 */
+	public AddChildInTrayAction(IWorkbenchPart part, Class clazz, String label, ImageDescriptor icon) {
+		super(part);
+		setText(label);
+		setToolTipText(label);
+		setImageDescriptor(icon);
+		this.clazz = clazz;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.gef.ui.actions.WorkbenchPartAction#calculateEnabled()
+	 */
+	@Override
+	protected boolean calculateEnabled() {
+		List selected = getSelectedObjects();
+		target = null;
+		if (getSelectedObjects().size() >  0 && (selected.get(0) instanceof EditPart)) {
+			Object model = ((EditPart) selected.get(0)).getModel();
+			for (Iterator it = selected.iterator(); it.hasNext(); ) {
+				Object o = it.next();
+				if (o instanceof TrayCategoryEditPart)
+					target = (TrayCategoryEditPart) o;
+				if (o instanceof EditPart) {
+					if (!model.equals(((EditPart) o).getModel()))
+						return false;
+				}
+			}
+			if (target != null && clazz == target.getClass())
+				return true;
+		}
+		return false;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	@Override
+	public void run() {
+		if (target != null) 
+			target.publicAddEntry();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#getId()
+	 */
+	@Override
+	public String getId() {
+		return ID + "." + clazz; //$NON-NLS-1$
+	}
+	
+	public static String calculateId(Class clazz) {
+		return ID + "." + clazz; //$NON-NLS-1$
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/GraphicalEditorWithPaletteAndTray.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/GraphicalEditorWithPaletteAndTray.java
new file mode 100644
index 0000000..156e6b0
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/GraphicalEditorWithPaletteAndTray.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import org.eclipse.bpel.common.ui.palette.GraphicalEditorWithPalette;
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Viewport;
+import org.eclipse.draw2d.ViewportLayout;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+
+
+/**
+ * @author IBM Initial contribution
+ * @date January, 2006
+ *
+ */
+
+public abstract class GraphicalEditorWithPaletteAndTray extends GraphicalEditorWithPalette {
+
+	protected TrayComposite trayComposite;
+	protected GraphicalViewer trayViewer;
+
+	/**
+	 * @see org.eclipse.bpel.common.ui.palette.GraphicalEditorWithPalette#dispose()
+	 */
+	@Override
+	public void dispose() {
+		super.dispose();
+		trayViewer = null;
+	}
+
+	/**
+	 * Return the tray composite.
+	 * @return the tray composite.
+	 */
+	public TrayComposite getTrayComposite() {
+		return trayComposite;
+	}
+
+	/**
+	 * Return the tray viewer.
+	 * 
+	 * @return the tray viewer
+	 */
+	
+	public GraphicalViewer getTrayViewer() {
+		return trayViewer;
+	}
+	
+	/**
+	 * Creates the palette and graphical viewers.
+	 */
+	@Override
+	public void createPartControl(Composite parent) {
+		trayComposite = new TrayComposite(parent, SWT.NONE);
+		
+		// create editor control
+		Composite editorComposite = trayComposite.getEditorComposite();
+		super.createPartControl(editorComposite);
+		
+		// create tray control
+		createTrayViewer(trayComposite);
+		trayComposite.setTrayControl(trayViewer.getControl());
+	}
+	
+	protected void createTrayViewer(Composite parent) {
+		trayViewer = new ScrollingGraphicalViewer();
+		trayViewer.createControl(parent);
+		final FigureCanvas canvas = (FigureCanvas) trayViewer.getControl();
+		canvas.setScrollBarVisibility(FigureCanvas.NEVER);
+		
+		// We need to modify the viewport layout so that it adjusts the
+		// size of the viewport contents according to the viewport size.
+		// The contents cannot be bigger than the viewport otherwise it
+		// will break the tray scrolling.
+		canvas.getViewport().setLayoutManager(new ViewportLayout() {
+			
+			@Override
+			public void layout(IFigure figure) {
+				Viewport viewport = (Viewport)figure;
+				IFigure contents = viewport.getContents();
+				
+				if (contents == null) return;
+				Point p = viewport.getClientArea().getLocation();
+
+				p.translate(viewport.getViewLocation().getNegated());
+				
+				Dimension newSize = viewport.getClientArea().getSize();
+				
+				contents.setBounds(new Rectangle(p, newSize));
+			}
+		});
+		
+		trayViewer.setKeyHandler(new TrayKeyHandler(trayViewer));
+		initializeTrayViewer();
+	}
+	
+    /**
+     * @see org.eclipse.gef.ui.parts.GraphicalEditor#setFocus()
+     */
+    @Override
+	public void setFocus() {
+    	getGraphicalViewer().getControl().setFocus();
+    }
+	
+	protected abstract void initializeTrayViewer();
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/MainTrayEditPart.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/MainTrayEditPart.java
new file mode 100644
index 0000000..ee0100c
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/MainTrayEditPart.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import org.eclipse.bpel.common.ui.decorator.EditPartMarkerDecorator;
+import org.eclipse.bpel.common.ui.layouts.AlignedFlowLayout;
+import org.eclipse.draw2d.AbstractLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.ImageFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.ScrollPane;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Insets;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.Handle;
+import org.eclipse.gef.handles.HandleBounds;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+
+/**
+ * Main EditPart for the Tray.
+ */
+public class MainTrayEditPart extends TrayContainerEditPart {
+
+	/**
+	 * 
+	 */
+	public static final int SCROLL_STEP = 20;
+	
+	protected class MainTrayTitleFigure extends SelectionBorderFigure implements HandleBounds {
+		/**
+		 * 
+		 */
+		public MainTrayTitleFigure() {
+			super();
+			setOpaque(true);
+			AlignedFlowLayout titleLayout = new AlignedFlowLayout();
+			titleLayout.setHorizontal(true);
+			titleLayout.setHorizontalSpacing(2);
+			titleLayout.setVerticalAlignment(AlignedFlowLayout.ALIGN_CENTER);
+			titleLayout.setHorizontalAlignment(AlignedFlowLayout.ALIGN_CENTER);
+			setLayoutManager(titleLayout);
+			setBorder(new MarginBorder(new Insets(3)));
+		}
+		/**
+		 * @see org.eclipse.gef.handles.HandleBounds#getHandleBounds()
+		 */
+		public Rectangle getHandleBounds() {
+			return getClientArea();
+		}
+	}
+	
+	protected class MainTraySelectionEditPolicy extends TraySelectionEditPolicy {
+		@Override
+		protected Handle createHandle(GraphicalEditPart owner) {
+			return new TraySelectionHandle(owner, mainTrayTitleFigure);
+		}
+	}
+	
+	/**
+	 * Figure that implements scrolling.
+	 */
+	public class MainTrayContainerFigure extends TrayContainerFigure {
+
+		protected class MainTrayContainerFigureLayout extends AbstractLayout {
+			@Override
+			protected Dimension calculatePreferredSize(IFigure container, int wHint, int hHint) {
+				if (titleFigure == null || childrenScrollPane == null) return new Dimension(wHint, hHint);
+				Dimension titleSize = titleFigure.getPreferredSize(wHint, hHint);
+				Dimension scrollPaneSize = childrenScrollPane.getPreferredSize(wHint, hHint);
+				int width = Math.max(titleSize.width, scrollPaneSize.width);
+				return new Dimension(width, container.getSize().height);
+			}
+			/**
+			 * @see org.eclipse.draw2d.LayoutManager#layout(org.eclipse.draw2d.IFigure)
+			 */
+			public void layout(IFigure container) {
+				if (titleFigure == null || childrenScrollPane == null) return;
+				Rectangle area = container.getClientArea().getCopy();
+				Dimension size = titleFigure.getPreferredSize();
+				titleFigure.setBounds(new Rectangle(area.x, area.y, area.width, size.height));
+				area.y += size.height;
+				int height = area.height - size.height;
+				childrenScrollPane.setBounds(new Rectangle(area.x, area.y, area.width, height));
+			}
+			
+			/**
+			 * @see org.eclipse.draw2d.AbstractLayout#getMinimumSize(org.eclipse.draw2d.IFigure, int, int)
+			 */
+			@Override
+			public Dimension getMinimumSize(IFigure container, int wHint, int hHint) {
+				Dimension result = getPreferredSize(container, wHint, hHint);
+				result.width = 80; // magic number
+				return result;
+			}
+		}
+		
+		protected ScrollPane childrenScrollPane;
+		
+		/**
+		 * 
+		 */
+		public MainTrayContainerFigure() {
+			super();
+			setLayoutManager(new MainTrayContainerFigureLayout());
+		}
+		
+		/**
+		 * @see org.eclipse.bpel.common.ui.tray.TrayContainerEditPart.TrayContainerFigure#setChildrenFigure(org.eclipse.draw2d.IFigure)
+		 */
+		@Override
+		public void setChildrenFigure(IFigure target) {
+			if (childrenScrollPane == null) {
+				childrenScrollPane = createScrollpane();
+				add(childrenScrollPane);
+			}
+			childrenFigure = target;
+			childrenScrollPane.setContents(target);
+		}
+		protected ScrollPane createScrollpane() {
+			ScrollPane scrollpane = new ScrollPane();
+			scrollpane.getViewport().setContentsTracksWidth(true);
+			scrollpane.getViewport().setContentsTracksHeight(true);
+			scrollpane.setMinimumSize(new Dimension(0, 0));
+			scrollpane.setHorizontalScrollBarVisibility(ScrollPane.NEVER);
+			scrollpane.setVerticalScrollBar(new TrayScrollBar());
+			scrollpane.getVerticalScrollBar().setStepIncrement(SCROLL_STEP);
+			scrollpane.setLayoutManager(new TrayScrollPaneLayout());
+			return scrollpane;
+		}
+		
+		/**
+		 * @return the scroll pane.
+		 */
+		public ScrollPane getChildrenScrollPane() {
+			return childrenScrollPane;
+		}
+	}
+	
+	protected EditPartMarkerDecorator decorator;
+	protected Label nameLabel;
+	protected MainTrayTitleFigure mainTrayTitleFigure;
+	
+	/**
+	 * 
+	 */
+	public MainTrayEditPart() {
+		super();
+	}
+
+	@Override
+	protected IFigure createTitleFigure() {
+		mainTrayTitleFigure = new MainTrayTitleFigure();
+		mainTrayTitleFigure.add(new ImageFigure(getLabelProvider().getImage(getModel())));
+		nameLabel = new Label(getLabelProvider().getText(getModel()));
+		mainTrayTitleFigure.add(nameLabel);
+		decorator = createEditPartMarkerDecorator();
+		return decorator.createFigure(mainTrayTitleFigure);
+	}
+	
+	protected EditPartMarkerDecorator createEditPartMarkerDecorator ( ) {
+		return new TrayMarkerDecorator((EObject)getModel(), new ToolbarLayout()); 
+	}
+	
+	@Override
+	protected TrayContainerFigure createMainFigure() {
+		return new MainTrayContainerFigure();
+	}
+	
+	@Override
+	protected void refreshVisuals() {
+		super.refreshVisuals();
+		nameLabel.setText(getLabelProvider().getText(getModel()));
+		decorator.refresh();
+	}
+
+	@Override
+	protected void createEditPolicies() {
+		// Show selection handles
+		MainTraySelectionEditPolicy selectionEditPolicy = new MainTraySelectionEditPolicy();
+		selectionEditPolicy.setDragAllowed(false);
+		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, selectionEditPolicy);
+	}
+	
+	/**
+	 * @see org.eclipse.bpel.common.ui.tray.TrayEditPart#getDirectEditLabel()
+	 */
+	@Override
+	public Label getDirectEditLabel() {
+		return nameLabel;
+	}
+
+	/**
+	 * Returns a model object if one is available or null.
+	 */
+	protected Object getModelObjectFromSelection(ISelection target) {
+		if (target instanceof IStructuredSelection) {
+			IStructuredSelection selection = (IStructuredSelection)target;
+			Object element = selection.getFirstElement();
+			if (element != null) {
+				return (element instanceof EditPart) ? ((EditPart)element).getModel() : element;
+			}
+		}
+		return null;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/MultiViewerSelectionProvider.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/MultiViewerSelectionProvider.java
new file mode 100644
index 0000000..5ec55d0
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/MultiViewerSelectionProvider.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others. 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.html
+ * 
+ * Contributors: IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.jface.viewers.IPostSelectionProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+
+/**
+ * @author IBM, Original Contribution.
+ * @author Michal Chmielewski (michal.chmielewski@oracle.com)
+ * @date Jun 5, 2007
+ * 
+ */
+
+public class MultiViewerSelectionProvider implements ISelectionProvider, IPostSelectionProvider {
+
+  static ISelectionChangedListener[] EMPTY_LISTENERS = {};
+
+  protected List<EditPartViewer> viewers = new ArrayList<EditPartViewer>();
+
+  protected List<ISelectionChangedListener> listeners = new ArrayList<ISelectionChangedListener>();
+
+  protected List<ISelectionChangedListener> postListeners = new ArrayList<ISelectionChangedListener>();
+
+  protected boolean changingSelection = false;
+
+  protected boolean broadcastingSelectionChange = false;
+
+  protected IStructuredSelection cachedSelection;
+
+  /**
+   * Brand new shiny MultiViewerSelectionProvider
+   */
+  public MultiViewerSelectionProvider() {
+    // Empty constructor
+  }
+
+  /**
+   * Brand new shiny MultiViewerSelectionProvider
+   * 
+   * @param viewer
+   */
+  public MultiViewerSelectionProvider(EditPartViewer viewer) {
+    addViewer(viewer);
+  }
+
+  /**
+   * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+   */
+  public void addSelectionChangedListener(ISelectionChangedListener listener) {
+    listeners.add(listener);
+  }
+
+  /**
+   * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+   */
+  public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+    listeners.remove(listener);
+  }
+
+  /**
+   * @see org.eclipse.jface.viewers.IPostSelectionProvider#addPostSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+   */
+  public void addPostSelectionChangedListener(ISelectionChangedListener listener) {
+    postListeners.add(listener);
+  }
+
+  /**
+   * @see org.eclipse.jface.viewers.IPostSelectionProvider#removePostSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+   */
+  public void removePostSelectionChangedListener(ISelectionChangedListener listener) {
+    postListeners.remove(listener);
+  }
+
+  /**
+   * Add the viewer to the list of viewers that are listening for selection changes.
+   * 
+   * @param viewer
+   */
+  public void addViewer(EditPartViewer viewer) {
+    viewers.add(viewer);
+    viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+      public void selectionChanged(SelectionChangedEvent event) {
+        if (changingSelection) {
+          return;
+        }
+        setSelection(event.getSelection());
+      }
+    });
+  }
+
+  /**
+   * Get the current selection
+   * 
+   * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
+   */
+  public ISelection getSelection() {
+    if (cachedSelection == null) {
+      List<EditPartViewer> result = new ArrayList<EditPartViewer>();
+      for (EditPartViewer next : viewers) {
+        result.addAll(next.getSelectedEditParts());
+      }
+      cachedSelection = calculateSelection(new StructuredSelection(result));
+    }
+    return cachedSelection;
+  }
+
+  /**
+   * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
+   */
+  public void setSelection(ISelection selection) {
+    if (selection instanceof IStructuredSelection == false) {
+      return;
+    }
+
+    cachedSelection = calculateSelection((IStructuredSelection) selection);
+    internalSetSelection(cachedSelection);
+    fireSelectionChanged(this, cachedSelection);
+  }
+
+  protected void fireSelectionChanged(ISelectionProvider provider, ISelection selection) {
+    SelectionChangedEvent event = new SelectionChangedEvent(provider, selection);
+    try {
+      broadcastingSelectionChange = true;
+      for (ISelectionChangedListener listener : this.listeners.toArray(EMPTY_LISTENERS)) {
+        listener.selectionChanged(event);
+      }
+      for (ISelectionChangedListener listener : this.postListeners.toArray(EMPTY_LISTENERS)) {
+        listener.selectionChanged(event);
+      }
+    } finally {
+      broadcastingSelectionChange = false;
+    }
+  }
+
+  protected IStructuredSelection calculateSelection(IStructuredSelection baseSelection) {
+
+    List<EditPart> result = new ArrayList<EditPart>();
+    for (EditPartViewer viewer : viewers) {
+
+      Map<Object, EditPart> registry = viewer.getEditPartRegistry();
+
+      for (Object n : baseSelection.toArray()) {
+        EditPart part = (EditPart) n;
+        Object model = part.getModel();
+        EditPart viewerEditPart = registry.get(model);
+        if (viewerEditPart != null) {
+          result.add(viewerEditPart);
+        }
+      }
+    }
+    if (result.isEmpty()) {
+      return StructuredSelection.EMPTY;
+    }
+    return new StructuredSelection(result);
+  }
+
+  // TODO: try getting rid of the isEmpty() check here and in the same
+  // place in AdaptingSelectionProvider.
+
+  // Set selection to each of the viewers and make sure we ignore callbacks
+
+  protected void internalSetSelection(IStructuredSelection selection) {
+    if (selection == null || selection.isEmpty()) {
+      return;
+    }
+
+    try {
+      changingSelection = true;
+
+      for (EditPartViewer viewer : viewers) {
+
+        Map<Object, EditPart> registry = viewer.getEditPartRegistry();
+        List<EditPart> newList = new ArrayList<EditPart>();
+        Set<EditPart> newSet = new HashSet<EditPart>();
+
+        for (Object n : selection.toArray()) {
+          EditPart part = (EditPart) n;
+          Object model = part.getModel();
+          EditPart viewerEditPart = registry.get(model);
+          if (viewerEditPart != null && newSet.add(viewerEditPart)) {
+            newList.add(viewerEditPart);
+          }
+        }
+        viewer.setSelection(new StructuredSelection(newList));
+      }
+    } finally {
+      changingSelection = false;
+    }
+  }
+
+  /**
+   * Answer true if we are broadcasting a selection change.
+   * 
+   * @return answer true if we are broadcasting selection change.
+   */
+
+  public boolean isBroadcastingSelectionChange() {
+    return broadcastingSelectionChange;
+  }
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/SelectionBorderFigure.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/SelectionBorderFigure.java
new file mode 100644
index 0000000..6b35632
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/SelectionBorderFigure.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+/**
+ * Selection border works differently than selection handles.
+ * We don't use the normal selection handles because they do not
+ * work properly within a ScrollPane. Selection handles are drawn in a layer of the
+ * root figure so even when figures in the ScrollPane are not visible, if that figure
+ * was selected before, the handle is drawn on top of other figures.
+ * Selection borders are drawn by the selected figure.
+ */
+public class SelectionBorderFigure extends Figure {
+
+	protected boolean shouldPaintSelectionBorder;
+	
+	public SelectionBorderFigure() {
+		super();
+		shouldPaintSelectionBorder = false;
+	}
+
+	@Override
+	public void paint(Graphics graphics) {
+		super.paint(graphics);
+		paintSelectionBorder(graphics);
+	}
+	
+	protected void paintSelectionBorder(Graphics graphics) {
+		if (shouldPaintSelectionBorder) {
+			Rectangle rect = getBounds().getCopy();
+			rect.shrink(1, 1);
+			graphics.drawRectangle(rect);
+		}
+	}
+	
+	public void setPaintSelectionBorder(boolean paint) {
+		shouldPaintSelectionBorder = paint;
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayAccessibleEditPart.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayAccessibleEditPart.java
new file mode 100644
index 0000000..3ad9635
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayAccessibleEditPart.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.AccessibleEditPart;
+import org.eclipse.gef.EditPart;
+import org.eclipse.swt.accessibility.ACC;
+import org.eclipse.swt.accessibility.AccessibleControlEvent;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+
+
+public class TrayAccessibleEditPart extends AccessibleEditPart {
+
+	protected TrayEditPart part;
+	
+	public TrayAccessibleEditPart(TrayEditPart part) {
+		super();
+		this.part = part; 
+	}
+
+	@Override
+	public void getChildCount(AccessibleControlEvent e) {
+		getChildren(e);
+		e.detail = e.children.length;
+	}
+
+	@Override
+	public void getChildren(AccessibleControlEvent e) {
+		List<EditPart> list = part.getChildren();
+		Vector<Integer> childList = new Vector<Integer>();
+		for (int i = 0; i < list.size(); i++) {
+			EditPart child = list.get(i);
+			AccessibleEditPart access = (AccessibleEditPart)child.getAdapter(AccessibleEditPart.class);
+			if (access == null)
+				continue;
+			childList.add( Integer.valueOf( access.getAccessibleID()));
+		}
+		e.children = childList.toArray();
+	}
+
+	@Override
+	public void getName(AccessibleEvent e) {
+		Label label = part.getDirectEditLabel();
+		if (label != null) {
+			e.result = label.getText();
+		} else {
+			e.result = null;
+		}
+	}
+
+	@Override
+	public void getLocation(AccessibleControlEvent e) {
+		Rectangle bounds = part.getFigure().getBounds().getCopy();
+		part.getFigure().translateToAbsolute(bounds);
+		org.eclipse.swt.graphics.Point p = new org.eclipse.swt.graphics.Point(0, 0);
+		p = part.getViewer().getControl().toDisplay(p);
+		e.x = bounds.x + p.x;
+		e.y = bounds.y + p.y;
+		e.width = bounds.width;
+		e.height = bounds.height;
+	}
+
+	@Override
+	public void getState(AccessibleControlEvent e) {
+		e.detail = ACC.STATE_SELECTABLE | ACC.STATE_FOCUSABLE;
+		if (part.getSelected() != EditPart.SELECTED_NONE)
+			e.detail |= ACC.STATE_SELECTED;
+		if (part.getViewer().getFocusEditPart() == part)
+			e.detail = ACC.STATE_FOCUSED;
+	}
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayCategoryEditPart.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayCategoryEditPart.java
new file mode 100644
index 0000000..9b13081
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayCategoryEditPart.java
@@ -0,0 +1,304 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.bpel.common.ui.ICommonUIConstants;
+import org.eclipse.bpel.common.ui.CommonUIPlugin;
+import org.eclipse.bpel.common.ui.details.IDetailsColors;
+import org.eclipse.bpel.common.ui.details.widgets.NoBorderButton;
+import org.eclipse.draw2d.AbstractLayout;
+import org.eclipse.draw2d.ActionEvent;
+import org.eclipse.draw2d.ActionListener;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.ImageFigure;
+import org.eclipse.draw2d.KeyEvent;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.DragTracker;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.Handle;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.CompoundCommand;
+import org.eclipse.gef.requests.CreateRequest;
+import org.eclipse.gef.requests.CreationFactory;
+import org.eclipse.gef.requests.GroupRequest;
+import org.eclipse.gef.tools.SelectEditPartTracker;
+
+
+/**
+ * Represents a category in the Tray.
+ */
+public abstract class TrayCategoryEditPart extends TrayContainerEditPart {
+	protected SelectionBorderFigure titleFigure;
+	
+	protected class TrayCategoryEntrySelectionEditPolicy extends TraySelectionEditPolicy {
+		@Override
+		protected Handle createHandle(GraphicalEditPart owner) {
+			return new TraySelectionHandle(owner, titleFigure);
+		}
+	}
+	/**
+	 * A layout for the title of this edit part:
+	 * 	ICON LABEL ADD_BUTTON REMOVE_BUTTON
+	 */
+	protected class TitleLayout extends AbstractLayout {
+		private static final int SPACING = 2;
+		public void layout(IFigure container) {
+			List elements = container.getChildren();
+			ImageFigure icon = (ImageFigure)elements.get(0);
+			Label text = (Label)elements.get(1);
+			Figure removeButton = (Figure)elements.get(2);
+			Figure addButton = (Figure)elements.get(3);
+			
+			Rectangle containerBounds = container.getBounds();
+			int x = containerBounds.x + SPACING;
+			int y = containerBounds.y;
+			int height = containerBounds.height;
+			
+			Dimension size = icon.getPreferredSize();
+			Rectangle bounds = new Rectangle(x, y, size.width, height);
+			icon.setBounds(bounds);
+			
+			size = removeButton.getPreferredSize();
+			x = (containerBounds.x + containerBounds.width) - size.width;
+			bounds = new Rectangle(x, y, size.width, height);
+			removeButton.setBounds(bounds);
+
+			size = addButton.getPreferredSize();
+			x = x - size.width;
+			bounds = new Rectangle(x, y, size.width, height);
+			addButton.setBounds(bounds);
+
+			x = icon.getBounds().x + icon.getBounds().width;
+			x = x + SPACING;
+			int width = containerBounds.width - (icon.getBounds().width + removeButton.getBounds().width + addButton.getBounds().width);
+			bounds = new Rectangle(x, y, width, height);
+			text.setBounds(bounds);
+		}
+		@Override
+		protected Dimension calculatePreferredSize(IFigure container, int wHint, int hHint) {
+			Dimension result = new Dimension(0, hHint);
+			for (Iterator<IFigure> iter = container.getChildren().iterator(); iter.hasNext();) {
+				IFigure	child = iter.next();
+				Dimension size = (child instanceof Label) ? child.getMinimumSize() : child.getPreferredSize();
+				result.height = Math.max(result.height, size.height);
+				result.width += size.width;
+			}
+			result.height += (SPACING*2); // give it some extra pixels
+			return result;
+		}
+	}
+	
+	/**
+	 * The figure representing the title of this container.
+	 */
+	protected class TitleFigure extends SelectionBorderFigure {
+		protected Label textLabel;
+		protected NoBorderButton addButton;
+		protected NoBorderButton removeButton;
+		public TitleFigure() {
+			super();
+			setLayoutManager(new TitleLayout());
+			setOpaque(true);
+			setBackgroundColor(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_LIGHT_BACKGROUND));
+			add(new ImageFigure(getLabelProvider().getImage(getModel())));
+			textLabel = new Label(getLabelProvider().getText(getModel()));
+			textLabel.setLabelAlignment(PositionConstants.LEFT);
+			add(textLabel);
+			
+			removeButton = new NoBorderButton(CommonUIPlugin.getDefault().getImageRegistry().get(ICommonUIConstants.ICON_TRAY_CATEGORY_REMOVE_BUTTON)) {
+				@Override
+				public void handleKeyPressed(KeyEvent event) {
+					// Do nothing - the button can only be pressed with a mouse
+				}
+				@Override
+				public void handleKeyReleased(KeyEvent event) {
+					// Do nothing - the button can only be pressed with a mouse
+				}
+			};
+			removeButton.setOpaque(false);
+			removeButton.setToolTip(getRemoveToolTip());
+			removeButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent event) {
+					removeEntry();
+				}
+			});
+			
+			addButton = new NoBorderButton(CommonUIPlugin.getDefault().getImageRegistry().get(ICommonUIConstants.ICON_TRAY_CATEGORY_ADD_BUTTON)) {
+				@Override
+				public void handleKeyPressed(KeyEvent event) {
+					// Do nothing - the button can only be pressed with a mouse
+				}
+				@Override
+				public void handleKeyReleased(KeyEvent event) {
+					// Do nothing - the button can only be pressed with a mouse
+				}
+			};
+			addButton.setOpaque(false);
+			addButton.setToolTip(getAddToolTip());
+			addButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent event) {
+					addEntry();
+				}
+			});
+			
+			add(removeButton);
+			add(addButton);
+		}
+		public Label getTextLabel() {
+			return textLabel;
+		}
+	}
+
+	/**
+	 * Adds a new entry to the category. Returns the new model object.
+	 */
+	protected Object addEntry() {
+		CreateRequest request = new CreateRequest();
+		request.setFactory(getCreationFactory());
+		Command command = getCommand(request);
+		getCommandStack().execute(command);
+		Object newObject = request.getNewObject();
+		// Select the new item after creation
+		selectEditPart(newObject);
+		return newObject;
+	}
+	
+	/**
+	 * Adds a new entry to the category. Returns the new model object.
+	 * Used by the AddChildInTrayAction.
+	 */
+	public Object publicAddEntry() {
+		return addEntry();
+	}
+	
+	/**
+	 * Called by the remove button to remove the currently selected entry.
+	 */
+	protected void removeEntry() {
+		List selectedParts = getViewer().getSelectedEditParts();
+		if (selectedParts.size() == 0) return; // nothing to be done
+		
+		// we can only delete edit parts that are children of this edit part
+		List<EditPart> condemned = new ArrayList<EditPart>();
+		for (Iterator<EditPart> iter = selectedParts.iterator(); iter.hasNext();) {
+			EditPart part = iter.next();
+			if (part.getParent() == TrayCategoryEditPart.this) {
+				condemned.add(part);
+			}
+		}
+		if (condemned.isEmpty()) return; // nothing to be done
+
+		// gets the index to be used in the post-deletion selection
+		EditPart indexPart = condemned.get(0);
+		int index = getModelChildren().indexOf(indexPart.getModel());
+		
+		// remove all the valid selected edit parts
+		GroupRequest request = new GroupRequest(RequestConstants.REQ_DELETE);
+		CompoundCommand deletions = new CompoundCommand();
+		for (Iterator<EditPart> iter = condemned.iterator(); iter.hasNext();) {
+			EditPart part = iter.next();
+			deletions.add(part.getCommand(request));
+		}
+		getCommandStack().execute(deletions);
+		
+		// Select the next edit part if one is available
+		int size = getModelChildren().size();
+		if (size == 0) return; // nothing to be done
+		if (size > index) {
+			selectEditPart(getModelChildren().get(index));
+		} else {
+			selectEditPart(getModelChildren().get(size-1));
+		}
+	}
+	
+	public TrayCategoryEditPart() {
+		super();
+	}
+
+	@Override
+	protected TrayContainerFigure createMainFigure() {
+		return new TrayContainerFigure() {
+			@Override
+			protected void paintBorder(Graphics graphics) {
+				graphics.setForegroundColor(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_DARK_SHADOW));
+				Rectangle area = getClientArea().getCopy();
+				area.height--;
+				graphics.drawLine(area.getTopLeft(), area.getTopRight());
+			}
+		};
+	}
+	
+	@Override
+	protected IFigure createTitleFigure() {
+		return titleFigure = new TitleFigure();
+	}
+	
+	/**
+	 * As part of our layout, the entries and the category should have
+	 * the same x-coordinate for their texts. This is the figure used
+	 * by the entries to calculate the position of their text.
+	 */
+	public IFigure getLabelPositionReference() {
+		return ((TitleFigure)getTitleFigure()).getTextLabel();
+	}
+	
+	@Override
+	protected void createEditPolicies() {
+		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new TrayCategoryEntrySelectionEditPolicy());
+	}
+
+	/**
+	 * Subclasses need to provide a creation factory for the category entry creation.
+	 */
+	protected abstract CreationFactory getCreationFactory();
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.gef.EditPart#getDragTracker(org.eclipse.gef.Request)
+	 */
+	@Override
+	public DragTracker getDragTracker(Request request) {
+		return new SelectEditPartTracker(this);
+	}
+	
+	@Override
+	public Label getDirectEditLabel() {
+		return null;
+	}
+	
+	/**
+	 * Return the label to be used as the tooltip for the Add button.
+	 * Subclasses may override.
+	 */
+	protected IFigure getAddToolTip() {
+	    return new Label("Add");
+	}
+	
+	/**
+	 * Return the label to be used as the tooltip for the Add button.
+	 * Subclasses may override.
+	 */
+	protected IFigure getRemoveToolTip() {
+	    return new Label("Remove");
+	}	
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayCategoryEntryEditPart.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayCategoryEntryEditPart.java
new file mode 100644
index 0000000..b3abbc5
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayCategoryEntryEditPart.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import org.eclipse.bpel.common.ui.decorator.EditPartMarkerDecorator;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.Handle;
+
+
+/**
+ * An entry in a Tray category.
+ */
+public abstract class TrayCategoryEntryEditPart extends TrayEditPart {
+
+	protected class TrayCategoryEntrySelectionEditPolicy extends TraySelectionEditPolicy {
+		@Override
+		protected Handle createHandle(GraphicalEditPart owner) {
+			return new TraySelectionHandle(owner, entryFigure);
+		}
+	}
+	
+	protected EditPartMarkerDecorator decorator;
+	protected TrayCategoryEntryFigure entryFigure;
+	
+	/**
+	 * Return a brand new shiny TrayCategoryEntryEditPart 
+	 */
+	
+	public TrayCategoryEntryEditPart() {
+		super();
+	}
+
+	@Override
+	protected IFigure createFigure() {
+		IFigure reference = ((TrayCategoryEditPart)getParent()).getLabelPositionReference();
+		entryFigure = new TrayCategoryEntryFigure(reference, this);
+		entryFigure.setText(getLabelProvider().getText(getModel()));
+		decorator = createEditPartMarkerDecorator ();
+		return decorator.createFigure(entryFigure);
+	}
+	
+	protected EditPartMarkerDecorator createEditPartMarkerDecorator ( ) {
+		return new TrayMarkerDecorator((EObject)getModel(), new ToolbarLayout()); 
+	}
+	
+	@Override
+	protected void refreshVisuals() {
+		super.refreshVisuals();
+		entryFigure.setText(getLabelProvider().getText(getModel()));
+		decorator.refresh();
+	}
+	
+	@Override
+	protected void createEditPolicies() {
+		// Show selection handles
+		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new TrayCategoryEntrySelectionEditPolicy());
+	}
+
+	/**
+	 * @see org.eclipse.bpel.common.ui.tray.TrayEditPart#getDirectEditLabel()
+	 */
+	@Override
+	public Label getDirectEditLabel() {
+		return entryFigure.getLabel();
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayCategoryEntryEditPartDirectEditManager.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayCategoryEntryEditPartDirectEditManager.java
new file mode 100644
index 0000000..2510624
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayCategoryEntryEditPartDirectEditManager.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.tools.CellEditorLocator;
+import org.eclipse.gef.tools.DirectEditManager;
+import org.eclipse.swt.widgets.Text;
+
+
+public class TrayCategoryEntryEditPartDirectEditManager extends DirectEditManager {
+
+	public TrayCategoryEntryEditPartDirectEditManager(GraphicalEditPart source, Class editorType, CellEditorLocator locator) {
+		super(source, editorType, locator);
+	}
+
+	@Override
+	protected void initCellEditor() {
+		Text text = (Text) getCellEditor().getControl();
+		TrayEditPart part = (TrayEditPart) getEditPart();
+		String initialLabelText = part.getDirectEditLabel().getText();
+		getCellEditor().setValue(initialLabelText);
+		text.selectAll();
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayCategoryEntryFigure.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayCategoryEntryFigure.java
new file mode 100644
index 0000000..b76a95e
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayCategoryEntryFigure.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import java.util.List;
+
+import org.eclipse.bpel.common.ui.CommonUIPlugin;
+import org.eclipse.bpel.common.ui.details.IDetailsColors;
+import org.eclipse.draw2d.AbstractLayout;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Insets;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.swt.graphics.Color;
+
+
+
+public class TrayCategoryEntryFigure extends SelectionBorderFigure {
+
+	public static final int BORDER = 3;
+	
+	/**
+	 * Used to align the text of this entry with the text on the categories.
+	 */
+	protected class EntryLayout extends AbstractLayout {
+		public void layout(IFigure container) {
+			List elements = container.getChildren();
+			Label text = (Label)elements.get(0);
+			Rectangle containerBounds = container.getBounds();
+			Rectangle constraint = getCategoryTitleLabelBounds();
+			int width = containerBounds.width - constraint.x;
+			text.setBounds(new Rectangle(constraint.x, containerBounds.y, width, containerBounds.height));
+		}
+		@Override
+		protected Dimension calculatePreferredSize(IFigure container, int wHint, int hHint) {
+			// use the minimum width and the preferred height plus some spacing
+			Dimension result = new Dimension();
+			result.width = nameLabel.getMinimumSize(wHint, hHint).width;
+			result.height = nameLabel.getPreferredSize(wHint, hHint).height;
+			result.height += (BORDER * 2);
+			return result;
+		}
+	}
+
+	protected Label nameLabel;
+	protected IFigure labelPositionReference;
+	protected TrayCategoryEntryEditPart part;
+	
+	public TrayCategoryEntryFigure(IFigure labelPositionReference, TrayCategoryEntryEditPart part) {
+		super();
+		this.labelPositionReference = labelPositionReference;
+		this.part = part;
+		setLayoutManager(new EntryLayout());
+		setBorder(new MarginBorder(BORDER) {
+			@Override
+			public void paint(IFigure figure, Graphics graphics, Insets in) {
+				Rectangle rect = figure.getBounds().getCopy();
+				Color color = CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_LIGHT_BACKGROUND);
+				graphics.setForegroundColor(color);
+				graphics.drawLine(rect.x, rect.y + rect.height - 1, rect.x + rect.width, rect.y + rect.height - 1);
+			}
+		});
+		nameLabel = new Label();
+		nameLabel.setLabelAlignment(PositionConstants.LEFT);
+		add(nameLabel);
+	}
+
+	public void setText(String text) {
+		nameLabel.setText(text);
+	}
+	
+	public String getText() {
+		return nameLabel.getText();
+	}
+	
+	protected Rectangle getCategoryTitleLabelBounds() {
+		return labelPositionReference.getBounds();
+	}
+
+	public Label getLabel() {
+		return nameLabel;
+	}
+	
+	public TrayCategoryEntryEditPart getEditPart() {
+		return part;
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayComposite.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayComposite.java
new file mode 100644
index 0000000..512738c
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayComposite.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+
+public class TrayComposite extends SashForm {
+	
+	private static final int DEFAULT_TRAY_WIDTH = 92;
+
+	public static final int EVENT_COLLAPSED_STATE_CHANGED = 9999999;
+	public static final int STATE_EXPANDED = 1;
+	public static final int STATE_COLLAPSED = 2;
+	
+	public int marginHeight = 0;
+	public int marginWidth = 0;
+
+	protected Composite editorControl;
+	protected TraySash sashControl;
+	protected Control trayControl;
+	protected int trayState;
+	protected int trayWidth;
+	
+	public class ResizeListener extends MouseAdapter implements MouseMoveListener {
+		protected boolean dragging = false;
+		protected boolean correctState = false;
+		protected int origX;
+		
+		@Override
+		public void mouseDown(MouseEvent me) {
+			if (me.button != 1)
+				return;
+			dragging = true;
+			correctState = isInState(STATE_EXPANDED);
+			origX = me.x;
+		}
+		public void mouseMove(MouseEvent me) {
+			if (dragging && correctState) {
+				int shiftAmount = me.x - origX;
+				int newWidth = trayWidth - shiftAmount;
+				Point minSize = trayControl.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+				Point maxSize = TrayComposite.this.getSize();
+				if (newWidth >= minSize.x && newWidth <= (maxSize.x / 2)) {
+					setTrayWidth(newWidth);
+				}
+			}
+		}
+		@Override
+		public void mouseUp(MouseEvent me) {
+			dragging = false;
+			correctState = false;
+		}
+	}
+	
+	/**
+	 * @param parent
+	 * @param style
+	 */
+	public TrayComposite(Composite parent, int style) {
+		super(parent, style | SWT.HORIZONTAL);
+		
+		editorControl = new Composite(this, SWT.NONE);
+		editorControl.setLayout(new FillLayout());
+
+		sashControl = new TraySash(this, this, SWT.VERTICAL);
+		
+		setState(STATE_COLLAPSED);
+		setTrayWidth(DEFAULT_TRAY_WIDTH);
+		
+		addListener(SWT.Resize, new Listener() {
+			public void handleEvent(Event event) {
+				layout();
+			}
+		});
+	}
+	
+	public Composite getEditorComposite() {
+		return editorControl;
+	}
+	
+	/**
+	 * set the tray composite
+	 * @param trayControl
+	 */
+	public void setTrayControl(Control trayControl) {
+		Assert.isTrue(trayControl.getParent() == this);
+		this.trayControl = trayControl;
+	}
+		
+	protected boolean isInState(int state) {
+		return (trayState & state) != 0;
+	}
+	
+	/**
+	 * Sets the tray state to either STATE_EXPANDED or STATE_COLLAPSED.
+	 */
+	public void setState(int trayState) {
+		if (this.trayState != trayState) {
+			this.trayState = trayState;
+			
+			Event event = new Event();
+			event.type = EVENT_COLLAPSED_STATE_CHANGED;
+			notifyListeners(EVENT_COLLAPSED_STATE_CHANGED, event);
+
+			layout();
+		}
+	}
+	
+	public void setTrayWidth(int width) {
+		if (trayWidth != width) {
+			trayWidth = width;
+			layout();
+		}
+	}
+
+	@Override
+	public void layout(boolean changed) {
+		if (editorControl == null || editorControl.isDisposed() || trayControl == null || trayControl.isDisposed())
+			return;
+	 	
+		Rectangle area = getClientArea();
+		if (area.width == 0 || area.height == 0)
+			return;
+		
+		setRedraw(false);
+		
+		if (isInState(STATE_COLLAPSED)) {
+			int titleWidth = sashControl.computeSize(-1, -1).x;			
+			editorControl.setBounds(area.x, area.y, area.width - titleWidth, area.height);
+			sashControl.setBounds(area.x + area.width - titleWidth, area.y, titleWidth, area.height);
+			trayControl.setVisible(false);
+			
+		} else if (isInState(STATE_EXPANDED)) {
+			int titleWidth = sashControl.computeSize(-1, -1).x;			
+			if (changed) {
+				int editorWeight = area.width - titleWidth - trayWidth;
+				int sashWeight = titleWidth >= 0 ? titleWidth : 0;
+				int trayWeight = trayWidth >= 0 ? trayWidth : 0;
+				
+				if (editorWeight < 0) {
+					editorWeight = 0;
+				}
+				
+				setWeights(new int[] {editorWeight, sashWeight, trayWeight});
+			}
+			editorControl.setBounds(area.x, area.y, area.width - titleWidth - trayWidth, area.height);
+			sashControl.setBounds(area.x + area.width - titleWidth - trayWidth, area.y, titleWidth, area.height);
+			trayControl.setBounds(area.x + area.width - trayWidth, area.y, trayWidth, area.height);
+			trayControl.setVisible(true);
+		}
+		
+		sashControl.layout(true);
+		
+		setRedraw(true);
+		update();
+	}
+	
+	/* (non-Javadoc)
+     * @see org.eclipse.swt.widgets.Scrollable#getClientArea()
+     */
+    @Override
+	public Rectangle getClientArea() {
+        Rectangle rect = super.getClientArea();
+        rect.x += marginWidth;
+        rect.y += marginHeight;
+        rect.width -= marginWidth * 2;
+        rect.height -= marginHeight * 2;
+        return rect;
+    }
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayContainerEditPart.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayContainerEditPart.java
new file mode 100644
index 0000000..5dc18cd
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayContainerEditPart.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import org.eclipse.bpel.common.ui.CommonUIPlugin;
+import org.eclipse.bpel.common.ui.details.IDetailsColors;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.commands.CommandStack;
+import org.eclipse.jface.viewers.StructuredSelection;
+
+
+/**
+ * The container edit part to be used by the Tray editor.
+ */
+public abstract class TrayContainerEditPart extends TrayEditPart {
+
+	protected class TrayContainerFigure extends Figure {
+		protected IFigure titleFigure;
+		protected IFigure childrenFigure;
+		public TrayContainerFigure() {
+			super();
+			setLayoutManager(new ToolbarLayout());
+			setOpaque(true);
+			setBackgroundColor(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_TRAY_BACKGROUND));
+		}
+		public IFigure getChildrenFigure() {
+			return childrenFigure;
+		}
+		public void setChildrenFigure(IFigure target) {
+			if (childrenFigure != null) {
+				remove(childrenFigure);
+			}
+			childrenFigure = target;
+			add(target);
+		}
+		public IFigure getTitleFigure() {
+			return titleFigure;
+		}
+		public void setTitleFigure(IFigure target) {
+			if (titleFigure != null) {
+				remove(titleFigure);
+			}
+			titleFigure = target;
+			add(target);
+		}
+	}
+	
+	protected TrayContainerFigure mainFigure;
+	
+	public TrayContainerEditPart() {
+		super();
+	}
+
+	@Override
+	protected IFigure createFigure() {
+		mainFigure = createMainFigure();
+		mainFigure.setTitleFigure(createTitleFigure());
+		mainFigure.setChildrenFigure(createChildrenFigure());
+		return mainFigure;
+	}
+	
+	protected TrayContainerFigure createMainFigure() {
+		return new TrayContainerFigure();
+	}
+	
+	protected IFigure createTitleFigure() {
+		return new Figure();
+	}
+	
+	protected IFigure createChildrenFigure() {
+		Figure result = new Figure();
+		result.setLayoutManager(new ToolbarLayout());
+		return result;
+	}
+	
+	/**
+	 * Selects the EditPart that represents the given model object.
+	 */
+	protected EditPart selectEditPart(Object model) {
+		EditPart editPart = (EditPart)getViewer().getEditPartRegistry().get(model);
+		if (editPart != null) {
+			getViewer().setSelection(new StructuredSelection(editPart));
+		}
+		return editPart;
+	}
+	
+	protected CommandStack getCommandStack() {
+		return getViewer().getEditDomain().getCommandStack();
+	}
+	
+	public IFigure getTitleFigure() {
+		return mainFigure.getTitleFigure();
+	}
+	
+	// where children will be added
+	@Override
+	public IFigure getContentPane() {
+		return mainFigure.getChildrenFigure();
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayEditPart.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayEditPart.java
new file mode 100644
index 0000000..c553e67
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayEditPart.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gef.AccessibleEditPart;
+import org.eclipse.gef.DragTracker;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.gef.requests.DirectEditRequest;
+import org.eclipse.gef.tools.CellEditorLocator;
+import org.eclipse.gef.tools.DirectEditManager;
+import org.eclipse.gef.tools.SelectEditPartTracker;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * An edit part for the Tray framework.
+ */
+public abstract class TrayEditPart extends AbstractGraphicalEditPart {
+
+	protected Adapter adapter;
+	protected ILabelProvider labelProvider;
+	protected DirectEditManager directEditManager;
+	protected AccessibleEditPart acc;
+
+	public TrayEditPart() {
+		super();
+		adapter = createAdapter();
+	}
+	
+	protected Adapter createAdapter() {
+		return new Adapter() {
+			public void notifyChanged(Notification notification) {
+				refresh();
+			}
+			public Notifier getTarget() {return null;}
+			public void setTarget(Notifier newTarget) {}
+			public boolean isAdapterForType(Object type) {return false;}
+		};
+	}
+
+	@Override
+	public void activate() {
+		super.activate();
+		EObject modelObject = (EObject)getModel();
+		modelObject.eAdapters().add(adapter);
+	}
+
+	@Override
+	public void deactivate() {
+		super.deactivate();
+		EObject modelObject = (EObject)getModel();
+		modelObject.eAdapters().remove(adapter);
+	}
+
+	/**
+	 * Provides the label and text for the edit part.
+	 */
+	public void setLabelProvider(ILabelProvider labelProvider) {
+		this.labelProvider = labelProvider;
+	}
+
+	public ILabelProvider getLabelProvider() {
+		return labelProvider;
+	}
+
+	/**
+	 * Overwrite the default behaviour since these edit parts
+	 * should not move.
+	 */
+	@Override
+	public DragTracker getDragTracker(Request request) {
+		return new SelectEditPartTracker(this);
+	}
+
+	/**
+	 * Override to handle direct edit requests
+	 */
+	@Override
+	public void performRequest(Request request) {
+		if (request.getType() == RequestConstants.REQ_DIRECT_EDIT) {
+			performDirectEdit((DirectEditRequest)request);
+		} else {
+			super.performRequest(request);
+		}
+	}
+
+	protected void performDirectEdit(DirectEditRequest request) {
+		// check if we support direct edit
+		if (getEditPolicy(EditPolicy.DIRECT_EDIT_ROLE) == null) return; // there is nothing to be done
+		
+		if(directEditManager == null) {
+			directEditManager = new TrayCategoryEntryEditPartDirectEditManager(this, 
+					TextCellEditor.class, new CellEditorLocator() {
+						public void relocate(CellEditor celleditor) {
+							Text text = (Text) celleditor.getControl();
+							Point sel = text.getSelection();
+							Point pref = text.computeSize(-1, -1);
+							Label label = getDirectEditLabel();
+							Rectangle rect = label.getTextBounds().getCopy();
+							label.translateToAbsolute(rect);
+							text.setBounds(rect.x - 4, rect.y - 1, Math.min(pref.x + 1, text.getParent().getSize().x - 20), pref.y + 1);
+							text.setSelection(0);
+							text.setSelection(sel);
+						}
+					});
+		}
+		directEditManager.show();
+	}
+	
+	/**
+	 * Returns the Label to be used for direct edit.
+	 */
+	public abstract Label getDirectEditLabel();
+
+	@Override
+	protected AccessibleEditPart getAccessibleEditPart() {
+		if (acc == null) acc = createAccessible();
+		return acc;
+	}
+	
+	protected AccessibleEditPart createAccessible() {
+		return new TrayAccessibleEditPart(this);
+	}
+
+	@Override
+	public Object getAdapter(Class key) {
+		if (key == AccessibleEditPart.class) {
+			return getAccessibleEditPart();
+		}
+		return super.getAdapter(key);
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayKeyHandler.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayKeyHandler.java
new file mode 100644
index 0000000..0d756d6
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayKeyHandler.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.ScrollBar;
+import org.eclipse.draw2d.ScrollPane;
+import org.eclipse.draw2d.Viewport;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.KeyHandler;
+import org.eclipse.gef.requests.DirectEditRequest;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+
+
+public class TrayKeyHandler extends KeyHandler {
+
+	protected EditPartViewer viewer;
+	
+	public TrayKeyHandler(EditPartViewer viewer) {
+		this.viewer = viewer;
+	}
+	
+	@Override
+	public boolean keyPressed(KeyEvent event) {
+		switch (event.keyCode) {
+			case SWT.ARROW_UP:
+				return navigateNext(event, PositionConstants.NORTH);
+			case SWT.ARROW_DOWN:
+				return navigateNext(event, PositionConstants.SOUTH);
+			case SWT.HOME:
+				return navigateJump(event, PositionConstants.TOP);
+			case SWT.END:
+				return navigateJump(event, PositionConstants.BOTTOM);
+			case SWT.PAGE_DOWN:
+				return navigateJump(event, PositionConstants.SOUTH);
+			case SWT.PAGE_UP:
+				return navigateJump(event, PositionConstants.NORTH);
+			case SWT.F2:
+				return activateDirectEdit(event);
+		}
+		// default
+		return super.keyPressed(event);
+	}
+	
+	protected boolean navigateNext(KeyEvent event, int direction) {
+		GraphicalEditPart currentPart = (GraphicalEditPart)viewer.getFocusEditPart();
+		
+		// TODO: we should cache this list
+		List flatList = new ArrayList();
+		buildFlatList(flatList, viewer.getContents());
+		
+		int currentPosition = flatList.indexOf(currentPart);
+		switch (direction) {
+			case PositionConstants.NORTH:
+				currentPosition--;
+				break;
+			case PositionConstants.SOUTH:
+				currentPosition++;
+				break;
+		}
+		if (currentPosition >= 0 && currentPosition < flatList.size()) {
+			currentPart = (GraphicalEditPart) flatList.get(currentPosition);
+			navigateTo(currentPart, event);
+			return true;
+		}
+		return false;
+	}
+	
+	protected void buildFlatList(List result, EditPart container) {
+		result.add(container);
+		for (Iterator iter = container.getChildren().iterator(); iter.hasNext();) {
+			EditPart part = (EditPart) iter.next();
+			buildFlatList(result, part);
+		}
+	}
+
+	protected boolean navigateJump(KeyEvent event, int direction) {
+		return true;
+	}
+
+	protected void navigateTo(GraphicalEditPart part, KeyEvent event) {
+		if (part == null) return;
+		if ((event.stateMask & SWT.SHIFT) != 0) {
+			viewer.appendSelection(part);
+			viewer.setFocus(part);
+		} else if ((event.stateMask & SWT.CONTROL) != 0) {
+			viewer.setFocus(part);
+		} else {
+			viewer.select(part);
+		}
+		reveal(part);
+	}
+	
+	protected void reveal(GraphicalEditPart part) {
+		// there's no need to scroll to the main edit part because it is always visible
+		if (part instanceof MainTrayEditPart) return;
+
+		MainTrayEditPart mainPart = getMainTrayEditPart(part);
+		ScrollPane scrollpane = ((MainTrayEditPart.MainTrayContainerFigure)mainPart.getFigure()).getChildrenScrollPane();
+		Viewport viewport = scrollpane.getViewport();
+		Rectangle partBounds = part.getFigure().getBounds().getCopy();
+		Rectangle portBounds = viewport.getBounds();
+		if (!portBounds.contains(partBounds)) {
+			Point topLocation = partBounds.getTopLeft();
+			
+			Point currentLocation = viewport.getViewLocation();
+			int step = getScrollStep(part);
+			if (currentLocation.getPosition(topLocation) == PositionConstants.NORTH) {
+				currentLocation.y -= step;
+				// ensure that we don't leave things "half-scrolled" at the top
+				currentLocation.y = (currentLocation.y < step) ? 0 : currentLocation.y;
+			} else {
+				currentLocation.y += step;
+			}
+			viewport.setViewLocation(currentLocation);
+
+			// refreshes the scrollbar so they can disppear if needed 
+			ScrollBar scrollbar = scrollpane.getVerticalScrollBar();
+			scrollbar.invalidate();
+			scrollbar.validate();
+		}
+	}
+	
+	protected int getScrollStep(GraphicalEditPart part) {
+		if (part instanceof TrayCategoryEntryEditPart) {
+			return part.getFigure().getBounds().height;
+		}
+		if (part instanceof TrayCategoryEditPart) {
+			return ((TrayCategoryEditPart)part).getTitleFigure().getBounds().height;
+		}
+		return 0;
+	}
+	
+	protected MainTrayEditPart getMainTrayEditPart(EditPart part) {
+		if (part instanceof MainTrayEditPart) return (MainTrayEditPart)part;
+		return getMainTrayEditPart(part.getParent());
+	}
+	
+	protected boolean activateDirectEdit(KeyEvent event) {
+		GraphicalEditPart currentPart = (GraphicalEditPart)viewer.getFocusEditPart();
+		currentPart.performRequest(new DirectEditRequest());
+		return true;
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayMarkerDecorator.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayMarkerDecorator.java
new file mode 100644
index 0000000..14cad2d
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayMarkerDecorator.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import java.util.List;
+
+import org.eclipse.bpel.common.ui.decorator.EditPartMarkerDecorator;
+import org.eclipse.bpel.common.ui.decorator.IMarkerConstants;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.draw2d.AbstractLayout;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gef.handles.HandleBounds;
+
+/**
+ * An EditPart marker decorator for TrayCategoryEntryEditPart.
+ */
+public class TrayMarkerDecorator extends EditPartMarkerDecorator {
+
+	/**
+	 * Figure that holds the decoration layer. This figure is necessary in order
+	 * to get selection handles in the correct place.
+	 */
+
+	protected class DecoratorHolderFigure extends Figure implements
+			HandleBounds {
+		protected HandleBounds handleBoundsReference;
+
+		/**
+		 * Brand new shiny DecoratorHolderFigure.
+		 * 
+		 * @param boundsReference
+		 */
+		public DecoratorHolderFigure (HandleBounds boundsReference) {
+			super();
+			this.handleBoundsReference = boundsReference;
+			setLayoutManager(new ToolbarLayout());
+		}
+
+		/**
+		 * @see org.eclipse.gef.handles.HandleBounds#getHandleBounds()
+		 */
+		public Rectangle getHandleBounds() {
+			return handleBoundsReference.getHandleBounds();
+		}
+	}
+
+	/**
+	 * Brand new shiny TrayMarkerDecorator with the model object given.
+	 * 
+	 * @param aModelObject
+	 *            the model object.
+	 */
+	public TrayMarkerDecorator(EObject aModelObject) {
+		super(aModelObject);
+	}
+
+	/**
+	 * Brand new shiny TrayMarkerDecorator with a list of model objects.
+	 * 
+	 * @param aListOfModelObjects
+	 *            the model object list.
+	 */
+
+	public TrayMarkerDecorator(List<EObject> aListOfModelObjects) {
+		super(aListOfModelObjects);
+	}
+
+	/**
+	 * Brand new shiny TrayMarkerDecorator with a model object and a layout.
+	 * 
+	 * @param aModelObject
+	 * @param aLayout
+	 *            the layout to use.
+	 */
+
+	public TrayMarkerDecorator(EObject aModelObject, AbstractLayout aLayout) {
+		super(aModelObject, aLayout);
+	}
+
+	/**
+	 * Brand new shiny TrayMarkerDecorator with a list of model objects and a
+	 * layout.
+	 * 
+	 * @param aListOfModelObjects
+	 *            the list of model objects
+	 * @param aLayout
+	 *            the layout to use.
+	 */
+	public TrayMarkerDecorator(List<EObject> aListOfModelObjects,
+			AbstractLayout aLayout) {
+		super(aListOfModelObjects, aLayout);
+	}
+
+	/**
+	 * @see org.eclipse.bpel.common.ui.decorator.EditPartMarkerDecorator#createFigure(org.eclipse.draw2d.IFigure)
+	 */
+	@Override
+	public IFigure createFigure(IFigure figure) {
+		IFigure layers = super.createFigure(figure);
+		if (figure instanceof HandleBounds) {
+			IFigure result = new DecoratorHolderFigure((HandleBounds) figure);
+			result.add(layers);
+			return result;
+		}
+		return layers;
+	}
+
+	@Override
+	protected Object getConstraint(IMarker marker) {
+		try {
+			// problem markers are always placed in the top left
+			if (marker.isSubtypeOf(IMarker.PROBLEM)) {
+				return IMarkerConstants.BOTTOM_LEFT;
+			}
+		} catch (CoreException e) {
+			// Just ignore exceptions getting marker info.
+			// It is possible that the marker no longer exists.
+			// Eventually the UI will be notified that the
+			// marker is removed and it will update.
+		}
+		return super.getConstraint(marker);
+	}
+
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TraySash.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TraySash.java
new file mode 100644
index 0000000..341fcaf
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TraySash.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import org.eclipse.bpel.common.ui.CommonUIPlugin;
+import org.eclipse.bpel.common.ui.ICommonUIConstants;
+import org.eclipse.bpel.common.ui.details.IDetailsColors;
+import org.eclipse.draw2d.ActionEvent;
+import org.eclipse.draw2d.ActionListener;
+import org.eclipse.draw2d.Button;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Cursors;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.ImageFigure;
+import org.eclipse.draw2d.LightweightSystem;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseTrackAdapter;
+import org.eclipse.swt.events.MouseTrackListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+
+
+
+public class TraySash extends Composite {
+
+	protected static final Image ARROW_LEFT = CommonUIPlugin.getDefault().getImageRegistry().get(ICommonUIConstants.ICON_KEY_TRAY_EXPAND_BUTTON);
+	protected static final Image ARROW_RIGHT = CommonUIPlugin.getDefault().getImageRegistry().get(ICommonUIConstants.ICON_KEY_TRAY_COLLAPSE_BUTTON);
+
+	protected static final Point TEXTURE_SIZE = new Point(15, 50);
+	protected static final int TEXTURE_SPACING = 4;
+
+	protected class TrayTextureCanvas extends Canvas {
+		protected final int MAX_ROWS = (TEXTURE_SIZE.y / TEXTURE_SPACING);
+		protected final int MAX_COLUMNS = 2;
+		public TrayTextureCanvas(Composite parent, int style) {
+			super(parent, SWT.NO_REDRAW_RESIZE | style);
+			setBackground(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_LIGHT_BACKGROUND));
+
+			addPaintListener(new PaintListener() {
+				public void paintControl(PaintEvent e) {
+					int y;
+					int height = getBounds().height;
+					int textureHeight = MAX_ROWS * TEXTURE_SPACING;
+					int availableHeight = height - textureHeight;
+					int imageHeight = 66;
+					if (isTop()) {
+						y = Math.min(0, (availableHeight - imageHeight));
+					} else {
+						y = Math.max(textureHeight, (height - imageHeight));
+					}
+					// paint texture background
+					e.gc.setBackground(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_LIGHT_BACKGROUND));
+					if (isTop()) {
+						e.gc.fillRectangle(0, (y + imageHeight), getBounds().width, getBounds().height);
+					} else {
+						e.gc.fillRectangle(0, 0, getBounds().width, y);
+					}
+					// paint texture
+					y = 0;
+					if (isTop()) {
+						y = getBounds().height;
+					}
+					for(int i = 0; i < MAX_ROWS; i++) {
+						int x = (TEXTURE_SIZE.x - ((TEXTURE_SPACING-1) * MAX_COLUMNS)) / 2;
+						for(int j = 0; j < MAX_COLUMNS; j++) {
+							e.gc.setForeground(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_DARK_SHADOW));
+							e.gc.drawLine(x, y, x, y+1);
+							e.gc.setForeground(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_CANVAS));
+							e.gc.drawLine(x+1, y, x+1, y+1);
+							x += TEXTURE_SPACING;
+						}
+						if (isTop()) {
+							y -= TEXTURE_SPACING;
+						} else {
+							y += TEXTURE_SPACING;
+						}
+					}
+				}
+				protected boolean isTop() {
+					return (getStyle() & SWT.TOP) != 0;
+				}
+			});
+		}
+		@Override
+		public Point computeSize(int wHint, int hHint, boolean changed) {
+			return TEXTURE_SIZE;
+		}
+	}
+
+	protected class TrayButtonCanvas extends Canvas {
+
+		protected class TrayArrowButton extends Button {
+			public TrayArrowButton() {
+				super(getButtonImage());
+				setBorder(null);
+				setRolloverEnabled(true);
+				addActionListener(new ActionListener() {
+					public void actionPerformed(ActionEvent event) {
+						if (trayComposite.isInState(TrayComposite.STATE_COLLAPSED)) {
+							trayComposite.setState(TrayComposite.STATE_EXPANDED);
+						} else {
+							trayComposite.setState(TrayComposite.STATE_COLLAPSED);
+						}
+					}
+				});
+				trayComposite.addListener(TrayComposite.EVENT_COLLAPSED_STATE_CHANGED, new Listener() {
+					public void handleEvent(Event event) {
+						setContents(new ImageFigure(getButtonImage()));
+					}
+				});
+			}
+			@Override
+			protected void paintBorder(Graphics graphics) {
+				if (hasFocus()) {
+					graphics.setForegroundColor(ColorConstants.black);
+					graphics.setBackgroundColor(ColorConstants.white);
+
+					org.eclipse.draw2d.geometry.Rectangle area = getClientArea();
+					graphics.drawFocus(area.x, area.y, area.width - 1, area.height - 1);
+				}
+			}
+		}
+		
+		protected LightweightSystem lws;
+		public TrayButtonCanvas(Composite parent) {
+			super(parent, SWT.NO_REDRAW_RESIZE);
+			setCursor(Cursors.ARROW);
+			lws = new LightweightSystem();
+			lws.setControl(this);
+			lws.setContents(new TrayArrowButton());
+		}
+		@Override
+		public Point computeSize(int wHint, int hHint, boolean changed) {
+			Dimension size = lws.getRootFigure().getPreferredSize(wHint, hHint);
+			size.union(new Dimension(wHint, hHint));
+			return new Point(size.width, size.height * 2);
+		}
+		private Image getButtonImage() {
+			return trayComposite.isInState(TrayComposite.STATE_COLLAPSED) ?  ARROW_LEFT : ARROW_RIGHT;
+		}
+	}
+	
+	protected TrayComposite trayComposite;
+	
+	public TraySash(TrayComposite composite, Composite parent, int style) {
+		super(parent, SWT.NONE);
+		this.trayComposite = composite;
+		setBackground(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_TRAY_BACKGROUND));
+		
+		GridLayout layout = new GridLayout(1, false);
+		layout.marginWidth = 3;
+		layout.marginHeight = 0;
+		layout.horizontalSpacing = 0;
+		layout.verticalSpacing = 0;
+		setLayout(layout);
+
+		Control topTexture = new TrayTextureCanvas(this, SWT.TOP);
+		Control button = new TrayButtonCanvas(this);
+		Control bottomTexture = new TrayTextureCanvas(this, SWT.BOTTOM);
+
+		topTexture.setLayoutData(new GridData(GridData.BEGINNING | GridData.FILL_BOTH));
+		button.setLayoutData(new GridData(GridData.CENTER | GridData.FILL_HORIZONTAL));
+		bottomTexture.setLayoutData(new GridData(GridData.END | GridData.FILL_BOTH));
+
+		// add listeners
+		MouseTrackListener listener = new MouseTrackAdapter() {
+			@Override
+			public void mouseEnter(MouseEvent e) {
+				if (TraySash.this.trayComposite.isInState(TrayComposite.STATE_EXPANDED))
+					setCursor(Cursors.SIZEWE);
+			}
+			@Override
+			public void mouseExit(MouseEvent e) {
+				if (TraySash.this.trayComposite.isInState(TrayComposite.STATE_EXPANDED))
+					setCursor(Cursors.ARROW);
+			}
+		};
+		addMouseTrackListener(listener);
+		topTexture.addMouseTrackListener(listener);
+		bottomTexture.addMouseTrackListener(listener);
+		
+		TrayComposite.ResizeListener resizeListener = trayComposite.new ResizeListener();
+		addMouseListener(resizeListener);
+		addMouseMoveListener(resizeListener);
+		topTexture.addMouseListener(resizeListener);
+		topTexture.addMouseMoveListener(resizeListener);
+		bottomTexture.addMouseListener(resizeListener);
+		bottomTexture.addMouseMoveListener(resizeListener);
+		
+		addPaintListener(new PaintListener() {
+			public void paintControl(PaintEvent e) {
+				e.gc.setForeground(CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_DARK_SHADOW));
+				e.gc.drawLine(0, 0, 0, getBounds().height);
+			}
+		});
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayScrollBar.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayScrollBar.java
new file mode 100644
index 0000000..37bfbf4
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayScrollBar.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import org.eclipse.bpel.common.ui.CommonUIPlugin;
+import org.eclipse.bpel.common.ui.details.IDetailsColors;
+import org.eclipse.draw2d.ArrowButton;
+import org.eclipse.draw2d.Button;
+import org.eclipse.draw2d.Clickable;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.RangeModel;
+import org.eclipse.draw2d.ScrollBar;
+import org.eclipse.draw2d.ScrollBarLayout;
+import org.eclipse.draw2d.TreeSearch;
+import org.eclipse.draw2d.Triangle;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Insets;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.swt.graphics.Color;
+
+
+public class TrayScrollBar extends ScrollBar {
+
+	protected static final int BUTTON_HEIGHT = 13;
+
+	public TrayScrollBar() {
+		super();
+		
+		setLayoutManager(new ScrollBarLayout(transposer) {
+			@Override
+			protected Rectangle layoutButtons(ScrollBar scrollBar) {
+				Rectangle bounds = transposer.t(scrollBar.getClientArea());
+				Dimension buttonSize = new Dimension(bounds.width, BUTTON_HEIGHT);
+				getButtonUp().setBounds(transposer.t(new Rectangle(bounds.getTopLeft(), buttonSize)));
+				Rectangle r = new Rectangle (bounds.x, bounds.bottom() - buttonSize.height, buttonSize.width, buttonSize.height);
+				getButtonDown().setBounds(transposer.t(r));
+				Rectangle trackBounds = bounds.getCropped(new Insets(buttonSize.height, 0, buttonSize.height, 0));
+				RangeModel model = scrollBar.getRangeModel();
+				getButtonUp().setVisible(model.getValue() != model.getMinimum());
+				getButtonDown().setVisible(model.getValue() != model.getMaximum() - model.getExtent());
+				return trackBounds;
+			}
+		});
+		
+		setPageUp(null);
+		setPageDown(null);
+		setThumb(null);
+		setOpaque(false);
+	}
+
+	// make it non-clickable otherwise it will block tooltips and direct edit
+	@Override
+	public IFigure findFigureAt(int x, int y, TreeSearch search) {
+		IFigure result = super.findFigureAt(x, y, search);
+		if (result != this)
+			return result;
+		return null;
+	}
+	
+	@Override
+	public boolean containsPoint(int x, int y) {
+		IFigure up = getButtonUp();
+		IFigure down = getButtonDown();
+		return (up.isVisible() && up.getBounds().contains(x, y))
+			|| (down.isVisible() && down.getBounds().contains(x, y));
+	}
+
+	@Override
+	public Dimension getPreferredSize(int wHint, int hHint) {
+		return new Dimension(wHint, hHint);
+	}
+	
+	@Override
+	protected Clickable createDefaultDownButton() {
+		return createButton();
+	}
+	
+	@Override
+	protected Clickable createDefaultUpButton() {
+		return createButton();
+	}
+	
+	protected Clickable createButton() {
+		final Color foreground = CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_DARK_SHADOW);
+		final Color background = CommonUIPlugin.getDefault().getColorRegistry().get(IDetailsColors.COLOR_TRAY_BACKGROUND);
+		Button result = new ArrowButton() {
+			@Override
+			protected void paintBorder(Graphics graphics) {
+				graphics.setForegroundColor(foreground);
+				Rectangle r = getBounds().getCopy();
+				r.shrink(0, 2);
+				r.width -= 1;
+				graphics.drawRectangle(r);
+			}
+		};
+		result.setBackgroundColor(background);
+		// sets the triangle color
+		((Triangle)result.getChildren().get(0)).setBackgroundColor(foreground);
+		return result;
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayScrollPaneLayout.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayScrollPaneLayout.java
new file mode 100644
index 0000000..ca0b31b
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TrayScrollPaneLayout.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.ScrollBar;
+import org.eclipse.draw2d.ScrollPane;
+import org.eclipse.draw2d.ScrollPaneLayout;
+import org.eclipse.draw2d.Viewport;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Insets;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+
+public class TrayScrollPaneLayout extends ScrollPaneLayout {
+
+	public TrayScrollPaneLayout() {
+		super();
+	}
+
+	@Override
+	public void layout(IFigure parent) {
+		ScrollPane scrollpane = (ScrollPane)parent;
+		Rectangle clientArea = parent.getClientArea();
+
+		ScrollBar hBar = scrollpane.getHorizontalScrollBar(),
+			    vBar = scrollpane.getVerticalScrollBar();
+		Viewport viewport = scrollpane.getViewport();
+
+		Insets insets = new Insets();
+		insets.bottom = hBar.getPreferredSize(clientArea.width, clientArea.height).height;
+		insets.right  = vBar.getPreferredSize(clientArea.width, clientArea.height).width;
+
+		int hVis = scrollpane.getHorizontalScrollBarVisibility(),
+		    vVis = scrollpane.getVerticalScrollBarVisibility();
+
+		Dimension available = clientArea.getSize(),
+			preferred =
+				viewport.getPreferredSize(available.width, available.height).getCopy();
+
+		boolean none = available.contains(preferred),
+			  both = !none && vVis != NEVER && hVis != NEVER && preferred.contains(available),
+			  showV = both || preferred.height > available.height,
+			  showH = both || preferred.width > available.width;
+
+		//Adjust for visibility override flags
+		showV = !(vVis == NEVER) && (showV || vVis == ALWAYS);
+		showH = !(hVis == NEVER) && (showH || hVis == ALWAYS);
+
+		if (!showV) insets.right = 0;
+		if (!showH) insets.bottom = 0;
+		Rectangle bounds, viewportArea = clientArea;
+
+		if (showV) {
+			bounds = new Rectangle(
+				viewportArea.right() - insets.right,
+				viewportArea.y, insets.right, viewportArea.height);
+			vBar.setBounds(bounds);
+		}
+		if (showH) {
+			bounds = new Rectangle(viewportArea.x, 
+				viewportArea.bottom() - insets.bottom,
+				viewportArea.width, insets.bottom);
+			hBar.setBounds(bounds);
+		}
+		vBar.setVisible(showV);
+		hBar.setVisible(showH);
+		viewport.setBounds(viewportArea);
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TraySelectionEditPolicy.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TraySelectionEditPolicy.java
new file mode 100644
index 0000000..83f6b95
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TraySelectionEditPolicy.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.Handle;
+import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
+
+/**
+ * Add handles to the selected edit part. We use this instead of
+ * NonResizableEditPolicy because we don't want a focus rectangle.
+ */
+public class TraySelectionEditPolicy extends NonResizableEditPolicy {
+	
+	@Override
+	protected List<Handle> createSelectionHandles() {
+		List<Handle> result = new ArrayList<Handle>();
+		GraphicalEditPart owner = (GraphicalEditPart)getHost();
+		result.add(createHandle(owner));
+		return result;
+	}
+	
+	protected Handle createHandle(GraphicalEditPart owner) {
+		return new TraySelectionHandle(owner, (SelectionBorderFigure)owner.getFigure());
+	}
+}
diff --git a/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TraySelectionHandle.java b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TraySelectionHandle.java
new file mode 100644
index 0000000..2715ba3
--- /dev/null
+++ b/plugins/org.eclipse.bpel.common.ui.noEmbeddedEditors/src/org/eclipse/bpel/common/ui/tray/TraySelectionHandle.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * 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.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpel.common.ui.tray;
+
+import org.eclipse.draw2d.AncestorListener;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Locator;
+import org.eclipse.draw2d.TreeSearch;
+import org.eclipse.gef.DragTracker;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.handles.AbstractHandle;
+
+/**
+ * This figure does not draw the selection handle. It is only used to
+ * control when the selection border should be drawn or not.
+ */
+public class TraySelectionHandle extends AbstractHandle {
+
+	protected static class TrayHandleLocator implements Locator {
+		protected IFigure reference;
+		public TrayHandleLocator(IFigure reference) {
+			this.reference = reference;
+		}
+		public void relocate(IFigure target) {
+			target.setBounds(reference.getClientArea());
+		}
+	}
+	
+	protected SelectionBorderFigure selectionBorderFigure;
+	
+	public TraySelectionHandle(GraphicalEditPart owner, SelectionBorderFigure figure) {
+		super(owner, new TrayHandleLocator(figure));
+		this.selectionBorderFigure = figure;
+		
+		// controls when the border should be painted based on the
+		// parenting of this handle figure.
+		addAncestorListener(new AncestorListener.Stub() {
+			@Override
+			public void ancestorAdded(IFigure ancestor) {
+				selectionBorderFigure.setPaintSelectionBorder(true);
+				selectionBorderFigure.repaint();
+			}
+			@Override
+			public void ancestorRemoved(IFigure ancestor) {
+				selectionBorderFigure.setPaintSelectionBorder(false);
+				selectionBorderFigure.repaint();
+			}
+		});
+	}
+
+	/**
+	 * The painting is done by the SelectionBorderFigure
+	 * and not the selection handle.
+	 */
+	@Override
+	public void paint(Graphics g) {
+		// the painting is done by the SelectionBorderFigure
+	}
+
+	@Override
+	protected DragTracker createDragTracker() {
+		return null; // not needed
+	}
+
+	// make it non-clickable otherwise it will block tooltips and direct edit
+	@Override
+	public IFigure findFigureAt(int x, int y, TreeSearch search) {
+		IFigure result = super.findFigureAt(x, y, search);
+		if (result != this)
+			return result;
+		return null;
+	}
+	
+	// get the buttons from the figure that the handle encloses, not from the handle itself
+	@Override
+	public IFigure findMouseEventTargetAt(int x, int y) {
+		return selectionBorderFigure.findMouseEventTargetAt(x, y);
+	}
+	
+}
diff --git a/plugins/org.eclipse.bpel.examples.extensionPoints.noEmbeddedEditors/.classpath b/plugins/org.eclipse.bpel.examples.extensionPoints.noEmbeddedEditors/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/plugins/org.eclipse.bpel.examples.extensionPoints.noEmbeddedEditors/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.bpel.examples.extensionPoints.noEmbeddedEditors/.project b/plugins/org.eclipse.bpel.examples.extensionPoints.noEmbeddedEditors/.project
new file mode 100644
index 0000000..b1f2030
--- /dev/null
+++ b/plugins/org.eclipse.bpel.examples.extensionPoints.noEmbeddedEditors/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.bpel.examples.extensionPoints.noEmbeddedEditors</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.bpel.examples.extensionPoints.noEmbeddedEditors/META-INF/MANIFEST.MF b/plugins/org.eclipse.bpel.examples.extensionPoints.noEmbeddedEditors/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..48309d1
--- /dev/null
+++ b/plugins/org.eclipse.bpel.examples.extensionPoints.noEmbeddedEditors/META-INF/MANIFEST.MF
@@ -0,0 +1,27 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: ExtensionPoints Plug-in
+Bundle-SymbolicName: org.eclipse.bpel.examples.extensionPoints;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.bpel.examples.extensionpoints.Activator
+Bundle-Vendor: eclipse.org
+Require-Bundle: org.eclipse.ui;bundle-version="3.3.0",
+ org.eclipse.core.runtime;bundle-version="3.3.0",
+ org.eclipse.bpel.common.ui;bundle-version="0.3.0",
+ org.eclipse.gef;bundle-version="3.2.0",
+ org.eclipse.bpel.ui;bundle-version="0.3.0",
+ org.eclipse.bpel.model;bundle-version="0.3.0",
+ org.eclipse.emf.ecore;bundle-version="2.3.0",
+ javax.wsdl;bundle-version="[1.5.0,1.6.2]",
+ org.eclipse.core.resources,
+ org.eclipse.ui.views.properties.tabbed,
+ org.eclipse.ui.editors,
+ org.eclipse.jdt,
+ org.eclipse.jdt.ui,
+ org.eclipse.jface.text,
+ org.eclipse.jdt.core,
+ org.eclipse.bpel.common.model,
+ org.eclipse.wst.jsdt.core;bundle-version="1.1.1",
+ org.eclipse.wst.jsdt.ui;bundle-version="1.1.1"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.bpel.examples.ext