basic diagram capabilities (to be updated as a Sirius-based modeller
soon)
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/.classpath b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/.classpath
new file mode 100755
index 0000000..ed2bc12
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>

+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

+	<classpathentry kind="output" path="bin"/>

+</classpath>

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/.gitignore b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/.gitignore
new file mode 100644
index 0000000..ae3c172
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/.options b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/.options
new file mode 100755
index 0000000..8fa9bc9
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/.options
@@ -0,0 +1,7 @@
+# Tracing options for the org.eclipse.soa.mangrove.diagram plug-in
+
+# Common issues
+org.eclipse.soa.mangrove.diagram/debug=false
+
+# Visual IDs
+org.eclipse.soa.mangrove.diagram/debug/visualID=false
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/.project b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/.project
new file mode 100755
index 0000000..6eff61b
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<projectDescription>

+	<name>org.eclipse.soa.mangrove.diagram</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.jdt.core.javanature</nature>

+		<nature>org.eclipse.pde.PluginNature</nature>

+	</natures>

+</projectDescription>

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/META-INF/MANIFEST.MF b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..8c4abe6
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/META-INF/MANIFEST.MF
@@ -0,0 +1,41 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.soa.mangrove.diagram; singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Export-Package: org.eclipse.soa.mangrove.diagram.edit.parts, 
+ org.eclipse.soa.mangrove.diagram.part,
+ org.eclipse.soa.mangrove.diagram.providers
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.core.expressions,
+ org.eclipse.jface,
+ org.eclipse.ui.ide,
+ org.eclipse.ui.views,
+ org.eclipse.ui.navigator,
+ org.eclipse.ui.navigator.resources,
+ org.eclipse.emf.ecore,
+ org.eclipse.emf.ecore.xmi,
+ org.eclipse.emf.edit.ui,
+ org.eclipse.gmf.runtime.emf.core,
+ org.eclipse.gmf.runtime.emf.commands.core,
+ org.eclipse.gmf.runtime.emf.ui.properties,
+ org.eclipse.gmf.runtime.diagram.ui,
+ org.eclipse.gmf.runtime.diagram.ui.properties,
+ org.eclipse.gmf.runtime.diagram.ui.providers,
+ org.eclipse.gmf.runtime.diagram.ui.providers.ide,
+ org.eclipse.gmf.runtime.diagram.ui.render,
+ org.eclipse.gmf.runtime.diagram.ui.resources.editor,
+ org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide,
+ org.eclipse.gmf.tooling.runtime;visibility:=reexport,
+ org.eclipse.draw2d;visibility:=reexport,
+ org.eclipse.gmf.runtime.draw2d.ui;visibility:=reexport,
+ org.eclipse.soa.mangrove;visibility:=reexport,
+ org.eclipse.soa.mangrove.edit;visibility:=reexport,
+ org.eclipse.gef;visibility:=reexport
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/build.properties b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/build.properties
new file mode 100755
index 0000000..162d13a
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/build.properties
@@ -0,0 +1,10 @@
+bin.includes = .,\
+               icons/,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties,\
+               messages.properties,\
+               .options
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/incomingLinksNavigatorGroup.gif b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/incomingLinksNavigatorGroup.gif
new file mode 100755
index 0000000..fca9c53
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/incomingLinksNavigatorGroup.gif
Binary files differ
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/linkSourceNavigatorGroup.gif b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/linkSourceNavigatorGroup.gif
new file mode 100755
index 0000000..fca9c53
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/linkSourceNavigatorGroup.gif
Binary files differ
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/linkTargetNavigatorGroup.gif b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/linkTargetNavigatorGroup.gif
new file mode 100755
index 0000000..fca9c53
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/linkTargetNavigatorGroup.gif
Binary files differ
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/linksNavigatorGroup.gif b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/linksNavigatorGroup.gif
new file mode 100755
index 0000000..fca9c53
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/linksNavigatorGroup.gif
Binary files differ
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/obj16/ImDiagramFile.gif b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/obj16/ImDiagramFile.gif
new file mode 100755
index 0000000..4a83950
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/obj16/ImDiagramFile.gif
Binary files differ
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/outgoingLinksNavigatorGroup.gif b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/outgoingLinksNavigatorGroup.gif
new file mode 100755
index 0000000..fca9c53
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/outgoingLinksNavigatorGroup.gif
Binary files differ
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/wizban/NewImWizard.gif b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/wizban/NewImWizard.gif
new file mode 100755
index 0000000..60e58d1
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/icons/wizban/NewImWizard.gif
Binary files differ
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/messages.properties b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/messages.properties
new file mode 100755
index 0000000..71d091d
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/messages.properties
@@ -0,0 +1,96 @@
+
+# TODO: manually put keys and values
+IntermediateModelCreationWizardTitle=New IntermediateModel Diagram
+IntermediateModelCreationWizard_DiagramModelFilePageTitle=Create IntermediateModel Diagram
+IntermediateModelCreationWizard_DiagramModelFilePageDescription=Select file that will contain diagram model.
+IntermediateModelCreationWizard_DomainModelFilePageTitle=Create IntermediateModel Domain Model
+IntermediateModelCreationWizard_DomainModelFilePageDescription=Select file that will contain domain model.
+IntermediateModelCreationWizardOpenEditorError=Error opening diagram editor
+IntermediateModelCreationWizardCreationError=Creation Problems
+IntermediateModelCreationWizardPageExtensionError=File name should have {0} extension.
+IntermediateModelDiagramEditorUtil_OpenModelResourceErrorDialogTitle=Error
+IntermediateModelDiagramEditorUtil_OpenModelResourceErrorDialogMessage=Failed to load model file {0}
+IntermediateModelDiagramEditorUtil_CreateDiagramProgressTask=Creating diagram and model files
+IntermediateModelDiagramEditorUtil_CreateDiagramCommandLabel=Creating diagram and model
+IntermediateModelDocumentProvider_isModifiable=Updating cache failed
+IntermediateModelDocumentProvider_handleElementContentChanged=Failed to refresh hierarchy for changed resource
+IntermediateModelDocumentProvider_IncorrectInputError={1}
+IntermediateModelDocumentProvider_NoDiagramInResourceError=Diagram is not present in resource
+IntermediateModelDocumentProvider_DiagramLoadingError=Error loading diagram
+IntermediateModelDocumentProvider_UnsynchronizedFileSaveError=The file has been changed on the file system
+IntermediateModelDocumentProvider_SaveDiagramTask=Saving diagram
+IntermediateModelDocumentProvider_SaveNextResourceTask=Saving {0}
+IntermediateModelDocumentProvider_SaveAsOperation=Saving {0} diagram as
+InitDiagramFile_ResourceErrorDialogTitle=Error
+InitDiagramFile_ResourceErrorDialogMessage=Model file loading failed
+InitDiagramFile_WizardTitle=Initialize new {0} diagram file
+InitDiagramFile_OpenModelFileDialogTitle=Select domain model
+IntermediateModelNewDiagramFileWizard_CreationPageName=Initialize new diagram file
+IntermediateModelNewDiagramFileWizard_CreationPageTitle=Diagram file
+IntermediateModelNewDiagramFileWizard_CreationPageDescription=Create new diagram based on {0} model content
+IntermediateModelNewDiagramFileWizard_RootSelectionPageName=Select diagram root element
+IntermediateModelNewDiagramFileWizard_RootSelectionPageTitle=Diagram root element
+IntermediateModelNewDiagramFileWizard_RootSelectionPageDescription=Select semantic model element to be depicted on diagram
+IntermediateModelNewDiagramFileWizard_RootSelectionPageSelectionTitle=Select diagram root element:
+IntermediateModelNewDiagramFileWizard_RootSelectionPageNoSelectionMessage=Diagram root element is not selected
+IntermediateModelNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage=Invalid diagram root element is selected
+IntermediateModelNewDiagramFileWizard_InitDiagramCommand=Initializing diagram contents
+IntermediateModelNewDiagramFileWizard_IncorrectRootError=Incorrect model object stored as a root resource object
+IntermediateModelDiagramEditor_SavingDeletedFile=The original file "{0}" has been deleted.
+IntermediateModelDiagramEditor_SaveAsErrorTitle=Problem During Save As...
+IntermediateModelDiagramEditor_SaveAsErrorMessage=Save could not be completed. Target file is already open in another editor.
+IntermediateModelDiagramEditor_SaveErrorTitle=Save Problems
+IntermediateModelDiagramEditor_SaveErrorMessage=Could not save file.
+IntermediateModelElementChooserDialog_SelectModelElementTitle=Select model element
+ModelElementSelectionPageMessage=Select model element:
+ValidateActionMessage=Validate
+Mangrove1Group_title=mangrove
+Mangrove1Group_desc=
+TravelServices2Group_title=Travel Services
+FinancialServices3Group_title=Financial Services
+FinancialServices3Group_desc=
+StandardToolsTool_title=StandardTools
+ProcessCollection3CreationTool_title=Process Collection
+ProcessCollection3CreationTool_desc=Create new Process Collection
+Process4CreationTool_title=Process
+Process4CreationTool_desc=Create new Process
+Step5CreationTool_title=Step
+Step5CreationTool_desc=Create new Step
+Transition6CreationTool_title=Transition
+Transition6CreationTool_desc=Create new Transition
+ServiceCollection8CreationTool_title=Service Collection
+ServiceCollection8CreationTool_desc=Create new Service Collection
+Service9CreationTool_title=Service
+Service9CreationTool_desc=Create new Service
+ServiceService10CreationTool_title=Service <-> Service
+ServiceService10CreationTool_desc=Service dependency to another service
+StepServiceConnection12CreationTool_title=Step <-> Service Connection
+StepServiceConnection12CreationTool_desc=Create connection with a Service
+Hotel1CreationTool_title=Hotel
+Weather2CreationTool_title=Weather
+Weather2CreationTool_desc=http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl
+CreditCard1CreationTool_title=Credit Card
+ShoppingCart2CreationTool_title=Shopping Cart
+
+CommandName_OpenDiagram=Open Diagram
+NavigatorGroupName_StpIntermediateModel_1000_links=links
+NavigatorGroupName_Transition_4009_target=target
+NavigatorGroupName_Transition_4009_source=source
+NavigatorGroupName_Service_3009_incominglinks=incoming links
+NavigatorGroupName_Service_3009_outgoinglinks=outgoing links
+NavigatorGroupName_ServiceNeeds_4011_target=target
+NavigatorGroupName_ServiceNeeds_4011_source=source
+NavigatorGroupName_StepServiceModel_4010_target=target
+NavigatorGroupName_StepServiceModel_4010_source=source
+NavigatorGroupName_Step_3008_incominglinks=incoming links
+NavigatorGroupName_Step_3008_outgoinglinks=outgoing links
+NavigatorGroupName_Process_3007_incominglinks=incoming links
+NavigatorGroupName_Process_3007_outgoinglinks=outgoing links
+NavigatorActionProvider_OpenDiagramActionName=Open Diagram
+AbstractParser_UnexpectedValueType=Value of type {0} is expected
+AbstractParser_WrongStringConversion=String value does not convert to {0} value
+AbstractParser_UnknownLiteral=Unknown literal: {0}
+
+MessageFormatParser_InvalidInputError=Invalid input at {0}
+IntermediateModelModelingAssistantProviderTitle=Select domain model element
+IntermediateModelModelingAssistantProviderMessage=Available domain model elements:
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/plugin.properties b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/plugin.properties
new file mode 100755
index 0000000..81eba13
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/plugin.properties
@@ -0,0 +1,46 @@
+pluginName=IntermediateModel Plugin
+providerName=Sample Plugin Provider, Inc
+
+editorName=IntermediateModel Diagram Editing
+context.description=IntermediateModel Diagram Editing
+context.name=In IntermediateModel Diagram Editor
+newWizardName=IntermediateModel Diagram
+newWizardDesc=Creates IntermediateModel diagram.
+
+initDiagramActionLabel=Initialize mangrove_diagram diagram file
+
+
+navigatorContentName=*.mangrove_diagram diagram contents
+domainNavigatorContentName=*.mangrove model contents
+update.diagram.name=Update IntermediateModel diagram
+update.diagram.description=Perform IntermediateModel diagram update
+
+
+# Property Sheet
+tab.appearance=Appearance
+tab.diagram=Rulers & Grid
+tab.domain=Core
+
+# Preferences
+prefpage.org.eclipse.soa.mangrove.diagram.general=IntermediateModel Diagram
+prefpage.org.eclipse.soa.mangrove.diagram.appearance=Appearance
+prefpage.org.eclipse.soa.mangrove.diagram.connections=Connections
+prefpage.org.eclipse.soa.mangrove.diagram.printing=Printing
+prefpage.org.eclipse.soa.mangrove.diagram.rulersAndGrid=Rulers And Grid
+
+
+# Providers
+metatype.name.StpIntermediateModel_1000=Undefined
+metatype.name.ProcessCollection_2005=ProcessCollection
+metatype.name.ServiceCollection_2006=ServiceCollection
+metatype.name.Process_3007=Process
+metatype.name.Step_3008=Step
+metatype.name.Service_3009=Service
+metatype.name.Transition_4009=Transition
+metatype.name.StepServiceModel_4010=Undefined
+metatype.name.ServiceNeeds_4011=Undefined
+
+# Commands and menu actions
+cmdcategory.name=IntermediateModel Editor Commands
+cmdcategory.desc=IntermediateModel Editor Commands
+
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/plugin.xml b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/plugin.xml
new file mode 100755
index 0000000..d527d20
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/plugin.xml
@@ -0,0 +1,556 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+   <extension point="org.eclipse.team.core.fileTypes" id="repo-ftype">
+      <?gmfgen generated="true"?>
+      <fileTypes type="text" extension="mangrove_diagram"/>
+   </extension>
+
+   <extension point="org.eclipse.emf.ecore.extension_parser" id="resource-factory">
+      <?gmfgen generated="true"?>
+      <parser
+         type="mangrove_diagram"
+         class="org.eclipse.gmf.runtime.emf.core.resources.GMFResourceFactory">
+      </parser>
+   </extension>
+
+   <extension point="org.eclipse.ui.editors" id="gmf-editor">
+      <?gmfgen generated="true"?>
+      <editor
+         id="org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorID"
+         name="%editorName"
+         icon="icons/obj16/ImDiagramFile.gif"
+         extensions="mangrove_diagram"
+         default="true"
+         class="org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditor"
+         matchingStrategy="org.eclipse.soa.mangrove.diagram.part.IntermediateModelMatchingStrategy"
+         contributorClass="org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramActionBarContributor">
+      </editor>
+   </extension>
+   
+   <extension point="org.eclipse.ui.contexts" id="ui-context">
+      <?gmfgen generated="true"?>
+      <context
+         description="%context.description"
+         id="org.eclipse.soa.mangrove.diagram.ui.diagramContext"
+         name="%context.name"
+         parentId="org.eclipse.gmf.runtime.diagram.ui.diagramContext">
+      </context>
+   </extension>
+
+   <extension point="org.eclipse.ui.newWizards" id="creation-wizard">
+      <?gmfgen generated="true"?>
+  	  <wizard
+  	     name="%newWizardName"
+  	     icon="icons/obj16/ImDiagramFile.gif"
+  	     category="org.eclipse.ui.Examples"
+  	     class="org.eclipse.soa.mangrove.diagram.part.IntermediateModelCreationWizard"
+  	     id="org.eclipse.soa.mangrove.diagram.part.IntermediateModelCreationWizardID">
+  	  	 <description>%newWizardDesc</description>  
+      </wizard>
+   </extension>
+
+   <extension point="org.eclipse.ui.popupMenus" id="init-diagram-action">
+      <?gmfgen generated="true"?>
+      <objectContribution
+            id="org.eclipse.soa.mangrove.diagram.InitDiagram"
+            nameFilter="*.mangrove"
+            objectClass="org.eclipse.core.resources.IFile">
+         <action
+               label="%initDiagramActionLabel"
+               class="org.eclipse.soa.mangrove.diagram.part.IntermediateModelInitDiagramFileAction"
+               menubarPath="additions"
+               enablesFor="1"
+               id="org.eclipse.soa.mangrove.diagram.InitDiagramAction">
+         </action>
+      </objectContribution>
+   </extension>
+	
+   <extension point="org.eclipse.gmf.runtime.common.ui.services.action.globalActionHandlerProviders" id="global-actions">
+      <?gmfgen generated="true"?>
+      <GlobalActionHandlerProvider
+         class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramGlobalActionHandlerProvider"
+         id="IntermediateModelPresentation">
+         <Priority name="Lowest"/>
+         <ViewId id="org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorID">
+            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
+               <GlobalActionId actionId="delete"/>
+            </ElementType>
+            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart">
+               <GlobalActionId actionId="save"/>
+            </ElementType>
+            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
+               <GlobalActionId actionId="save">
+               </GlobalActionId>
+            </ElementType>        
+         </ViewId>
+      </GlobalActionHandlerProvider>
+      <GlobalActionHandlerProvider
+         class="org.eclipse.gmf.runtime.diagram.ui.providers.ide.providers.DiagramIDEGlobalActionHandlerProvider"
+         id="IntermediateModelPresentationIDE">
+         <Priority name="Lowest"/>
+         <ViewId id="org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorID">
+            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
+               <GlobalActionId actionId="bookmark"/>
+            </ElementType>
+         </ViewId>
+      </GlobalActionHandlerProvider>
+      <GlobalActionHandlerProvider
+            class="org.eclipse.gmf.runtime.diagram.ui.render.providers.DiagramUIRenderGlobalActionHandlerProvider"
+            id="IntermediateModelRender">
+         <Priority name="Lowest"/>
+         <ViewId id="org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorID">
+            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
+               <GlobalActionId actionId="cut"/>
+               <GlobalActionId actionId="copy"/>
+               <GlobalActionId actionId="paste"/>
+            </ElementType>
+         </ViewId>
+      </GlobalActionHandlerProvider>
+   </extension>
+
+
+   <extension point="org.eclipse.core.runtime.preferences" id="prefs">
+      <?gmfgen generated="true"?>
+      <initializer class="org.eclipse.soa.mangrove.diagram.preferences.DiagramPreferenceInitializer"/>
+   </extension>
+
+   <extension point="org.eclipse.ui.preferencePages" id="prefpages">
+      <?gmfgen generated="true"?>
+      <page
+            id="org.eclipse.soa.mangrove.diagram.general"
+            name="%prefpage.org.eclipse.soa.mangrove.diagram.general"
+            class="org.eclipse.soa.mangrove.diagram.preferences.DiagramGeneralPreferencePage">
+      </page>
+      <page
+            id="org.eclipse.soa.mangrove.diagram.appearance"
+            name="%prefpage.org.eclipse.soa.mangrove.diagram.appearance"
+            category="org.eclipse.soa.mangrove.diagram.general"
+            class="org.eclipse.soa.mangrove.diagram.preferences.DiagramAppearancePreferencePage">
+      </page>
+      <page
+            id="org.eclipse.soa.mangrove.diagram.connections"
+            name="%prefpage.org.eclipse.soa.mangrove.diagram.connections"
+            category="org.eclipse.soa.mangrove.diagram.general"
+            class="org.eclipse.soa.mangrove.diagram.preferences.DiagramConnectionsPreferencePage">
+      </page>
+      <page
+            id="org.eclipse.soa.mangrove.diagram.printing"
+            name="%prefpage.org.eclipse.soa.mangrove.diagram.printing"
+            category="org.eclipse.soa.mangrove.diagram.general"
+            class="org.eclipse.soa.mangrove.diagram.preferences.DiagramPrintingPreferencePage">
+      </page>
+      <page
+            id="org.eclipse.soa.mangrove.diagram.rulersAndGrid"
+            name="%prefpage.org.eclipse.soa.mangrove.diagram.rulersAndGrid"
+            category="org.eclipse.soa.mangrove.diagram.general"
+            class="org.eclipse.soa.mangrove.diagram.preferences.DiagramRulersAndGridPreferencePage">
+      </page>
+   </extension>
+
+   <extension point="org.eclipse.ui.views.properties.tabbed.propertyContributor" id="prop-contrib">
+      <?gmfgen generated="true"?>
+      <propertyContributor
+            contributorId="org.eclipse.soa.mangrove.diagram"
+            labelProvider="org.eclipse.soa.mangrove.diagram.sheet.IntermediateModelSheetLabelProvider">
+         <propertyCategory category="domain"/>
+         <propertyCategory category="visual"/>
+         <propertyCategory category="extra"/>
+      </propertyContributor>
+   </extension>
+
+   <extension point="org.eclipse.ui.views.properties.tabbed.propertyTabs" id="proptabs">
+      <?gmfgen generated="true"?>   
+      <propertyTabs contributorId="org.eclipse.soa.mangrove.diagram">
+         <propertyTab
+             category="visual"
+             id="property.tab.AppearancePropertySection"
+             label="%tab.appearance"/>
+          <propertyTab
+             category="visual"
+             id="property.tab.DiagramPropertySection"
+             label="%tab.diagram"/>
+          <propertyTab
+             category="domain"
+             id="property.tab.domain"
+             label="%tab.domain"/>
+      </propertyTabs>
+   </extension>
+
+   <extension point="org.eclipse.ui.views.properties.tabbed.propertySections" id="propsections">
+      <?gmfgen generated="true"?>   
+      <propertySections contributorId="org.eclipse.soa.mangrove.diagram">
+         <propertySection id="property.section.ConnectorAppearancePropertySection" 
+            filter="org.eclipse.gmf.runtime.diagram.ui.properties.filters.ConnectionEditPartPropertySectionFilter" 
+            class="org.eclipse.gmf.runtime.diagram.ui.properties.sections.appearance.ConnectionAppearancePropertySection" 
+            tab="property.tab.AppearancePropertySection">
+         </propertySection>
+         <propertySection id="property.section.ShapeColorAndFontPropertySection" 
+            filter="org.eclipse.gmf.runtime.diagram.ui.properties.filters.ShapeEditPartPropertySectionFilter" 
+            class="org.eclipse.gmf.runtime.diagram.ui.properties.sections.appearance.ShapeColorsAndFontsPropertySection" 
+            tab="property.tab.AppearancePropertySection">
+         </propertySection> 
+         <propertySection id="property.section.DiagramColorsAndFontsPropertySection" 
+            filter="org.eclipse.gmf.runtime.diagram.ui.properties.filters.DiagramEditPartPropertySectionFilter" 
+            class="org.eclipse.gmf.runtime.diagram.ui.properties.sections.appearance.DiagramColorsAndFontsPropertySection" 
+            tab="property.tab.AppearancePropertySection">
+         </propertySection>     
+         <propertySection id="property.section.RulerGridPropertySection" 
+            filter="org.eclipse.gmf.runtime.diagram.ui.properties.filters.DiagramEditPartPropertySectionFilter" 
+            class="org.eclipse.gmf.runtime.diagram.ui.properties.sections.grid.RulerGridPropertySection" 
+            tab="property.tab.DiagramPropertySection">
+         </propertySection>     
+         <propertySection
+            id="property.section.domain" 
+            tab="property.tab.domain"
+            class="org.eclipse.soa.mangrove.diagram.sheet.IntermediateModelPropertySection">
+            <input type="org.eclipse.gmf.runtime.notation.View"/>
+            <input type="org.eclipse.gef.EditPart"/>
+            <input type="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelAbstractNavigatorItem"/>
+         </propertySection>
+      </propertySections>
+   </extension>
+
+   <extension point="org.eclipse.gmf.runtime.diagram.core.viewProviders" id="view-provider">
+      <?gmfgen generated="true"?>
+      <viewProvider class="org.eclipse.soa.mangrove.diagram.providers.IntermediateModelViewProvider">
+         <Priority name="Lowest"/>
+         <context viewClass="org.eclipse.gmf.runtime.notation.Diagram" semanticHints="IntermediateModel"/>
+         <context viewClass="org.eclipse.gmf.runtime.notation.Node" semanticHints="2005,2006,3007,3008,3009"/>
+         <context viewClass="org.eclipse.gmf.runtime.notation.Edge" semanticHints="4009,4010,4011"/>
+      </viewProvider>
+   </extension>
+
+   <extension point="org.eclipse.gmf.runtime.diagram.ui.editpartProviders" id="ep-provider">
+      <?gmfgen generated="true"?>
+      <editpartProvider class="org.eclipse.soa.mangrove.diagram.providers.IntermediateModelEditPartProvider">
+         <Priority name="Lowest"/>
+         <object class="org.eclipse.gmf.runtime.notation.Diagram" id="generated-diagram">
+            <method name="getType()" value="IntermediateModel"/>
+         </object>
+         <object class="org.eclipse.gmf.runtime.notation.Node" id="generated-nodes">
+            <method name="getType()" value="2005,2006,3007,3008,3009"/>
+         </object>
+         <object class="org.eclipse.gmf.runtime.notation.Edge" id="generated-links">
+            <method name="getType()" value="4009,4010,4011"/>
+         </object>
+         <object class="org.eclipse.gmf.runtime.notation.Node" id="generated-labels">
+            <method name="getType()" value="5011,5010,5009,5012"/>
+         </object>
+         <object class="org.eclipse.gmf.runtime.notation.Node" id="generated-compartments">
+            <method name="getType()" value=""/>
+         </object>
+         <context views="generated-diagram,generated-nodes,generated-links,generated-labels,generated-compartments"/>
+      </editpartProvider>
+   </extension>
+
+   <extension point="org.eclipse.gmf.runtime.emf.ui.modelingAssistantProviders" id="modelassist-provider">
+      <?gmfgen generated="true"?>
+      <modelingAssistantProvider class="org.eclipse.soa.mangrove.diagram.providers.IntermediateModelModelingAssistantProvider">
+         <Priority name="Lowest"/>
+         <object class="org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart" id="StpIntermediateModel_1000"/>
+         <object class="org.eclipse.soa.mangrove.diagram.edit.parts.ProcessCollectionEditPart" id="ProcessCollection_2005"/>
+         <object class="org.eclipse.soa.mangrove.diagram.edit.parts.ServiceCollectionEditPart" id="ServiceCollection_2006"/>
+         <object class="org.eclipse.soa.mangrove.diagram.edit.parts.ProcessEditPart" id="Process_3007"/>
+         <object class="org.eclipse.soa.mangrove.diagram.edit.parts.StepEditPart" id="Step_3008"/>
+         <object class="org.eclipse.soa.mangrove.diagram.edit.parts.ServiceEditPart" id="Service_3009"/>
+         <context elements="StpIntermediateModel_1000,ProcessCollection_2005,ServiceCollection_2006,Process_3007,Step_3008,Service_3009"/>
+      </modelingAssistantProvider>
+   </extension>
+
+   <extension point="org.eclipse.gmf.runtime.common.ui.services.iconProviders" id="icon-provider">
+      <?gmfgen generated="true"?>
+      <IconProvider class="org.eclipse.soa.mangrove.diagram.providers.IntermediateModelIconProvider">
+         <Priority name="Low"/>
+      </IconProvider>
+   </extension>
+
+   <extension point="org.eclipse.gmf.runtime.common.ui.services.parserProviders" id="parser-provider">
+      <?gmfgen generated="true"?>
+      <ParserProvider class="org.eclipse.soa.mangrove.diagram.providers.IntermediateModelParserProvider">
+         <Priority name="Lowest"/>
+      </ParserProvider>
+   </extension>
+
+   <extension point="org.eclipse.gmf.runtime.emf.type.core.elementTypes" id="element-types">
+      <?gmfgen generated="true"?>
+      <metamodel nsURI="http://eclipse.org/soa/mangrove">
+         <metamodelType
+               id="org.eclipse.soa.mangrove.diagram.StpIntermediateModel_1000"
+               name="%metatype.name.StpIntermediateModel_1000"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="StpIntermediateModel"
+               edithelper="org.eclipse.soa.mangrove.diagram.edit.helpers.StpIntermediateModelEditHelper">
+            <param name="semanticHint" value="1000"/>
+         </metamodelType>
+      </metamodel>
+      <metamodel nsURI="http://eclipse.org/soa/mangrove">
+         <metamodelType
+               id="org.eclipse.soa.mangrove.diagram.ProcessCollection_2005"
+               name="%metatype.name.ProcessCollection_2005"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="ProcessCollection"
+               edithelper="org.eclipse.soa.mangrove.diagram.edit.helpers.ProcessCollectionEditHelper">
+            <param name="semanticHint" value="2005"/>
+         </metamodelType>
+      </metamodel>
+      <metamodel nsURI="http://eclipse.org/soa/mangrove">
+         <metamodelType
+               id="org.eclipse.soa.mangrove.diagram.ServiceCollection_2006"
+               name="%metatype.name.ServiceCollection_2006"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="ServiceCollection"
+               edithelper="org.eclipse.soa.mangrove.diagram.edit.helpers.ServiceCollectionEditHelper">
+            <param name="semanticHint" value="2006"/>
+         </metamodelType>
+      </metamodel>
+      <metamodel nsURI="http://eclipse.org/soa/mangrove">
+         <metamodelType
+               id="org.eclipse.soa.mangrove.diagram.Process_3007"
+               name="%metatype.name.Process_3007"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="Process"
+               edithelper="org.eclipse.soa.mangrove.diagram.edit.helpers.ProcessEditHelper">
+            <param name="semanticHint" value="3007"/>
+         </metamodelType>
+      </metamodel>
+      <metamodel nsURI="http://eclipse.org/soa/mangrove">
+         <metamodelType
+               id="org.eclipse.soa.mangrove.diagram.Step_3008"
+               name="%metatype.name.Step_3008"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="Step"
+               edithelper="org.eclipse.soa.mangrove.diagram.edit.helpers.StepEditHelper">
+            <param name="semanticHint" value="3008"/>
+         </metamodelType>
+      </metamodel>
+      <metamodel nsURI="http://eclipse.org/soa/mangrove">
+         <metamodelType
+               id="org.eclipse.soa.mangrove.diagram.Service_3009"
+               name="%metatype.name.Service_3009"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="Service"
+               edithelper="org.eclipse.soa.mangrove.diagram.edit.helpers.ServiceEditHelper">
+            <param name="semanticHint" value="3009"/>
+         </metamodelType>
+      </metamodel>
+      <metamodel nsURI="http://eclipse.org/soa/mangrove">
+         <metamodelType
+               id="org.eclipse.soa.mangrove.diagram.Transition_4009"
+               name="%metatype.name.Transition_4009"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
+               eclass="Transition"
+               edithelper="org.eclipse.soa.mangrove.diagram.edit.helpers.TransitionEditHelper">
+            <param name="semanticHint" value="4009"/>
+         </metamodelType>
+      </metamodel>
+      <metamodel nsURI="http://eclipse.org/soa/mangrove">
+         <specializationType
+               id="org.eclipse.soa.mangrove.diagram.StepServiceModel_4010"
+               name="%metatype.name.StepServiceModel_4010"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType">
+            <specializes id="org.eclipse.gmf.runtime.emf.type.core.null"/>
+            <param name="semanticHint" value="4010"/>
+         </specializationType>
+      </metamodel>
+      <metamodel nsURI="http://eclipse.org/soa/mangrove">
+         <specializationType
+               id="org.eclipse.soa.mangrove.diagram.ServiceNeeds_4011"
+               name="%metatype.name.ServiceNeeds_4011"
+               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType">
+            <specializes id="org.eclipse.gmf.runtime.emf.type.core.null"/>
+            <param name="semanticHint" value="4011"/>
+         </specializationType>
+      </metamodel>
+   </extension>
+
+   <extension point="org.eclipse.gmf.runtime.emf.type.core.elementTypeBindings" id="element-types-bindings">
+      <?gmfgen generated="true"?>
+      <clientContext id="org.eclipse.soa.mangrove.diagram.TypeContext">
+         <enablement>
+            <test
+               property="org.eclipse.gmf.runtime.emf.core.editingDomain"
+               value="org.eclipse.soa.mangrove.diagram.EditingDomain"/>
+         </enablement>
+      </clientContext> 
+      <binding context="org.eclipse.soa.mangrove.diagram.TypeContext">
+         <elementType ref="org.eclipse.soa.mangrove.diagram.StpIntermediateModel_1000"/>
+         <elementType ref="org.eclipse.soa.mangrove.diagram.ProcessCollection_2005"/>
+         <elementType ref="org.eclipse.soa.mangrove.diagram.ServiceCollection_2006"/>
+         <elementType ref="org.eclipse.soa.mangrove.diagram.Process_3007"/>
+         <elementType ref="org.eclipse.soa.mangrove.diagram.Step_3008"/>
+         <elementType ref="org.eclipse.soa.mangrove.diagram.Service_3009"/>
+         <elementType ref="org.eclipse.soa.mangrove.diagram.Transition_4009"/>
+         <elementType ref="org.eclipse.soa.mangrove.diagram.StepServiceModel_4010"/>
+         <elementType ref="org.eclipse.soa.mangrove.diagram.ServiceNeeds_4011"/>
+         <advice ref="org.eclipse.gmf.runtime.diagram.core.advice.notationDepdendents"/>
+      </binding>
+   </extension>
+	   <extension point="org.eclipse.core.expressions.propertyTesters" id="navigator-proptest.isURIEditorInput">
+      <?gmfgen generated="true"?>
+       <propertyTester
+           id="org.eclipse.soa.mangrove.diagram.URIEditorInputPropertyTester"
+           type="org.eclipse.emf.common.ui.URIEditorInput"
+           namespace="org.eclipse.soa.mangrove.diagram"
+           properties="isURIEditorInput"
+           class="org.eclipse.soa.mangrove.diagram.part.IntermediateModelUriEditorInputTester">
+       </propertyTester>
+   </extension>
+
+	   <extension point="org.eclipse.ui.navigator.viewer" id="navigator-viewbinding">
+      <?gmfgen generated="true"?>
+      <viewerContentBinding viewerId="org.eclipse.ui.navigator.ProjectExplorer">
+         <includes>
+            <contentExtension pattern="org.eclipse.soa.mangrove.diagram.resourceContent"/>
+			<contentExtension pattern="org.eclipse.soa.mangrove.diagram.domainResourceContent"/>
+            <contentExtension pattern="org.eclipse.soa.mangrove.diagram.navigatorLinkHelper"/>
+         </includes>
+      </viewerContentBinding>
+      <viewerActionBinding viewerId="org.eclipse.ui.navigator.ProjectExplorer">
+         <includes>
+            <actionExtension pattern="org.eclipse.soa.mangrove.diagram.navigatorActionProvider"/>
+         </includes>
+      </viewerActionBinding>
+   </extension>
+
+   <extension point="org.eclipse.ui.navigator.navigatorContent" id="navigator-content">
+      <?gmfgen generated="true"?>
+      <navigatorContent
+            id="org.eclipse.soa.mangrove.diagram.resourceContent" 
+            name="%navigatorContentName" 
+            priority="normal" 
+            contentProvider="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorContentProvider" 
+            labelProvider="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorLabelProvider"
+            icon="icons/obj16/ImDiagramFile.gif"
+            activeByDefault="true">
+         <triggerPoints>
+            <or>
+	           <and>
+    	          <instanceof value="org.eclipse.core.resources.IFile"/>
+        	      <test property="org.eclipse.core.resources.extension" value="mangrove_diagram"/>
+               </and>
+               <instanceof value="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelAbstractNavigatorItem"/>
+            </or>
+         </triggerPoints>
+         <possibleChildren>
+            <or>
+         	   <instanceof value="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelAbstractNavigatorItem"/>
+            </or>
+         </possibleChildren>
+         <commonSorter 
+               id="org.eclipse.soa.mangrove.diagram.navigatorSorter" 
+               class="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorSorter">
+            <parentExpression>
+               <or>
+	              <and>
+    	             <instanceof value="org.eclipse.core.resources.IFile"/>
+        	         <test property="org.eclipse.core.resources.extension" value="mangrove_diagram"/>
+                  </and>
+                  <instanceof value="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelAbstractNavigatorItem"/>
+               </or>
+            </parentExpression>
+         </commonSorter>
+      </navigatorContent>
+      <navigatorContent
+            id="org.eclipse.soa.mangrove.diagram.domainResourceContent" 
+            name="%domainNavigatorContentName" 
+            priority="normal" 
+            contentProvider="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelDomainNavigatorContentProvider" 
+            labelProvider="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelDomainNavigatorLabelProvider"
+            icon="icons/obj16/ImDiagramFile.gif"
+            activeByDefault="true">
+         <triggerPoints>
+            <or>
+	           <and>
+    	          <instanceof value="org.eclipse.core.resources.IFile"/>
+        	      <test property="org.eclipse.core.resources.extension" value="mangrove"/>
+               </and>
+               <instanceof value="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelDomainNavigatorItem"/>
+            </or>
+         </triggerPoints>
+         <possibleChildren>
+            <instanceof value="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelDomainNavigatorItem"/>
+         </possibleChildren>
+      </navigatorContent>
+      <actionProvider
+            id="org.eclipse.soa.mangrove.diagram.navigatorActionProvider"
+            class="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorActionProvider">
+         <enablement>
+            <or>
+               <instanceof value="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelAbstractNavigatorItem"/>
+            </or>
+         </enablement>
+      </actionProvider>
+   </extension>
+   
+	   <extension point="org.eclipse.ui.navigator.linkHelper" id="navigator-linkhelper">
+      <?gmfgen generated="true"?>
+      <linkHelper
+            id="org.eclipse.soa.mangrove.diagram.navigatorLinkHelper"
+            class="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorLinkHelper">
+         <editorInputEnablement>
+            <and>
+               <instanceof value="org.eclipse.emf.common.ui.URIEditorInput"/>
+               <test property="org.eclipse.soa.mangrove.diagram.isURIEditorInput"/>
+            </and>
+         </editorInputEnablement>
+         <selectionEnablement>
+            <instanceof value="org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelAbstractNavigatorItem"/>
+         </selectionEnablement>
+      </linkHelper>
+   </extension>
+   <extension point="org.eclipse.ui.commands" id="update-cmd">
+      <?gmfgen generated="true"?>
+      <command
+         categoryId="org.eclipse.ui.category.edit"
+         defaultHandler="org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramUpdateCommand"
+         description="%update.diagram.description"
+         id="org.eclipse.soa.mangrove.diagram.updateDiagram"
+         name="%update.diagram.name"/>
+   </extension>
+   
+   <extension point="org.eclipse.ui.bindings" id="update-cmd-binding">
+      <?gmfgen generated="true"?>
+      <key 
+         commandId="org.eclipse.soa.mangrove.diagram.updateDiagram"
+         contextId="org.eclipse.soa.mangrove.diagram.ui.diagramContext"
+         schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+         sequence="F5"/>
+   </extension>
+
+   <extension point="org.eclipse.ui.menus" id="context-menus">
+      <?gmfgen generated="true"?>
+      <!-- menuContribution locationURI="menu:org.eclipse.ui.main.menu?after=">
+      </menuContribution>
+      <menuContribution locationURI="toolbar:org.eclipse.ui.main.toolbar?after=">
+      </menuContribution -->
+      <menuContribution locationURI="popup:org.eclipse.gmf.runtime.diagram.ui.DiagramEditorContextMenu">
+         <command commandId="org.eclipse.soa.mangrove.diagram.LoadResourceAction">
+            <visibleWhen>
+               <and>
+                  <with variable="activePartId"><equals value="org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorID"/></with>
+                  <with variable="selection"><iterate ifEmpty="false"> 
+                     <instanceof value="org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart"/>
+                  </iterate></with>
+               </and>
+            </visibleWhen>
+         </command>
+      </menuContribution>
+   </extension>
+
+   <extension point="org.eclipse.ui.commands" id="menu-commands">
+      <?gmfgen generated="true"?>
+      <category id="org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorID" name="%cmdcategory.name" description="%cmdcategory.desc"/>
+      <command id="org.eclipse.soa.mangrove.diagram.LoadResourceAction"
+         name="Load Resource"
+         categoryId="org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorID"
+         defaultHandler="org.eclipse.soa.mangrove.diagram.part.LoadResourceAction"/>
+   </extension>
+
+   <extension point="org.eclipse.ui.handlers" id="menu-handlers">
+      <?gmfgen generated="true"?>
+   </extension>
+
+   <!-- optionally, specify keybindings -->
+</plugin>
diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ProcessCollectionCreateCommand.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ProcessCollectionCreateCommand.java
new file mode 100755
index 0000000..472533b
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ProcessCollectionCreateCommand.java
@@ -0,0 +1,92 @@
+package org.eclipse.soa.mangrove.diagram.edit.commands;

+

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.common.core.command.CommandResult;

+import org.eclipse.gmf.runtime.common.core.command.ICommand;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.ImFactory;

+import org.eclipse.soa.mangrove.ProcessCollection;

+import org.eclipse.soa.mangrove.StpIntermediateModel;

+

+/**

+ * @generated

+ */

+public class ProcessCollectionCreateCommand extends EditElementCommand {

+

+	/**

+	 * @generated

+	 */

+	public ProcessCollectionCreateCommand(CreateElementRequest req) {

+		super(req.getLabel(), null, req);

+	}

+

+	/**

+	 * FIXME: replace with setElementToEdit()

+	 * @generated

+	 */

+	protected EObject getElementToEdit() {

+		EObject container = ((CreateElementRequest) getRequest())

+				.getContainer();

+		if (container instanceof View) {

+			container = ((View) container).getElement();

+		}

+		return container;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean canExecute() {

+		StpIntermediateModel container = (StpIntermediateModel) getElementToEdit();

+		if (container.getProcessCollection() != null) {

+			return false;

+		}

+		return true;

+

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		ProcessCollection newElement = ImFactory.eINSTANCE

+				.createProcessCollection();

+

+		StpIntermediateModel owner = (StpIntermediateModel) getElementToEdit();

+		owner.setProcessCollection(newElement);

+

+		doConfigure(newElement, monitor, info);

+

+		((CreateElementRequest) getRequest()).setNewElement(newElement);

+		return CommandResult.newOKCommandResult(newElement);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void doConfigure(ProcessCollection newElement,

+			IProgressMonitor monitor, IAdaptable info)

+			throws ExecutionException {

+		IElementType elementType = ((CreateElementRequest) getRequest())

+				.getElementType();

+		ConfigureRequest configureRequest = new ConfigureRequest(

+				getEditingDomain(), newElement, elementType);

+		configureRequest.setClientContext(((CreateElementRequest) getRequest())

+				.getClientContext());

+		configureRequest.addParameters(getRequest().getParameters());

+		ICommand configureCommand = elementType

+				.getEditCommand(configureRequest);

+		if (configureCommand != null && configureCommand.canExecute()) {

+			configureCommand.execute(monitor, info);

+		}

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ProcessCreateCommand.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ProcessCreateCommand.java
new file mode 100755
index 0000000..ae21451
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ProcessCreateCommand.java
@@ -0,0 +1,86 @@
+package org.eclipse.soa.mangrove.diagram.edit.commands;

+

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.common.core.command.CommandResult;

+import org.eclipse.gmf.runtime.common.core.command.ICommand;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.ImFactory;

+import org.eclipse.soa.mangrove.Process;

+import org.eclipse.soa.mangrove.ProcessCollection;

+

+/**

+ * @generated

+ */

+public class ProcessCreateCommand extends EditElementCommand {

+

+	/**

+	 * @generated

+	 */

+	public ProcessCreateCommand(CreateElementRequest req) {

+		super(req.getLabel(), null, req);

+	}

+

+	/**

+	 * FIXME: replace with setElementToEdit()

+	 * @generated

+	 */

+	protected EObject getElementToEdit() {

+		EObject container = ((CreateElementRequest) getRequest())

+				.getContainer();

+		if (container instanceof View) {

+			container = ((View) container).getElement();

+		}

+		return container;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean canExecute() {

+		return true;

+

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		Process newElement = ImFactory.eINSTANCE.createProcess();

+

+		ProcessCollection owner = (ProcessCollection) getElementToEdit();

+		owner.getProcesses().add(newElement);

+

+		doConfigure(newElement, monitor, info);

+

+		((CreateElementRequest) getRequest()).setNewElement(newElement);

+		return CommandResult.newOKCommandResult(newElement);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void doConfigure(Process newElement, IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		IElementType elementType = ((CreateElementRequest) getRequest())

+				.getElementType();

+		ConfigureRequest configureRequest = new ConfigureRequest(

+				getEditingDomain(), newElement, elementType);

+		configureRequest.setClientContext(((CreateElementRequest) getRequest())

+				.getClientContext());

+		configureRequest.addParameters(getRequest().getParameters());

+		ICommand configureCommand = elementType

+				.getEditCommand(configureRequest);

+		if (configureCommand != null && configureCommand.canExecute()) {

+			configureCommand.execute(monitor, info);

+		}

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ServiceCollectionCreateCommand.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ServiceCollectionCreateCommand.java
new file mode 100755
index 0000000..b964c60
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ServiceCollectionCreateCommand.java
@@ -0,0 +1,92 @@
+package org.eclipse.soa.mangrove.diagram.edit.commands;

+

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.common.core.command.CommandResult;

+import org.eclipse.gmf.runtime.common.core.command.ICommand;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.ImFactory;

+import org.eclipse.soa.mangrove.ServiceCollection;

+import org.eclipse.soa.mangrove.StpIntermediateModel;

+

+/**

+ * @generated

+ */

+public class ServiceCollectionCreateCommand extends EditElementCommand {

+

+	/**

+	 * @generated

+	 */

+	public ServiceCollectionCreateCommand(CreateElementRequest req) {

+		super(req.getLabel(), null, req);

+	}

+

+	/**

+	 * FIXME: replace with setElementToEdit()

+	 * @generated

+	 */

+	protected EObject getElementToEdit() {

+		EObject container = ((CreateElementRequest) getRequest())

+				.getContainer();

+		if (container instanceof View) {

+			container = ((View) container).getElement();

+		}

+		return container;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean canExecute() {

+		StpIntermediateModel container = (StpIntermediateModel) getElementToEdit();

+		if (container.getServiceCollection() != null) {

+			return false;

+		}

+		return true;

+

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		ServiceCollection newElement = ImFactory.eINSTANCE

+				.createServiceCollection();

+

+		StpIntermediateModel owner = (StpIntermediateModel) getElementToEdit();

+		owner.setServiceCollection(newElement);

+

+		doConfigure(newElement, monitor, info);

+

+		((CreateElementRequest) getRequest()).setNewElement(newElement);

+		return CommandResult.newOKCommandResult(newElement);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void doConfigure(ServiceCollection newElement,

+			IProgressMonitor monitor, IAdaptable info)

+			throws ExecutionException {

+		IElementType elementType = ((CreateElementRequest) getRequest())

+				.getElementType();

+		ConfigureRequest configureRequest = new ConfigureRequest(

+				getEditingDomain(), newElement, elementType);

+		configureRequest.setClientContext(((CreateElementRequest) getRequest())

+				.getClientContext());

+		configureRequest.addParameters(getRequest().getParameters());

+		ICommand configureCommand = elementType

+				.getEditCommand(configureRequest);

+		if (configureCommand != null && configureCommand.canExecute()) {

+			configureCommand.execute(monitor, info);

+		}

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ServiceCreateCommand.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ServiceCreateCommand.java
new file mode 100755
index 0000000..397349f
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ServiceCreateCommand.java
@@ -0,0 +1,86 @@
+package org.eclipse.soa.mangrove.diagram.edit.commands;

+

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.common.core.command.CommandResult;

+import org.eclipse.gmf.runtime.common.core.command.ICommand;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.ImFactory;

+import org.eclipse.soa.mangrove.Service;

+import org.eclipse.soa.mangrove.ServiceCollection;

+

+/**

+ * @generated

+ */

+public class ServiceCreateCommand extends EditElementCommand {

+

+	/**

+	 * @generated

+	 */

+	public ServiceCreateCommand(CreateElementRequest req) {

+		super(req.getLabel(), null, req);

+	}

+

+	/**

+	 * FIXME: replace with setElementToEdit()

+	 * @generated

+	 */

+	protected EObject getElementToEdit() {

+		EObject container = ((CreateElementRequest) getRequest())

+				.getContainer();

+		if (container instanceof View) {

+			container = ((View) container).getElement();

+		}

+		return container;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean canExecute() {

+		return true;

+

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		Service newElement = ImFactory.eINSTANCE.createService();

+

+		ServiceCollection owner = (ServiceCollection) getElementToEdit();

+		owner.getServices().add(newElement);

+

+		doConfigure(newElement, monitor, info);

+

+		((CreateElementRequest) getRequest()).setNewElement(newElement);

+		return CommandResult.newOKCommandResult(newElement);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void doConfigure(Service newElement, IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		IElementType elementType = ((CreateElementRequest) getRequest())

+				.getElementType();

+		ConfigureRequest configureRequest = new ConfigureRequest(

+				getEditingDomain(), newElement, elementType);

+		configureRequest.setClientContext(((CreateElementRequest) getRequest())

+				.getClientContext());

+		configureRequest.addParameters(getRequest().getParameters());

+		ICommand configureCommand = elementType

+				.getEditCommand(configureRequest);

+		if (configureCommand != null && configureCommand.canExecute()) {

+			configureCommand.execute(monitor, info);

+		}

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ServiceNeedsCreateCommand.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ServiceNeedsCreateCommand.java
new file mode 100755
index 0000000..8a1a5f0
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ServiceNeedsCreateCommand.java
@@ -0,0 +1,96 @@
+package org.eclipse.soa.mangrove.diagram.edit.commands;

+

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.common.core.command.CommandResult;

+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;

+import org.eclipse.soa.mangrove.Service;

+import org.eclipse.soa.mangrove.diagram.edit.policies.IntermediateModelBaseItemSemanticEditPolicy;

+

+/**

+ * @generated

+ */

+public class ServiceNeedsCreateCommand extends EditElementCommand {

+

+	/**

+	 * @generated

+	 */

+	private final EObject source;

+

+	/**

+	 * @generated

+	 */

+	private final EObject target;

+

+	/**

+	 * @generated

+	 */

+	public ServiceNeedsCreateCommand(CreateRelationshipRequest request,

+			EObject source, EObject target) {

+		super(request.getLabel(), null, request);

+		this.source = source;

+		this.target = target;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean canExecute() {

+		if (source == null && target == null) {

+			return false;

+		}

+		if (source != null && false == source instanceof Service) {

+			return false;

+		}

+		if (target != null && false == target instanceof Service) {

+			return false;

+		}

+		if (getSource() == null) {

+			return true; // link creation is in progress; source is not defined yet

+		}

+		// target may be null here but it's possible to check constraint

+		return IntermediateModelBaseItemSemanticEditPolicy.getLinkConstraints()

+				.canCreateServiceNeeds_4011(getSource(), getTarget());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		if (!canExecute()) {

+			throw new ExecutionException(

+					"Invalid arguments in create link command"); //$NON-NLS-1$

+		}

+

+		if (getSource() != null && getTarget() != null) {

+			getSource().getNeeds().add(getTarget());

+		}

+		return CommandResult.newOKCommandResult();

+

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setElementToEdit(EObject element) {

+		throw new UnsupportedOperationException();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Service getSource() {

+		return (Service) source;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Service getTarget() {

+		return (Service) target;

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ServiceNeedsReorientCommand.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ServiceNeedsReorientCommand.java
new file mode 100755
index 0000000..cb57bb4
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/ServiceNeedsReorientCommand.java
@@ -0,0 +1,152 @@
+package org.eclipse.soa.mangrove.diagram.edit.commands;

+

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.common.core.command.CommandResult;

+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientReferenceRelationshipRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;

+import org.eclipse.soa.mangrove.Service;

+import org.eclipse.soa.mangrove.diagram.edit.policies.IntermediateModelBaseItemSemanticEditPolicy;

+

+/**

+ * @generated

+ */

+public class ServiceNeedsReorientCommand extends EditElementCommand {

+

+	/**

+	 * @generated

+	 */

+	private final int reorientDirection;

+

+	/**

+	 * @generated

+	 */

+	private final EObject referenceOwner;

+

+	/**

+	 * @generated

+	 */

+	private final EObject oldEnd;

+

+	/**

+	 * @generated

+	 */

+	private final EObject newEnd;

+

+	/**

+	 * @generated

+	 */

+	public ServiceNeedsReorientCommand(

+			ReorientReferenceRelationshipRequest request) {

+		super(request.getLabel(), null, request);

+		reorientDirection = request.getDirection();

+		referenceOwner = request.getReferenceOwner();

+		oldEnd = request.getOldRelationshipEnd();

+		newEnd = request.getNewRelationshipEnd();

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean canExecute() {

+		if (false == referenceOwner instanceof Service) {

+			return false;

+		}

+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {

+			return canReorientSource();

+		}

+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {

+			return canReorientTarget();

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean canReorientSource() {

+		if (!(oldEnd instanceof Service && newEnd instanceof Service)) {

+			return false;

+		}

+		return IntermediateModelBaseItemSemanticEditPolicy.getLinkConstraints()

+				.canExistServiceNeeds_4011(getNewSource(), getOldTarget());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean canReorientTarget() {

+		if (!(oldEnd instanceof Service && newEnd instanceof Service)) {

+			return false;

+		}

+		return IntermediateModelBaseItemSemanticEditPolicy.getLinkConstraints()

+				.canExistServiceNeeds_4011(getOldSource(), getNewTarget());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		if (!canExecute()) {

+			throw new ExecutionException(

+					"Invalid arguments in reorient link command"); //$NON-NLS-1$

+		}

+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {

+			return reorientSource();

+		}

+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {

+			return reorientTarget();

+		}

+		throw new IllegalStateException();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult reorientSource() throws ExecutionException {

+		getOldSource().getNeeds().remove(getOldTarget());

+		getNewSource().getNeeds().add(getOldTarget());

+		return CommandResult.newOKCommandResult(referenceOwner);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult reorientTarget() throws ExecutionException {

+		getOldSource().getNeeds().remove(getOldTarget());

+		getOldSource().getNeeds().add(getNewTarget());

+		return CommandResult.newOKCommandResult(referenceOwner);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Service getOldSource() {

+		return (Service) referenceOwner;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Service getNewSource() {

+		return (Service) newEnd;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Service getOldTarget() {

+		return (Service) oldEnd;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Service getNewTarget() {

+		return (Service) newEnd;

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/StepCreateCommand.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/StepCreateCommand.java
new file mode 100755
index 0000000..2fffb9c
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/StepCreateCommand.java
@@ -0,0 +1,86 @@
+package org.eclipse.soa.mangrove.diagram.edit.commands;

+

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.common.core.command.CommandResult;

+import org.eclipse.gmf.runtime.common.core.command.ICommand;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.ImFactory;

+import org.eclipse.soa.mangrove.Process;

+import org.eclipse.soa.mangrove.Step;

+

+/**

+ * @generated

+ */

+public class StepCreateCommand extends EditElementCommand {

+

+	/**

+	 * @generated

+	 */

+	public StepCreateCommand(CreateElementRequest req) {

+		super(req.getLabel(), null, req);

+	}

+

+	/**

+	 * FIXME: replace with setElementToEdit()

+	 * @generated

+	 */

+	protected EObject getElementToEdit() {

+		EObject container = ((CreateElementRequest) getRequest())

+				.getContainer();

+		if (container instanceof View) {

+			container = ((View) container).getElement();

+		}

+		return container;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean canExecute() {

+		return true;

+

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		Step newElement = ImFactory.eINSTANCE.createStep();

+

+		Process owner = (Process) getElementToEdit();

+		owner.getSteps().add(newElement);

+

+		doConfigure(newElement, monitor, info);

+

+		((CreateElementRequest) getRequest()).setNewElement(newElement);

+		return CommandResult.newOKCommandResult(newElement);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void doConfigure(Step newElement, IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		IElementType elementType = ((CreateElementRequest) getRequest())

+				.getElementType();

+		ConfigureRequest configureRequest = new ConfigureRequest(

+				getEditingDomain(), newElement, elementType);

+		configureRequest.setClientContext(((CreateElementRequest) getRequest())

+				.getClientContext());

+		configureRequest.addParameters(getRequest().getParameters());

+		ICommand configureCommand = elementType

+				.getEditCommand(configureRequest);

+		if (configureCommand != null && configureCommand.canExecute()) {

+			configureCommand.execute(monitor, info);

+		}

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/StepServiceModelCreateCommand.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/StepServiceModelCreateCommand.java
new file mode 100755
index 0000000..fd1d228
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/StepServiceModelCreateCommand.java
@@ -0,0 +1,97 @@
+package org.eclipse.soa.mangrove.diagram.edit.commands;

+

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.common.core.command.CommandResult;

+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;

+import org.eclipse.soa.mangrove.Service;

+import org.eclipse.soa.mangrove.Step;

+import org.eclipse.soa.mangrove.diagram.edit.policies.IntermediateModelBaseItemSemanticEditPolicy;

+

+/**

+ * @generated

+ */

+public class StepServiceModelCreateCommand extends EditElementCommand {

+

+	/**

+	 * @generated

+	 */

+	private final EObject source;

+

+	/**

+	 * @generated

+	 */

+	private final EObject target;

+

+	/**

+	 * @generated

+	 */

+	public StepServiceModelCreateCommand(CreateRelationshipRequest request,

+			EObject source, EObject target) {

+		super(request.getLabel(), null, request);

+		this.source = source;

+		this.target = target;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean canExecute() {

+		if (source == null && target == null) {

+			return false;

+		}

+		if (source != null && false == source instanceof Step) {

+			return false;

+		}

+		if (target != null && false == target instanceof Service) {

+			return false;

+		}

+		if (getSource() == null) {

+			return true; // link creation is in progress; source is not defined yet

+		}

+		// target may be null here but it's possible to check constraint

+		return IntermediateModelBaseItemSemanticEditPolicy.getLinkConstraints()

+				.canCreateStepServiceModel_4010(getSource(), getTarget());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		if (!canExecute()) {

+			throw new ExecutionException(

+					"Invalid arguments in create link command"); //$NON-NLS-1$

+		}

+

+		if (getSource() != null && getTarget() != null) {

+			getSource().setServiceModel(getTarget());

+		}

+		return CommandResult.newOKCommandResult();

+

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setElementToEdit(EObject element) {

+		throw new UnsupportedOperationException();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Step getSource() {

+		return (Step) source;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Service getTarget() {

+		return (Service) target;

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/StepServiceModelReorientCommand.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/StepServiceModelReorientCommand.java
new file mode 100755
index 0000000..99b395d
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/StepServiceModelReorientCommand.java
@@ -0,0 +1,152 @@
+package org.eclipse.soa.mangrove.diagram.edit.commands;

+

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.common.core.command.CommandResult;

+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientReferenceRelationshipRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;

+import org.eclipse.soa.mangrove.Service;

+import org.eclipse.soa.mangrove.Step;

+import org.eclipse.soa.mangrove.diagram.edit.policies.IntermediateModelBaseItemSemanticEditPolicy;

+

+/**

+ * @generated

+ */

+public class StepServiceModelReorientCommand extends EditElementCommand {

+

+	/**

+	 * @generated

+	 */

+	private final int reorientDirection;

+

+	/**

+	 * @generated

+	 */

+	private final EObject referenceOwner;

+

+	/**

+	 * @generated

+	 */

+	private final EObject oldEnd;

+

+	/**

+	 * @generated

+	 */

+	private final EObject newEnd;

+

+	/**

+	 * @generated

+	 */

+	public StepServiceModelReorientCommand(

+			ReorientReferenceRelationshipRequest request) {

+		super(request.getLabel(), null, request);

+		reorientDirection = request.getDirection();

+		referenceOwner = request.getReferenceOwner();

+		oldEnd = request.getOldRelationshipEnd();

+		newEnd = request.getNewRelationshipEnd();

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean canExecute() {

+		if (false == referenceOwner instanceof Step) {

+			return false;

+		}

+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {

+			return canReorientSource();

+		}

+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {

+			return canReorientTarget();

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean canReorientSource() {

+		if (!(oldEnd instanceof Service && newEnd instanceof Step)) {

+			return false;

+		}

+		return IntermediateModelBaseItemSemanticEditPolicy.getLinkConstraints()

+				.canExistStepServiceModel_4010(getNewSource(), getOldTarget());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean canReorientTarget() {

+		if (!(oldEnd instanceof Service && newEnd instanceof Service)) {

+			return false;

+		}

+		return IntermediateModelBaseItemSemanticEditPolicy.getLinkConstraints()

+				.canExistStepServiceModel_4010(getOldSource(), getNewTarget());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		if (!canExecute()) {

+			throw new ExecutionException(

+					"Invalid arguments in reorient link command"); //$NON-NLS-1$

+		}

+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {

+			return reorientSource();

+		}

+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {

+			return reorientTarget();

+		}

+		throw new IllegalStateException();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult reorientSource() throws ExecutionException {

+		getOldSource().setServiceModel(null);

+		getNewSource().setServiceModel(getOldTarget());

+		return CommandResult.newOKCommandResult(referenceOwner);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult reorientTarget() throws ExecutionException {

+		getOldSource().setServiceModel(getNewTarget());

+		return CommandResult.newOKCommandResult(referenceOwner);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Step getOldSource() {

+		return (Step) referenceOwner;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Step getNewSource() {

+		return (Step) newEnd;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Service getOldTarget() {

+		return (Service) oldEnd;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Service getNewTarget() {

+		return (Service) newEnd;

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/TransitionCreateCommand.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/TransitionCreateCommand.java
new file mode 100755
index 0000000..32581b0
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/TransitionCreateCommand.java
@@ -0,0 +1,165 @@
+package org.eclipse.soa.mangrove.diagram.edit.commands;

+

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.common.core.command.CommandResult;

+import org.eclipse.gmf.runtime.common.core.command.ICommand;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;

+import org.eclipse.soa.mangrove.ImFactory;

+import org.eclipse.soa.mangrove.Process;

+import org.eclipse.soa.mangrove.Step;

+import org.eclipse.soa.mangrove.Transition;

+import org.eclipse.soa.mangrove.diagram.edit.policies.IntermediateModelBaseItemSemanticEditPolicy;

+

+/**

+ * @generated

+ */

+public class TransitionCreateCommand extends EditElementCommand {

+

+	/**

+	 * @generated

+	 */

+	private final EObject source;

+

+	/**

+	 * @generated

+	 */

+	private final EObject target;

+

+	/**

+	 * @generated

+	 */

+	private final Process container;

+

+	/**

+	 * @generated

+	 */

+	public TransitionCreateCommand(CreateRelationshipRequest request,

+			EObject source, EObject target) {

+		super(request.getLabel(), null, request);

+		this.source = source;

+		this.target = target;

+		container = deduceContainer(source, target);

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean canExecute() {

+		if (source == null && target == null) {

+			return false;

+		}

+		if (source != null && false == source instanceof Step) {

+			return false;

+		}

+		if (target != null && false == target instanceof Step) {

+			return false;

+		}

+		if (getSource() == null) {

+			return true; // link creation is in progress; source is not defined yet

+		}

+		// target may be null here but it's possible to check constraint

+		if (getContainer() == null) {

+			return false;

+		}

+		return IntermediateModelBaseItemSemanticEditPolicy.getLinkConstraints()

+				.canCreateTransition_4009(getContainer(), getSource(),

+						getTarget());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		if (!canExecute()) {

+			throw new ExecutionException(

+					"Invalid arguments in create link command"); //$NON-NLS-1$

+		}

+

+		Transition newElement = ImFactory.eINSTANCE.createTransition();

+		getContainer().getTransitions().add(newElement);

+		newElement.setSource(getSource());

+		newElement.setTarget(getTarget());

+		doConfigure(newElement, monitor, info);

+		((CreateElementRequest) getRequest()).setNewElement(newElement);

+		return CommandResult.newOKCommandResult(newElement);

+

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void doConfigure(Transition newElement, IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		IElementType elementType = ((CreateElementRequest) getRequest())

+				.getElementType();

+		ConfigureRequest configureRequest = new ConfigureRequest(

+				getEditingDomain(), newElement, elementType);

+		configureRequest.setClientContext(((CreateElementRequest) getRequest())

+				.getClientContext());

+		configureRequest.addParameters(getRequest().getParameters());

+		configureRequest.setParameter(CreateRelationshipRequest.SOURCE,

+				getSource());

+		configureRequest.setParameter(CreateRelationshipRequest.TARGET,

+				getTarget());

+		ICommand configureCommand = elementType

+				.getEditCommand(configureRequest);

+		if (configureCommand != null && configureCommand.canExecute()) {

+			configureCommand.execute(monitor, info);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setElementToEdit(EObject element) {

+		throw new UnsupportedOperationException();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Step getSource() {

+		return (Step) source;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Step getTarget() {

+		return (Step) target;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Process getContainer() {

+		return container;

+	}

+

+	/**

+	 * Default approach is to traverse ancestors of the source to find instance of container.

+	 * Modify with appropriate logic.

+	 * @generated

+	 */

+	private static Process deduceContainer(EObject source, EObject target) {

+		// Find container element for the new link.

+		// Climb up by containment hierarchy starting from the source

+		// and return the first element that is instance of the container class.

+		for (EObject element = source; element != null; element = element

+				.eContainer()) {

+			if (element instanceof Process) {

+				return (Process) element;

+			}

+		}

+		return null;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/TransitionReorientCommand.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/TransitionReorientCommand.java
new file mode 100755
index 0000000..be18a1e
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/commands/TransitionReorientCommand.java
@@ -0,0 +1,163 @@
+package org.eclipse.soa.mangrove.diagram.edit.commands;

+

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.common.core.command.CommandResult;

+import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;

+import org.eclipse.soa.mangrove.Process;

+import org.eclipse.soa.mangrove.Step;

+import org.eclipse.soa.mangrove.Transition;

+import org.eclipse.soa.mangrove.diagram.edit.policies.IntermediateModelBaseItemSemanticEditPolicy;

+

+/**

+ * @generated

+ */

+public class TransitionReorientCommand extends EditElementCommand {

+

+	/**

+	 * @generated

+	 */

+	private final int reorientDirection;

+

+	/**

+	 * @generated

+	 */

+	private final EObject oldEnd;

+

+	/**

+	 * @generated

+	 */

+	private final EObject newEnd;

+

+	/**

+	 * @generated

+	 */

+	public TransitionReorientCommand(ReorientRelationshipRequest request) {

+		super(request.getLabel(), request.getRelationship(), request);

+		reorientDirection = request.getDirection();

+		oldEnd = request.getOldRelationshipEnd();

+		newEnd = request.getNewRelationshipEnd();

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean canExecute() {

+		if (false == getElementToEdit() instanceof Transition) {

+			return false;

+		}

+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {

+			return canReorientSource();

+		}

+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {

+			return canReorientTarget();

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean canReorientSource() {

+		if (!(oldEnd instanceof Step && newEnd instanceof Step)) {

+			return false;

+		}

+		Step target = getLink().getTarget();

+		if (!(getLink().eContainer() instanceof Process)) {

+			return false;

+		}

+		Process container = (Process) getLink().eContainer();

+		return IntermediateModelBaseItemSemanticEditPolicy.getLinkConstraints()

+				.canExistTransition_4009(container, getLink(), getNewSource(),

+						target);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean canReorientTarget() {

+		if (!(oldEnd instanceof Step && newEnd instanceof Step)) {

+			return false;

+		}

+		Step source = getLink().getSource();

+		if (!(getLink().eContainer() instanceof Process)) {

+			return false;

+		}

+		Process container = (Process) getLink().eContainer();

+		return IntermediateModelBaseItemSemanticEditPolicy.getLinkConstraints()

+				.canExistTransition_4009(container, getLink(), source,

+						getNewTarget());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,

+			IAdaptable info) throws ExecutionException {

+		if (!canExecute()) {

+			throw new ExecutionException(

+					"Invalid arguments in reorient link command"); //$NON-NLS-1$

+		}

+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {

+			return reorientSource();

+		}

+		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {

+			return reorientTarget();

+		}

+		throw new IllegalStateException();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult reorientSource() throws ExecutionException {

+		getLink().setSource(getNewSource());

+		return CommandResult.newOKCommandResult(getLink());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected CommandResult reorientTarget() throws ExecutionException {

+		getLink().setTarget(getNewTarget());

+		return CommandResult.newOKCommandResult(getLink());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Transition getLink() {

+		return (Transition) getElementToEdit();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Step getOldSource() {

+		return (Step) oldEnd;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Step getNewSource() {

+		return (Step) newEnd;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Step getOldTarget() {

+		return (Step) oldEnd;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Step getNewTarget() {

+		return (Step) newEnd;

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/IntermediateModelBaseEditHelper.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/IntermediateModelBaseEditHelper.java
new file mode 100755
index 0000000..683b2ad
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/IntermediateModelBaseEditHelper.java
@@ -0,0 +1,10 @@
+package org.eclipse.soa.mangrove.diagram.edit.helpers;

+

+import org.eclipse.gmf.tooling.runtime.edit.helpers.GeneratedEditHelperBase;

+

+/**

+ * @generated

+ */

+public class IntermediateModelBaseEditHelper extends GeneratedEditHelperBase {

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/ProcessCollectionEditHelper.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/ProcessCollectionEditHelper.java
new file mode 100755
index 0000000..51d9a5c
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/ProcessCollectionEditHelper.java
@@ -0,0 +1,8 @@
+package org.eclipse.soa.mangrove.diagram.edit.helpers;

+

+/**

+ * @generated

+ */

+public class ProcessCollectionEditHelper extends

+		IntermediateModelBaseEditHelper {

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/ProcessEditHelper.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/ProcessEditHelper.java
new file mode 100755
index 0000000..413597c
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/ProcessEditHelper.java
@@ -0,0 +1,7 @@
+package org.eclipse.soa.mangrove.diagram.edit.helpers;

+

+/**

+ * @generated

+ */

+public class ProcessEditHelper extends IntermediateModelBaseEditHelper {

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/ServiceCollectionEditHelper.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/ServiceCollectionEditHelper.java
new file mode 100755
index 0000000..580fcc2
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/ServiceCollectionEditHelper.java
@@ -0,0 +1,8 @@
+package org.eclipse.soa.mangrove.diagram.edit.helpers;

+

+/**

+ * @generated

+ */

+public class ServiceCollectionEditHelper extends

+		IntermediateModelBaseEditHelper {

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/ServiceEditHelper.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/ServiceEditHelper.java
new file mode 100755
index 0000000..c0f32da
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/ServiceEditHelper.java
@@ -0,0 +1,7 @@
+package org.eclipse.soa.mangrove.diagram.edit.helpers;

+

+/**

+ * @generated

+ */

+public class ServiceEditHelper extends IntermediateModelBaseEditHelper {

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/StepEditHelper.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/StepEditHelper.java
new file mode 100755
index 0000000..464ea03
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/StepEditHelper.java
@@ -0,0 +1,7 @@
+package org.eclipse.soa.mangrove.diagram.edit.helpers;

+

+/**

+ * @generated

+ */

+public class StepEditHelper extends IntermediateModelBaseEditHelper {

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/StpIntermediateModelEditHelper.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/StpIntermediateModelEditHelper.java
new file mode 100755
index 0000000..44fdafe
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/StpIntermediateModelEditHelper.java
@@ -0,0 +1,8 @@
+package org.eclipse.soa.mangrove.diagram.edit.helpers;

+

+/**

+ * @generated

+ */

+public class StpIntermediateModelEditHelper extends

+		IntermediateModelBaseEditHelper {

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/TransitionEditHelper.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/TransitionEditHelper.java
new file mode 100755
index 0000000..878b4a1
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/helpers/TransitionEditHelper.java
@@ -0,0 +1,7 @@
+package org.eclipse.soa.mangrove.diagram.edit.helpers;

+

+/**

+ * @generated

+ */

+public class TransitionEditHelper extends IntermediateModelBaseEditHelper {

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/IntermediateModelEditPartFactory.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/IntermediateModelEditPartFactory.java
new file mode 100755
index 0000000..dbc6a01
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/IntermediateModelEditPartFactory.java
@@ -0,0 +1,85 @@
+package org.eclipse.soa.mangrove.diagram.edit.parts;

+

+import org.eclipse.gef.EditPart;

+import org.eclipse.gef.EditPartFactory;

+import org.eclipse.gef.tools.CellEditorLocator;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.gmf.tooling.runtime.directedit.locator.CellEditorLocatorAccess;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+

+/**

+ * @generated

+ */

+public class IntermediateModelEditPartFactory implements EditPartFactory {

+

+	/**

+	 * @generated

+	 */

+	public EditPart createEditPart(EditPart context, Object model) {

+		if (model instanceof View) {

+			View view = (View) model;

+			switch (IntermediateModelVisualIDRegistry.getVisualID(view)) {

+

+			case StpIntermediateModelEditPart.VISUAL_ID:

+				return new StpIntermediateModelEditPart(view);

+

+			case ProcessCollectionEditPart.VISUAL_ID:

+				return new ProcessCollectionEditPart(view);

+

+			case ProcessCollectionPoolNameEditPart.VISUAL_ID:

+				return new ProcessCollectionPoolNameEditPart(view);

+

+			case ServiceCollectionEditPart.VISUAL_ID:

+				return new ServiceCollectionEditPart(view);

+

+			case ProcessEditPart.VISUAL_ID:

+				return new ProcessEditPart(view);

+

+			case ProcessNameEditPart.VISUAL_ID:

+				return new ProcessNameEditPart(view);

+

+			case StepEditPart.VISUAL_ID:

+				return new StepEditPart(view);

+

+			case StepNameEditPart.VISUAL_ID:

+				return new StepNameEditPart(view);

+

+			case ServiceEditPart.VISUAL_ID:

+				return new ServiceEditPart(view);

+

+			case ServiceServiceNameEditPart.VISUAL_ID:

+				return new ServiceServiceNameEditPart(view);

+

+			case TransitionEditPart.VISUAL_ID:

+				return new TransitionEditPart(view);

+

+			case StepServiceModelEditPart.VISUAL_ID:

+				return new StepServiceModelEditPart(view);

+

+			case ServiceNeedsEditPart.VISUAL_ID:

+				return new ServiceNeedsEditPart(view);

+

+			}

+		}

+		return createUnrecognizedEditPart(context, model);

+	}

+

+	/**

+	 * @generated

+	 */

+	private EditPart createUnrecognizedEditPart(EditPart context, Object model) {

+		// Handle creation of unrecognized child node EditParts here

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static CellEditorLocator getTextCellEditorLocator(

+			ITextAwareEditPart source) {

+		return CellEditorLocatorAccess.INSTANCE

+				.getTextCellEditorLocator(source);

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ProcessCollectionEditPart.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ProcessCollectionEditPart.java
new file mode 100755
index 0000000..0d83b0a
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ProcessCollectionEditPart.java
@@ -0,0 +1,309 @@
+package org.eclipse.soa.mangrove.diagram.edit.parts;

+

+import org.eclipse.draw2d.IFigure;

+import org.eclipse.draw2d.MarginBorder;

+import org.eclipse.draw2d.RectangleFigure;

+import org.eclipse.draw2d.Shape;

+import org.eclipse.draw2d.StackLayout;

+import org.eclipse.gef.EditPart;

+import org.eclipse.gef.EditPolicy;

+import org.eclipse.gef.Request;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gef.editpolicies.LayoutEditPolicy;

+import org.eclipse.gef.editpolicies.NonResizableEditPolicy;

+import org.eclipse.gef.requests.CreateRequest;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;

+import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;

+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.gmf.tooling.runtime.edit.policies.reparent.CreationEditPolicyWithCustomReparent;

+import org.eclipse.soa.mangrove.diagram.edit.policies.ProcessCollectionCanonicalEditPolicy;

+import org.eclipse.soa.mangrove.diagram.edit.policies.ProcessCollectionItemSemanticEditPolicy;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.swt.graphics.Color;

+

+/**

+ * @generated

+ */

+public class ProcessCollectionEditPart extends ShapeNodeEditPart {

+

+	/**

+	 * @generated

+	 */

+	public static final int VISUAL_ID = 2005;

+

+	/**

+	 * @generated

+	 */

+	protected IFigure contentPane;

+

+	/**

+	 * @generated

+	 */

+	protected IFigure primaryShape;

+

+	/**

+	 * @generated

+	 */

+	public ProcessCollectionEditPart(View view) {

+		super(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void createDefaultEditPolicies() {

+		installEditPolicy(EditPolicyRoles.CREATION_ROLE,

+				new CreationEditPolicyWithCustomReparent(

+						IntermediateModelVisualIDRegistry.TYPED_INSTANCE));

+		super.createDefaultEditPolicies();

+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,

+				new ProcessCollectionItemSemanticEditPolicy());

+		installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE,

+				new DragDropEditPolicy());

+		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,

+				new ProcessCollectionCanonicalEditPolicy());

+		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());

+		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies

+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected LayoutEditPolicy createLayoutEditPolicy() {

+		org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy lep = new org.eclipse.gmf.runtime.diagram.ui.editpolicies.LayoutEditPolicy() {

+

+			protected EditPolicy createChildEditPolicy(EditPart child) {

+				EditPolicy result = child

+						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);

+				if (result == null) {

+					result = new NonResizableEditPolicy();

+				}

+				return result;

+			}

+

+			protected Command getMoveChildrenCommand(Request request) {

+				return null;

+			}

+

+			protected Command getCreateCommand(CreateRequest request) {

+				return null;

+			}

+		};

+		return lep;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure createNodeShape() {

+		return primaryShape = new ProcessCollectionFigure();

+	}

+

+	/**

+	 * @generated

+	 */

+	public ProcessCollectionFigure getPrimaryShape() {

+		return (ProcessCollectionFigure) primaryShape;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean addFixedChild(EditPart childEditPart) {

+		if (childEditPart instanceof ProcessCollectionPoolNameEditPart) {

+			((ProcessCollectionPoolNameEditPart) childEditPart)

+					.setLabel(getPrimaryShape()

+							.getFigureProcessCollectionPoolNameFigure());

+			return true;

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean removeFixedChild(EditPart childEditPart) {

+		if (childEditPart instanceof ProcessCollectionPoolNameEditPart) {

+			return true;

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void addChildVisual(EditPart childEditPart, int index) {

+		if (addFixedChild(childEditPart)) {

+			return;

+		}

+		super.addChildVisual(childEditPart, -1);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void removeChildVisual(EditPart childEditPart) {

+		if (removeFixedChild(childEditPart)) {

+			return;

+		}

+		super.removeChildVisual(childEditPart);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {

+		return getContentPane();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected NodeFigure createNodePlate() {

+		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);

+		return result;

+	}

+

+	/**

+	 * Creates figure for this edit part.

+	 * 

+	 * Body of this method does not depend on settings in generation model

+	 * so you may safely remove <i>generated</i> tag and modify it.

+	 * 

+	 * @generated

+	 */

+	protected NodeFigure createNodeFigure() {

+		NodeFigure figure = createNodePlate();

+		figure.setLayoutManager(new StackLayout());

+		IFigure shape = createNodeShape();

+		figure.add(shape);

+		contentPane = setupContentPane(shape);

+		return figure;

+	}

+

+	/**

+	 * Default implementation treats passed figure as content pane.

+	 * Respects layout one may have set for generated figure.

+	 * @param nodeShape instance of generated figure class

+	 * @generated

+	 */

+	protected IFigure setupContentPane(IFigure nodeShape) {

+		if (nodeShape.getLayoutManager() == null) {

+			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();

+			layout.setSpacing(5);

+			nodeShape.setLayoutManager(layout);

+		}

+		return nodeShape; // use nodeShape itself as contentPane

+	}

+

+	/**

+	 * @generated

+	 */

+	public IFigure getContentPane() {

+		if (contentPane != null) {

+			return contentPane;

+		}

+		return super.getContentPane();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setForegroundColor(Color color) {

+		if (primaryShape != null) {

+			primaryShape.setForegroundColor(color);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setBackgroundColor(Color color) {

+		if (primaryShape != null) {

+			primaryShape.setBackgroundColor(color);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLineWidth(int width) {

+		if (primaryShape instanceof Shape) {

+			((Shape) primaryShape).setLineWidth(width);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLineType(int style) {

+		if (primaryShape instanceof Shape) {

+			((Shape) primaryShape).setLineStyle(style);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public EditPart getPrimaryChildEditPart() {

+		return getChildBySemanticHint(IntermediateModelVisualIDRegistry

+				.getType(ProcessCollectionPoolNameEditPart.VISUAL_ID));

+	}

+

+	/**

+	 * @generated

+	 */

+	public class ProcessCollectionFigure extends RectangleFigure {

+

+		/**

+		 * @generated

+		 */

+		private WrappingLabel fFigureProcessCollectionPoolNameFigure;

+

+		/**

+		 * @generated

+		 */

+		public ProcessCollectionFigure() {

+			this.setBackgroundColor(THIS_BACK);

+			this.setBorder(new MarginBorder(getMapMode().DPtoLP(10),

+					getMapMode().DPtoLP(10), getMapMode().DPtoLP(10),

+					getMapMode().DPtoLP(10)));

+			createContents();

+		}

+

+		/**

+		 * @generated

+		 */

+		private void createContents() {

+

+			fFigureProcessCollectionPoolNameFigure = new WrappingLabel();

+

+			fFigureProcessCollectionPoolNameFigure

+					.setText("Process Collection");

+

+			this.add(fFigureProcessCollectionPoolNameFigure);

+

+		}

+

+		/**

+		 * @generated

+		 */

+		public WrappingLabel getFigureProcessCollectionPoolNameFigure() {

+			return fFigureProcessCollectionPoolNameFigure;

+		}

+

+	}

+

+	/**

+	 * @generated

+	 */

+	static final Color THIS_BACK = new Color(null, 253, 222, 166);

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ProcessCollectionPoolNameEditPart.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ProcessCollectionPoolNameEditPart.java
new file mode 100755
index 0000000..5fc7ee4
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ProcessCollectionPoolNameEditPart.java
@@ -0,0 +1,630 @@
+package org.eclipse.soa.mangrove.diagram.edit.parts;

+

+import java.util.Collections;

+import java.util.List;

+

+import org.eclipse.draw2d.IFigure;

+import org.eclipse.draw2d.Label;

+import org.eclipse.draw2d.geometry.Point;

+import org.eclipse.emf.common.notify.Notification;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.transaction.RunnableWithResult;

+import org.eclipse.gef.AccessibleEditPart;

+import org.eclipse.gef.EditPolicy;

+import org.eclipse.gef.Request;

+import org.eclipse.gef.requests.DirectEditRequest;

+import org.eclipse.gef.tools.DirectEditManager;

+import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;

+import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;

+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;

+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;

+import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;

+import org.eclipse.gmf.runtime.diagram.ui.label.ILabelDelegate;

+import org.eclipse.gmf.runtime.diagram.ui.label.WrappingLabelDelegate;

+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;

+import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;

+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;

+import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;

+import org.eclipse.gmf.runtime.notation.FontStyle;

+import org.eclipse.gmf.runtime.notation.NotationPackage;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.gmf.tooling.runtime.directedit.TextDirectEditManager2;

+import org.eclipse.gmf.tooling.runtime.draw2d.labels.SimpleLabelDelegate;

+import org.eclipse.gmf.tooling.runtime.edit.policies.labels.IRefreshableFeedbackEditPolicy;

+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;

+import org.eclipse.jface.viewers.ICellEditorValidator;

+import org.eclipse.soa.mangrove.diagram.edit.policies.IntermediateModelTextSelectionEditPolicy;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelParserProvider;

+import org.eclipse.swt.SWT;

+import org.eclipse.swt.accessibility.AccessibleEvent;

+import org.eclipse.swt.graphics.Color;

+import org.eclipse.swt.graphics.FontData;

+import org.eclipse.swt.graphics.Image;

+

+/**

+ * @generated

+ */

+public class ProcessCollectionPoolNameEditPart extends CompartmentEditPart

+		implements ITextAwareEditPart {

+

+	/**

+	 * @generated

+	 */

+	public static final int VISUAL_ID = 5011;

+

+	/**

+	 * @generated

+	 */

+	private DirectEditManager manager;

+

+	/**

+	 * @generated

+	 */

+	private IParser parser;

+

+	/**

+	 * @generated

+	 */

+	private List<?> parserElements;

+

+	/**

+	 * @generated

+	 */

+	private String defaultText;

+

+	/**

+	 * @generated

+	 */

+	private ILabelDelegate labelDelegate;

+

+	/**

+	 * @generated

+	 */

+	public ProcessCollectionPoolNameEditPart(View view) {

+		super(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void createDefaultEditPolicies() {

+		super.createDefaultEditPolicies();

+		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,

+				new IntermediateModelTextSelectionEditPolicy());

+		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,

+				new LabelDirectEditPolicy());

+		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,

+				new StpIntermediateModelEditPart.NodeLabelDragPolicy());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected String getLabelTextHelper(IFigure figure) {

+		if (figure instanceof WrappingLabel) {

+			return ((WrappingLabel) figure).getText();

+		} else if (figure instanceof Label) {

+			return ((Label) figure).getText();

+		} else {

+			return getLabelDelegate().getText();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLabelTextHelper(IFigure figure, String text) {

+		if (figure instanceof WrappingLabel) {

+			((WrappingLabel) figure).setText(text);

+		} else if (figure instanceof Label) {

+			((Label) figure).setText(text);

+		} else {

+			getLabelDelegate().setText(text);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Image getLabelIconHelper(IFigure figure) {

+		if (figure instanceof WrappingLabel) {

+			return ((WrappingLabel) figure).getIcon();

+		} else if (figure instanceof Label) {

+			return ((Label) figure).getIcon();

+		} else {

+			return getLabelDelegate().getIcon(0);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLabelIconHelper(IFigure figure, Image icon) {

+		if (figure instanceof WrappingLabel) {

+			((WrappingLabel) figure).setIcon(icon);

+			return;

+		} else if (figure instanceof Label) {

+			((Label) figure).setIcon(icon);

+			return;

+		} else {

+			getLabelDelegate().setIcon(icon, 0);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setLabel(WrappingLabel figure) {

+		unregisterVisuals();

+		setFigure(figure);

+		defaultText = getLabelTextHelper(figure);

+		registerVisuals();

+		refreshVisuals();

+	}

+

+	/**

+	 * @generated

+	 */

+	@SuppressWarnings("rawtypes")

+	protected List getModelChildren() {

+		return Collections.EMPTY_LIST;

+	}

+

+	/**

+	 * @generated

+	 */

+	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected EObject getParserElement() {

+		return resolveSemanticElement();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Image getLabelIcon() {

+		EObject parserElement = getParserElement();

+		if (parserElement == null) {

+			return null;

+		}

+		return IntermediateModelElementTypes.getImage(parserElement.eClass());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected String getLabelText() {

+		String text = null;

+		EObject parserElement = getParserElement();

+		if (parserElement != null && getParser() != null) {

+			text = getParser().getPrintString(

+					new EObjectAdapter(parserElement),

+					getParserOptions().intValue());

+		}

+		if (text == null || text.length() == 0) {

+			text = defaultText;

+		}

+		return text;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setLabelText(String text) {

+		setLabelTextHelper(getFigure(), text);

+		refreshSelectionFeedback();

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getEditText() {

+		if (getParserElement() == null || getParser() == null) {

+			return ""; //$NON-NLS-1$

+		}

+		return getParser().getEditString(

+				new EObjectAdapter(getParserElement()),

+				getParserOptions().intValue());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean isEditable() {

+		return getParser() != null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public ICellEditorValidator getEditTextValidator() {

+		return new ICellEditorValidator() {

+

+			public String isValid(final Object value) {

+				if (value instanceof String) {

+					final EObject element = getParserElement();

+					final IParser parser = getParser();

+					try {

+						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()

+								.runExclusive(

+										new RunnableWithResult.Impl<IParserEditStatus>() {

+

+											public void run() {

+												setResult(parser

+														.isValidEditString(

+																new EObjectAdapter(

+																		element),

+																(String) value));

+											}

+										});

+						return valid.getCode() == ParserEditStatus.EDITABLE ? null

+								: valid.getMessage();

+					} catch (InterruptedException ie) {

+						ie.printStackTrace();

+					}

+				}

+

+				// shouldn't get here

+				return null;

+			}

+		};

+	}

+

+	/**

+	 * @generated

+	 */

+	public IContentAssistProcessor getCompletionProcessor() {

+		if (getParserElement() == null || getParser() == null) {

+			return null;

+		}

+		return getParser().getCompletionProcessor(

+				new EObjectAdapter(getParserElement()));

+	}

+

+	/**

+	 * @generated

+	 */

+	public ParserOptions getParserOptions() {

+		return ParserOptions.NONE;

+	}

+

+	/**

+	 * @generated

+	 */

+	public IParser getParser() {

+		if (parser == null) {

+			parser = IntermediateModelParserProvider

+					.getParser(

+							IntermediateModelElementTypes.ProcessCollection_2005,

+							getParserElement(),

+							IntermediateModelVisualIDRegistry

+									.getType(org.eclipse.soa.mangrove.diagram.edit.parts.ProcessCollectionPoolNameEditPart.VISUAL_ID));

+		}

+		return parser;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected DirectEditManager getManager() {

+		if (manager == null) {

+			setManager(new TextDirectEditManager2(this, null,

+					IntermediateModelEditPartFactory

+							.getTextCellEditorLocator(this)));

+		}

+		return manager;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setManager(DirectEditManager manager) {

+		this.manager = manager;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void performDirectEdit() {

+		getManager().show();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void performDirectEdit(Point eventLocation) {

+		if (getManager().getClass() == TextDirectEditManager2.class) {

+			((TextDirectEditManager2) getManager()).show(eventLocation

+					.getSWTPoint());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private void performDirectEdit(char initialCharacter) {

+		if (getManager() instanceof TextDirectEditManager) {

+			((TextDirectEditManager) getManager()).show(initialCharacter);

+		} else // 

+		if (getManager() instanceof TextDirectEditManager2) {

+			((TextDirectEditManager2) getManager()).show(initialCharacter);

+		} else //

+		{

+			performDirectEdit();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void performDirectEditRequest(Request request) {

+		final Request theRequest = request;

+		try {

+			getEditingDomain().runExclusive(new Runnable() {

+

+				public void run() {

+					if (isActive() && isEditable()) {

+						if (theRequest

+								.getExtendedData()

+								.get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {

+							Character initialChar = (Character) theRequest

+									.getExtendedData()

+									.get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);

+							performDirectEdit(initialChar.charValue());

+						} else if ((theRequest instanceof DirectEditRequest)

+								&& (getEditText().equals(getLabelText()))) {

+							DirectEditRequest editRequest = (DirectEditRequest) theRequest;

+							performDirectEdit(editRequest.getLocation());

+						} else {

+							performDirectEdit();

+						}

+					}

+				}

+			});

+		} catch (InterruptedException e) {

+			e.printStackTrace();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshVisuals() {

+		super.refreshVisuals();

+		refreshLabel();

+		refreshFont();

+		refreshFontColor();

+		refreshUnderline();

+		refreshStrikeThrough();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshLabel() {

+		setLabelTextHelper(getFigure(), getLabelText());

+		setLabelIconHelper(getFigure(), getLabelIcon());

+		refreshSelectionFeedback();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshUnderline() {

+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(

+				NotationPackage.eINSTANCE.getFontStyle());

+		if (style != null && getFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getFigure()).setTextUnderline(style.isUnderline());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshStrikeThrough() {

+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(

+				NotationPackage.eINSTANCE.getFontStyle());

+		if (style != null && getFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getFigure()).setTextStrikeThrough(style

+					.isStrikeThrough());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshFont() {

+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(

+				NotationPackage.eINSTANCE.getFontStyle());

+		if (style != null) {

+			FontData fontData = new FontData(style.getFontName(),

+					style.getFontHeight(), (style.isBold() ? SWT.BOLD

+							: SWT.NORMAL)

+							| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));

+			setFont(fontData);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private void refreshSelectionFeedback() {

+		requestEditPolicyFeedbackRefresh(EditPolicy.PRIMARY_DRAG_ROLE);

+		requestEditPolicyFeedbackRefresh(EditPolicy.SELECTION_FEEDBACK_ROLE);

+	}

+

+	/**

+	 * @generated

+	 */

+	private void requestEditPolicyFeedbackRefresh(String editPolicyKey) {

+		Object editPolicy = getEditPolicy(editPolicyKey);

+		if (editPolicy instanceof IRefreshableFeedbackEditPolicy) {

+			((IRefreshableFeedbackEditPolicy) editPolicy).refreshFeedback();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setFontColor(Color color) {

+		getFigure().setForegroundColor(color);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void addSemanticListeners() {

+		if (getParser() instanceof ISemanticParser) {

+			EObject element = resolveSemanticElement();

+			parserElements = ((ISemanticParser) getParser())

+					.getSemanticElementsBeingParsed(element);

+			for (int i = 0; i < parserElements.size(); i++) {

+				addListenerFilter(

+						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$

+			}

+		} else {

+			super.addSemanticListeners();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void removeSemanticListeners() {

+		if (parserElements != null) {

+			for (int i = 0; i < parserElements.size(); i++) {

+				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$

+			}

+		} else {

+			super.removeSemanticListeners();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected AccessibleEditPart getAccessibleEditPart() {

+		if (accessibleEP == null) {

+			accessibleEP = new AccessibleGraphicalEditPart() {

+

+				public void getName(AccessibleEvent e) {

+					e.result = getLabelTextHelper(getFigure());

+				}

+			};

+		}

+		return accessibleEP;

+	}

+

+	/**

+	 * @generated

+	 */

+	private View getFontStyleOwnerView() {

+		return getPrimaryView();

+	}

+

+	/**

+	 * @generated

+	 */

+	private ILabelDelegate getLabelDelegate() {

+		if (labelDelegate == null) {

+			IFigure label = getFigure();

+			if (label instanceof WrappingLabel) {

+				labelDelegate = new WrappingLabelDelegate((WrappingLabel) label);

+			} else {

+				labelDelegate = new SimpleLabelDelegate((Label) label);

+			}

+		}

+		return labelDelegate;

+	}

+

+	/**

+	 * @generated

+	 */

+	@Override

+	public Object getAdapter(Class key) {

+		if (ILabelDelegate.class.equals(key)) {

+			return getLabelDelegate();

+		}

+		return super.getAdapter(key);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void addNotationalListeners() {

+		super.addNotationalListeners();

+		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void removeNotationalListeners() {

+		super.removeNotationalListeners();

+		removeListenerFilter("PrimaryView"); //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void handleNotificationEvent(Notification event) {

+		Object feature = event.getFeature();

+		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {

+			Integer c = (Integer) event.getNewValue();

+			setFontColor(DiagramColorRegistry.getInstance().getColor(c));

+		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(

+				feature)) {

+			refreshUnderline();

+		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()

+				.equals(feature)) {

+			refreshStrikeThrough();

+		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(

+				feature)

+				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(

+						feature)

+				|| NotationPackage.eINSTANCE.getFontStyle_Bold()

+						.equals(feature)

+				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(

+						feature)) {

+			refreshFont();

+		} else {

+			if (getParser() != null

+					&& getParser().isAffectingEvent(event,

+							getParserOptions().intValue())) {

+				refreshLabel();

+			}

+			if (getParser() instanceof ISemanticParser) {

+				ISemanticParser modelParser = (ISemanticParser) getParser();

+				if (modelParser.areSemanticElementsAffected(null, event)) {

+					removeSemanticListeners();

+					if (resolveSemanticElement() != null) {

+						addSemanticListeners();

+					}

+					refreshLabel();

+				}

+			}

+		}

+		super.handleNotificationEvent(event);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure createFigure() {

+		// Parent should assign one using setLabel() method

+		return null;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ProcessEditPart.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ProcessEditPart.java
new file mode 100755
index 0000000..1ed5a63
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ProcessEditPart.java
@@ -0,0 +1,370 @@
+package org.eclipse.soa.mangrove.diagram.edit.parts;

+

+import java.util.ArrayList;

+import java.util.LinkedList;

+import java.util.List;

+

+import org.eclipse.draw2d.FreeformLayout;

+import org.eclipse.draw2d.IFigure;

+import org.eclipse.draw2d.MarginBorder;

+import org.eclipse.draw2d.RectangleFigure;

+import org.eclipse.draw2d.Shape;

+import org.eclipse.draw2d.StackLayout;

+import org.eclipse.draw2d.XYLayout;

+import org.eclipse.draw2d.geometry.Rectangle;

+import org.eclipse.gef.EditPart;

+import org.eclipse.gef.EditPolicy;

+import org.eclipse.gef.editpolicies.LayoutEditPolicy;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ResizableShapeEditPolicy;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.XYLayoutEditPolicy;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;

+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.gmf.tooling.runtime.edit.policies.reparent.CreationEditPolicyWithCustomReparent;

+import org.eclipse.soa.mangrove.diagram.edit.policies.ProcessCanonicalEditPolicy;

+import org.eclipse.soa.mangrove.diagram.edit.policies.ProcessItemSemanticEditPolicy;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+import org.eclipse.swt.graphics.Color;

+

+/**

+ * @generated

+ */

+public class ProcessEditPart extends ShapeNodeEditPart {

+

+	/**

+	 * @generated

+	 */

+	public static final int VISUAL_ID = 3007;

+

+	/**

+	 * @generated

+	 */

+	protected IFigure contentPane;

+

+	/**

+	 * @generated

+	 */

+	protected IFigure primaryShape;

+

+	/**

+	 * @generated

+	 */

+	public ProcessEditPart(View view) {

+		super(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void createDefaultEditPolicies() {

+		installEditPolicy(EditPolicyRoles.CREATION_ROLE,

+				new CreationEditPolicyWithCustomReparent(

+						IntermediateModelVisualIDRegistry.TYPED_INSTANCE));

+		super.createDefaultEditPolicies();

+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,

+				new ProcessItemSemanticEditPolicy());

+		installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE,

+				new DragDropEditPolicy());

+		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,

+				new ProcessCanonicalEditPolicy());

+		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());

+		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies

+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected LayoutEditPolicy createLayoutEditPolicy() {

+		XYLayoutEditPolicy lep = new XYLayoutEditPolicy() {

+

+			protected EditPolicy createChildEditPolicy(EditPart child) {

+				EditPolicy result = super.createChildEditPolicy(child);

+				if (result == null) {

+					return new ResizableShapeEditPolicy();

+				}

+				return result;

+			}

+		};

+		return lep;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure createNodeShape() {

+		return primaryShape = new ProcessFigure() {

+			protected boolean useLocalCoordinates() {

+				return true;

+			}

+		};

+	}

+

+	/**

+	 * @generated

+	 */

+	public ProcessFigure getPrimaryShape() {

+		return (ProcessFigure) primaryShape;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean addFixedChild(EditPart childEditPart) {

+		if (childEditPart instanceof ProcessNameEditPart) {

+			((ProcessNameEditPart) childEditPart).setLabel(getPrimaryShape()

+					.getFigureProcessNameFigure());

+			return true;

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean removeFixedChild(EditPart childEditPart) {

+		if (childEditPart instanceof ProcessNameEditPart) {

+			return true;

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void addChildVisual(EditPart childEditPart, int index) {

+		if (addFixedChild(childEditPart)) {

+			return;

+		}

+		super.addChildVisual(childEditPart, -1);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void removeChildVisual(EditPart childEditPart) {

+		if (removeFixedChild(childEditPart)) {

+			return;

+		}

+		super.removeChildVisual(childEditPart);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {

+		return getContentPane();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected NodeFigure createNodePlate() {

+		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);

+		return result;

+	}

+

+	/**

+	 * Creates figure for this edit part.

+	 * 

+	 * Body of this method does not depend on settings in generation model

+	 * so you may safely remove <i>generated</i> tag and modify it.

+	 * 

+	 * @generated

+	 */

+	protected NodeFigure createNodeFigure() {

+		NodeFigure figure = createNodePlate();

+		figure.setLayoutManager(new StackLayout());

+		IFigure shape = createNodeShape();

+		figure.add(shape);

+		contentPane = setupContentPane(shape);

+		return figure;

+	}

+

+	/**

+	 * Default implementation treats passed figure as content pane.

+	 * Respects layout one may have set for generated figure.

+	 * @param nodeShape instance of generated figure class

+	 * @generated

+	 */

+	protected IFigure setupContentPane(IFigure nodeShape) {

+		if (nodeShape.getLayoutManager() == null) {

+			nodeShape.setLayoutManager(new FreeformLayout() {

+

+				public Object getConstraint(IFigure figure) {

+					Object result = constraints.get(figure);

+					if (result == null) {

+						result = new Rectangle(0, 0, -1, -1);

+					}

+					return result;

+				}

+			});

+		}

+		return nodeShape; // use nodeShape itself as contentPane

+	}

+

+	/**

+	 * @generated

+	 */

+	public IFigure getContentPane() {

+		if (contentPane != null) {

+			return contentPane;

+		}

+		return super.getContentPane();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setForegroundColor(Color color) {

+		if (primaryShape != null) {

+			primaryShape.setForegroundColor(color);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setBackgroundColor(Color color) {

+		if (primaryShape != null) {

+			primaryShape.setBackgroundColor(color);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLineWidth(int width) {

+		if (primaryShape instanceof Shape) {

+			((Shape) primaryShape).setLineWidth(width);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLineType(int style) {

+		if (primaryShape instanceof Shape) {

+			((Shape) primaryShape).setLineStyle(style);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public EditPart getPrimaryChildEditPart() {

+		return getChildBySemanticHint(IntermediateModelVisualIDRegistry

+				.getType(ProcessNameEditPart.VISUAL_ID));

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMARelTypesOnSource() {

+		ArrayList<IElementType> types = new ArrayList<IElementType>(1);

+		types.add(IntermediateModelElementTypes.ServiceNeeds_4011);

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMARelTypesOnSourceAndTarget(

+			IGraphicalEditPart targetEditPart) {

+		LinkedList<IElementType> types = new LinkedList<IElementType>();

+		if (targetEditPart instanceof org.eclipse.soa.mangrove.diagram.edit.parts.ProcessEditPart) {

+			types.add(IntermediateModelElementTypes.ServiceNeeds_4011);

+		}

+		if (targetEditPart instanceof ServiceEditPart) {

+			types.add(IntermediateModelElementTypes.ServiceNeeds_4011);

+		}

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMATypesForTarget(IElementType relationshipType) {

+		LinkedList<IElementType> types = new LinkedList<IElementType>();

+		if (relationshipType == IntermediateModelElementTypes.ServiceNeeds_4011) {

+			types.add(IntermediateModelElementTypes.Process_3007);

+			types.add(IntermediateModelElementTypes.Service_3009);

+		}

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMARelTypesOnTarget() {

+		ArrayList<IElementType> types = new ArrayList<IElementType>(2);

+		types.add(IntermediateModelElementTypes.StepServiceModel_4010);

+		types.add(IntermediateModelElementTypes.ServiceNeeds_4011);

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMATypesForSource(IElementType relationshipType) {

+		LinkedList<IElementType> types = new LinkedList<IElementType>();

+		if (relationshipType == IntermediateModelElementTypes.StepServiceModel_4010) {

+			types.add(IntermediateModelElementTypes.Step_3008);

+		} else if (relationshipType == IntermediateModelElementTypes.ServiceNeeds_4011) {

+			types.add(IntermediateModelElementTypes.Process_3007);

+			types.add(IntermediateModelElementTypes.Service_3009);

+		}

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public class ProcessFigure extends RectangleFigure {

+

+		/**

+		 * @generated

+		 */

+		private WrappingLabel fFigureProcessNameFigure;

+

+		/**

+		 * @generated

+		 */

+		public ProcessFigure() {

+			this.setLayoutManager(new XYLayout());

+			this.setBorder(new MarginBorder(getMapMode().DPtoLP(10),

+					getMapMode().DPtoLP(10), getMapMode().DPtoLP(10),

+					getMapMode().DPtoLP(10)));

+			createContents();

+		}

+

+		/**

+		 * @generated

+		 */

+		private void createContents() {

+

+			fFigureProcessNameFigure = new WrappingLabel();

+

+			fFigureProcessNameFigure.setText("Process");

+

+			this.add(fFigureProcessNameFigure);

+

+		}

+

+		/**

+		 * @generated

+		 */

+		public WrappingLabel getFigureProcessNameFigure() {

+			return fFigureProcessNameFigure;

+		}

+

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ProcessNameEditPart.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ProcessNameEditPart.java
new file mode 100755
index 0000000..661a56c
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ProcessNameEditPart.java
@@ -0,0 +1,658 @@
+package org.eclipse.soa.mangrove.diagram.edit.parts;

+

+import java.util.Collections;

+import java.util.List;

+

+import org.eclipse.draw2d.IFigure;

+import org.eclipse.draw2d.Label;

+import org.eclipse.draw2d.geometry.Dimension;

+import org.eclipse.draw2d.geometry.Point;

+import org.eclipse.draw2d.geometry.Rectangle;

+import org.eclipse.emf.common.notify.Notification;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.transaction.RunnableWithResult;

+import org.eclipse.gef.AccessibleEditPart;

+import org.eclipse.gef.EditPolicy;

+import org.eclipse.gef.GraphicalEditPart;

+import org.eclipse.gef.Request;

+import org.eclipse.gef.requests.DirectEditRequest;

+import org.eclipse.gef.tools.DirectEditManager;

+import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;

+import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;

+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;

+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;

+import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;

+import org.eclipse.gmf.runtime.diagram.ui.label.ILabelDelegate;

+import org.eclipse.gmf.runtime.diagram.ui.label.WrappingLabelDelegate;

+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;

+import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;

+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;

+import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;

+import org.eclipse.gmf.runtime.notation.FontStyle;

+import org.eclipse.gmf.runtime.notation.NotationPackage;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.gmf.tooling.runtime.directedit.TextDirectEditManager2;

+import org.eclipse.gmf.tooling.runtime.draw2d.labels.SimpleLabelDelegate;

+import org.eclipse.gmf.tooling.runtime.edit.policies.labels.IRefreshableFeedbackEditPolicy;

+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;

+import org.eclipse.jface.viewers.ICellEditorValidator;

+import org.eclipse.soa.mangrove.diagram.edit.policies.IntermediateModelTextSelectionEditPolicy;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelParserProvider;

+import org.eclipse.swt.SWT;

+import org.eclipse.swt.accessibility.AccessibleEvent;

+import org.eclipse.swt.graphics.Color;

+import org.eclipse.swt.graphics.FontData;

+import org.eclipse.swt.graphics.Image;

+

+/**

+ * @generated

+ */

+public class ProcessNameEditPart extends CompartmentEditPart implements

+		ITextAwareEditPart {

+

+	/**

+	 * @generated

+	 */

+	public static final int VISUAL_ID = 5010;

+

+	/**

+	 * @generated

+	 */

+	private DirectEditManager manager;

+

+	/**

+	 * @generated

+	 */

+	private IParser parser;

+

+	/**

+	 * @generated

+	 */

+	private List<?> parserElements;

+

+	/**

+	 * @generated

+	 */

+	private String defaultText;

+

+	/**

+	 * @generated

+	 */

+	private ILabelDelegate labelDelegate;

+

+	/**

+	 * @generated

+	 */

+	public ProcessNameEditPart(View view) {

+		super(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void createDefaultEditPolicies() {

+		super.createDefaultEditPolicies();

+		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,

+				new IntermediateModelTextSelectionEditPolicy());

+		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,

+				new LabelDirectEditPolicy());

+		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,

+				new StpIntermediateModelEditPart.NodeLabelDragPolicy());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected String getLabelTextHelper(IFigure figure) {

+		if (figure instanceof WrappingLabel) {

+			return ((WrappingLabel) figure).getText();

+		} else if (figure instanceof Label) {

+			return ((Label) figure).getText();

+		} else {

+			return getLabelDelegate().getText();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLabelTextHelper(IFigure figure, String text) {

+		if (figure instanceof WrappingLabel) {

+			((WrappingLabel) figure).setText(text);

+		} else if (figure instanceof Label) {

+			((Label) figure).setText(text);

+		} else {

+			getLabelDelegate().setText(text);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Image getLabelIconHelper(IFigure figure) {

+		if (figure instanceof WrappingLabel) {

+			return ((WrappingLabel) figure).getIcon();

+		} else if (figure instanceof Label) {

+			return ((Label) figure).getIcon();

+		} else {

+			return getLabelDelegate().getIcon(0);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLabelIconHelper(IFigure figure, Image icon) {

+		if (figure instanceof WrappingLabel) {

+			((WrappingLabel) figure).setIcon(icon);

+			return;

+		} else if (figure instanceof Label) {

+			((Label) figure).setIcon(icon);

+			return;

+		} else {

+			getLabelDelegate().setIcon(icon, 0);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setLabel(WrappingLabel figure) {

+		unregisterVisuals();

+		setFigure(figure);

+		defaultText = getLabelTextHelper(figure);

+		registerVisuals();

+		refreshVisuals();

+	}

+

+	/**

+	 * @generated

+	 */

+	@SuppressWarnings("rawtypes")

+	protected List getModelChildren() {

+		return Collections.EMPTY_LIST;

+	}

+

+	/**

+	 * @generated

+	 */

+	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected EObject getParserElement() {

+		return resolveSemanticElement();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Image getLabelIcon() {

+		EObject parserElement = getParserElement();

+		if (parserElement == null) {

+			return null;

+		}

+		return IntermediateModelElementTypes.getImage(parserElement.eClass());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected String getLabelText() {

+		String text = null;

+		EObject parserElement = getParserElement();

+		if (parserElement != null && getParser() != null) {

+			text = getParser().getPrintString(

+					new EObjectAdapter(parserElement),

+					getParserOptions().intValue());

+		}

+		if (text == null || text.length() == 0) {

+			text = defaultText;

+		}

+		return text;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setLabelText(String text) {

+		setLabelTextHelper(getFigure(), text);

+		refreshSelectionFeedback();

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getEditText() {

+		if (getParserElement() == null || getParser() == null) {

+			return ""; //$NON-NLS-1$

+		}

+		return getParser().getEditString(

+				new EObjectAdapter(getParserElement()),

+				getParserOptions().intValue());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean isEditable() {

+		return getParser() != null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public ICellEditorValidator getEditTextValidator() {

+		return new ICellEditorValidator() {

+

+			public String isValid(final Object value) {

+				if (value instanceof String) {

+					final EObject element = getParserElement();

+					final IParser parser = getParser();

+					try {

+						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()

+								.runExclusive(

+										new RunnableWithResult.Impl<IParserEditStatus>() {

+

+											public void run() {

+												setResult(parser

+														.isValidEditString(

+																new EObjectAdapter(

+																		element),

+																(String) value));

+											}

+										});

+						return valid.getCode() == ParserEditStatus.EDITABLE ? null

+								: valid.getMessage();

+					} catch (InterruptedException ie) {

+						ie.printStackTrace();

+					}

+				}

+

+				// shouldn't get here

+				return null;

+			}

+		};

+	}

+

+	/**

+	 * @generated

+	 */

+	public IContentAssistProcessor getCompletionProcessor() {

+		if (getParserElement() == null || getParser() == null) {

+			return null;

+		}

+		return getParser().getCompletionProcessor(

+				new EObjectAdapter(getParserElement()));

+	}

+

+	/**

+	 * @generated

+	 */

+	public ParserOptions getParserOptions() {

+		return ParserOptions.NONE;

+	}

+

+	/**

+	 * @generated

+	 */

+	public IParser getParser() {

+		if (parser == null) {

+			parser = IntermediateModelParserProvider

+					.getParser(

+							IntermediateModelElementTypes.Process_3007,

+							getParserElement(),

+							IntermediateModelVisualIDRegistry

+									.getType(org.eclipse.soa.mangrove.diagram.edit.parts.ProcessNameEditPart.VISUAL_ID));

+		}

+		return parser;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected DirectEditManager getManager() {

+		if (manager == null) {

+			setManager(new TextDirectEditManager2(this, null,

+					IntermediateModelEditPartFactory

+							.getTextCellEditorLocator(this)));

+		}

+		return manager;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setManager(DirectEditManager manager) {

+		this.manager = manager;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void performDirectEdit() {

+		getManager().show();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void performDirectEdit(Point eventLocation) {

+		if (getManager().getClass() == TextDirectEditManager2.class) {

+			((TextDirectEditManager2) getManager()).show(eventLocation

+					.getSWTPoint());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private void performDirectEdit(char initialCharacter) {

+		if (getManager() instanceof TextDirectEditManager) {

+			((TextDirectEditManager) getManager()).show(initialCharacter);

+		} else // 

+		if (getManager() instanceof TextDirectEditManager2) {

+			((TextDirectEditManager2) getManager()).show(initialCharacter);

+		} else //

+		{

+			performDirectEdit();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void performDirectEditRequest(Request request) {

+		final Request theRequest = request;

+		try {

+			getEditingDomain().runExclusive(new Runnable() {

+

+				public void run() {

+					if (isActive() && isEditable()) {

+						if (theRequest

+								.getExtendedData()

+								.get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {

+							Character initialChar = (Character) theRequest

+									.getExtendedData()

+									.get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);

+							performDirectEdit(initialChar.charValue());

+						} else if ((theRequest instanceof DirectEditRequest)

+								&& (getEditText().equals(getLabelText()))) {

+							DirectEditRequest editRequest = (DirectEditRequest) theRequest;

+							performDirectEdit(editRequest.getLocation());

+						} else {

+							performDirectEdit();

+						}

+					}

+				}

+			});

+		} catch (InterruptedException e) {

+			e.printStackTrace();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshVisuals() {

+		super.refreshVisuals();

+		refreshLabel();

+		refreshFont();

+		refreshFontColor();

+		refreshUnderline();

+		refreshStrikeThrough();

+		refreshBounds();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshLabel() {

+		setLabelTextHelper(getFigure(), getLabelText());

+		setLabelIconHelper(getFigure(), getLabelIcon());

+		refreshSelectionFeedback();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshUnderline() {

+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(

+				NotationPackage.eINSTANCE.getFontStyle());

+		if (style != null && getFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getFigure()).setTextUnderline(style.isUnderline());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshStrikeThrough() {

+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(

+				NotationPackage.eINSTANCE.getFontStyle());

+		if (style != null && getFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getFigure()).setTextStrikeThrough(style

+					.isStrikeThrough());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshFont() {

+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(

+				NotationPackage.eINSTANCE.getFontStyle());

+		if (style != null) {

+			FontData fontData = new FontData(style.getFontName(),

+					style.getFontHeight(), (style.isBold() ? SWT.BOLD

+							: SWT.NORMAL)

+							| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));

+			setFont(fontData);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private void refreshSelectionFeedback() {

+		requestEditPolicyFeedbackRefresh(EditPolicy.PRIMARY_DRAG_ROLE);

+		requestEditPolicyFeedbackRefresh(EditPolicy.SELECTION_FEEDBACK_ROLE);

+	}

+

+	/**

+	 * @generated

+	 */

+	private void requestEditPolicyFeedbackRefresh(String editPolicyKey) {

+		Object editPolicy = getEditPolicy(editPolicyKey);

+		if (editPolicy instanceof IRefreshableFeedbackEditPolicy) {

+			((IRefreshableFeedbackEditPolicy) editPolicy).refreshFeedback();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setFontColor(Color color) {

+		getFigure().setForegroundColor(color);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void addSemanticListeners() {

+		if (getParser() instanceof ISemanticParser) {

+			EObject element = resolveSemanticElement();

+			parserElements = ((ISemanticParser) getParser())

+					.getSemanticElementsBeingParsed(element);

+			for (int i = 0; i < parserElements.size(); i++) {

+				addListenerFilter(

+						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$

+			}

+		} else {

+			super.addSemanticListeners();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void removeSemanticListeners() {

+		if (parserElements != null) {

+			for (int i = 0; i < parserElements.size(); i++) {

+				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$

+			}

+		} else {

+			super.removeSemanticListeners();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected AccessibleEditPart getAccessibleEditPart() {

+		if (accessibleEP == null) {

+			accessibleEP = new AccessibleGraphicalEditPart() {

+

+				public void getName(AccessibleEvent e) {

+					e.result = getLabelTextHelper(getFigure());

+				}

+			};

+		}

+		return accessibleEP;

+	}

+

+	/**

+	 * @generated

+	 */

+	private View getFontStyleOwnerView() {

+		return getPrimaryView();

+	}

+

+	/**

+	 * @generated

+	 */

+	private ILabelDelegate getLabelDelegate() {

+		if (labelDelegate == null) {

+			IFigure label = getFigure();

+			if (label instanceof WrappingLabel) {

+				labelDelegate = new WrappingLabelDelegate((WrappingLabel) label);

+			} else {

+				labelDelegate = new SimpleLabelDelegate((Label) label);

+			}

+		}

+		return labelDelegate;

+	}

+

+	/**

+	 * @generated

+	 */

+	@Override

+	public Object getAdapter(Class key) {

+		if (ILabelDelegate.class.equals(key)) {

+			return getLabelDelegate();

+		}

+		return super.getAdapter(key);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void addNotationalListeners() {

+		super.addNotationalListeners();

+		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void removeNotationalListeners() {

+		super.removeNotationalListeners();

+		removeListenerFilter("PrimaryView"); //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshBounds() {

+		int width = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE

+				.getSize_Width())).intValue();

+		int height = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE

+				.getSize_Height())).intValue();

+		Dimension size = new Dimension(width, height);

+		int x = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE

+				.getLocation_X())).intValue();

+		int y = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE

+				.getLocation_Y())).intValue();

+		Point loc = new Point(x, y);

+		((GraphicalEditPart) getParent()).setLayoutConstraint(this,

+				getFigure(), new Rectangle(loc, size));

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void handleNotificationEvent(Notification event) {

+		Object feature = event.getFeature();

+		if (NotationPackage.eINSTANCE.getSize_Width().equals(feature)

+				|| NotationPackage.eINSTANCE.getSize_Height().equals(feature)

+				|| NotationPackage.eINSTANCE.getLocation_X().equals(feature)

+				|| NotationPackage.eINSTANCE.getLocation_Y().equals(feature)) {

+			refreshBounds();

+		}

+		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {

+			Integer c = (Integer) event.getNewValue();

+			setFontColor(DiagramColorRegistry.getInstance().getColor(c));

+		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(

+				feature)) {

+			refreshUnderline();

+		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()

+				.equals(feature)) {

+			refreshStrikeThrough();

+		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(

+				feature)

+				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(

+						feature)

+				|| NotationPackage.eINSTANCE.getFontStyle_Bold()

+						.equals(feature)

+				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(

+						feature)) {

+			refreshFont();

+		} else {

+			if (getParser() != null

+					&& getParser().isAffectingEvent(event,

+							getParserOptions().intValue())) {

+				refreshLabel();

+			}

+			if (getParser() instanceof ISemanticParser) {

+				ISemanticParser modelParser = (ISemanticParser) getParser();

+				if (modelParser.areSemanticElementsAffected(null, event)) {

+					removeSemanticListeners();

+					if (resolveSemanticElement() != null) {

+						addSemanticListeners();

+					}

+					refreshLabel();

+				}

+			}

+		}

+		super.handleNotificationEvent(event);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure createFigure() {

+		// Parent should assign one using setLabel() method

+		return null;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ServiceCollectionEditPart.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ServiceCollectionEditPart.java
new file mode 100755
index 0000000..9fd5d15
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ServiceCollectionEditPart.java
@@ -0,0 +1,248 @@
+package org.eclipse.soa.mangrove.diagram.edit.parts;

+

+import org.eclipse.draw2d.ColorConstants;

+import org.eclipse.draw2d.FlowLayout;

+import org.eclipse.draw2d.IFigure;

+import org.eclipse.draw2d.MarginBorder;

+import org.eclipse.draw2d.RectangleFigure;

+import org.eclipse.draw2d.Shape;

+import org.eclipse.draw2d.StackLayout;

+import org.eclipse.gef.EditPart;

+import org.eclipse.gef.EditPolicy;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gef.editpolicies.LayoutEditPolicy;

+import org.eclipse.gef.requests.CreateRequest;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.FlowLayoutEditPolicy;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;

+import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;

+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.gmf.tooling.runtime.edit.policies.reparent.CreationEditPolicyWithCustomReparent;

+import org.eclipse.soa.mangrove.diagram.edit.policies.ServiceCollectionCanonicalEditPolicy;

+import org.eclipse.soa.mangrove.diagram.edit.policies.ServiceCollectionItemSemanticEditPolicy;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.swt.graphics.Color;

+

+/**

+ * @generated

+ */

+public class ServiceCollectionEditPart extends ShapeNodeEditPart {

+

+	/**

+	 * @generated

+	 */

+	public static final int VISUAL_ID = 2006;

+

+	/**

+	 * @generated

+	 */

+	protected IFigure contentPane;

+

+	/**

+	 * @generated

+	 */

+	protected IFigure primaryShape;

+

+	/**

+	 * @generated

+	 */

+	public ServiceCollectionEditPart(View view) {

+		super(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void createDefaultEditPolicies() {

+		installEditPolicy(EditPolicyRoles.CREATION_ROLE,

+				new CreationEditPolicyWithCustomReparent(

+						IntermediateModelVisualIDRegistry.TYPED_INSTANCE));

+		super.createDefaultEditPolicies();

+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,

+				new ServiceCollectionItemSemanticEditPolicy());

+		installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE,

+				new DragDropEditPolicy());

+		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,

+				new ServiceCollectionCanonicalEditPolicy());

+		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());

+		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies

+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected LayoutEditPolicy createLayoutEditPolicy() {

+

+		FlowLayoutEditPolicy lep = new FlowLayoutEditPolicy() {

+

+			protected Command createAddCommand(EditPart child, EditPart after) {

+				return null;

+			}

+

+			protected Command createMoveChildCommand(EditPart child,

+					EditPart after) {

+				return null;

+			}

+

+			protected Command getCreateCommand(CreateRequest request) {

+				return null;

+			}

+		};

+		return lep;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure createNodeShape() {

+		return primaryShape = new ServiceCollectionFigure();

+	}

+

+	/**

+	 * @generated

+	 */

+	public ServiceCollectionFigure getPrimaryShape() {

+		return (ServiceCollectionFigure) primaryShape;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected NodeFigure createNodePlate() {

+		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);

+		return result;

+	}

+

+	/**

+	 * Creates figure for this edit part.

+	 * 

+	 * Body of this method does not depend on settings in generation model

+	 * so you may safely remove <i>generated</i> tag and modify it.

+	 * 

+	 * @generated

+	 */

+	protected NodeFigure createNodeFigure() {

+		NodeFigure figure = createNodePlate();

+		figure.setLayoutManager(new StackLayout());

+		IFigure shape = createNodeShape();

+		figure.add(shape);

+		contentPane = setupContentPane(shape);

+		return figure;

+	}

+

+	/**

+	 * Default implementation treats passed figure as content pane.

+	 * Respects layout one may have set for generated figure.

+	 * @param nodeShape instance of generated figure class

+	 * @generated

+	 */

+	protected IFigure setupContentPane(IFigure nodeShape) {

+		if (nodeShape.getLayoutManager() == null) {

+			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();

+			layout.setSpacing(5);

+			nodeShape.setLayoutManager(layout);

+		}

+		return nodeShape; // use nodeShape itself as contentPane

+	}

+

+	/**

+	 * @generated

+	 */

+	public IFigure getContentPane() {

+		if (contentPane != null) {

+			return contentPane;

+		}

+		return super.getContentPane();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setForegroundColor(Color color) {

+		if (primaryShape != null) {

+			primaryShape.setForegroundColor(color);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setBackgroundColor(Color color) {

+		if (primaryShape != null) {

+			primaryShape.setBackgroundColor(color);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLineWidth(int width) {

+		if (primaryShape instanceof Shape) {

+			((Shape) primaryShape).setLineWidth(width);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLineType(int style) {

+		if (primaryShape instanceof Shape) {

+			((Shape) primaryShape).setLineStyle(style);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public class ServiceCollectionFigure extends RectangleFigure {

+

+		/**

+		 * @generated

+		 */

+		public ServiceCollectionFigure() {

+

+			FlowLayout layoutThis = new FlowLayout();

+			layoutThis.setStretchMinorAxis(false);

+			layoutThis.setMinorAlignment(FlowLayout.ALIGN_LEFTTOP);

+

+			layoutThis.setMajorAlignment(FlowLayout.ALIGN_LEFTTOP);

+			layoutThis.setMajorSpacing(20);

+			layoutThis.setMinorSpacing(20);

+			layoutThis.setHorizontal(false);

+

+			this.setLayoutManager(layoutThis);

+

+			this.setBackgroundColor(THIS_BACK);

+			this.setBorder(new MarginBorder(getMapMode().DPtoLP(10),

+					getMapMode().DPtoLP(10), getMapMode().DPtoLP(10),

+					getMapMode().DPtoLP(10)));

+			createContents();

+		}

+

+		/**

+		 * @generated

+		 */

+		private void createContents() {

+

+			WrappingLabel serviceCollection0 = new WrappingLabel();

+

+			serviceCollection0.setText("Service Collection");

+			serviceCollection0.setForegroundColor(ColorConstants.black);

+

+			this.add(serviceCollection0);

+

+		}

+

+	}

+

+	/**

+	 * @generated

+	 */

+	static final Color THIS_BACK = new Color(null, 176, 220, 255);

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ServiceEditPart.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ServiceEditPart.java
new file mode 100755
index 0000000..0cacc5f
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ServiceEditPart.java
@@ -0,0 +1,371 @@
+package org.eclipse.soa.mangrove.diagram.edit.parts;

+

+import java.util.ArrayList;

+import java.util.LinkedList;

+import java.util.List;

+

+import org.eclipse.draw2d.ColorConstants;

+import org.eclipse.draw2d.FlowLayout;

+import org.eclipse.draw2d.IFigure;

+import org.eclipse.draw2d.MarginBorder;

+import org.eclipse.draw2d.RoundedRectangle;

+import org.eclipse.draw2d.Shape;

+import org.eclipse.draw2d.StackLayout;

+import org.eclipse.draw2d.geometry.Dimension;

+import org.eclipse.gef.EditPart;

+import org.eclipse.gef.EditPolicy;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gef.editpolicies.LayoutEditPolicy;

+import org.eclipse.gef.requests.CreateRequest;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.FlowLayoutEditPolicy;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;

+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.diagram.edit.policies.ServiceItemSemanticEditPolicy;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+import org.eclipse.swt.graphics.Color;

+

+/**

+ * @generated

+ */

+public class ServiceEditPart extends ShapeNodeEditPart {

+

+	/**

+	 * @generated

+	 */

+	public static final int VISUAL_ID = 3009;

+

+	/**

+	 * @generated

+	 */

+	protected IFigure contentPane;

+

+	/**

+	 * @generated

+	 */

+	protected IFigure primaryShape;

+

+	/**

+	 * @generated

+	 */

+	public ServiceEditPart(View view) {

+		super(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void createDefaultEditPolicies() {

+		super.createDefaultEditPolicies();

+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,

+				new ServiceItemSemanticEditPolicy());

+		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());

+		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies

+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected LayoutEditPolicy createLayoutEditPolicy() {

+

+		FlowLayoutEditPolicy lep = new FlowLayoutEditPolicy() {

+

+			protected Command createAddCommand(EditPart child, EditPart after) {

+				return null;

+			}

+

+			protected Command createMoveChildCommand(EditPart child,

+					EditPart after) {

+				return null;

+			}

+

+			protected Command getCreateCommand(CreateRequest request) {

+				return null;

+			}

+		};

+		return lep;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure createNodeShape() {

+		return primaryShape = new ServiceFigure();

+	}

+

+	/**

+	 * @generated

+	 */

+	public ServiceFigure getPrimaryShape() {

+		return (ServiceFigure) primaryShape;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean addFixedChild(EditPart childEditPart) {

+		if (childEditPart instanceof ServiceServiceNameEditPart) {

+			((ServiceServiceNameEditPart) childEditPart)

+					.setLabel(getPrimaryShape().getFigureServiceNameFigure());

+			return true;

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean removeFixedChild(EditPart childEditPart) {

+		if (childEditPart instanceof ServiceServiceNameEditPart) {

+			return true;

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void addChildVisual(EditPart childEditPart, int index) {

+		if (addFixedChild(childEditPart)) {

+			return;

+		}

+		super.addChildVisual(childEditPart, -1);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void removeChildVisual(EditPart childEditPart) {

+		if (removeFixedChild(childEditPart)) {

+			return;

+		}

+		super.removeChildVisual(childEditPart);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {

+		return getContentPane();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected NodeFigure createNodePlate() {

+		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);

+		return result;

+	}

+

+	/**

+	 * Creates figure for this edit part.

+	 * 

+	 * Body of this method does not depend on settings in generation model

+	 * so you may safely remove <i>generated</i> tag and modify it.

+	 * 

+	 * @generated

+	 */

+	protected NodeFigure createNodeFigure() {

+		NodeFigure figure = createNodePlate();

+		figure.setLayoutManager(new StackLayout());

+		IFigure shape = createNodeShape();

+		figure.add(shape);

+		contentPane = setupContentPane(shape);

+		return figure;

+	}

+

+	/**

+	 * Default implementation treats passed figure as content pane.

+	 * Respects layout one may have set for generated figure.

+	 * @param nodeShape instance of generated figure class

+	 * @generated

+	 */

+	protected IFigure setupContentPane(IFigure nodeShape) {

+		if (nodeShape.getLayoutManager() == null) {

+			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();

+			layout.setSpacing(5);

+			nodeShape.setLayoutManager(layout);

+		}

+		return nodeShape; // use nodeShape itself as contentPane

+	}

+

+	/**

+	 * @generated

+	 */

+	public IFigure getContentPane() {

+		if (contentPane != null) {

+			return contentPane;

+		}

+		return super.getContentPane();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setForegroundColor(Color color) {

+		if (primaryShape != null) {

+			primaryShape.setForegroundColor(color);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setBackgroundColor(Color color) {

+		if (primaryShape != null) {

+			primaryShape.setBackgroundColor(color);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLineWidth(int width) {

+		if (primaryShape instanceof Shape) {

+			((Shape) primaryShape).setLineWidth(width);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLineType(int style) {

+		if (primaryShape instanceof Shape) {

+			((Shape) primaryShape).setLineStyle(style);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public EditPart getPrimaryChildEditPart() {

+		return getChildBySemanticHint(IntermediateModelVisualIDRegistry

+				.getType(ServiceServiceNameEditPart.VISUAL_ID));

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMARelTypesOnSource() {

+		ArrayList<IElementType> types = new ArrayList<IElementType>(1);

+		types.add(IntermediateModelElementTypes.ServiceNeeds_4011);

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMARelTypesOnSourceAndTarget(

+			IGraphicalEditPart targetEditPart) {

+		LinkedList<IElementType> types = new LinkedList<IElementType>();

+		if (targetEditPart instanceof ProcessEditPart) {

+			types.add(IntermediateModelElementTypes.ServiceNeeds_4011);

+		}

+		if (targetEditPart instanceof org.eclipse.soa.mangrove.diagram.edit.parts.ServiceEditPart) {

+			types.add(IntermediateModelElementTypes.ServiceNeeds_4011);

+		}

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMATypesForTarget(IElementType relationshipType) {

+		LinkedList<IElementType> types = new LinkedList<IElementType>();

+		if (relationshipType == IntermediateModelElementTypes.ServiceNeeds_4011) {

+			types.add(IntermediateModelElementTypes.Process_3007);

+			types.add(IntermediateModelElementTypes.Service_3009);

+		}

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMARelTypesOnTarget() {

+		ArrayList<IElementType> types = new ArrayList<IElementType>(2);

+		types.add(IntermediateModelElementTypes.StepServiceModel_4010);

+		types.add(IntermediateModelElementTypes.ServiceNeeds_4011);

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMATypesForSource(IElementType relationshipType) {

+		LinkedList<IElementType> types = new LinkedList<IElementType>();

+		if (relationshipType == IntermediateModelElementTypes.StepServiceModel_4010) {

+			types.add(IntermediateModelElementTypes.Step_3008);

+		} else if (relationshipType == IntermediateModelElementTypes.ServiceNeeds_4011) {

+			types.add(IntermediateModelElementTypes.Process_3007);

+			types.add(IntermediateModelElementTypes.Service_3009);

+		}

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public class ServiceFigure extends RoundedRectangle {

+

+		/**

+		 * @generated

+		 */

+		private WrappingLabel fFigureServiceNameFigure;

+

+		/**

+		 * @generated

+		 */

+		public ServiceFigure() {

+

+			FlowLayout layoutThis = new FlowLayout();

+			layoutThis.setStretchMinorAxis(false);

+			layoutThis.setMinorAlignment(FlowLayout.ALIGN_LEFTTOP);

+

+			layoutThis.setMajorAlignment(FlowLayout.ALIGN_LEFTTOP);

+			layoutThis.setMajorSpacing(5);

+			layoutThis.setMinorSpacing(5);

+			layoutThis.setHorizontal(false);

+

+			this.setLayoutManager(layoutThis);

+

+			this.setCornerDimensions(new Dimension(getMapMode().DPtoLP(8),

+					getMapMode().DPtoLP(8)));

+			this.setBackgroundColor(ColorConstants.lightBlue);

+			this.setBorder(new MarginBorder(getMapMode().DPtoLP(0),

+					getMapMode().DPtoLP(0), getMapMode().DPtoLP(0),

+					getMapMode().DPtoLP(10)));

+			createContents();

+		}

+

+		/**

+		 * @generated

+		 */

+		private void createContents() {

+

+			fFigureServiceNameFigure = new WrappingLabel();

+

+			fFigureServiceNameFigure.setText("Service Name");

+

+			this.add(fFigureServiceNameFigure);

+

+		}

+

+		/**

+		 * @generated

+		 */

+		public WrappingLabel getFigureServiceNameFigure() {

+			return fFigureServiceNameFigure;

+		}

+

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ServiceNeedsEditPart.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ServiceNeedsEditPart.java
new file mode 100755
index 0000000..72aa0ea
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ServiceNeedsEditPart.java
@@ -0,0 +1,85 @@
+package org.eclipse.soa.mangrove.diagram.edit.parts;

+

+import org.eclipse.draw2d.ColorConstants;

+import org.eclipse.draw2d.Connection;

+import org.eclipse.draw2d.PolylineDecoration;

+import org.eclipse.draw2d.RotatableDecoration;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITreeBranchEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.diagram.edit.policies.ServiceNeedsItemSemanticEditPolicy;

+

+/**

+ * @generated

+ */

+public class ServiceNeedsEditPart extends ConnectionNodeEditPart implements

+		ITreeBranchEditPart {

+

+	/**

+	 * @generated

+	 */

+	public static final int VISUAL_ID = 4011;

+

+	/**

+	 * @generated

+	 */

+	public ServiceNeedsEditPart(View view) {

+		super(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void createDefaultEditPolicies() {

+		super.createDefaultEditPolicies();

+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,

+				new ServiceNeedsItemSemanticEditPolicy());

+	}

+

+	/**

+	 * Creates figure for this edit part.

+	 * 

+	 * Body of this method does not depend on settings in generation model

+	 * so you may safely remove <i>generated</i> tag and modify it.

+	 * 

+	 * @generated

+	 */

+

+	protected Connection createConnectionFigure() {

+		return new ServiceNeedsFigure();

+	}

+

+	/**

+	 * @generated

+	 */

+	public ServiceNeedsFigure getPrimaryShape() {

+		return (ServiceNeedsFigure) getFigure();

+	}

+

+	/**

+	 * @generated

+	 */

+	public class ServiceNeedsFigure extends PolylineConnectionEx {

+

+		/**

+		 * @generated

+		 */

+		public ServiceNeedsFigure() {

+			this.setForegroundColor(ColorConstants.black);

+

+			setTargetDecoration(createTargetDecoration());

+		}

+

+		/**

+		 * @generated

+		 */

+		private RotatableDecoration createTargetDecoration() {

+			PolylineDecoration df = new PolylineDecoration();

+			return df;

+		}

+

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ServiceServiceNameEditPart.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ServiceServiceNameEditPart.java
new file mode 100755
index 0000000..75d3ecc
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/ServiceServiceNameEditPart.java
@@ -0,0 +1,630 @@
+package org.eclipse.soa.mangrove.diagram.edit.parts;

+

+import java.util.Collections;

+import java.util.List;

+

+import org.eclipse.draw2d.IFigure;

+import org.eclipse.draw2d.Label;

+import org.eclipse.draw2d.geometry.Point;

+import org.eclipse.emf.common.notify.Notification;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.transaction.RunnableWithResult;

+import org.eclipse.gef.AccessibleEditPart;

+import org.eclipse.gef.EditPolicy;

+import org.eclipse.gef.Request;

+import org.eclipse.gef.requests.DirectEditRequest;

+import org.eclipse.gef.tools.DirectEditManager;

+import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;

+import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;

+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;

+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;

+import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;

+import org.eclipse.gmf.runtime.diagram.ui.label.ILabelDelegate;

+import org.eclipse.gmf.runtime.diagram.ui.label.WrappingLabelDelegate;

+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;

+import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;

+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;

+import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;

+import org.eclipse.gmf.runtime.notation.FontStyle;

+import org.eclipse.gmf.runtime.notation.NotationPackage;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.gmf.tooling.runtime.directedit.TextDirectEditManager2;

+import org.eclipse.gmf.tooling.runtime.draw2d.labels.SimpleLabelDelegate;

+import org.eclipse.gmf.tooling.runtime.edit.policies.labels.IRefreshableFeedbackEditPolicy;

+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;

+import org.eclipse.jface.viewers.ICellEditorValidator;

+import org.eclipse.soa.mangrove.diagram.edit.policies.IntermediateModelTextSelectionEditPolicy;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelParserProvider;

+import org.eclipse.swt.SWT;

+import org.eclipse.swt.accessibility.AccessibleEvent;

+import org.eclipse.swt.graphics.Color;

+import org.eclipse.swt.graphics.FontData;

+import org.eclipse.swt.graphics.Image;

+

+/**

+ * @generated

+ */

+public class ServiceServiceNameEditPart extends CompartmentEditPart implements

+		ITextAwareEditPart {

+

+	/**

+	 * @generated

+	 */

+	public static final int VISUAL_ID = 5012;

+

+	/**

+	 * @generated

+	 */

+	private DirectEditManager manager;

+

+	/**

+	 * @generated

+	 */

+	private IParser parser;

+

+	/**

+	 * @generated

+	 */

+	private List<?> parserElements;

+

+	/**

+	 * @generated

+	 */

+	private String defaultText;

+

+	/**

+	 * @generated

+	 */

+	private ILabelDelegate labelDelegate;

+

+	/**

+	 * @generated

+	 */

+	public ServiceServiceNameEditPart(View view) {

+		super(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void createDefaultEditPolicies() {

+		super.createDefaultEditPolicies();

+		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,

+				new IntermediateModelTextSelectionEditPolicy());

+		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,

+				new LabelDirectEditPolicy());

+		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,

+				new StpIntermediateModelEditPart.NodeLabelDragPolicy());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected String getLabelTextHelper(IFigure figure) {

+		if (figure instanceof WrappingLabel) {

+			return ((WrappingLabel) figure).getText();

+		} else if (figure instanceof Label) {

+			return ((Label) figure).getText();

+		} else {

+			return getLabelDelegate().getText();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLabelTextHelper(IFigure figure, String text) {

+		if (figure instanceof WrappingLabel) {

+			((WrappingLabel) figure).setText(text);

+		} else if (figure instanceof Label) {

+			((Label) figure).setText(text);

+		} else {

+			getLabelDelegate().setText(text);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Image getLabelIconHelper(IFigure figure) {

+		if (figure instanceof WrappingLabel) {

+			return ((WrappingLabel) figure).getIcon();

+		} else if (figure instanceof Label) {

+			return ((Label) figure).getIcon();

+		} else {

+			return getLabelDelegate().getIcon(0);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLabelIconHelper(IFigure figure, Image icon) {

+		if (figure instanceof WrappingLabel) {

+			((WrappingLabel) figure).setIcon(icon);

+			return;

+		} else if (figure instanceof Label) {

+			((Label) figure).setIcon(icon);

+			return;

+		} else {

+			getLabelDelegate().setIcon(icon, 0);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setLabel(WrappingLabel figure) {

+		unregisterVisuals();

+		setFigure(figure);

+		defaultText = getLabelTextHelper(figure);

+		registerVisuals();

+		refreshVisuals();

+	}

+

+	/**

+	 * @generated

+	 */

+	@SuppressWarnings("rawtypes")

+	protected List getModelChildren() {

+		return Collections.EMPTY_LIST;

+	}

+

+	/**

+	 * @generated

+	 */

+	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected EObject getParserElement() {

+		return resolveSemanticElement();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Image getLabelIcon() {

+		EObject parserElement = getParserElement();

+		if (parserElement == null) {

+			return null;

+		}

+		return IntermediateModelElementTypes.getImage(parserElement.eClass());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected String getLabelText() {

+		String text = null;

+		EObject parserElement = getParserElement();

+		if (parserElement != null && getParser() != null) {

+			text = getParser().getPrintString(

+					new EObjectAdapter(parserElement),

+					getParserOptions().intValue());

+		}

+		if (text == null || text.length() == 0) {

+			text = defaultText;

+		}

+		return text;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setLabelText(String text) {

+		setLabelTextHelper(getFigure(), text);

+		refreshSelectionFeedback();

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getEditText() {

+		if (getParserElement() == null || getParser() == null) {

+			return ""; //$NON-NLS-1$

+		}

+		return getParser().getEditString(

+				new EObjectAdapter(getParserElement()),

+				getParserOptions().intValue());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean isEditable() {

+		return getParser() != null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public ICellEditorValidator getEditTextValidator() {

+		return new ICellEditorValidator() {

+

+			public String isValid(final Object value) {

+				if (value instanceof String) {

+					final EObject element = getParserElement();

+					final IParser parser = getParser();

+					try {

+						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()

+								.runExclusive(

+										new RunnableWithResult.Impl<IParserEditStatus>() {

+

+											public void run() {

+												setResult(parser

+														.isValidEditString(

+																new EObjectAdapter(

+																		element),

+																(String) value));

+											}

+										});

+						return valid.getCode() == ParserEditStatus.EDITABLE ? null

+								: valid.getMessage();

+					} catch (InterruptedException ie) {

+						ie.printStackTrace();

+					}

+				}

+

+				// shouldn't get here

+				return null;

+			}

+		};

+	}

+

+	/**

+	 * @generated

+	 */

+	public IContentAssistProcessor getCompletionProcessor() {

+		if (getParserElement() == null || getParser() == null) {

+			return null;

+		}

+		return getParser().getCompletionProcessor(

+				new EObjectAdapter(getParserElement()));

+	}

+

+	/**

+	 * @generated

+	 */

+	public ParserOptions getParserOptions() {

+		return ParserOptions.NONE;

+	}

+

+	/**

+	 * @generated

+	 */

+	public IParser getParser() {

+		if (parser == null) {

+			parser = IntermediateModelParserProvider

+					.getParser(

+							IntermediateModelElementTypes.Service_3009,

+							getParserElement(),

+							IntermediateModelVisualIDRegistry

+									.getType(org.eclipse.soa.mangrove.diagram.edit.parts.ServiceServiceNameEditPart.VISUAL_ID));

+		}

+		return parser;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected DirectEditManager getManager() {

+		if (manager == null) {

+			setManager(new TextDirectEditManager2(this, null,

+					IntermediateModelEditPartFactory

+							.getTextCellEditorLocator(this)));

+		}

+		return manager;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setManager(DirectEditManager manager) {

+		this.manager = manager;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void performDirectEdit() {

+		getManager().show();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void performDirectEdit(Point eventLocation) {

+		if (getManager().getClass() == TextDirectEditManager2.class) {

+			((TextDirectEditManager2) getManager()).show(eventLocation

+					.getSWTPoint());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private void performDirectEdit(char initialCharacter) {

+		if (getManager() instanceof TextDirectEditManager) {

+			((TextDirectEditManager) getManager()).show(initialCharacter);

+		} else // 

+		if (getManager() instanceof TextDirectEditManager2) {

+			((TextDirectEditManager2) getManager()).show(initialCharacter);

+		} else //

+		{

+			performDirectEdit();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void performDirectEditRequest(Request request) {

+		final Request theRequest = request;

+		try {

+			getEditingDomain().runExclusive(new Runnable() {

+

+				public void run() {

+					if (isActive() && isEditable()) {

+						if (theRequest

+								.getExtendedData()

+								.get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {

+							Character initialChar = (Character) theRequest

+									.getExtendedData()

+									.get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);

+							performDirectEdit(initialChar.charValue());

+						} else if ((theRequest instanceof DirectEditRequest)

+								&& (getEditText().equals(getLabelText()))) {

+							DirectEditRequest editRequest = (DirectEditRequest) theRequest;

+							performDirectEdit(editRequest.getLocation());

+						} else {

+							performDirectEdit();

+						}

+					}

+				}

+			});

+		} catch (InterruptedException e) {

+			e.printStackTrace();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshVisuals() {

+		super.refreshVisuals();

+		refreshLabel();

+		refreshFont();

+		refreshFontColor();

+		refreshUnderline();

+		refreshStrikeThrough();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshLabel() {

+		setLabelTextHelper(getFigure(), getLabelText());

+		setLabelIconHelper(getFigure(), getLabelIcon());

+		refreshSelectionFeedback();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshUnderline() {

+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(

+				NotationPackage.eINSTANCE.getFontStyle());

+		if (style != null && getFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getFigure()).setTextUnderline(style.isUnderline());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshStrikeThrough() {

+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(

+				NotationPackage.eINSTANCE.getFontStyle());

+		if (style != null && getFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getFigure()).setTextStrikeThrough(style

+					.isStrikeThrough());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshFont() {

+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(

+				NotationPackage.eINSTANCE.getFontStyle());

+		if (style != null) {

+			FontData fontData = new FontData(style.getFontName(),

+					style.getFontHeight(), (style.isBold() ? SWT.BOLD

+							: SWT.NORMAL)

+							| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));

+			setFont(fontData);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private void refreshSelectionFeedback() {

+		requestEditPolicyFeedbackRefresh(EditPolicy.PRIMARY_DRAG_ROLE);

+		requestEditPolicyFeedbackRefresh(EditPolicy.SELECTION_FEEDBACK_ROLE);

+	}

+

+	/**

+	 * @generated

+	 */

+	private void requestEditPolicyFeedbackRefresh(String editPolicyKey) {

+		Object editPolicy = getEditPolicy(editPolicyKey);

+		if (editPolicy instanceof IRefreshableFeedbackEditPolicy) {

+			((IRefreshableFeedbackEditPolicy) editPolicy).refreshFeedback();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setFontColor(Color color) {

+		getFigure().setForegroundColor(color);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void addSemanticListeners() {

+		if (getParser() instanceof ISemanticParser) {

+			EObject element = resolveSemanticElement();

+			parserElements = ((ISemanticParser) getParser())

+					.getSemanticElementsBeingParsed(element);

+			for (int i = 0; i < parserElements.size(); i++) {

+				addListenerFilter(

+						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$

+			}

+		} else {

+			super.addSemanticListeners();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void removeSemanticListeners() {

+		if (parserElements != null) {

+			for (int i = 0; i < parserElements.size(); i++) {

+				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$

+			}

+		} else {

+			super.removeSemanticListeners();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected AccessibleEditPart getAccessibleEditPart() {

+		if (accessibleEP == null) {

+			accessibleEP = new AccessibleGraphicalEditPart() {

+

+				public void getName(AccessibleEvent e) {

+					e.result = getLabelTextHelper(getFigure());

+				}

+			};

+		}

+		return accessibleEP;

+	}

+

+	/**

+	 * @generated

+	 */

+	private View getFontStyleOwnerView() {

+		return getPrimaryView();

+	}

+

+	/**

+	 * @generated

+	 */

+	private ILabelDelegate getLabelDelegate() {

+		if (labelDelegate == null) {

+			IFigure label = getFigure();

+			if (label instanceof WrappingLabel) {

+				labelDelegate = new WrappingLabelDelegate((WrappingLabel) label);

+			} else {

+				labelDelegate = new SimpleLabelDelegate((Label) label);

+			}

+		}

+		return labelDelegate;

+	}

+

+	/**

+	 * @generated

+	 */

+	@Override

+	public Object getAdapter(Class key) {

+		if (ILabelDelegate.class.equals(key)) {

+			return getLabelDelegate();

+		}

+		return super.getAdapter(key);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void addNotationalListeners() {

+		super.addNotationalListeners();

+		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void removeNotationalListeners() {

+		super.removeNotationalListeners();

+		removeListenerFilter("PrimaryView"); //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void handleNotificationEvent(Notification event) {

+		Object feature = event.getFeature();

+		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {

+			Integer c = (Integer) event.getNewValue();

+			setFontColor(DiagramColorRegistry.getInstance().getColor(c));

+		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(

+				feature)) {

+			refreshUnderline();

+		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()

+				.equals(feature)) {

+			refreshStrikeThrough();

+		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(

+				feature)

+				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(

+						feature)

+				|| NotationPackage.eINSTANCE.getFontStyle_Bold()

+						.equals(feature)

+				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(

+						feature)) {

+			refreshFont();

+		} else {

+			if (getParser() != null

+					&& getParser().isAffectingEvent(event,

+							getParserOptions().intValue())) {

+				refreshLabel();

+			}

+			if (getParser() instanceof ISemanticParser) {

+				ISemanticParser modelParser = (ISemanticParser) getParser();

+				if (modelParser.areSemanticElementsAffected(null, event)) {

+					removeSemanticListeners();

+					if (resolveSemanticElement() != null) {

+						addSemanticListeners();

+					}

+					refreshLabel();

+				}

+			}

+		}

+		super.handleNotificationEvent(event);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure createFigure() {

+		// Parent should assign one using setLabel() method

+		return null;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/StepEditPart.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/StepEditPart.java
new file mode 100755
index 0000000..5b16bd5
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/StepEditPart.java
@@ -0,0 +1,373 @@
+package org.eclipse.soa.mangrove.diagram.edit.parts;

+

+import java.util.ArrayList;

+import java.util.LinkedList;

+import java.util.List;

+

+import org.eclipse.draw2d.ColorConstants;

+import org.eclipse.draw2d.FlowLayout;

+import org.eclipse.draw2d.IFigure;

+import org.eclipse.draw2d.MarginBorder;

+import org.eclipse.draw2d.RoundedRectangle;

+import org.eclipse.draw2d.Shape;

+import org.eclipse.draw2d.StackLayout;

+import org.eclipse.draw2d.geometry.Dimension;

+import org.eclipse.gef.EditPart;

+import org.eclipse.gef.EditPolicy;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gef.editpolicies.LayoutEditPolicy;

+import org.eclipse.gef.requests.CreateRequest;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.FlowLayoutEditPolicy;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;

+import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.diagram.edit.policies.StepItemSemanticEditPolicy;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+import org.eclipse.swt.graphics.Color;

+

+/**

+ * @generated

+ */

+public class StepEditPart extends ShapeNodeEditPart {

+

+	/**

+	 * @generated

+	 */

+	public static final int VISUAL_ID = 3008;

+

+	/**

+	 * @generated

+	 */

+	protected IFigure contentPane;

+

+	/**

+	 * @generated

+	 */

+	protected IFigure primaryShape;

+

+	/**

+	 * @generated

+	 */

+	public StepEditPart(View view) {

+		super(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void createDefaultEditPolicies() {

+		super.createDefaultEditPolicies();

+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,

+				new StepItemSemanticEditPolicy());

+		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());

+		// XXX need an SCR to runtime to have another abstract superclass that would let children add reasonable editpolicies

+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.CONNECTION_HANDLES_ROLE);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected LayoutEditPolicy createLayoutEditPolicy() {

+

+		FlowLayoutEditPolicy lep = new FlowLayoutEditPolicy() {

+

+			protected Command createAddCommand(EditPart child, EditPart after) {

+				return null;

+			}

+

+			protected Command createMoveChildCommand(EditPart child,

+					EditPart after) {

+				return null;

+			}

+

+			protected Command getCreateCommand(CreateRequest request) {

+				return null;

+			}

+		};

+		return lep;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure createNodeShape() {

+		return primaryShape = new StepFigure();

+	}

+

+	/**

+	 * @generated

+	 */

+	public StepFigure getPrimaryShape() {

+		return (StepFigure) primaryShape;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean addFixedChild(EditPart childEditPart) {

+		if (childEditPart instanceof StepNameEditPart) {

+			((StepNameEditPart) childEditPart).setLabel(getPrimaryShape()

+					.getFigureStepNameFigure());

+			return true;

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean removeFixedChild(EditPart childEditPart) {

+		if (childEditPart instanceof StepNameEditPart) {

+			return true;

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void addChildVisual(EditPart childEditPart, int index) {

+		if (addFixedChild(childEditPart)) {

+			return;

+		}

+		super.addChildVisual(childEditPart, -1);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void removeChildVisual(EditPart childEditPart) {

+		if (removeFixedChild(childEditPart)) {

+			return;

+		}

+		super.removeChildVisual(childEditPart);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {

+		return getContentPane();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected NodeFigure createNodePlate() {

+		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(40, 40);

+		return result;

+	}

+

+	/**

+	 * Creates figure for this edit part.

+	 * 

+	 * Body of this method does not depend on settings in generation model

+	 * so you may safely remove <i>generated</i> tag and modify it.

+	 * 

+	 * @generated

+	 */

+	protected NodeFigure createNodeFigure() {

+		NodeFigure figure = createNodePlate();

+		figure.setLayoutManager(new StackLayout());

+		IFigure shape = createNodeShape();

+		figure.add(shape);

+		contentPane = setupContentPane(shape);

+		return figure;

+	}

+

+	/**

+	 * Default implementation treats passed figure as content pane.

+	 * Respects layout one may have set for generated figure.

+	 * @param nodeShape instance of generated figure class

+	 * @generated

+	 */

+	protected IFigure setupContentPane(IFigure nodeShape) {

+		if (nodeShape.getLayoutManager() == null) {

+			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();

+			layout.setSpacing(5);

+			nodeShape.setLayoutManager(layout);

+		}

+		return nodeShape; // use nodeShape itself as contentPane

+	}

+

+	/**

+	 * @generated

+	 */

+	public IFigure getContentPane() {

+		if (contentPane != null) {

+			return contentPane;

+		}

+		return super.getContentPane();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setForegroundColor(Color color) {

+		if (primaryShape != null) {

+			primaryShape.setForegroundColor(color);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setBackgroundColor(Color color) {

+		if (primaryShape != null) {

+			primaryShape.setBackgroundColor(color);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLineWidth(int width) {

+		if (primaryShape instanceof Shape) {

+			((Shape) primaryShape).setLineWidth(width);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLineType(int style) {

+		if (primaryShape instanceof Shape) {

+			((Shape) primaryShape).setLineStyle(style);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public EditPart getPrimaryChildEditPart() {

+		return getChildBySemanticHint(IntermediateModelVisualIDRegistry

+				.getType(StepNameEditPart.VISUAL_ID));

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMARelTypesOnSource() {

+		ArrayList<IElementType> types = new ArrayList<IElementType>(2);

+		types.add(IntermediateModelElementTypes.Transition_4009);

+		types.add(IntermediateModelElementTypes.StepServiceModel_4010);

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMARelTypesOnSourceAndTarget(

+			IGraphicalEditPart targetEditPart) {

+		LinkedList<IElementType> types = new LinkedList<IElementType>();

+		if (targetEditPart instanceof org.eclipse.soa.mangrove.diagram.edit.parts.StepEditPart) {

+			types.add(IntermediateModelElementTypes.Transition_4009);

+		}

+		if (targetEditPart instanceof ProcessEditPart) {

+			types.add(IntermediateModelElementTypes.StepServiceModel_4010);

+		}

+		if (targetEditPart instanceof ServiceEditPart) {

+			types.add(IntermediateModelElementTypes.StepServiceModel_4010);

+		}

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMATypesForTarget(IElementType relationshipType) {

+		LinkedList<IElementType> types = new LinkedList<IElementType>();

+		if (relationshipType == IntermediateModelElementTypes.Transition_4009) {

+			types.add(IntermediateModelElementTypes.Step_3008);

+		} else if (relationshipType == IntermediateModelElementTypes.StepServiceModel_4010) {

+			types.add(IntermediateModelElementTypes.Process_3007);

+			types.add(IntermediateModelElementTypes.Service_3009);

+		}

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMARelTypesOnTarget() {

+		ArrayList<IElementType> types = new ArrayList<IElementType>(1);

+		types.add(IntermediateModelElementTypes.Transition_4009);

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List<IElementType> getMATypesForSource(IElementType relationshipType) {

+		LinkedList<IElementType> types = new LinkedList<IElementType>();

+		if (relationshipType == IntermediateModelElementTypes.Transition_4009) {

+			types.add(IntermediateModelElementTypes.Step_3008);

+		}

+		return types;

+	}

+

+	/**

+	 * @generated

+	 */

+	public class StepFigure extends RoundedRectangle {

+

+		/**

+		 * @generated

+		 */

+		private WrappingLabel fFigureStepNameFigure;

+

+		/**

+		 * @generated

+		 */

+		public StepFigure() {

+

+			FlowLayout layoutThis = new FlowLayout();

+			layoutThis.setStretchMinorAxis(false);

+			layoutThis.setMinorAlignment(FlowLayout.ALIGN_LEFTTOP);

+

+			layoutThis.setMajorAlignment(FlowLayout.ALIGN_LEFTTOP);

+			layoutThis.setMajorSpacing(5);

+			layoutThis.setMinorSpacing(5);

+			layoutThis.setHorizontal(true);

+

+			this.setLayoutManager(layoutThis);

+

+			this.setCornerDimensions(new Dimension(getMapMode().DPtoLP(8),

+					getMapMode().DPtoLP(8)));

+			this.setBackgroundColor(ColorConstants.orange);

+			this.setBorder(new MarginBorder(getMapMode().DPtoLP(0),

+					getMapMode().DPtoLP(0), getMapMode().DPtoLP(0),

+					getMapMode().DPtoLP(10)));

+			createContents();

+		}

+

+		/**

+		 * @generated

+		 */

+		private void createContents() {

+

+			fFigureStepNameFigure = new WrappingLabel();

+

+			fFigureStepNameFigure.setText("step");

+

+			this.add(fFigureStepNameFigure);

+

+		}

+

+		/**

+		 * @generated

+		 */

+		public WrappingLabel getFigureStepNameFigure() {

+			return fFigureStepNameFigure;

+		}

+

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/StepNameEditPart.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/StepNameEditPart.java
new file mode 100755
index 0000000..79b616a
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/StepNameEditPart.java
@@ -0,0 +1,630 @@
+package org.eclipse.soa.mangrove.diagram.edit.parts;

+

+import java.util.Collections;

+import java.util.List;

+

+import org.eclipse.draw2d.IFigure;

+import org.eclipse.draw2d.Label;

+import org.eclipse.draw2d.geometry.Point;

+import org.eclipse.emf.common.notify.Notification;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.transaction.RunnableWithResult;

+import org.eclipse.gef.AccessibleEditPart;

+import org.eclipse.gef.EditPolicy;

+import org.eclipse.gef.Request;

+import org.eclipse.gef.requests.DirectEditRequest;

+import org.eclipse.gef.tools.DirectEditManager;

+import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;

+import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;

+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;

+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;

+import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;

+import org.eclipse.gmf.runtime.diagram.ui.label.ILabelDelegate;

+import org.eclipse.gmf.runtime.diagram.ui.label.WrappingLabelDelegate;

+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;

+import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;

+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;

+import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;

+import org.eclipse.gmf.runtime.notation.FontStyle;

+import org.eclipse.gmf.runtime.notation.NotationPackage;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.gmf.tooling.runtime.directedit.TextDirectEditManager2;

+import org.eclipse.gmf.tooling.runtime.draw2d.labels.SimpleLabelDelegate;

+import org.eclipse.gmf.tooling.runtime.edit.policies.labels.IRefreshableFeedbackEditPolicy;

+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;

+import org.eclipse.jface.viewers.ICellEditorValidator;

+import org.eclipse.soa.mangrove.diagram.edit.policies.IntermediateModelTextSelectionEditPolicy;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelParserProvider;

+import org.eclipse.swt.SWT;

+import org.eclipse.swt.accessibility.AccessibleEvent;

+import org.eclipse.swt.graphics.Color;

+import org.eclipse.swt.graphics.FontData;

+import org.eclipse.swt.graphics.Image;

+

+/**

+ * @generated

+ */

+public class StepNameEditPart extends CompartmentEditPart implements

+		ITextAwareEditPart {

+

+	/**

+	 * @generated

+	 */

+	public static final int VISUAL_ID = 5009;

+

+	/**

+	 * @generated

+	 */

+	private DirectEditManager manager;

+

+	/**

+	 * @generated

+	 */

+	private IParser parser;

+

+	/**

+	 * @generated

+	 */

+	private List<?> parserElements;

+

+	/**

+	 * @generated

+	 */

+	private String defaultText;

+

+	/**

+	 * @generated

+	 */

+	private ILabelDelegate labelDelegate;

+

+	/**

+	 * @generated

+	 */

+	public StepNameEditPart(View view) {

+		super(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void createDefaultEditPolicies() {

+		super.createDefaultEditPolicies();

+		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,

+				new IntermediateModelTextSelectionEditPolicy());

+		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,

+				new LabelDirectEditPolicy());

+		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,

+				new StpIntermediateModelEditPart.NodeLabelDragPolicy());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected String getLabelTextHelper(IFigure figure) {

+		if (figure instanceof WrappingLabel) {

+			return ((WrappingLabel) figure).getText();

+		} else if (figure instanceof Label) {

+			return ((Label) figure).getText();

+		} else {

+			return getLabelDelegate().getText();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLabelTextHelper(IFigure figure, String text) {

+		if (figure instanceof WrappingLabel) {

+			((WrappingLabel) figure).setText(text);

+		} else if (figure instanceof Label) {

+			((Label) figure).setText(text);

+		} else {

+			getLabelDelegate().setText(text);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Image getLabelIconHelper(IFigure figure) {

+		if (figure instanceof WrappingLabel) {

+			return ((WrappingLabel) figure).getIcon();

+		} else if (figure instanceof Label) {

+			return ((Label) figure).getIcon();

+		} else {

+			return getLabelDelegate().getIcon(0);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setLabelIconHelper(IFigure figure, Image icon) {

+		if (figure instanceof WrappingLabel) {

+			((WrappingLabel) figure).setIcon(icon);

+			return;

+		} else if (figure instanceof Label) {

+			((Label) figure).setIcon(icon);

+			return;

+		} else {

+			getLabelDelegate().setIcon(icon, 0);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setLabel(WrappingLabel figure) {

+		unregisterVisuals();

+		setFigure(figure);

+		defaultText = getLabelTextHelper(figure);

+		registerVisuals();

+		refreshVisuals();

+	}

+

+	/**

+	 * @generated

+	 */

+	@SuppressWarnings("rawtypes")

+	protected List getModelChildren() {

+		return Collections.EMPTY_LIST;

+	}

+

+	/**

+	 * @generated

+	 */

+	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected EObject getParserElement() {

+		return resolveSemanticElement();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Image getLabelIcon() {

+		EObject parserElement = getParserElement();

+		if (parserElement == null) {

+			return null;

+		}

+		return IntermediateModelElementTypes.getImage(parserElement.eClass());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected String getLabelText() {

+		String text = null;

+		EObject parserElement = getParserElement();

+		if (parserElement != null && getParser() != null) {

+			text = getParser().getPrintString(

+					new EObjectAdapter(parserElement),

+					getParserOptions().intValue());

+		}

+		if (text == null || text.length() == 0) {

+			text = defaultText;

+		}

+		return text;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setLabelText(String text) {

+		setLabelTextHelper(getFigure(), text);

+		refreshSelectionFeedback();

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getEditText() {

+		if (getParserElement() == null || getParser() == null) {

+			return ""; //$NON-NLS-1$

+		}

+		return getParser().getEditString(

+				new EObjectAdapter(getParserElement()),

+				getParserOptions().intValue());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean isEditable() {

+		return getParser() != null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public ICellEditorValidator getEditTextValidator() {

+		return new ICellEditorValidator() {

+

+			public String isValid(final Object value) {

+				if (value instanceof String) {

+					final EObject element = getParserElement();

+					final IParser parser = getParser();

+					try {

+						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()

+								.runExclusive(

+										new RunnableWithResult.Impl<IParserEditStatus>() {

+

+											public void run() {

+												setResult(parser

+														.isValidEditString(

+																new EObjectAdapter(

+																		element),

+																(String) value));

+											}

+										});

+						return valid.getCode() == ParserEditStatus.EDITABLE ? null

+								: valid.getMessage();

+					} catch (InterruptedException ie) {

+						ie.printStackTrace();

+					}

+				}

+

+				// shouldn't get here

+				return null;

+			}

+		};

+	}

+

+	/**

+	 * @generated

+	 */

+	public IContentAssistProcessor getCompletionProcessor() {

+		if (getParserElement() == null || getParser() == null) {

+			return null;

+		}

+		return getParser().getCompletionProcessor(

+				new EObjectAdapter(getParserElement()));

+	}

+

+	/**

+	 * @generated

+	 */

+	public ParserOptions getParserOptions() {

+		return ParserOptions.NONE;

+	}

+

+	/**

+	 * @generated

+	 */

+	public IParser getParser() {

+		if (parser == null) {

+			parser = IntermediateModelParserProvider

+					.getParser(

+							IntermediateModelElementTypes.Step_3008,

+							getParserElement(),

+							IntermediateModelVisualIDRegistry

+									.getType(org.eclipse.soa.mangrove.diagram.edit.parts.StepNameEditPart.VISUAL_ID));

+		}

+		return parser;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected DirectEditManager getManager() {

+		if (manager == null) {

+			setManager(new TextDirectEditManager2(this, null,

+					IntermediateModelEditPartFactory

+							.getTextCellEditorLocator(this)));

+		}

+		return manager;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setManager(DirectEditManager manager) {

+		this.manager = manager;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void performDirectEdit() {

+		getManager().show();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void performDirectEdit(Point eventLocation) {

+		if (getManager().getClass() == TextDirectEditManager2.class) {

+			((TextDirectEditManager2) getManager()).show(eventLocation

+					.getSWTPoint());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private void performDirectEdit(char initialCharacter) {

+		if (getManager() instanceof TextDirectEditManager) {

+			((TextDirectEditManager) getManager()).show(initialCharacter);

+		} else // 

+		if (getManager() instanceof TextDirectEditManager2) {

+			((TextDirectEditManager2) getManager()).show(initialCharacter);

+		} else //

+		{

+			performDirectEdit();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void performDirectEditRequest(Request request) {

+		final Request theRequest = request;

+		try {

+			getEditingDomain().runExclusive(new Runnable() {

+

+				public void run() {

+					if (isActive() && isEditable()) {

+						if (theRequest

+								.getExtendedData()

+								.get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {

+							Character initialChar = (Character) theRequest

+									.getExtendedData()

+									.get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);

+							performDirectEdit(initialChar.charValue());

+						} else if ((theRequest instanceof DirectEditRequest)

+								&& (getEditText().equals(getLabelText()))) {

+							DirectEditRequest editRequest = (DirectEditRequest) theRequest;

+							performDirectEdit(editRequest.getLocation());

+						} else {

+							performDirectEdit();

+						}

+					}

+				}

+			});

+		} catch (InterruptedException e) {

+			e.printStackTrace();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshVisuals() {

+		super.refreshVisuals();

+		refreshLabel();

+		refreshFont();

+		refreshFontColor();

+		refreshUnderline();

+		refreshStrikeThrough();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshLabel() {

+		setLabelTextHelper(getFigure(), getLabelText());

+		setLabelIconHelper(getFigure(), getLabelIcon());

+		refreshSelectionFeedback();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshUnderline() {

+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(

+				NotationPackage.eINSTANCE.getFontStyle());

+		if (style != null && getFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getFigure()).setTextUnderline(style.isUnderline());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshStrikeThrough() {

+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(

+				NotationPackage.eINSTANCE.getFontStyle());

+		if (style != null && getFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getFigure()).setTextStrikeThrough(style

+					.isStrikeThrough());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshFont() {

+		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(

+				NotationPackage.eINSTANCE.getFontStyle());

+		if (style != null) {

+			FontData fontData = new FontData(style.getFontName(),

+					style.getFontHeight(), (style.isBold() ? SWT.BOLD

+							: SWT.NORMAL)

+							| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));

+			setFont(fontData);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private void refreshSelectionFeedback() {

+		requestEditPolicyFeedbackRefresh(EditPolicy.PRIMARY_DRAG_ROLE);

+		requestEditPolicyFeedbackRefresh(EditPolicy.SELECTION_FEEDBACK_ROLE);

+	}

+

+	/**

+	 * @generated

+	 */

+	private void requestEditPolicyFeedbackRefresh(String editPolicyKey) {

+		Object editPolicy = getEditPolicy(editPolicyKey);

+		if (editPolicy instanceof IRefreshableFeedbackEditPolicy) {

+			((IRefreshableFeedbackEditPolicy) editPolicy).refreshFeedback();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setFontColor(Color color) {

+		getFigure().setForegroundColor(color);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void addSemanticListeners() {

+		if (getParser() instanceof ISemanticParser) {

+			EObject element = resolveSemanticElement();

+			parserElements = ((ISemanticParser) getParser())

+					.getSemanticElementsBeingParsed(element);

+			for (int i = 0; i < parserElements.size(); i++) {

+				addListenerFilter(

+						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$

+			}

+		} else {

+			super.addSemanticListeners();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void removeSemanticListeners() {

+		if (parserElements != null) {

+			for (int i = 0; i < parserElements.size(); i++) {

+				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$

+			}

+		} else {

+			super.removeSemanticListeners();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected AccessibleEditPart getAccessibleEditPart() {

+		if (accessibleEP == null) {

+			accessibleEP = new AccessibleGraphicalEditPart() {

+

+				public void getName(AccessibleEvent e) {

+					e.result = getLabelTextHelper(getFigure());

+				}

+			};

+		}

+		return accessibleEP;

+	}

+

+	/**

+	 * @generated

+	 */

+	private View getFontStyleOwnerView() {

+		return getPrimaryView();

+	}

+

+	/**

+	 * @generated

+	 */

+	private ILabelDelegate getLabelDelegate() {

+		if (labelDelegate == null) {

+			IFigure label = getFigure();

+			if (label instanceof WrappingLabel) {

+				labelDelegate = new WrappingLabelDelegate((WrappingLabel) label);

+			} else {

+				labelDelegate = new SimpleLabelDelegate((Label) label);

+			}

+		}

+		return labelDelegate;

+	}

+

+	/**

+	 * @generated

+	 */

+	@Override

+	public Object getAdapter(Class key) {

+		if (ILabelDelegate.class.equals(key)) {

+			return getLabelDelegate();

+		}

+		return super.getAdapter(key);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void addNotationalListeners() {

+		super.addNotationalListeners();

+		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void removeNotationalListeners() {

+		super.removeNotationalListeners();

+		removeListenerFilter("PrimaryView"); //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void handleNotificationEvent(Notification event) {

+		Object feature = event.getFeature();

+		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {

+			Integer c = (Integer) event.getNewValue();

+			setFontColor(DiagramColorRegistry.getInstance().getColor(c));

+		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(

+				feature)) {

+			refreshUnderline();

+		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()

+				.equals(feature)) {

+			refreshStrikeThrough();

+		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(

+				feature)

+				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(

+						feature)

+				|| NotationPackage.eINSTANCE.getFontStyle_Bold()

+						.equals(feature)

+				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(

+						feature)) {

+			refreshFont();

+		} else {

+			if (getParser() != null

+					&& getParser().isAffectingEvent(event,

+							getParserOptions().intValue())) {

+				refreshLabel();

+			}

+			if (getParser() instanceof ISemanticParser) {

+				ISemanticParser modelParser = (ISemanticParser) getParser();

+				if (modelParser.areSemanticElementsAffected(null, event)) {

+					removeSemanticListeners();

+					if (resolveSemanticElement() != null) {

+						addSemanticListeners();

+					}

+					refreshLabel();

+				}

+			}

+		}

+		super.handleNotificationEvent(event);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure createFigure() {

+		// Parent should assign one using setLabel() method

+		return null;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/StepServiceModelEditPart.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/StepServiceModelEditPart.java
new file mode 100755
index 0000000..207812f
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/StepServiceModelEditPart.java
@@ -0,0 +1,88 @@
+package org.eclipse.soa.mangrove.diagram.edit.parts;

+

+import org.eclipse.draw2d.ColorConstants;

+import org.eclipse.draw2d.Connection;

+import org.eclipse.draw2d.Graphics;

+import org.eclipse.draw2d.PolylineDecoration;

+import org.eclipse.draw2d.RotatableDecoration;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITreeBranchEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.diagram.edit.policies.StepServiceModelItemSemanticEditPolicy;

+

+/**

+ * @generated

+ */

+public class StepServiceModelEditPart extends ConnectionNodeEditPart implements

+		ITreeBranchEditPart {

+

+	/**

+	 * @generated

+	 */

+	public static final int VISUAL_ID = 4010;

+

+	/**

+	 * @generated

+	 */

+	public StepServiceModelEditPart(View view) {

+		super(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void createDefaultEditPolicies() {

+		super.createDefaultEditPolicies();

+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,

+				new StepServiceModelItemSemanticEditPolicy());

+	}

+

+	/**

+	 * Creates figure for this edit part.

+	 * 

+	 * Body of this method does not depend on settings in generation model

+	 * so you may safely remove <i>generated</i> tag and modify it.

+	 * 

+	 * @generated

+	 */

+

+	protected Connection createConnectionFigure() {

+		return new StepServiceModelFigure();

+	}

+

+	/**

+	 * @generated

+	 */

+	public StepServiceModelFigure getPrimaryShape() {

+		return (StepServiceModelFigure) getFigure();

+	}

+

+	/**

+	 * @generated

+	 */

+	public class StepServiceModelFigure extends PolylineConnectionEx {

+

+		/**

+		 * @generated

+		 */

+		public StepServiceModelFigure() {

+			this.setLineWidth(2);

+			this.setLineStyle(Graphics.LINE_DASH);

+			this.setForegroundColor(ColorConstants.black);

+

+			setTargetDecoration(createTargetDecoration());

+		}

+

+		/**

+		 * @generated

+		 */

+		private RotatableDecoration createTargetDecoration() {

+			PolylineDecoration df = new PolylineDecoration();

+			return df;

+		}

+

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/StpIntermediateModelEditPart.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/StpIntermediateModelEditPart.java
new file mode 100755
index 0000000..51b9fc2
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/StpIntermediateModelEditPart.java
@@ -0,0 +1,87 @@
+package org.eclipse.soa.mangrove.diagram.edit.parts;

+

+import java.util.Collections;

+import java.util.List;

+

+import org.eclipse.gef.GraphicalEditPart;

+import org.eclipse.gef.Request;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gef.editpolicies.NonResizableEditPolicy;

+import org.eclipse.gef.handles.MoveHandle;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.gmf.tooling.runtime.edit.policies.reparent.CreationEditPolicyWithCustomReparent;

+import org.eclipse.soa.mangrove.diagram.edit.policies.StpIntermediateModelCanonicalEditPolicy;

+import org.eclipse.soa.mangrove.diagram.edit.policies.StpIntermediateModelItemSemanticEditPolicy;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+

+/**

+ * @generated

+ */

+public class StpIntermediateModelEditPart extends DiagramEditPart {

+

+	/**

+	 * @generated

+	 */

+	public final static String MODEL_ID = "IntermediateModel"; //$NON-NLS-1$

+

+	/**

+	 * @generated

+	 */

+	public static final int VISUAL_ID = 1000;

+

+	/**

+	 * @generated

+	 */

+	public StpIntermediateModelEditPart(View view) {

+		super(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void createDefaultEditPolicies() {

+		super.createDefaultEditPolicies();

+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,

+				new StpIntermediateModelItemSemanticEditPolicy());

+		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,

+				new StpIntermediateModelCanonicalEditPolicy());

+		installEditPolicy(EditPolicyRoles.CREATION_ROLE,

+				new CreationEditPolicyWithCustomReparent(

+						IntermediateModelVisualIDRegistry.TYPED_INSTANCE));

+		// removeEditPolicy(org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles.POPUPBAR_ROLE);

+	}

+

+	/**

+	 * @generated

+	 */

+	/*package-local*/static class NodeLabelDragPolicy extends

+			NonResizableEditPolicy {

+

+		/**

+		 * @generated

+		 */

+		@SuppressWarnings("rawtypes")

+		protected List createSelectionHandles() {

+			MoveHandle h = new MoveHandle((GraphicalEditPart) getHost());

+			h.setBorder(null);

+			return Collections.singletonList(h);

+		}

+

+		/**

+		 * @generated

+		 */

+		public Command getCommand(Request request) {

+			return null;

+		}

+

+		/**

+		 * @generated

+		 */

+		public boolean understandsRequest(Request request) {

+			return false;

+		}

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/TransitionEditPart.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/TransitionEditPart.java
new file mode 100755
index 0000000..e7d24e6
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/parts/TransitionEditPart.java
@@ -0,0 +1,85 @@
+package org.eclipse.soa.mangrove.diagram.edit.parts;

+

+import org.eclipse.draw2d.ColorConstants;

+import org.eclipse.draw2d.Connection;

+import org.eclipse.draw2d.PolylineDecoration;

+import org.eclipse.draw2d.RotatableDecoration;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.ITreeBranchEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.diagram.edit.policies.TransitionItemSemanticEditPolicy;

+

+/**

+ * @generated

+ */

+public class TransitionEditPart extends ConnectionNodeEditPart implements

+		ITreeBranchEditPart {

+

+	/**

+	 * @generated

+	 */

+	public static final int VISUAL_ID = 4009;

+

+	/**

+	 * @generated

+	 */

+	public TransitionEditPart(View view) {

+		super(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void createDefaultEditPolicies() {

+		super.createDefaultEditPolicies();

+		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,

+				new TransitionItemSemanticEditPolicy());

+	}

+

+	/**

+	 * Creates figure for this edit part.

+	 * 

+	 * Body of this method does not depend on settings in generation model

+	 * so you may safely remove <i>generated</i> tag and modify it.

+	 * 

+	 * @generated

+	 */

+

+	protected Connection createConnectionFigure() {

+		return new TransitionFigure();

+	}

+

+	/**

+	 * @generated

+	 */

+	public TransitionFigure getPrimaryShape() {

+		return (TransitionFigure) getFigure();

+	}

+

+	/**

+	 * @generated

+	 */

+	public class TransitionFigure extends PolylineConnectionEx {

+

+		/**

+		 * @generated

+		 */

+		public TransitionFigure() {

+			this.setForegroundColor(ColorConstants.black);

+

+			setTargetDecoration(createTargetDecoration());

+		}

+

+		/**

+		 * @generated

+		 */

+		private RotatableDecoration createTargetDecoration() {

+			PolylineDecoration df = new PolylineDecoration();

+			return df;

+		}

+

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/IntermediateModelBaseItemSemanticEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/IntermediateModelBaseItemSemanticEditPolicy.java
new file mode 100755
index 0000000..66fdd46
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/IntermediateModelBaseItemSemanticEditPolicy.java
@@ -0,0 +1,386 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import java.util.Iterator;

+

+import org.eclipse.emf.transaction.TransactionalEditingDomain;

+import org.eclipse.gef.Request;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gef.commands.UnexecutableCommand;

+import org.eclipse.gef.requests.ReconnectRequest;

+import org.eclipse.gmf.runtime.common.core.command.ICommand;

+import org.eclipse.gmf.runtime.common.core.command.ICompositeCommand;

+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;

+import org.eclipse.gmf.runtime.diagram.ui.commands.CommandProxy;

+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.SemanticEditPolicy;

+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DuplicateElementsRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.GetEditContextRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.MoveRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientReferenceRelationshipRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.gmf.tooling.runtime.edit.helpers.GeneratedEditHelperBase;

+import org.eclipse.soa.mangrove.Process;

+import org.eclipse.soa.mangrove.Service;

+import org.eclipse.soa.mangrove.Step;

+import org.eclipse.soa.mangrove.Transition;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+

+/**

+ * @generated

+ */

+public class IntermediateModelBaseItemSemanticEditPolicy extends

+		SemanticEditPolicy {

+

+	/**

+	 * Extended request data key to hold editpart visual id.

+	 * @generated

+	 */

+	public static final String VISUAL_ID_KEY = "visual_id"; //$NON-NLS-1$

+

+	/**

+	 * @generated

+	 */

+	private final IElementType myElementType;

+

+	/**

+	 * @generated

+	 */

+	protected IntermediateModelBaseItemSemanticEditPolicy(

+			IElementType elementType) {

+		myElementType = elementType;

+	}

+

+	/**

+	 * Extended request data key to hold editpart visual id.

+	 * Add visual id of edited editpart to extended data of the request

+	 * so command switch can decide what kind of diagram element is being edited.

+	 * It is done in those cases when it's not possible to deduce diagram

+	 * element kind from domain element.

+	 * 

+	 * @generated

+	 */

+	public Command getCommand(Request request) {

+		if (request instanceof ReconnectRequest) {

+			Object view = ((ReconnectRequest) request).getConnectionEditPart()

+					.getModel();

+			if (view instanceof View) {

+				Integer id = new Integer(

+						IntermediateModelVisualIDRegistry

+								.getVisualID((View) view));

+				request.getExtendedData().put(VISUAL_ID_KEY, id);

+			}

+		}

+		return super.getCommand(request);

+	}

+

+	/**

+	 * Returns visual id from request parameters.

+	 * @generated

+	 */

+	protected int getVisualID(IEditCommandRequest request) {

+		Object id = request.getParameter(VISUAL_ID_KEY);

+		return id instanceof Integer ? ((Integer) id).intValue() : -1;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getSemanticCommand(IEditCommandRequest request) {

+		IEditCommandRequest completedRequest = completeRequest(request);

+		Command semanticCommand = getSemanticCommandSwitch(completedRequest);

+		semanticCommand = getEditHelperCommand(completedRequest,

+				semanticCommand);

+		if (completedRequest instanceof DestroyRequest) {

+			DestroyRequest destroyRequest = (DestroyRequest) completedRequest;

+			return shouldProceed(destroyRequest) ? addDeleteViewCommand(

+					semanticCommand, destroyRequest) : null;

+		}

+		return semanticCommand;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command addDeleteViewCommand(Command mainCommand,

+			DestroyRequest completedRequest) {

+		Command deleteViewCommand = getGEFWrapper(new DeleteCommand(

+				getEditingDomain(), (View) getHost().getModel()));

+		return mainCommand == null ? deleteViewCommand : mainCommand

+				.chain(deleteViewCommand);

+	}

+

+	/**

+	 * @generated

+	 */

+	private Command getEditHelperCommand(IEditCommandRequest request,

+			Command editPolicyCommand) {

+		if (editPolicyCommand != null) {

+			ICommand command = editPolicyCommand instanceof ICommandProxy ? ((ICommandProxy) editPolicyCommand)

+					.getICommand() : new CommandProxy(editPolicyCommand);

+			request.setParameter(GeneratedEditHelperBase.EDIT_POLICY_COMMAND,

+					command);

+		}

+		IElementType requestContextElementType = getContextElementType(request);

+		request.setParameter(GeneratedEditHelperBase.CONTEXT_ELEMENT_TYPE,

+				requestContextElementType);

+		ICommand command = requestContextElementType.getEditCommand(request);

+		request.setParameter(GeneratedEditHelperBase.EDIT_POLICY_COMMAND, null);

+		request.setParameter(GeneratedEditHelperBase.CONTEXT_ELEMENT_TYPE, null);

+		if (command != null) {

+			if (!(command instanceof CompositeTransactionalCommand)) {

+				command = new CompositeTransactionalCommand(getEditingDomain(),

+						command.getLabel()).compose(command);

+			}

+			return new ICommandProxy(command);

+		}

+		return editPolicyCommand;

+	}

+

+	/**

+	 * @generated

+	 */

+	private IElementType getContextElementType(IEditCommandRequest request) {

+		IElementType requestContextElementType = IntermediateModelElementTypes

+				.getElementType(getVisualID(request));

+		return requestContextElementType != null ? requestContextElementType

+				: myElementType;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getSemanticCommandSwitch(IEditCommandRequest req) {

+		if (req instanceof CreateRelationshipRequest) {

+			return getCreateRelationshipCommand((CreateRelationshipRequest) req);

+		} else if (req instanceof CreateElementRequest) {

+			return getCreateCommand((CreateElementRequest) req);

+		} else if (req instanceof ConfigureRequest) {

+			return getConfigureCommand((ConfigureRequest) req);

+		} else if (req instanceof DestroyElementRequest) {

+			return getDestroyElementCommand((DestroyElementRequest) req);

+		} else if (req instanceof DestroyReferenceRequest) {

+			return getDestroyReferenceCommand((DestroyReferenceRequest) req);

+		} else if (req instanceof DuplicateElementsRequest) {

+			return getDuplicateCommand((DuplicateElementsRequest) req);

+		} else if (req instanceof GetEditContextRequest) {

+			return getEditContextCommand((GetEditContextRequest) req);

+		} else if (req instanceof MoveRequest) {

+			return getMoveCommand((MoveRequest) req);

+		} else if (req instanceof ReorientReferenceRelationshipRequest) {

+			return getReorientReferenceRelationshipCommand((ReorientReferenceRelationshipRequest) req);

+		} else if (req instanceof ReorientRelationshipRequest) {

+			return getReorientRelationshipCommand((ReorientRelationshipRequest) req);

+		} else if (req instanceof SetRequest) {

+			return getSetCommand((SetRequest) req);

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getConfigureCommand(ConfigureRequest req) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getCreateCommand(CreateElementRequest req) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getSetCommand(SetRequest req) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getEditContextCommand(GetEditContextRequest req) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getDestroyElementCommand(DestroyElementRequest req) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getDestroyReferenceCommand(DestroyReferenceRequest req) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getDuplicateCommand(DuplicateElementsRequest req) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getMoveCommand(MoveRequest req) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getReorientReferenceRelationshipCommand(

+			ReorientReferenceRelationshipRequest req) {

+		return UnexecutableCommand.INSTANCE;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getReorientRelationshipCommand(

+			ReorientRelationshipRequest req) {

+		return UnexecutableCommand.INSTANCE;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected final Command getGEFWrapper(ICommand cmd) {

+		return new ICommandProxy(cmd);

+	}

+

+	/**

+	 * Returns editing domain from the host edit part.

+	 * @generated

+	 */

+	protected TransactionalEditingDomain getEditingDomain() {

+		return ((IGraphicalEditPart) getHost()).getEditingDomain();

+	}

+

+	/**

+	 * Clean all shortcuts to the host element from the same diagram

+	 * @generated

+	 */

+	protected void addDestroyShortcutsCommand(ICompositeCommand cmd, View view) {

+		assert view.getEAnnotation("Shortcut") == null; //$NON-NLS-1$

+		for (Iterator it = view.getDiagram().getChildren().iterator(); it

+				.hasNext();) {

+			View nextView = (View) it.next();

+			if (nextView.getEAnnotation("Shortcut") == null || !nextView.isSetElement() || nextView.getElement() != view.getElement()) { //$NON-NLS-1$

+				continue;

+			}

+			cmd.add(new DeleteCommand(getEditingDomain(), nextView));

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public static LinkConstraints getLinkConstraints() {

+		LinkConstraints cached = IntermediateModelDiagramEditorPlugin

+				.getInstance().getLinkConstraints();

+		if (cached == null) {

+			IntermediateModelDiagramEditorPlugin.getInstance()

+					.setLinkConstraints(cached = new LinkConstraints());

+		}

+		return cached;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static class LinkConstraints {

+

+		/**

+		 * @generated

+		 */

+		LinkConstraints() {

+			// use static method #getLinkConstraints() to access instance

+		}

+

+		/**

+		 * @generated

+		 */

+		public boolean canCreateTransition_4009(Process container, Step source,

+				Step target) {

+			return canExistTransition_4009(container, null, source, target);

+		}

+

+		/**

+		 * @generated

+		 */

+		public boolean canCreateStepServiceModel_4010(Step source,

+				Service target) {

+			if (source != null) {

+				if (source.getServiceModel() != null) {

+					return false;

+				}

+			}

+

+			return canExistStepServiceModel_4010(source, target);

+		}

+

+		/**

+		 * @generated

+		 */

+		public boolean canCreateServiceNeeds_4011(Service source, Service target) {

+			if (source != null) {

+				if (source.getNeeds().contains(target)) {

+					return false;

+				}

+			}

+

+			return canExistServiceNeeds_4011(source, target);

+		}

+

+		/**

+		 * @generated

+		 */

+		public boolean canExistTransition_4009(Process container,

+				Transition linkInstance, Step source, Step target) {

+			return true;

+		}

+

+		/**

+		 * @generated

+		 */

+		public boolean canExistStepServiceModel_4010(Step source, Service target) {

+			return true;

+		}

+

+		/**

+		 * @generated

+		 */

+		public boolean canExistServiceNeeds_4011(Service source, Service target) {

+			return true;

+		}

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/IntermediateModelTextNonResizableEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/IntermediateModelTextNonResizableEditPolicy.java
new file mode 100755
index 0000000..db7a76c
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/IntermediateModelTextNonResizableEditPolicy.java
@@ -0,0 +1,228 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import java.util.Collections;

+import java.util.List;

+

+import org.eclipse.draw2d.ColorConstants;

+import org.eclipse.draw2d.Figure;

+import org.eclipse.draw2d.FigureListener;

+import org.eclipse.draw2d.Graphics;

+import org.eclipse.draw2d.IFigure;

+import org.eclipse.draw2d.Label;

+import org.eclipse.draw2d.RectangleFigure;

+import org.eclipse.draw2d.geometry.Rectangle;

+import org.eclipse.gef.GraphicalEditPart;

+import org.eclipse.gef.handles.MoveHandle;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.NonResizableEditPolicyEx;

+import org.eclipse.gmf.runtime.diagram.ui.tools.DragEditPartsTrackerEx;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;

+import org.eclipse.gmf.tooling.runtime.edit.policies.labels.IRefreshableFeedbackEditPolicy;

+

+/**

+ * @generated

+ */

+public class IntermediateModelTextNonResizableEditPolicy extends

+		NonResizableEditPolicyEx implements IRefreshableFeedbackEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	private IFigure selectionFeedbackFigure;

+

+	/**

+	 * @generated

+	 */

+	private IFigure focusFeedbackFigure;

+

+	/**

+	 * @generated

+	 */

+	private FigureListener hostPositionListener;

+

+	/**

+	 * @generated

+	 */

+	protected void showPrimarySelection() {

+		if (getHostFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getHostFigure()).setSelected(true);

+			((WrappingLabel) getHostFigure()).setFocus(true);

+		} else {

+			showSelection();

+			showFocus();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void showSelection() {

+		if (getHostFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getHostFigure()).setSelected(true);

+			((WrappingLabel) getHostFigure()).setFocus(false);

+		} else {

+			hideSelection();

+			addFeedback(selectionFeedbackFigure = createSelectionFeedbackFigure());

+			getHostFigure().addFigureListener(getHostPositionListener());

+			refreshSelectionFeedback();

+			hideFocus();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void hideSelection() {

+		if (getHostFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getHostFigure()).setSelected(false);

+			((WrappingLabel) getHostFigure()).setFocus(false);

+		} else {

+			if (selectionFeedbackFigure != null) {

+				removeFeedback(selectionFeedbackFigure);

+				getHostFigure().removeFigureListener(getHostPositionListener());

+				selectionFeedbackFigure = null;

+			}

+			hideFocus();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void showFocus() {

+		if (getHostFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getHostFigure()).setFocus(true);

+		} else {

+			hideFocus();

+			addFeedback(focusFeedbackFigure = createFocusFeedbackFigure());

+			refreshFocusFeedback();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void hideFocus() {

+		if (getHostFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getHostFigure()).setFocus(false);

+		} else {

+			if (focusFeedbackFigure != null) {

+				removeFeedback(focusFeedbackFigure);

+				focusFeedbackFigure = null;

+			}

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Rectangle getFeedbackBounds() {

+		Rectangle bounds;

+		if (getHostFigure() instanceof Label) {

+			bounds = ((Label) getHostFigure()).getTextBounds();

+			bounds.intersect(getHostFigure().getBounds());

+		} else {

+			bounds = getHostFigure().getBounds().getCopy();

+		}

+		getHostFigure().getParent().translateToAbsolute(bounds);

+		getFeedbackLayer().translateToRelative(bounds);

+		return bounds;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure createSelectionFeedbackFigure() {

+		if (getHostFigure() instanceof Label) {

+			Label feedbackFigure = new Label();

+			feedbackFigure.setOpaque(true);

+			feedbackFigure

+					.setBackgroundColor(ColorConstants.menuBackgroundSelected);

+			feedbackFigure

+					.setForegroundColor(ColorConstants.menuForegroundSelected);

+			return feedbackFigure;

+		} else {

+			RectangleFigure feedbackFigure = new RectangleFigure();

+			feedbackFigure.setFill(false);

+			return feedbackFigure;

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure createFocusFeedbackFigure() {

+		return new Figure() {

+

+			protected void paintFigure(Graphics graphics) {

+				graphics.drawFocus(getBounds().getResized(-1, -1));

+			}

+		};

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void updateLabel(Label target) {

+		Label source = (Label) getHostFigure();

+		target.setText(source.getText());

+		target.setTextAlignment(source.getTextAlignment());

+		target.setFont(source.getFont());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshSelectionFeedback() {

+		if (selectionFeedbackFigure != null) {

+			if (selectionFeedbackFigure instanceof Label) {

+				updateLabel((Label) selectionFeedbackFigure);

+				selectionFeedbackFigure.setBounds(getFeedbackBounds());

+			} else {

+				selectionFeedbackFigure.setBounds(getFeedbackBounds().expand(5,

+						5));

+			}

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshFocusFeedback() {

+		if (focusFeedbackFigure != null) {

+			focusFeedbackFigure.setBounds(getFeedbackBounds());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public void refreshFeedback() {

+		refreshSelectionFeedback();

+		refreshFocusFeedback();

+	}

+

+	/**

+	 * @generated

+	 */

+	private FigureListener getHostPositionListener() {

+		if (hostPositionListener == null) {

+			hostPositionListener = new FigureListener() {

+				public void figureMoved(IFigure source) {

+					refreshFeedback();

+				}

+			};

+		}

+		return hostPositionListener;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected List createSelectionHandles() {

+		MoveHandle moveHandle = new MoveHandle((GraphicalEditPart) getHost());

+		moveHandle.setBorder(null);

+		moveHandle.setDragTracker(new DragEditPartsTrackerEx(getHost()));

+		return Collections.singletonList(moveHandle);

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/IntermediateModelTextSelectionEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/IntermediateModelTextSelectionEditPolicy.java
new file mode 100755
index 0000000..4d51ad3
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/IntermediateModelTextSelectionEditPolicy.java
@@ -0,0 +1,212 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import org.eclipse.draw2d.ColorConstants;

+import org.eclipse.draw2d.Figure;

+import org.eclipse.draw2d.FigureListener;

+import org.eclipse.draw2d.Graphics;

+import org.eclipse.draw2d.IFigure;

+import org.eclipse.draw2d.Label;

+import org.eclipse.draw2d.RectangleFigure;

+import org.eclipse.draw2d.geometry.Rectangle;

+import org.eclipse.gef.editpolicies.SelectionEditPolicy;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;

+import org.eclipse.gmf.tooling.runtime.edit.policies.labels.IRefreshableFeedbackEditPolicy;

+

+/**

+ * @generated

+ */

+public class IntermediateModelTextSelectionEditPolicy extends

+		SelectionEditPolicy implements IRefreshableFeedbackEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	private IFigure selectionFeedbackFigure;

+

+	/**

+	 * @generated

+	 */

+	private IFigure focusFeedbackFigure;

+

+	/**

+	 * @generated

+	 */

+	private FigureListener hostPositionListener;

+

+	/**

+	 * @generated

+	 */

+	protected void showPrimarySelection() {

+		if (getHostFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getHostFigure()).setSelected(true);

+			((WrappingLabel) getHostFigure()).setFocus(true);

+		} else {

+			showSelection();

+			showFocus();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void showSelection() {

+		if (getHostFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getHostFigure()).setSelected(true);

+			((WrappingLabel) getHostFigure()).setFocus(false);

+		} else {

+			hideSelection();

+			addFeedback(selectionFeedbackFigure = createSelectionFeedbackFigure());

+			getHostFigure().addFigureListener(getHostPositionListener());

+			refreshSelectionFeedback();

+			hideFocus();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void hideSelection() {

+		if (getHostFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getHostFigure()).setSelected(false);

+			((WrappingLabel) getHostFigure()).setFocus(false);

+		} else {

+			if (selectionFeedbackFigure != null) {

+				removeFeedback(selectionFeedbackFigure);

+				getHostFigure().removeFigureListener(getHostPositionListener());

+				selectionFeedbackFigure = null;

+			}

+			hideFocus();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void showFocus() {

+		if (getHostFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getHostFigure()).setFocus(true);

+		} else {

+			hideFocus();

+			addFeedback(focusFeedbackFigure = createFocusFeedbackFigure());

+			refreshFocusFeedback();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void hideFocus() {

+		if (getHostFigure() instanceof WrappingLabel) {

+			((WrappingLabel) getHostFigure()).setFocus(false);

+		} else {

+			if (focusFeedbackFigure != null) {

+				removeFeedback(focusFeedbackFigure);

+				focusFeedbackFigure = null;

+			}

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Rectangle getFeedbackBounds() {

+		Rectangle bounds;

+		if (getHostFigure() instanceof Label) {

+			bounds = ((Label) getHostFigure()).getTextBounds();

+			bounds.intersect(getHostFigure().getBounds());

+		} else {

+			bounds = getHostFigure().getBounds().getCopy();

+		}

+		getHostFigure().getParent().translateToAbsolute(bounds);

+		getFeedbackLayer().translateToRelative(bounds);

+		return bounds;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure createSelectionFeedbackFigure() {

+		if (getHostFigure() instanceof Label) {

+			Label feedbackFigure = new Label();

+			feedbackFigure.setOpaque(true);

+			feedbackFigure

+					.setBackgroundColor(ColorConstants.menuBackgroundSelected);

+			feedbackFigure

+					.setForegroundColor(ColorConstants.menuForegroundSelected);

+			return feedbackFigure;

+		} else {

+			RectangleFigure feedbackFigure = new RectangleFigure();

+			feedbackFigure.setFill(false);

+			return feedbackFigure;

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IFigure createFocusFeedbackFigure() {

+		return new Figure() {

+

+			protected void paintFigure(Graphics graphics) {

+				graphics.drawFocus(getBounds().getResized(-1, -1));

+			}

+		};

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void updateLabel(Label target) {

+		Label source = (Label) getHostFigure();

+		target.setText(source.getText());

+		target.setTextAlignment(source.getTextAlignment());

+		target.setFont(source.getFont());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshSelectionFeedback() {

+		if (selectionFeedbackFigure != null) {

+			if (selectionFeedbackFigure instanceof Label) {

+				updateLabel((Label) selectionFeedbackFigure);

+				selectionFeedbackFigure.setBounds(getFeedbackBounds());

+			} else {

+				selectionFeedbackFigure.setBounds(getFeedbackBounds().expand(5,

+						5));

+			}

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshFocusFeedback() {

+		if (focusFeedbackFigure != null) {

+			focusFeedbackFigure.setBounds(getFeedbackBounds());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public void refreshFeedback() {

+		refreshSelectionFeedback();

+		refreshFocusFeedback();

+	}

+

+	/**

+	 * @generated

+	 */

+	private FigureListener getHostPositionListener() {

+		if (hostPositionListener == null) {

+			hostPositionListener = new FigureListener() {

+				public void figureMoved(IFigure source) {

+					refreshFeedback();

+				}

+			};

+		}

+		return hostPositionListener;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ProcessCanonicalEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ProcessCanonicalEditPolicy.java
new file mode 100755
index 0000000..db6ee35
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ProcessCanonicalEditPolicy.java
@@ -0,0 +1,172 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import java.util.ArrayList;

+import java.util.Collection;

+import java.util.Iterator;

+import java.util.LinkedList;

+import java.util.List;

+

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.EStructuralFeature;

+import org.eclipse.gef.EditPart;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;

+import org.eclipse.gmf.runtime.diagram.ui.commands.DeferredLayoutCommand;

+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;

+import org.eclipse.gmf.runtime.diagram.ui.commands.SetViewMutabilityCommand;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;

+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;

+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;

+import org.eclipse.gmf.runtime.notation.Node;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.ImPackage;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramUpdater;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelNodeDescriptor;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+

+/**

+ * @generated

+ */

+public class ProcessCanonicalEditPolicy extends CanonicalEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	protected void refreshOnActivate() {

+		// Need to activate editpart children before invoking the canonical refresh for EditParts to add event listeners

+		List<?> c = getHost().getChildren();

+		for (int i = 0; i < c.size(); i++) {

+			((EditPart) c.get(i)).activate();

+		}

+		super.refreshOnActivate();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected EStructuralFeature getFeatureToSynchronize() {

+		return ImPackage.eINSTANCE.getProcess_Steps();

+	}

+

+	/**

+	 * @generated

+	 */

+	@SuppressWarnings("rawtypes")

+	protected List getSemanticChildrenList() {

+		View viewObject = (View) getHost().getModel();

+		LinkedList<EObject> result = new LinkedList<EObject>();

+		List<IntermediateModelNodeDescriptor> childDescriptors = IntermediateModelDiagramUpdater

+				.getProcess_3007SemanticChildren(viewObject);

+		for (IntermediateModelNodeDescriptor d : childDescriptors) {

+			result.add(d.getModelElement());

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean isOrphaned(Collection<EObject> semanticChildren,

+			final View view) {

+		return isMyDiagramElement(view)

+				&& !semanticChildren.contains(view.getElement());

+	}

+

+	/**

+	 * @generated

+	 */

+	private boolean isMyDiagramElement(View view) {

+		return StepEditPart.VISUAL_ID == IntermediateModelVisualIDRegistry

+				.getVisualID(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshSemantic() {

+		if (resolveSemanticElement() == null) {

+			return;

+		}

+		LinkedList<IAdaptable> createdViews = new LinkedList<IAdaptable>();

+		List<IntermediateModelNodeDescriptor> childDescriptors = IntermediateModelDiagramUpdater

+				.getProcess_3007SemanticChildren((View) getHost().getModel());

+		LinkedList<View> orphaned = new LinkedList<View>();

+		// we care to check only views we recognize as ours

+		LinkedList<View> knownViewChildren = new LinkedList<View>();

+		for (View v : getViewChildren()) {

+			if (isMyDiagramElement(v)) {

+				knownViewChildren.add(v);

+			}

+		}

+		// alternative to #cleanCanonicalSemanticChildren(getViewChildren(), semanticChildren)

+		//

+		// iteration happens over list of desired semantic elements, trying to find best matching View, while original CEP

+		// iterates views, potentially losing view (size/bounds) information - i.e. if there are few views to reference same EObject, only last one 

+		// to answer isOrphaned == true will be used for the domain element representation, see #cleanCanonicalSemanticChildren()

+		for (Iterator<IntermediateModelNodeDescriptor> descriptorsIterator = childDescriptors

+				.iterator(); descriptorsIterator.hasNext();) {

+			IntermediateModelNodeDescriptor next = descriptorsIterator.next();

+			String hint = IntermediateModelVisualIDRegistry.getType(next

+					.getVisualID());

+			LinkedList<View> perfectMatch = new LinkedList<View>(); // both semanticElement and hint match that of NodeDescriptor

+			for (View childView : getViewChildren()) {

+				EObject semanticElement = childView.getElement();

+				if (next.getModelElement().equals(semanticElement)) {

+					if (hint.equals(childView.getType())) {

+						perfectMatch.add(childView);

+						// actually, can stop iteration over view children here, but

+						// may want to use not the first view but last one as a 'real' match (the way original CEP does

+						// with its trick with viewToSemanticMap inside #cleanCanonicalSemanticChildren

+					}

+				}

+			}

+			if (perfectMatch.size() > 0) {

+				descriptorsIterator.remove(); // precise match found no need to create anything for the NodeDescriptor

+				// use only one view (first or last?), keep rest as orphaned for further consideration

+				knownViewChildren.remove(perfectMatch.getFirst());

+			}

+		}

+		// those left in knownViewChildren are subject to removal - they are our diagram elements we didn't find match to,

+		// or those we have potential matches to, and thus need to be recreated, preserving size/location information.

+		orphaned.addAll(knownViewChildren);

+		//

+		ArrayList<CreateViewRequest.ViewDescriptor> viewDescriptors = new ArrayList<CreateViewRequest.ViewDescriptor>(

+				childDescriptors.size());

+		for (IntermediateModelNodeDescriptor next : childDescriptors) {

+			String hint = IntermediateModelVisualIDRegistry.getType(next

+					.getVisualID());

+			IAdaptable elementAdapter = new CanonicalElementAdapter(

+					next.getModelElement(), hint);

+			CreateViewRequest.ViewDescriptor descriptor = new CreateViewRequest.ViewDescriptor(

+					elementAdapter, Node.class, hint, ViewUtil.APPEND, false,

+					host().getDiagramPreferencesHint());

+			viewDescriptors.add(descriptor);

+		}

+

+		boolean changed = deleteViews(orphaned.iterator());

+		//

+		CreateViewRequest request = getCreateViewRequest(viewDescriptors);

+		Command cmd = getCreateViewCommand(request);

+		if (cmd != null && cmd.canExecute()) {

+			SetViewMutabilityCommand.makeMutable(

+					new EObjectAdapter(host().getNotationView())).execute();

+			executeCommand(cmd);

+			@SuppressWarnings("unchecked")

+			List<IAdaptable> nl = (List<IAdaptable>) request.getNewObject();

+			createdViews.addAll(nl);

+		}

+		if (changed || createdViews.size() > 0) {

+			postProcessRefreshSemantic(createdViews);

+		}

+		if (createdViews.size() > 1) {

+			// perform a layout of the container

+			DeferredLayoutCommand layoutCmd = new DeferredLayoutCommand(host()

+					.getEditingDomain(), createdViews, host());

+			executeCommand(new ICommandProxy(layoutCmd));

+		}

+

+		makeViewsImmutable(createdViews);

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ProcessCollectionCanonicalEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ProcessCollectionCanonicalEditPolicy.java
new file mode 100755
index 0000000..0ac9ad7
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ProcessCollectionCanonicalEditPolicy.java
@@ -0,0 +1,173 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import java.util.ArrayList;

+import java.util.Collection;

+import java.util.Iterator;

+import java.util.LinkedList;

+import java.util.List;

+

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.EStructuralFeature;

+import org.eclipse.gef.EditPart;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;

+import org.eclipse.gmf.runtime.diagram.ui.commands.DeferredLayoutCommand;

+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;

+import org.eclipse.gmf.runtime.diagram.ui.commands.SetViewMutabilityCommand;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;

+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;

+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;

+import org.eclipse.gmf.runtime.notation.Node;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.ImPackage;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramUpdater;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelNodeDescriptor;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+

+/**

+ * @generated

+ */

+public class ProcessCollectionCanonicalEditPolicy extends CanonicalEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	protected void refreshOnActivate() {

+		// Need to activate editpart children before invoking the canonical refresh for EditParts to add event listeners

+		List<?> c = getHost().getChildren();

+		for (int i = 0; i < c.size(); i++) {

+			((EditPart) c.get(i)).activate();

+		}

+		super.refreshOnActivate();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected EStructuralFeature getFeatureToSynchronize() {

+		return ImPackage.eINSTANCE.getProcessCollection_Processes();

+	}

+

+	/**

+	 * @generated

+	 */

+	@SuppressWarnings("rawtypes")

+	protected List getSemanticChildrenList() {

+		View viewObject = (View) getHost().getModel();

+		LinkedList<EObject> result = new LinkedList<EObject>();

+		List<IntermediateModelNodeDescriptor> childDescriptors = IntermediateModelDiagramUpdater

+				.getProcessCollection_2005SemanticChildren(viewObject);

+		for (IntermediateModelNodeDescriptor d : childDescriptors) {

+			result.add(d.getModelElement());

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean isOrphaned(Collection<EObject> semanticChildren,

+			final View view) {

+		return isMyDiagramElement(view)

+				&& !semanticChildren.contains(view.getElement());

+	}

+

+	/**

+	 * @generated

+	 */

+	private boolean isMyDiagramElement(View view) {

+		return ProcessEditPart.VISUAL_ID == IntermediateModelVisualIDRegistry

+				.getVisualID(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshSemantic() {

+		if (resolveSemanticElement() == null) {

+			return;

+		}

+		LinkedList<IAdaptable> createdViews = new LinkedList<IAdaptable>();

+		List<IntermediateModelNodeDescriptor> childDescriptors = IntermediateModelDiagramUpdater

+				.getProcessCollection_2005SemanticChildren((View) getHost()

+						.getModel());

+		LinkedList<View> orphaned = new LinkedList<View>();

+		// we care to check only views we recognize as ours

+		LinkedList<View> knownViewChildren = new LinkedList<View>();

+		for (View v : getViewChildren()) {

+			if (isMyDiagramElement(v)) {

+				knownViewChildren.add(v);

+			}

+		}

+		// alternative to #cleanCanonicalSemanticChildren(getViewChildren(), semanticChildren)

+		//

+		// iteration happens over list of desired semantic elements, trying to find best matching View, while original CEP

+		// iterates views, potentially losing view (size/bounds) information - i.e. if there are few views to reference same EObject, only last one 

+		// to answer isOrphaned == true will be used for the domain element representation, see #cleanCanonicalSemanticChildren()

+		for (Iterator<IntermediateModelNodeDescriptor> descriptorsIterator = childDescriptors

+				.iterator(); descriptorsIterator.hasNext();) {

+			IntermediateModelNodeDescriptor next = descriptorsIterator.next();

+			String hint = IntermediateModelVisualIDRegistry.getType(next

+					.getVisualID());

+			LinkedList<View> perfectMatch = new LinkedList<View>(); // both semanticElement and hint match that of NodeDescriptor

+			for (View childView : getViewChildren()) {

+				EObject semanticElement = childView.getElement();

+				if (next.getModelElement().equals(semanticElement)) {

+					if (hint.equals(childView.getType())) {

+						perfectMatch.add(childView);

+						// actually, can stop iteration over view children here, but

+						// may want to use not the first view but last one as a 'real' match (the way original CEP does

+						// with its trick with viewToSemanticMap inside #cleanCanonicalSemanticChildren

+					}

+				}

+			}

+			if (perfectMatch.size() > 0) {

+				descriptorsIterator.remove(); // precise match found no need to create anything for the NodeDescriptor

+				// use only one view (first or last?), keep rest as orphaned for further consideration

+				knownViewChildren.remove(perfectMatch.getFirst());

+			}

+		}

+		// those left in knownViewChildren are subject to removal - they are our diagram elements we didn't find match to,

+		// or those we have potential matches to, and thus need to be recreated, preserving size/location information.

+		orphaned.addAll(knownViewChildren);

+		//

+		ArrayList<CreateViewRequest.ViewDescriptor> viewDescriptors = new ArrayList<CreateViewRequest.ViewDescriptor>(

+				childDescriptors.size());

+		for (IntermediateModelNodeDescriptor next : childDescriptors) {

+			String hint = IntermediateModelVisualIDRegistry.getType(next

+					.getVisualID());

+			IAdaptable elementAdapter = new CanonicalElementAdapter(

+					next.getModelElement(), hint);

+			CreateViewRequest.ViewDescriptor descriptor = new CreateViewRequest.ViewDescriptor(

+					elementAdapter, Node.class, hint, ViewUtil.APPEND, false,

+					host().getDiagramPreferencesHint());

+			viewDescriptors.add(descriptor);

+		}

+

+		boolean changed = deleteViews(orphaned.iterator());

+		//

+		CreateViewRequest request = getCreateViewRequest(viewDescriptors);

+		Command cmd = getCreateViewCommand(request);

+		if (cmd != null && cmd.canExecute()) {

+			SetViewMutabilityCommand.makeMutable(

+					new EObjectAdapter(host().getNotationView())).execute();

+			executeCommand(cmd);

+			@SuppressWarnings("unchecked")

+			List<IAdaptable> nl = (List<IAdaptable>) request.getNewObject();

+			createdViews.addAll(nl);

+		}

+		if (changed || createdViews.size() > 0) {

+			postProcessRefreshSemantic(createdViews);

+		}

+		if (createdViews.size() > 1) {

+			// perform a layout of the container

+			DeferredLayoutCommand layoutCmd = new DeferredLayoutCommand(host()

+					.getEditingDomain(), createdViews, host());

+			executeCommand(new ICommandProxy(layoutCmd));

+		}

+

+		makeViewsImmutable(createdViews);

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ProcessCollectionItemSemanticEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ProcessCollectionItemSemanticEditPolicy.java
new file mode 100755
index 0000000..88fd516
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ProcessCollectionItemSemanticEditPolicy.java
@@ -0,0 +1,125 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import java.util.Iterator;

+

+import org.eclipse.emf.ecore.EAnnotation;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gmf.runtime.common.core.command.ICompositeCommand;

+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;

+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;

+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyReferenceCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;

+import org.eclipse.gmf.runtime.notation.Edge;

+import org.eclipse.gmf.runtime.notation.Node;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.diagram.edit.commands.ProcessCreateCommand;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceNeedsEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepServiceModelEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+

+/**

+ * @generated

+ */

+public class ProcessCollectionItemSemanticEditPolicy extends

+		IntermediateModelBaseItemSemanticEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	public ProcessCollectionItemSemanticEditPolicy() {

+		super(IntermediateModelElementTypes.ProcessCollection_2005);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getCreateCommand(CreateElementRequest req) {

+		if (IntermediateModelElementTypes.Process_3007 == req.getElementType()) {

+			return getGEFWrapper(new ProcessCreateCommand(req));

+		}

+		return super.getCreateCommand(req);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getDestroyElementCommand(DestroyElementRequest req) {

+		View view = (View) getHost().getModel();

+		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(

+				getEditingDomain(), null);

+		cmd.setTransactionNestingEnabled(false);

+		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$

+		if (annotation == null) {

+			// there are indirectly referenced children, need extra commands: false

+			addDestroyChildNodesCommand(cmd);

+			addDestroyShortcutsCommand(cmd, view);

+			// delete host element

+			cmd.add(new DestroyElementCommand(req));

+		} else {

+			cmd.add(new DeleteCommand(getEditingDomain(), view));

+		}

+		return getGEFWrapper(cmd.reduce());

+	}

+

+	/**

+	 * @generated

+	 */

+	private void addDestroyChildNodesCommand(ICompositeCommand cmd) {

+		View view = (View) getHost().getModel();

+		for (Iterator<?> nit = view.getChildren().iterator(); nit.hasNext();) {

+			Node node = (Node) nit.next();

+			switch (IntermediateModelVisualIDRegistry.getVisualID(node)) {

+			case ProcessEditPart.VISUAL_ID:

+				for (Iterator<?> it = node.getTargetEdges().iterator(); it

+						.hasNext();) {

+					Edge incomingLink = (Edge) it.next();

+					if (IntermediateModelVisualIDRegistry

+							.getVisualID(incomingLink) == StepServiceModelEditPart.VISUAL_ID) {

+						DestroyReferenceRequest r = new DestroyReferenceRequest(

+								incomingLink.getSource().getElement(), null,

+								incomingLink.getTarget().getElement(), false);

+						cmd.add(new DestroyReferenceCommand(r));

+						cmd.add(new DeleteCommand(getEditingDomain(),

+								incomingLink));

+						continue;

+					}

+					if (IntermediateModelVisualIDRegistry

+							.getVisualID(incomingLink) == ServiceNeedsEditPart.VISUAL_ID) {

+						DestroyReferenceRequest r = new DestroyReferenceRequest(

+								incomingLink.getSource().getElement(), null,

+								incomingLink.getTarget().getElement(), false);

+						cmd.add(new DestroyReferenceCommand(r));

+						cmd.add(new DeleteCommand(getEditingDomain(),

+								incomingLink));

+						continue;

+					}

+				}

+				for (Iterator<?> it = node.getSourceEdges().iterator(); it

+						.hasNext();) {

+					Edge outgoingLink = (Edge) it.next();

+					if (IntermediateModelVisualIDRegistry

+							.getVisualID(outgoingLink) == ServiceNeedsEditPart.VISUAL_ID) {

+						DestroyReferenceRequest r = new DestroyReferenceRequest(

+								outgoingLink.getSource().getElement(), null,

+								outgoingLink.getTarget().getElement(), false);

+						cmd.add(new DestroyReferenceCommand(r));

+						cmd.add(new DeleteCommand(getEditingDomain(),

+								outgoingLink));

+						continue;

+					}

+				}

+				cmd.add(new DestroyElementCommand(new DestroyElementRequest(

+						getEditingDomain(), node.getElement(), false))); // directlyOwned: true

+				// don't need explicit deletion of node as parent's view deletion would clean child views as well 

+				// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), node));

+				break;

+			}

+		}

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ProcessItemSemanticEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ProcessItemSemanticEditPolicy.java
new file mode 100755
index 0000000..9232b5c
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ProcessItemSemanticEditPolicy.java
@@ -0,0 +1,222 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import java.util.Iterator;

+

+import org.eclipse.emf.ecore.EAnnotation;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gmf.runtime.common.core.command.ICompositeCommand;

+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;

+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;

+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyReferenceCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientReferenceRelationshipRequest;

+import org.eclipse.gmf.runtime.notation.Edge;

+import org.eclipse.gmf.runtime.notation.Node;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.diagram.edit.commands.ServiceNeedsCreateCommand;

+import org.eclipse.soa.mangrove.diagram.edit.commands.ServiceNeedsReorientCommand;

+import org.eclipse.soa.mangrove.diagram.edit.commands.StepCreateCommand;

+import org.eclipse.soa.mangrove.diagram.edit.commands.StepServiceModelCreateCommand;

+import org.eclipse.soa.mangrove.diagram.edit.commands.StepServiceModelReorientCommand;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceNeedsEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepServiceModelEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.TransitionEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+

+/**

+ * @generated

+ */

+public class ProcessItemSemanticEditPolicy extends

+		IntermediateModelBaseItemSemanticEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	public ProcessItemSemanticEditPolicy() {

+		super(IntermediateModelElementTypes.Process_3007);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getCreateCommand(CreateElementRequest req) {

+		if (IntermediateModelElementTypes.Step_3008 == req.getElementType()) {

+			return getGEFWrapper(new StepCreateCommand(req));

+		}

+		return super.getCreateCommand(req);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getDestroyElementCommand(DestroyElementRequest req) {

+		View view = (View) getHost().getModel();

+		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(

+				getEditingDomain(), null);

+		cmd.setTransactionNestingEnabled(false);

+		for (Iterator<?> it = view.getTargetEdges().iterator(); it.hasNext();) {

+			Edge incomingLink = (Edge) it.next();

+			if (IntermediateModelVisualIDRegistry.getVisualID(incomingLink) == StepServiceModelEditPart.VISUAL_ID) {

+				DestroyReferenceRequest r = new DestroyReferenceRequest(

+						incomingLink.getSource().getElement(), null,

+						incomingLink.getTarget().getElement(), false);

+				cmd.add(new DestroyReferenceCommand(r));

+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));

+				continue;

+			}

+			if (IntermediateModelVisualIDRegistry.getVisualID(incomingLink) == ServiceNeedsEditPart.VISUAL_ID) {

+				DestroyReferenceRequest r = new DestroyReferenceRequest(

+						incomingLink.getSource().getElement(), null,

+						incomingLink.getTarget().getElement(), false);

+				cmd.add(new DestroyReferenceCommand(r));

+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));

+				continue;

+			}

+		}

+		for (Iterator<?> it = view.getSourceEdges().iterator(); it.hasNext();) {

+			Edge outgoingLink = (Edge) it.next();

+			if (IntermediateModelVisualIDRegistry.getVisualID(outgoingLink) == ServiceNeedsEditPart.VISUAL_ID) {

+				DestroyReferenceRequest r = new DestroyReferenceRequest(

+						outgoingLink.getSource().getElement(), null,

+						outgoingLink.getTarget().getElement(), false);

+				cmd.add(new DestroyReferenceCommand(r));

+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));

+				continue;

+			}

+		}

+		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$

+		if (annotation == null) {

+			// there are indirectly referenced children, need extra commands: false

+			addDestroyChildNodesCommand(cmd);

+			addDestroyShortcutsCommand(cmd, view);

+			// delete host element

+			cmd.add(new DestroyElementCommand(req));

+		} else {

+			cmd.add(new DeleteCommand(getEditingDomain(), view));

+		}

+		return getGEFWrapper(cmd.reduce());

+	}

+

+	/**

+	 * @generated

+	 */

+	private void addDestroyChildNodesCommand(ICompositeCommand cmd) {

+		View view = (View) getHost().getModel();

+		for (Iterator<?> nit = view.getChildren().iterator(); nit.hasNext();) {

+			Node node = (Node) nit.next();

+			switch (IntermediateModelVisualIDRegistry.getVisualID(node)) {

+			case StepEditPart.VISUAL_ID:

+				for (Iterator<?> it = node.getTargetEdges().iterator(); it

+						.hasNext();) {

+					Edge incomingLink = (Edge) it.next();

+					if (IntermediateModelVisualIDRegistry

+							.getVisualID(incomingLink) == TransitionEditPart.VISUAL_ID) {

+						DestroyElementRequest r = new DestroyElementRequest(

+								incomingLink.getElement(), false);

+						cmd.add(new DestroyElementCommand(r));

+						cmd.add(new DeleteCommand(getEditingDomain(),

+								incomingLink));

+						continue;

+					}

+				}

+				for (Iterator<?> it = node.getSourceEdges().iterator(); it

+						.hasNext();) {

+					Edge outgoingLink = (Edge) it.next();

+					if (IntermediateModelVisualIDRegistry

+							.getVisualID(outgoingLink) == TransitionEditPart.VISUAL_ID) {

+						DestroyElementRequest r = new DestroyElementRequest(

+								outgoingLink.getElement(), false);

+						cmd.add(new DestroyElementCommand(r));

+						cmd.add(new DeleteCommand(getEditingDomain(),

+								outgoingLink));

+						continue;

+					}

+					if (IntermediateModelVisualIDRegistry

+							.getVisualID(outgoingLink) == StepServiceModelEditPart.VISUAL_ID) {

+						DestroyReferenceRequest r = new DestroyReferenceRequest(

+								outgoingLink.getSource().getElement(), null,

+								outgoingLink.getTarget().getElement(), false);

+						cmd.add(new DestroyReferenceCommand(r));

+						cmd.add(new DeleteCommand(getEditingDomain(),

+								outgoingLink));

+						continue;

+					}

+				}

+				cmd.add(new DestroyElementCommand(new DestroyElementRequest(

+						getEditingDomain(), node.getElement(), false))); // directlyOwned: true

+				// don't need explicit deletion of node as parent's view deletion would clean child views as well 

+				// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), node));

+				break;

+			}

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {

+		Command command = req.getTarget() == null ? getStartCreateRelationshipCommand(req)

+				: getCompleteCreateRelationshipCommand(req);

+		return command != null ? command : super

+				.getCreateRelationshipCommand(req);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getStartCreateRelationshipCommand(

+			CreateRelationshipRequest req) {

+		if (IntermediateModelElementTypes.StepServiceModel_4010 == req

+				.getElementType()) {

+			return null;

+		}

+		if (IntermediateModelElementTypes.ServiceNeeds_4011 == req

+				.getElementType()) {

+			return getGEFWrapper(new ServiceNeedsCreateCommand(req,

+					req.getSource(), req.getTarget()));

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getCompleteCreateRelationshipCommand(

+			CreateRelationshipRequest req) {

+		if (IntermediateModelElementTypes.StepServiceModel_4010 == req

+				.getElementType()) {

+			return getGEFWrapper(new StepServiceModelCreateCommand(req,

+					req.getSource(), req.getTarget()));

+		}

+		if (IntermediateModelElementTypes.ServiceNeeds_4011 == req

+				.getElementType()) {

+			return getGEFWrapper(new ServiceNeedsCreateCommand(req,

+					req.getSource(), req.getTarget()));

+		}

+		return null;

+	}

+

+	/**

+	 * Returns command to reorient EReference based link. New link target or source

+	 * should be the domain model element associated with this node.

+	 * 

+	 * @generated

+	 */

+	protected Command getReorientReferenceRelationshipCommand(

+			ReorientReferenceRelationshipRequest req) {

+		switch (getVisualID(req)) {

+		case StepServiceModelEditPart.VISUAL_ID:

+			return getGEFWrapper(new StepServiceModelReorientCommand(req));

+		case ServiceNeedsEditPart.VISUAL_ID:

+			return getGEFWrapper(new ServiceNeedsReorientCommand(req));

+		}

+		return super.getReorientReferenceRelationshipCommand(req);

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ServiceCollectionCanonicalEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ServiceCollectionCanonicalEditPolicy.java
new file mode 100755
index 0000000..5b0cc09
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ServiceCollectionCanonicalEditPolicy.java
@@ -0,0 +1,173 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import java.util.ArrayList;

+import java.util.Collection;

+import java.util.Iterator;

+import java.util.LinkedList;

+import java.util.List;

+

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.EStructuralFeature;

+import org.eclipse.gef.EditPart;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;

+import org.eclipse.gmf.runtime.diagram.ui.commands.DeferredLayoutCommand;

+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;

+import org.eclipse.gmf.runtime.diagram.ui.commands.SetViewMutabilityCommand;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;

+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;

+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;

+import org.eclipse.gmf.runtime.notation.Node;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.ImPackage;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramUpdater;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelNodeDescriptor;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+

+/**

+ * @generated

+ */

+public class ServiceCollectionCanonicalEditPolicy extends CanonicalEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	protected void refreshOnActivate() {

+		// Need to activate editpart children before invoking the canonical refresh for EditParts to add event listeners

+		List<?> c = getHost().getChildren();

+		for (int i = 0; i < c.size(); i++) {

+			((EditPart) c.get(i)).activate();

+		}

+		super.refreshOnActivate();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected EStructuralFeature getFeatureToSynchronize() {

+		return ImPackage.eINSTANCE.getServiceCollection_Services();

+	}

+

+	/**

+	 * @generated

+	 */

+	@SuppressWarnings("rawtypes")

+	protected List getSemanticChildrenList() {

+		View viewObject = (View) getHost().getModel();

+		LinkedList<EObject> result = new LinkedList<EObject>();

+		List<IntermediateModelNodeDescriptor> childDescriptors = IntermediateModelDiagramUpdater

+				.getServiceCollection_2006SemanticChildren(viewObject);

+		for (IntermediateModelNodeDescriptor d : childDescriptors) {

+			result.add(d.getModelElement());

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean isOrphaned(Collection<EObject> semanticChildren,

+			final View view) {

+		return isMyDiagramElement(view)

+				&& !semanticChildren.contains(view.getElement());

+	}

+

+	/**

+	 * @generated

+	 */

+	private boolean isMyDiagramElement(View view) {

+		return ServiceEditPart.VISUAL_ID == IntermediateModelVisualIDRegistry

+				.getVisualID(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshSemantic() {

+		if (resolveSemanticElement() == null) {

+			return;

+		}

+		LinkedList<IAdaptable> createdViews = new LinkedList<IAdaptable>();

+		List<IntermediateModelNodeDescriptor> childDescriptors = IntermediateModelDiagramUpdater

+				.getServiceCollection_2006SemanticChildren((View) getHost()

+						.getModel());

+		LinkedList<View> orphaned = new LinkedList<View>();

+		// we care to check only views we recognize as ours

+		LinkedList<View> knownViewChildren = new LinkedList<View>();

+		for (View v : getViewChildren()) {

+			if (isMyDiagramElement(v)) {

+				knownViewChildren.add(v);

+			}

+		}

+		// alternative to #cleanCanonicalSemanticChildren(getViewChildren(), semanticChildren)

+		//

+		// iteration happens over list of desired semantic elements, trying to find best matching View, while original CEP

+		// iterates views, potentially losing view (size/bounds) information - i.e. if there are few views to reference same EObject, only last one 

+		// to answer isOrphaned == true will be used for the domain element representation, see #cleanCanonicalSemanticChildren()

+		for (Iterator<IntermediateModelNodeDescriptor> descriptorsIterator = childDescriptors

+				.iterator(); descriptorsIterator.hasNext();) {

+			IntermediateModelNodeDescriptor next = descriptorsIterator.next();

+			String hint = IntermediateModelVisualIDRegistry.getType(next

+					.getVisualID());

+			LinkedList<View> perfectMatch = new LinkedList<View>(); // both semanticElement and hint match that of NodeDescriptor

+			for (View childView : getViewChildren()) {

+				EObject semanticElement = childView.getElement();

+				if (next.getModelElement().equals(semanticElement)) {

+					if (hint.equals(childView.getType())) {

+						perfectMatch.add(childView);

+						// actually, can stop iteration over view children here, but

+						// may want to use not the first view but last one as a 'real' match (the way original CEP does

+						// with its trick with viewToSemanticMap inside #cleanCanonicalSemanticChildren

+					}

+				}

+			}

+			if (perfectMatch.size() > 0) {

+				descriptorsIterator.remove(); // precise match found no need to create anything for the NodeDescriptor

+				// use only one view (first or last?), keep rest as orphaned for further consideration

+				knownViewChildren.remove(perfectMatch.getFirst());

+			}

+		}

+		// those left in knownViewChildren are subject to removal - they are our diagram elements we didn't find match to,

+		// or those we have potential matches to, and thus need to be recreated, preserving size/location information.

+		orphaned.addAll(knownViewChildren);

+		//

+		ArrayList<CreateViewRequest.ViewDescriptor> viewDescriptors = new ArrayList<CreateViewRequest.ViewDescriptor>(

+				childDescriptors.size());

+		for (IntermediateModelNodeDescriptor next : childDescriptors) {

+			String hint = IntermediateModelVisualIDRegistry.getType(next

+					.getVisualID());

+			IAdaptable elementAdapter = new CanonicalElementAdapter(

+					next.getModelElement(), hint);

+			CreateViewRequest.ViewDescriptor descriptor = new CreateViewRequest.ViewDescriptor(

+					elementAdapter, Node.class, hint, ViewUtil.APPEND, false,

+					host().getDiagramPreferencesHint());

+			viewDescriptors.add(descriptor);

+		}

+

+		boolean changed = deleteViews(orphaned.iterator());

+		//

+		CreateViewRequest request = getCreateViewRequest(viewDescriptors);

+		Command cmd = getCreateViewCommand(request);

+		if (cmd != null && cmd.canExecute()) {

+			SetViewMutabilityCommand.makeMutable(

+					new EObjectAdapter(host().getNotationView())).execute();

+			executeCommand(cmd);

+			@SuppressWarnings("unchecked")

+			List<IAdaptable> nl = (List<IAdaptable>) request.getNewObject();

+			createdViews.addAll(nl);

+		}

+		if (changed || createdViews.size() > 0) {

+			postProcessRefreshSemantic(createdViews);

+		}

+		if (createdViews.size() > 1) {

+			// perform a layout of the container

+			DeferredLayoutCommand layoutCmd = new DeferredLayoutCommand(host()

+					.getEditingDomain(), createdViews, host());

+			executeCommand(new ICommandProxy(layoutCmd));

+		}

+

+		makeViewsImmutable(createdViews);

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ServiceCollectionItemSemanticEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ServiceCollectionItemSemanticEditPolicy.java
new file mode 100755
index 0000000..f0c3ba0
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ServiceCollectionItemSemanticEditPolicy.java
@@ -0,0 +1,125 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import java.util.Iterator;

+

+import org.eclipse.emf.ecore.EAnnotation;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gmf.runtime.common.core.command.ICompositeCommand;

+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;

+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;

+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyReferenceCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;

+import org.eclipse.gmf.runtime.notation.Edge;

+import org.eclipse.gmf.runtime.notation.Node;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.diagram.edit.commands.ServiceCreateCommand;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceNeedsEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepServiceModelEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+

+/**

+ * @generated

+ */

+public class ServiceCollectionItemSemanticEditPolicy extends

+		IntermediateModelBaseItemSemanticEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	public ServiceCollectionItemSemanticEditPolicy() {

+		super(IntermediateModelElementTypes.ServiceCollection_2006);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getCreateCommand(CreateElementRequest req) {

+		if (IntermediateModelElementTypes.Service_3009 == req.getElementType()) {

+			return getGEFWrapper(new ServiceCreateCommand(req));

+		}

+		return super.getCreateCommand(req);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getDestroyElementCommand(DestroyElementRequest req) {

+		View view = (View) getHost().getModel();

+		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(

+				getEditingDomain(), null);

+		cmd.setTransactionNestingEnabled(false);

+		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$

+		if (annotation == null) {

+			// there are indirectly referenced children, need extra commands: false

+			addDestroyChildNodesCommand(cmd);

+			addDestroyShortcutsCommand(cmd, view);

+			// delete host element

+			cmd.add(new DestroyElementCommand(req));

+		} else {

+			cmd.add(new DeleteCommand(getEditingDomain(), view));

+		}

+		return getGEFWrapper(cmd.reduce());

+	}

+

+	/**

+	 * @generated

+	 */

+	private void addDestroyChildNodesCommand(ICompositeCommand cmd) {

+		View view = (View) getHost().getModel();

+		for (Iterator<?> nit = view.getChildren().iterator(); nit.hasNext();) {

+			Node node = (Node) nit.next();

+			switch (IntermediateModelVisualIDRegistry.getVisualID(node)) {

+			case ServiceEditPart.VISUAL_ID:

+				for (Iterator<?> it = node.getTargetEdges().iterator(); it

+						.hasNext();) {

+					Edge incomingLink = (Edge) it.next();

+					if (IntermediateModelVisualIDRegistry

+							.getVisualID(incomingLink) == StepServiceModelEditPart.VISUAL_ID) {

+						DestroyReferenceRequest r = new DestroyReferenceRequest(

+								incomingLink.getSource().getElement(), null,

+								incomingLink.getTarget().getElement(), false);

+						cmd.add(new DestroyReferenceCommand(r));

+						cmd.add(new DeleteCommand(getEditingDomain(),

+								incomingLink));

+						continue;

+					}

+					if (IntermediateModelVisualIDRegistry

+							.getVisualID(incomingLink) == ServiceNeedsEditPart.VISUAL_ID) {

+						DestroyReferenceRequest r = new DestroyReferenceRequest(

+								incomingLink.getSource().getElement(), null,

+								incomingLink.getTarget().getElement(), false);

+						cmd.add(new DestroyReferenceCommand(r));

+						cmd.add(new DeleteCommand(getEditingDomain(),

+								incomingLink));

+						continue;

+					}

+				}

+				for (Iterator<?> it = node.getSourceEdges().iterator(); it

+						.hasNext();) {

+					Edge outgoingLink = (Edge) it.next();

+					if (IntermediateModelVisualIDRegistry

+							.getVisualID(outgoingLink) == ServiceNeedsEditPart.VISUAL_ID) {

+						DestroyReferenceRequest r = new DestroyReferenceRequest(

+								outgoingLink.getSource().getElement(), null,

+								outgoingLink.getTarget().getElement(), false);

+						cmd.add(new DestroyReferenceCommand(r));

+						cmd.add(new DeleteCommand(getEditingDomain(),

+								outgoingLink));

+						continue;

+					}

+				}

+				cmd.add(new DestroyElementCommand(new DestroyElementRequest(

+						getEditingDomain(), node.getElement(), false))); // directlyOwned: true

+				// don't need explicit deletion of node as parent's view deletion would clean child views as well 

+				// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), node));

+				break;

+			}

+		}

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ServiceItemSemanticEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ServiceItemSemanticEditPolicy.java
new file mode 100755
index 0000000..24ab15f
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ServiceItemSemanticEditPolicy.java
@@ -0,0 +1,151 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import java.util.Iterator;

+

+import org.eclipse.emf.ecore.EAnnotation;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;

+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;

+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyReferenceCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientReferenceRelationshipRequest;

+import org.eclipse.gmf.runtime.notation.Edge;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.diagram.edit.commands.ServiceNeedsCreateCommand;

+import org.eclipse.soa.mangrove.diagram.edit.commands.ServiceNeedsReorientCommand;

+import org.eclipse.soa.mangrove.diagram.edit.commands.StepServiceModelCreateCommand;

+import org.eclipse.soa.mangrove.diagram.edit.commands.StepServiceModelReorientCommand;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceNeedsEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepServiceModelEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+

+/**

+ * @generated

+ */

+public class ServiceItemSemanticEditPolicy extends

+		IntermediateModelBaseItemSemanticEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	public ServiceItemSemanticEditPolicy() {

+		super(IntermediateModelElementTypes.Service_3009);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getDestroyElementCommand(DestroyElementRequest req) {

+		View view = (View) getHost().getModel();

+		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(

+				getEditingDomain(), null);

+		cmd.setTransactionNestingEnabled(false);

+		for (Iterator<?> it = view.getTargetEdges().iterator(); it.hasNext();) {

+			Edge incomingLink = (Edge) it.next();

+			if (IntermediateModelVisualIDRegistry.getVisualID(incomingLink) == StepServiceModelEditPart.VISUAL_ID) {

+				DestroyReferenceRequest r = new DestroyReferenceRequest(

+						incomingLink.getSource().getElement(), null,

+						incomingLink.getTarget().getElement(), false);

+				cmd.add(new DestroyReferenceCommand(r));

+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));

+				continue;

+			}

+			if (IntermediateModelVisualIDRegistry.getVisualID(incomingLink) == ServiceNeedsEditPart.VISUAL_ID) {

+				DestroyReferenceRequest r = new DestroyReferenceRequest(

+						incomingLink.getSource().getElement(), null,

+						incomingLink.getTarget().getElement(), false);

+				cmd.add(new DestroyReferenceCommand(r));

+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));

+				continue;

+			}

+		}

+		for (Iterator<?> it = view.getSourceEdges().iterator(); it.hasNext();) {

+			Edge outgoingLink = (Edge) it.next();

+			if (IntermediateModelVisualIDRegistry.getVisualID(outgoingLink) == ServiceNeedsEditPart.VISUAL_ID) {

+				DestroyReferenceRequest r = new DestroyReferenceRequest(

+						outgoingLink.getSource().getElement(), null,

+						outgoingLink.getTarget().getElement(), false);

+				cmd.add(new DestroyReferenceCommand(r));

+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));

+				continue;

+			}

+		}

+		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$

+		if (annotation == null) {

+			// there are indirectly referenced children, need extra commands: false

+			addDestroyShortcutsCommand(cmd, view);

+			// delete host element

+			cmd.add(new DestroyElementCommand(req));

+		} else {

+			cmd.add(new DeleteCommand(getEditingDomain(), view));

+		}

+		return getGEFWrapper(cmd.reduce());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {

+		Command command = req.getTarget() == null ? getStartCreateRelationshipCommand(req)

+				: getCompleteCreateRelationshipCommand(req);

+		return command != null ? command : super

+				.getCreateRelationshipCommand(req);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getStartCreateRelationshipCommand(

+			CreateRelationshipRequest req) {

+		if (IntermediateModelElementTypes.StepServiceModel_4010 == req

+				.getElementType()) {

+			return null;

+		}

+		if (IntermediateModelElementTypes.ServiceNeeds_4011 == req

+				.getElementType()) {

+			return getGEFWrapper(new ServiceNeedsCreateCommand(req,

+					req.getSource(), req.getTarget()));

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getCompleteCreateRelationshipCommand(

+			CreateRelationshipRequest req) {

+		if (IntermediateModelElementTypes.StepServiceModel_4010 == req

+				.getElementType()) {

+			return getGEFWrapper(new StepServiceModelCreateCommand(req,

+					req.getSource(), req.getTarget()));

+		}

+		if (IntermediateModelElementTypes.ServiceNeeds_4011 == req

+				.getElementType()) {

+			return getGEFWrapper(new ServiceNeedsCreateCommand(req,

+					req.getSource(), req.getTarget()));

+		}

+		return null;

+	}

+

+	/**

+	 * Returns command to reorient EReference based link. New link target or source

+	 * should be the domain model element associated with this node.

+	 * 

+	 * @generated

+	 */

+	protected Command getReorientReferenceRelationshipCommand(

+			ReorientReferenceRelationshipRequest req) {

+		switch (getVisualID(req)) {

+		case StepServiceModelEditPart.VISUAL_ID:

+			return getGEFWrapper(new StepServiceModelReorientCommand(req));

+		case ServiceNeedsEditPart.VISUAL_ID:

+			return getGEFWrapper(new ServiceNeedsReorientCommand(req));

+		}

+		return super.getReorientReferenceRelationshipCommand(req);

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ServiceNeedsItemSemanticEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ServiceNeedsItemSemanticEditPolicy.java
new file mode 100755
index 0000000..2235c12
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/ServiceNeedsItemSemanticEditPolicy.java
@@ -0,0 +1,28 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyReferenceCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+

+/**

+ * @generated

+ */

+public class ServiceNeedsItemSemanticEditPolicy extends

+		IntermediateModelBaseItemSemanticEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	public ServiceNeedsItemSemanticEditPolicy() {

+		super(IntermediateModelElementTypes.ServiceNeeds_4011);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getDestroyReferenceCommand(DestroyReferenceRequest req) {

+		return getGEFWrapper(new DestroyReferenceCommand(req));

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/StepItemSemanticEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/StepItemSemanticEditPolicy.java
new file mode 100755
index 0000000..aaa1b17
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/StepItemSemanticEditPolicy.java
@@ -0,0 +1,163 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import java.util.Iterator;

+

+import org.eclipse.emf.ecore.EAnnotation;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;

+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;

+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyReferenceCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientReferenceRelationshipRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;

+import org.eclipse.gmf.runtime.notation.Edge;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.diagram.edit.commands.StepServiceModelCreateCommand;

+import org.eclipse.soa.mangrove.diagram.edit.commands.StepServiceModelReorientCommand;

+import org.eclipse.soa.mangrove.diagram.edit.commands.TransitionCreateCommand;

+import org.eclipse.soa.mangrove.diagram.edit.commands.TransitionReorientCommand;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepServiceModelEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.TransitionEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+

+/**

+ * @generated

+ */

+public class StepItemSemanticEditPolicy extends

+		IntermediateModelBaseItemSemanticEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	public StepItemSemanticEditPolicy() {

+		super(IntermediateModelElementTypes.Step_3008);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getDestroyElementCommand(DestroyElementRequest req) {

+		View view = (View) getHost().getModel();

+		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(

+				getEditingDomain(), null);

+		cmd.setTransactionNestingEnabled(false);

+		for (Iterator<?> it = view.getTargetEdges().iterator(); it.hasNext();) {

+			Edge incomingLink = (Edge) it.next();

+			if (IntermediateModelVisualIDRegistry.getVisualID(incomingLink) == TransitionEditPart.VISUAL_ID) {

+				DestroyElementRequest r = new DestroyElementRequest(

+						incomingLink.getElement(), false);

+				cmd.add(new DestroyElementCommand(r));

+				cmd.add(new DeleteCommand(getEditingDomain(), incomingLink));

+				continue;

+			}

+		}

+		for (Iterator<?> it = view.getSourceEdges().iterator(); it.hasNext();) {

+			Edge outgoingLink = (Edge) it.next();

+			if (IntermediateModelVisualIDRegistry.getVisualID(outgoingLink) == TransitionEditPart.VISUAL_ID) {

+				DestroyElementRequest r = new DestroyElementRequest(

+						outgoingLink.getElement(), false);

+				cmd.add(new DestroyElementCommand(r));

+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));

+				continue;

+			}

+			if (IntermediateModelVisualIDRegistry.getVisualID(outgoingLink) == StepServiceModelEditPart.VISUAL_ID) {

+				DestroyReferenceRequest r = new DestroyReferenceRequest(

+						outgoingLink.getSource().getElement(), null,

+						outgoingLink.getTarget().getElement(), false);

+				cmd.add(new DestroyReferenceCommand(r));

+				cmd.add(new DeleteCommand(getEditingDomain(), outgoingLink));

+				continue;

+			}

+		}

+		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$

+		if (annotation == null) {

+			// there are indirectly referenced children, need extra commands: false

+			addDestroyShortcutsCommand(cmd, view);

+			// delete host element

+			cmd.add(new DestroyElementCommand(req));

+		} else {

+			cmd.add(new DeleteCommand(getEditingDomain(), view));

+		}

+		return getGEFWrapper(cmd.reduce());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {

+		Command command = req.getTarget() == null ? getStartCreateRelationshipCommand(req)

+				: getCompleteCreateRelationshipCommand(req);

+		return command != null ? command : super

+				.getCreateRelationshipCommand(req);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getStartCreateRelationshipCommand(

+			CreateRelationshipRequest req) {

+		if (IntermediateModelElementTypes.Transition_4009 == req

+				.getElementType()) {

+			return getGEFWrapper(new TransitionCreateCommand(req,

+					req.getSource(), req.getTarget()));

+		}

+		if (IntermediateModelElementTypes.StepServiceModel_4010 == req

+				.getElementType()) {

+			return getGEFWrapper(new StepServiceModelCreateCommand(req,

+					req.getSource(), req.getTarget()));

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getCompleteCreateRelationshipCommand(

+			CreateRelationshipRequest req) {

+		if (IntermediateModelElementTypes.Transition_4009 == req

+				.getElementType()) {

+			return getGEFWrapper(new TransitionCreateCommand(req,

+					req.getSource(), req.getTarget()));

+		}

+		if (IntermediateModelElementTypes.StepServiceModel_4010 == req

+				.getElementType()) {

+			return null;

+		}

+		return null;

+	}

+

+	/**

+	 * Returns command to reorient EClass based link. New link target or source

+	 * should be the domain model element associated with this node.

+	 * 

+	 * @generated

+	 */

+	protected Command getReorientRelationshipCommand(

+			ReorientRelationshipRequest req) {

+		switch (getVisualID(req)) {

+		case TransitionEditPart.VISUAL_ID:

+			return getGEFWrapper(new TransitionReorientCommand(req));

+		}

+		return super.getReorientRelationshipCommand(req);

+	}

+

+	/**

+	 * Returns command to reorient EReference based link. New link target or source

+	 * should be the domain model element associated with this node.

+	 * 

+	 * @generated

+	 */

+	protected Command getReorientReferenceRelationshipCommand(

+			ReorientReferenceRelationshipRequest req) {

+		switch (getVisualID(req)) {

+		case StepServiceModelEditPart.VISUAL_ID:

+			return getGEFWrapper(new StepServiceModelReorientCommand(req));

+		}

+		return super.getReorientReferenceRelationshipCommand(req);

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/StepServiceModelItemSemanticEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/StepServiceModelItemSemanticEditPolicy.java
new file mode 100755
index 0000000..a255d82
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/StepServiceModelItemSemanticEditPolicy.java
@@ -0,0 +1,28 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyReferenceCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+

+/**

+ * @generated

+ */

+public class StepServiceModelItemSemanticEditPolicy extends

+		IntermediateModelBaseItemSemanticEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	public StepServiceModelItemSemanticEditPolicy() {

+		super(IntermediateModelElementTypes.StepServiceModel_4010);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getDestroyReferenceCommand(DestroyReferenceRequest req) {

+		return getGEFWrapper(new DestroyReferenceCommand(req));

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/StpIntermediateModelCanonicalEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/StpIntermediateModelCanonicalEditPolicy.java
new file mode 100755
index 0000000..d23a993
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/StpIntermediateModelCanonicalEditPolicy.java
@@ -0,0 +1,453 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import java.util.ArrayList;

+import java.util.Collection;

+import java.util.Collections;

+import java.util.HashMap;

+import java.util.HashSet;

+import java.util.Iterator;

+import java.util.LinkedList;

+import java.util.List;

+import java.util.Set;

+

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.EStructuralFeature;

+import org.eclipse.gef.EditPart;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;

+import org.eclipse.gmf.runtime.diagram.ui.commands.DeferredLayoutCommand;

+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;

+import org.eclipse.gmf.runtime.diagram.ui.commands.SetViewMutabilityCommand;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;

+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest;

+import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;

+import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;

+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;

+import org.eclipse.gmf.runtime.notation.Diagram;

+import org.eclipse.gmf.runtime.notation.Edge;

+import org.eclipse.gmf.runtime.notation.Node;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.gmf.tooling.runtime.update.UpdaterLinkDescriptor;

+import org.eclipse.soa.mangrove.ImPackage;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.TransitionEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramUpdater;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelLinkDescriptor;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelNodeDescriptor;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+

+/**

+ * @generated

+ */

+public class StpIntermediateModelCanonicalEditPolicy extends

+		CanonicalEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	private Set<EStructuralFeature> myFeaturesToSynchronize;

+

+	/**

+	 * @generated

+	 */

+	protected void refreshOnActivate() {

+		// Need to activate editpart children before invoking the canonical refresh for EditParts to add event listeners

+		List<?> c = getHost().getChildren();

+		for (int i = 0; i < c.size(); i++) {

+			((EditPart) c.get(i)).activate();

+		}

+		super.refreshOnActivate();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Set getFeaturesToSynchronize() {

+		if (myFeaturesToSynchronize == null) {

+			myFeaturesToSynchronize = new HashSet<EStructuralFeature>();

+			myFeaturesToSynchronize.add(ImPackage.eINSTANCE

+					.getStpIntermediateModel_ProcessCollection());

+			myFeaturesToSynchronize.add(ImPackage.eINSTANCE

+					.getStpIntermediateModel_ServiceCollection());

+		}

+		return myFeaturesToSynchronize;

+	}

+

+	/**

+	 * @generated

+	 */

+	@SuppressWarnings("rawtypes")

+	protected List getSemanticChildrenList() {

+		View viewObject = (View) getHost().getModel();

+		LinkedList<EObject> result = new LinkedList<EObject>();

+		List<IntermediateModelNodeDescriptor> childDescriptors = IntermediateModelDiagramUpdater

+				.getStpIntermediateModel_1000SemanticChildren(viewObject);

+		for (IntermediateModelNodeDescriptor d : childDescriptors) {

+			result.add(d.getModelElement());

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean isOrphaned(Collection<EObject> semanticChildren,

+			final View view) {

+		return isMyDiagramElement(view)

+				&& !semanticChildren.contains(view.getElement());

+	}

+

+	/**

+	 * @generated

+	 */

+	private boolean isMyDiagramElement(View view) {

+		int visualID = IntermediateModelVisualIDRegistry.getVisualID(view);

+		return visualID == ProcessCollectionEditPart.VISUAL_ID

+				|| visualID == ServiceCollectionEditPart.VISUAL_ID;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void refreshSemantic() {

+		if (resolveSemanticElement() == null) {

+			return;

+		}

+		LinkedList<IAdaptable> createdViews = new LinkedList<IAdaptable>();

+		List<IntermediateModelNodeDescriptor> childDescriptors = IntermediateModelDiagramUpdater

+				.getStpIntermediateModel_1000SemanticChildren((View) getHost()

+						.getModel());

+		LinkedList<View> orphaned = new LinkedList<View>();

+		// we care to check only views we recognize as ours

+		LinkedList<View> knownViewChildren = new LinkedList<View>();

+		for (View v : getViewChildren()) {

+			if (isMyDiagramElement(v)) {

+				knownViewChildren.add(v);

+			}

+		}

+		// alternative to #cleanCanonicalSemanticChildren(getViewChildren(), semanticChildren)

+		//

+		// iteration happens over list of desired semantic elements, trying to find best matching View, while original CEP

+		// iterates views, potentially losing view (size/bounds) information - i.e. if there are few views to reference same EObject, only last one 

+		// to answer isOrphaned == true will be used for the domain element representation, see #cleanCanonicalSemanticChildren()

+		for (Iterator<IntermediateModelNodeDescriptor> descriptorsIterator = childDescriptors

+				.iterator(); descriptorsIterator.hasNext();) {

+			IntermediateModelNodeDescriptor next = descriptorsIterator.next();

+			String hint = IntermediateModelVisualIDRegistry.getType(next

+					.getVisualID());

+			LinkedList<View> perfectMatch = new LinkedList<View>(); // both semanticElement and hint match that of NodeDescriptor

+			for (View childView : getViewChildren()) {

+				EObject semanticElement = childView.getElement();

+				if (next.getModelElement().equals(semanticElement)) {

+					if (hint.equals(childView.getType())) {

+						perfectMatch.add(childView);

+						// actually, can stop iteration over view children here, but

+						// may want to use not the first view but last one as a 'real' match (the way original CEP does

+						// with its trick with viewToSemanticMap inside #cleanCanonicalSemanticChildren

+					}

+				}

+			}

+			if (perfectMatch.size() > 0) {

+				descriptorsIterator.remove(); // precise match found no need to create anything for the NodeDescriptor

+				// use only one view (first or last?), keep rest as orphaned for further consideration

+				knownViewChildren.remove(perfectMatch.getFirst());

+			}

+		}

+		// those left in knownViewChildren are subject to removal - they are our diagram elements we didn't find match to,

+		// or those we have potential matches to, and thus need to be recreated, preserving size/location information.

+		orphaned.addAll(knownViewChildren);

+		//

+		ArrayList<CreateViewRequest.ViewDescriptor> viewDescriptors = new ArrayList<CreateViewRequest.ViewDescriptor>(

+				childDescriptors.size());

+		for (IntermediateModelNodeDescriptor next : childDescriptors) {

+			String hint = IntermediateModelVisualIDRegistry.getType(next

+					.getVisualID());

+			IAdaptable elementAdapter = new CanonicalElementAdapter(

+					next.getModelElement(), hint);

+			CreateViewRequest.ViewDescriptor descriptor = new CreateViewRequest.ViewDescriptor(

+					elementAdapter, Node.class, hint, ViewUtil.APPEND, false,

+					host().getDiagramPreferencesHint());

+			viewDescriptors.add(descriptor);

+		}

+

+		boolean changed = deleteViews(orphaned.iterator());

+		//

+		CreateViewRequest request = getCreateViewRequest(viewDescriptors);

+		Command cmd = getCreateViewCommand(request);

+		if (cmd != null && cmd.canExecute()) {

+			SetViewMutabilityCommand.makeMutable(

+					new EObjectAdapter(host().getNotationView())).execute();

+			executeCommand(cmd);

+			@SuppressWarnings("unchecked")

+			List<IAdaptable> nl = (List<IAdaptable>) request.getNewObject();

+			createdViews.addAll(nl);

+		}

+		if (changed || createdViews.size() > 0) {

+			postProcessRefreshSemantic(createdViews);

+		}

+

+		Collection<IAdaptable> createdConnectionViews = refreshConnections();

+

+		if (createdViews.size() > 1) {

+			// perform a layout of the container

+			DeferredLayoutCommand layoutCmd = new DeferredLayoutCommand(host()

+					.getEditingDomain(), createdViews, host());

+			executeCommand(new ICommandProxy(layoutCmd));

+		}

+

+		createdViews.addAll(createdConnectionViews);

+

+		makeViewsImmutable(createdViews);

+	}

+

+	/**

+	 * @generated

+	 */

+	private Collection<IAdaptable> refreshConnections() {

+		Domain2Notation domain2NotationMap = new Domain2Notation();

+		Collection<IntermediateModelLinkDescriptor> linkDescriptors = collectAllLinks(

+				getDiagram(), domain2NotationMap);

+		Collection existingLinks = new LinkedList(getDiagram().getEdges());

+		for (Iterator linksIterator = existingLinks.iterator(); linksIterator

+				.hasNext();) {

+			Edge nextDiagramLink = (Edge) linksIterator.next();

+			int diagramLinkVisualID = IntermediateModelVisualIDRegistry

+					.getVisualID(nextDiagramLink);

+			if (diagramLinkVisualID == -1) {

+				if (nextDiagramLink.getSource() != null

+						&& nextDiagramLink.getTarget() != null) {

+					linksIterator.remove();

+				}

+				continue;

+			}

+			EObject diagramLinkObject = nextDiagramLink.getElement();

+			EObject diagramLinkSrc = nextDiagramLink.getSource().getElement();

+			EObject diagramLinkDst = nextDiagramLink.getTarget().getElement();

+			for (Iterator<IntermediateModelLinkDescriptor> linkDescriptorsIterator = linkDescriptors

+					.iterator(); linkDescriptorsIterator.hasNext();) {

+				IntermediateModelLinkDescriptor nextLinkDescriptor = linkDescriptorsIterator

+						.next();

+				if (diagramLinkObject == nextLinkDescriptor.getModelElement()

+						&& diagramLinkSrc == nextLinkDescriptor.getSource()

+						&& diagramLinkDst == nextLinkDescriptor

+								.getDestination()

+						&& diagramLinkVisualID == nextLinkDescriptor

+								.getVisualID()) {

+					linksIterator.remove();

+					linkDescriptorsIterator.remove();

+					break;

+				}

+			}

+		}

+		deleteViews(existingLinks.iterator());

+		return createConnections(linkDescriptors, domain2NotationMap);

+	}

+

+	/**

+	 * @generated

+	 */

+	private Collection<IntermediateModelLinkDescriptor> collectAllLinks(

+			View view, Domain2Notation domain2NotationMap) {

+		if (!StpIntermediateModelEditPart.MODEL_ID

+				.equals(IntermediateModelVisualIDRegistry.getModelID(view))) {

+			return Collections.emptyList();

+		}

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		switch (IntermediateModelVisualIDRegistry.getVisualID(view)) {

+		case StpIntermediateModelEditPart.VISUAL_ID: {

+			if (!domain2NotationMap.containsKey(view.getElement())) {

+				result.addAll(IntermediateModelDiagramUpdater

+						.getStpIntermediateModel_1000ContainedLinks(view));

+			}

+			domain2NotationMap.putView(view.getElement(), view);

+			break;

+		}

+		case ProcessCollectionEditPart.VISUAL_ID: {

+			if (!domain2NotationMap.containsKey(view.getElement())) {

+				result.addAll(IntermediateModelDiagramUpdater

+						.getProcessCollection_2005ContainedLinks(view));

+			}

+			domain2NotationMap.putView(view.getElement(), view);

+			break;

+		}

+		case ServiceCollectionEditPart.VISUAL_ID: {

+			if (!domain2NotationMap.containsKey(view.getElement())) {

+				result.addAll(IntermediateModelDiagramUpdater

+						.getServiceCollection_2006ContainedLinks(view));

+			}

+			domain2NotationMap.putView(view.getElement(), view);

+			break;

+		}

+		case ProcessEditPart.VISUAL_ID: {

+			if (!domain2NotationMap.containsKey(view.getElement())) {

+				result.addAll(IntermediateModelDiagramUpdater

+						.getProcess_3007ContainedLinks(view));

+			}

+			domain2NotationMap.putView(view.getElement(), view);

+			break;

+		}

+		case StepEditPart.VISUAL_ID: {

+			if (!domain2NotationMap.containsKey(view.getElement())) {

+				result.addAll(IntermediateModelDiagramUpdater

+						.getStep_3008ContainedLinks(view));

+			}

+			domain2NotationMap.putView(view.getElement(), view);

+			break;

+		}

+		case ServiceEditPart.VISUAL_ID: {

+			if (!domain2NotationMap.containsKey(view.getElement())) {

+				result.addAll(IntermediateModelDiagramUpdater

+						.getService_3009ContainedLinks(view));

+			}

+			domain2NotationMap.putView(view.getElement(), view);

+			break;

+		}

+		case TransitionEditPart.VISUAL_ID: {

+			if (!domain2NotationMap.containsKey(view.getElement())) {

+				result.addAll(IntermediateModelDiagramUpdater

+						.getTransition_4009ContainedLinks(view));

+			}

+			domain2NotationMap.putView(view.getElement(), view);

+			break;

+		}

+		}

+		for (Iterator children = view.getChildren().iterator(); children

+				.hasNext();) {

+			result.addAll(collectAllLinks((View) children.next(),

+					domain2NotationMap));

+		}

+		for (Iterator edges = view.getSourceEdges().iterator(); edges.hasNext();) {

+			result.addAll(collectAllLinks((View) edges.next(),

+					domain2NotationMap));

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	private Collection<IAdaptable> createConnections(

+			Collection<IntermediateModelLinkDescriptor> linkDescriptors,

+			Domain2Notation domain2NotationMap) {

+		LinkedList<IAdaptable> adapters = new LinkedList<IAdaptable>();

+		for (IntermediateModelLinkDescriptor nextLinkDescriptor : linkDescriptors) {

+			EditPart sourceEditPart = getSourceEditPart(nextLinkDescriptor,

+					domain2NotationMap);

+			EditPart targetEditPart = getTargetEditPart(nextLinkDescriptor,

+					domain2NotationMap);

+			if (sourceEditPart == null || targetEditPart == null) {

+				continue;

+			}

+			CreateConnectionViewRequest.ConnectionViewDescriptor descriptor = new CreateConnectionViewRequest.ConnectionViewDescriptor(

+					nextLinkDescriptor.getSemanticAdapter(),

+					IntermediateModelVisualIDRegistry

+							.getType(nextLinkDescriptor.getVisualID()),

+					ViewUtil.APPEND, false,

+					((IGraphicalEditPart) getHost())

+							.getDiagramPreferencesHint());

+			CreateConnectionViewRequest ccr = new CreateConnectionViewRequest(

+					descriptor);

+			ccr.setType(RequestConstants.REQ_CONNECTION_START);

+			ccr.setSourceEditPart(sourceEditPart);

+			sourceEditPart.getCommand(ccr);

+			ccr.setTargetEditPart(targetEditPart);

+			ccr.setType(RequestConstants.REQ_CONNECTION_END);

+			Command cmd = targetEditPart.getCommand(ccr);

+			if (cmd != null && cmd.canExecute()) {

+				executeCommand(cmd);

+				IAdaptable viewAdapter = (IAdaptable) ccr.getNewObject();

+				if (viewAdapter != null) {

+					adapters.add(viewAdapter);

+				}

+			}

+		}

+		return adapters;

+	}

+

+	/**

+	 * @generated

+	 */

+	private EditPart getEditPart(EObject domainModelElement,

+			Domain2Notation domain2NotationMap) {

+		View view = (View) domain2NotationMap.get(domainModelElement);

+		if (view != null) {

+			return (EditPart) getHost().getViewer().getEditPartRegistry()

+					.get(view);

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	private Diagram getDiagram() {

+		return ((View) getHost().getModel()).getDiagram();

+	}

+

+	/**

+	 * @generated

+	 */

+	private EditPart getSourceEditPart(UpdaterLinkDescriptor descriptor,

+			Domain2Notation domain2NotationMap) {

+		return getEditPart(descriptor.getSource(), domain2NotationMap);

+	}

+

+	/**

+	 * @generated

+	 */

+	private EditPart getTargetEditPart(UpdaterLinkDescriptor descriptor,

+			Domain2Notation domain2NotationMap) {

+		return getEditPart(descriptor.getDestination(), domain2NotationMap);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected final EditPart getHintedEditPart(EObject domainModelElement,

+			Domain2Notation domain2NotationMap, int hintVisualId) {

+		View view = (View) domain2NotationMap.getHinted(domainModelElement,

+				IntermediateModelVisualIDRegistry.getType(hintVisualId));

+		if (view != null) {

+			return (EditPart) getHost().getViewer().getEditPartRegistry()

+					.get(view);

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	@SuppressWarnings("serial")

+	protected static class Domain2Notation extends HashMap<EObject, View> {

+		/**

+		 * @generated

+		 */

+		public boolean containsDomainElement(EObject domainElement) {

+			return this.containsKey(domainElement);

+		}

+

+		/**

+		 * @generated

+		 */

+		public View getHinted(EObject domainEObject, String hint) {

+			return this.get(domainEObject);

+		}

+

+		/**

+		 * @generated

+		 */

+		public void putView(EObject domainElement, View view) {

+			if (!containsKey(view.getElement())) {

+				this.put(domainElement, view);

+			}

+		}

+

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/StpIntermediateModelItemSemanticEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/StpIntermediateModelItemSemanticEditPolicy.java
new file mode 100755
index 0000000..d60c16f
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/StpIntermediateModelItemSemanticEditPolicy.java
@@ -0,0 +1,69 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import org.eclipse.emf.transaction.TransactionalEditingDomain;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;

+import org.eclipse.gmf.runtime.emf.commands.core.commands.DuplicateEObjectsCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DuplicateElementsRequest;

+import org.eclipse.soa.mangrove.diagram.edit.commands.ProcessCollectionCreateCommand;

+import org.eclipse.soa.mangrove.diagram.edit.commands.ServiceCollectionCreateCommand;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+

+/**

+ * @generated

+ */

+public class StpIntermediateModelItemSemanticEditPolicy extends

+		IntermediateModelBaseItemSemanticEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	public StpIntermediateModelItemSemanticEditPolicy() {

+		super(IntermediateModelElementTypes.StpIntermediateModel_1000);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getCreateCommand(CreateElementRequest req) {

+		if (IntermediateModelElementTypes.ProcessCollection_2005 == req

+				.getElementType()) {

+			return getGEFWrapper(new ProcessCollectionCreateCommand(req));

+		}

+		if (IntermediateModelElementTypes.ServiceCollection_2006 == req

+				.getElementType()) {

+			return getGEFWrapper(new ServiceCollectionCreateCommand(req));

+		}

+		return super.getCreateCommand(req);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getDuplicateCommand(DuplicateElementsRequest req) {

+		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())

+				.getEditingDomain();

+		return getGEFWrapper(new DuplicateAnythingCommand(editingDomain, req));

+	}

+

+	/**

+	 * @generated

+	 */

+	private static class DuplicateAnythingCommand extends

+			DuplicateEObjectsCommand {

+

+		/**

+		 * @generated

+		 */

+		public DuplicateAnythingCommand(

+				TransactionalEditingDomain editingDomain,

+				DuplicateElementsRequest req) {

+			super(editingDomain, req.getLabel(), req

+					.getElementsToBeDuplicated(), req

+					.getAllDuplicatedElementsMap());

+		}

+

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/TransitionItemSemanticEditPolicy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/TransitionItemSemanticEditPolicy.java
new file mode 100755
index 0000000..09cf632
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/edit/policies/TransitionItemSemanticEditPolicy.java
@@ -0,0 +1,28 @@
+package org.eclipse.soa.mangrove.diagram.edit.policies;

+

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+

+/**

+ * @generated

+ */

+public class TransitionItemSemanticEditPolicy extends

+		IntermediateModelBaseItemSemanticEditPolicy {

+

+	/**

+	 * @generated

+	 */

+	public TransitionItemSemanticEditPolicy() {

+		super(IntermediateModelElementTypes.Transition_4009);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getDestroyElementCommand(DestroyElementRequest req) {

+		return getGEFWrapper(new DestroyElementCommand(req));

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelAbstractNavigatorItem.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelAbstractNavigatorItem.java
new file mode 100755
index 0000000..d4edce4
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelAbstractNavigatorItem.java
@@ -0,0 +1,62 @@
+package org.eclipse.soa.mangrove.diagram.navigator;

+

+import org.eclipse.core.runtime.IAdapterFactory;

+import org.eclipse.core.runtime.Platform;

+import org.eclipse.core.runtime.PlatformObject;

+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;

+

+/**

+ * @generated

+ */

+public abstract class IntermediateModelAbstractNavigatorItem extends

+		PlatformObject {

+

+	/**

+	 * @generated

+	 */

+	static {

+		final Class[] supportedTypes = new Class[] { ITabbedPropertySheetPageContributor.class };

+		final ITabbedPropertySheetPageContributor propertySheetPageContributor = new ITabbedPropertySheetPageContributor() {

+			public String getContributorId() {

+				return "org.eclipse.soa.mangrove.diagram"; //$NON-NLS-1$

+			}

+		};

+		Platform.getAdapterManager().registerAdapters(

+				new IAdapterFactory() {

+

+					public Object getAdapter(Object adaptableObject,

+							Class adapterType) {

+						if (adaptableObject instanceof org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelAbstractNavigatorItem

+								&& adapterType == ITabbedPropertySheetPageContributor.class) {

+							return propertySheetPageContributor;

+						}

+						return null;

+					}

+

+					public Class[] getAdapterList() {

+						return supportedTypes;

+					}

+				},

+				org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelAbstractNavigatorItem.class);

+	}

+

+	/**

+	 * @generated

+	 */

+	private Object myParent;

+

+	/**

+	 * @generated

+	 */

+	protected IntermediateModelAbstractNavigatorItem(Object parent) {

+		myParent = parent;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Object getParent() {

+		return myParent;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelDomainNavigatorContentProvider.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelDomainNavigatorContentProvider.java
new file mode 100755
index 0000000..fdba5bd
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelDomainNavigatorContentProvider.java
@@ -0,0 +1,230 @@
+package org.eclipse.soa.mangrove.diagram.navigator;

+

+import java.util.ArrayList;

+import java.util.Collection;

+import java.util.HashMap;

+

+import org.eclipse.core.resources.IFile;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.resource.Resource;

+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;

+import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;

+import org.eclipse.emf.transaction.TransactionalEditingDomain;

+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;

+import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;

+import org.eclipse.jface.viewers.Viewer;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+import org.eclipse.ui.IMemento;

+import org.eclipse.ui.navigator.ICommonContentExtensionSite;

+import org.eclipse.ui.navigator.ICommonContentProvider;

+

+/**

+ * @generated

+ */

+public class IntermediateModelDomainNavigatorContentProvider implements

+		ICommonContentProvider {

+

+	/**

+	 * @generated

+	 */

+	private AdapterFactoryContentProvider myAdapterFctoryContentProvier;

+

+	/**

+	 * @generated

+	 */

+	private static final Object[] EMPTY_ARRAY = new Object[0];

+

+	/**

+	 * @generated

+	 */

+	private Viewer myViewer;

+

+	/**

+	 * @generated

+	 */

+	private AdapterFactoryEditingDomain myEditingDomain;

+

+	/**

+	 * @generated

+	 */

+	private WorkspaceSynchronizer myWorkspaceSynchronizer;

+

+	/**

+	 * @generated

+	 */

+	private Runnable myViewerRefreshRunnable;

+

+	/**

+	 * @generated

+	 */

+	public IntermediateModelDomainNavigatorContentProvider() {

+		myAdapterFctoryContentProvier = new AdapterFactoryContentProvider(

+				IntermediateModelDiagramEditorPlugin.getInstance()

+						.getItemProvidersAdapterFactory());

+		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE

+				.createEditingDomain();

+		myEditingDomain = (AdapterFactoryEditingDomain) editingDomain;

+		myEditingDomain.setResourceToReadOnlyMap(new HashMap() {

+			public Object get(Object key) {

+				if (!containsKey(key)) {

+					put(key, Boolean.TRUE);

+				}

+				return super.get(key);

+			}

+		});

+		myViewerRefreshRunnable = new Runnable() {

+			public void run() {

+				if (myViewer != null) {

+					myViewer.refresh();

+				}

+			}

+		};

+		myWorkspaceSynchronizer = new WorkspaceSynchronizer(editingDomain,

+				new WorkspaceSynchronizer.Delegate() {

+					public void dispose() {

+					}

+

+					public boolean handleResourceChanged(final Resource resource) {

+						unloadAllResources();

+						asyncRefresh();

+						return true;

+					}

+

+					public boolean handleResourceDeleted(Resource resource) {

+						unloadAllResources();

+						asyncRefresh();

+						return true;

+					}

+

+					public boolean handleResourceMoved(Resource resource,

+							final URI newURI) {

+						unloadAllResources();

+						asyncRefresh();

+						return true;

+					}

+				});

+	}

+

+	/**

+	 * @generated

+	 */

+	public void dispose() {

+		myWorkspaceSynchronizer.dispose();

+		myWorkspaceSynchronizer = null;

+		myViewerRefreshRunnable = null;

+		myViewer = null;

+		unloadAllResources();

+		((TransactionalEditingDomain) myEditingDomain).dispose();

+		myEditingDomain = null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

+		myViewer = viewer;

+	}

+

+	/**

+	 * @generated

+	 */

+	void unloadAllResources() {

+		for (Resource nextResource : myEditingDomain.getResourceSet()

+				.getResources()) {

+			nextResource.unload();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	void asyncRefresh() {

+		if (myViewer != null && !myViewer.getControl().isDisposed()) {

+			myViewer.getControl().getDisplay()

+					.asyncExec(myViewerRefreshRunnable);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public Object[] getElements(Object inputElement) {

+		return getChildren(inputElement);

+	}

+

+	/**

+	 * @generated

+	 */

+	public void restoreState(IMemento aMemento) {

+	}

+

+	/**

+	 * @generated

+	 */

+	public void saveState(IMemento aMemento) {

+	}

+

+	/**

+	 * @generated

+	 */

+	public void init(ICommonContentExtensionSite aConfig) {

+	}

+

+	/**

+	 * @generated

+	 */

+	public Object[] getChildren(Object parentElement) {

+		if (parentElement instanceof IFile) {

+			IFile file = (IFile) parentElement;

+			URI fileURI = URI.createPlatformResourceURI(file.getFullPath()

+					.toString(), true);

+			Resource resource = myEditingDomain.getResourceSet().getResource(

+					fileURI, true);

+			return wrapEObjects(

+					myAdapterFctoryContentProvier.getChildren(resource),

+					parentElement);

+		}

+

+		if (parentElement instanceof IntermediateModelDomainNavigatorItem) {

+			return wrapEObjects(

+					myAdapterFctoryContentProvier.getChildren(((IntermediateModelDomainNavigatorItem) parentElement)

+							.getEObject()), parentElement);

+		}

+		return EMPTY_ARRAY;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Object[] wrapEObjects(Object[] objects, Object parentElement) {

+		Collection result = new ArrayList();

+		for (int i = 0; i < objects.length; i++) {

+			if (objects[i] instanceof EObject) {

+				result.add(new IntermediateModelDomainNavigatorItem(

+						(EObject) objects[i], parentElement,

+						myAdapterFctoryContentProvier));

+			}

+		}

+		return result.toArray();

+	}

+

+	/**

+	 * @generated

+	 */

+	public Object getParent(Object element) {

+		if (element instanceof IntermediateModelAbstractNavigatorItem) {

+			IntermediateModelAbstractNavigatorItem abstractNavigatorItem = (IntermediateModelAbstractNavigatorItem) element;

+			return abstractNavigatorItem.getParent();

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean hasChildren(Object element) {

+		return element instanceof IFile || getChildren(element).length > 0;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelDomainNavigatorItem.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelDomainNavigatorItem.java
new file mode 100755
index 0000000..755c5ea
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelDomainNavigatorItem.java
@@ -0,0 +1,117 @@
+package org.eclipse.soa.mangrove.diagram.navigator;

+

+import org.eclipse.core.runtime.IAdapterFactory;

+import org.eclipse.core.runtime.Platform;

+import org.eclipse.core.runtime.PlatformObject;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.util.EcoreUtil;

+import org.eclipse.ui.views.properties.IPropertySource;

+import org.eclipse.ui.views.properties.IPropertySourceProvider;

+

+/**

+ * @generated

+ */

+public class IntermediateModelDomainNavigatorItem extends PlatformObject {

+

+	/**

+	 * @generated

+	 */

+	static {

+		final Class[] supportedTypes = new Class[] { EObject.class,

+				IPropertySource.class };

+		Platform.getAdapterManager().registerAdapters(

+				new IAdapterFactory() {

+

+					public Object getAdapter(Object adaptableObject,

+							Class adapterType) {

+						if (adaptableObject instanceof org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelDomainNavigatorItem) {

+							org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelDomainNavigatorItem domainNavigatorItem = (org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelDomainNavigatorItem) adaptableObject;

+							EObject eObject = domainNavigatorItem.getEObject();

+							if (adapterType == EObject.class) {

+								return eObject;

+							}

+							if (adapterType == IPropertySource.class) {

+								return domainNavigatorItem

+										.getPropertySourceProvider()

+										.getPropertySource(eObject);

+							}

+						}

+

+						return null;

+					}

+

+					public Class[] getAdapterList() {

+						return supportedTypes;

+					}

+				},

+				org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelDomainNavigatorItem.class);

+	}

+

+	/**

+	 * @generated

+	 */

+	private Object myParent;

+

+	/**

+	 * @generated

+	 */

+	private EObject myEObject;

+

+	/**

+	 * @generated

+	 */

+	private IPropertySourceProvider myPropertySourceProvider;

+

+	/**

+	 * @generated

+	 */

+	public IntermediateModelDomainNavigatorItem(EObject eObject, Object parent,

+			IPropertySourceProvider propertySourceProvider) {

+		myParent = parent;

+		myEObject = eObject;

+		myPropertySourceProvider = propertySourceProvider;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Object getParent() {

+		return myParent;

+	}

+

+	/**

+	 * @generated

+	 */

+	public EObject getEObject() {

+		return myEObject;

+	}

+

+	/**

+	 * @generated

+	 */

+	public IPropertySourceProvider getPropertySourceProvider() {

+		return myPropertySourceProvider;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean equals(Object obj) {

+		if (obj instanceof org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelDomainNavigatorItem) {

+			return EcoreUtil

+					.getURI(getEObject())

+					.equals(EcoreUtil

+							.getURI(((org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelDomainNavigatorItem) obj)

+									.getEObject()));

+		}

+		return super.equals(obj);

+	}

+

+	/**

+	 * @generated

+	 */

+	public int hashCode() {

+		return EcoreUtil.getURI(getEObject()).hashCode();

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelDomainNavigatorLabelProvider.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelDomainNavigatorLabelProvider.java
new file mode 100755
index 0000000..4d46ebf
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelDomainNavigatorLabelProvider.java
@@ -0,0 +1,101 @@
+package org.eclipse.soa.mangrove.diagram.navigator;

+

+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;

+import org.eclipse.jface.viewers.ILabelProviderListener;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+import org.eclipse.swt.graphics.Image;

+import org.eclipse.ui.IMemento;

+import org.eclipse.ui.navigator.ICommonContentExtensionSite;

+import org.eclipse.ui.navigator.ICommonLabelProvider;

+

+/**

+ * @generated

+ */

+public class IntermediateModelDomainNavigatorLabelProvider implements

+		ICommonLabelProvider {

+

+	/**

+	 * @generated

+	 */

+	private AdapterFactoryLabelProvider myAdapterFactoryLabelProvider = new AdapterFactoryLabelProvider(

+			IntermediateModelDiagramEditorPlugin.getInstance()

+					.getItemProvidersAdapterFactory());

+

+	/**

+	 * @generated

+	 */

+	public void init(ICommonContentExtensionSite aConfig) {

+	}

+

+	/**

+	 * @generated

+	 */

+	public Image getImage(Object element) {

+		if (element instanceof IntermediateModelDomainNavigatorItem) {

+			return myAdapterFactoryLabelProvider

+					.getImage(((IntermediateModelDomainNavigatorItem) element)

+							.getEObject());

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getText(Object element) {

+		if (element instanceof IntermediateModelDomainNavigatorItem) {

+			return myAdapterFactoryLabelProvider

+					.getText(((IntermediateModelDomainNavigatorItem) element)

+							.getEObject());

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void addListener(ILabelProviderListener listener) {

+		myAdapterFactoryLabelProvider.addListener(listener);

+	}

+

+	/**

+	 * @generated

+	 */

+	public void dispose() {

+		myAdapterFactoryLabelProvider.dispose();

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean isLabelProperty(Object element, String property) {

+		return myAdapterFactoryLabelProvider.isLabelProperty(element, property);

+	}

+

+	/**

+	 * @generated

+	 */

+	public void removeListener(ILabelProviderListener listener) {

+		myAdapterFactoryLabelProvider.removeListener(listener);

+	}

+

+	/**

+	 * @generated

+	 */

+	public void restoreState(IMemento aMemento) {

+	}

+

+	/**

+	 * @generated

+	 */

+	public void saveState(IMemento aMemento) {

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getDescription(Object anElement) {

+		return null;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorActionProvider.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorActionProvider.java
new file mode 100755
index 0000000..633595d
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorActionProvider.java
@@ -0,0 +1,178 @@
+package org.eclipse.soa.mangrove.diagram.navigator;

+

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.emf.common.ui.URIEditorInput;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.resource.Resource;

+import org.eclipse.emf.ecore.util.EcoreUtil;

+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;

+import org.eclipse.gmf.runtime.notation.Diagram;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.jface.action.Action;

+import org.eclipse.jface.action.IMenuManager;

+import org.eclipse.jface.viewers.IStructuredSelection;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditor;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.part.Messages;

+import org.eclipse.ui.IActionBars;

+import org.eclipse.ui.IEditorInput;

+import org.eclipse.ui.IWorkbenchPage;

+import org.eclipse.ui.PartInitException;

+import org.eclipse.ui.navigator.CommonActionProvider;

+import org.eclipse.ui.navigator.ICommonActionConstants;

+import org.eclipse.ui.navigator.ICommonActionExtensionSite;

+import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;

+import org.eclipse.ui.part.FileEditorInput;

+

+/**

+ * @generated

+ */

+public class IntermediateModelNavigatorActionProvider extends

+		CommonActionProvider {

+

+	/**

+	 * @generated

+	 */

+	private boolean myContribute;

+

+	/**

+	 * @generated

+	 */

+	private OpenDiagramAction myOpenDiagramAction;

+

+	/**

+	 * @generated

+	 */

+	public void init(ICommonActionExtensionSite aSite) {

+		super.init(aSite);

+		if (aSite.getViewSite() instanceof ICommonViewerWorkbenchSite) {

+			myContribute = true;

+			makeActions((ICommonViewerWorkbenchSite) aSite.getViewSite());

+		} else {

+			myContribute = false;

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private void makeActions(ICommonViewerWorkbenchSite viewerSite) {

+		myOpenDiagramAction = new OpenDiagramAction(viewerSite);

+	}

+

+	/**

+	 * @generated

+	 */

+	public void fillActionBars(IActionBars actionBars) {

+		if (!myContribute) {

+			return;

+		}

+		IStructuredSelection selection = (IStructuredSelection) getContext()

+				.getSelection();

+		myOpenDiagramAction.selectionChanged(selection);

+		if (myOpenDiagramAction.isEnabled()) {

+			actionBars.setGlobalActionHandler(ICommonActionConstants.OPEN,

+					myOpenDiagramAction);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public void fillContextMenu(IMenuManager menu) {

+	}

+

+	/**

+	 * @generated

+	 */

+	private static class OpenDiagramAction extends Action {

+

+		/**

+		 * @generated

+		 */

+		private Diagram myDiagram;

+

+		/**

+		 * @generated

+		 */

+		private ICommonViewerWorkbenchSite myViewerSite;

+

+		/**

+		 * @generated

+		 */

+		public OpenDiagramAction(ICommonViewerWorkbenchSite viewerSite) {

+			super(Messages.NavigatorActionProvider_OpenDiagramActionName);

+			myViewerSite = viewerSite;

+		}

+

+		/**

+		 * @generated

+		 */

+		public final void selectionChanged(IStructuredSelection selection) {

+			myDiagram = null;

+			if (selection.size() == 1) {

+				Object selectedElement = selection.getFirstElement();

+				if (selectedElement instanceof IntermediateModelNavigatorItem) {

+					selectedElement = ((IntermediateModelNavigatorItem) selectedElement)

+							.getView();

+				} else if (selectedElement instanceof IAdaptable) {

+					selectedElement = ((IAdaptable) selectedElement)

+							.getAdapter(View.class);

+				}

+				if (selectedElement instanceof Diagram) {

+					Diagram diagram = (Diagram) selectedElement;

+					if (StpIntermediateModelEditPart.MODEL_ID

+							.equals(IntermediateModelVisualIDRegistry

+									.getModelID(diagram))) {

+						myDiagram = diagram;

+					}

+				}

+			}

+			setEnabled(myDiagram != null);

+		}

+

+		/**

+		 * @generated

+		 */

+		public void run() {

+			if (myDiagram == null || myDiagram.eResource() == null) {

+				return;

+			}

+

+			IEditorInput editorInput = getEditorInput(myDiagram);

+			IWorkbenchPage page = myViewerSite.getPage();

+			try {

+				page.openEditor(editorInput, IntermediateModelDiagramEditor.ID);

+			} catch (PartInitException e) {

+				IntermediateModelDiagramEditorPlugin.getInstance().logError(

+						"Exception while openning diagram", e); //$NON-NLS-1$

+			}

+		}

+

+		/**

+		 * @generated

+		 */

+		private static IEditorInput getEditorInput(Diagram diagram) {

+			Resource diagramResource = diagram.eResource();

+			for (EObject nextEObject : diagramResource.getContents()) {

+				if (nextEObject == diagram) {

+					return new FileEditorInput(

+							WorkspaceSynchronizer.getFile(diagramResource));

+				}

+				if (nextEObject instanceof Diagram) {

+					break;

+				}

+			}

+			URI uri = EcoreUtil.getURI(diagram);

+			String editorName = uri.lastSegment() + '#'

+					+ diagram.eResource().getContents().indexOf(diagram);

+			IEditorInput editorInput = new URIEditorInput(uri, editorName);

+			return editorInput;

+		}

+

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorContentProvider.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorContentProvider.java
new file mode 100755
index 0000000..e33149b
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorContentProvider.java
@@ -0,0 +1,634 @@
+package org.eclipse.soa.mangrove.diagram.navigator;

+

+import java.util.ArrayList;

+import java.util.Collection;

+import java.util.Collections;

+import java.util.HashMap;

+import java.util.LinkedList;

+

+import org.eclipse.core.resources.IFile;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.resource.Resource;

+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;

+import org.eclipse.emf.transaction.TransactionalEditingDomain;

+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;

+import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;

+import org.eclipse.gmf.runtime.notation.Diagram;

+import org.eclipse.gmf.runtime.notation.Edge;

+import org.eclipse.gmf.runtime.notation.Node;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.jface.viewers.Viewer;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceNeedsEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepServiceModelEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.TransitionEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.part.Messages;

+import org.eclipse.ui.IMemento;

+import org.eclipse.ui.navigator.ICommonContentExtensionSite;

+import org.eclipse.ui.navigator.ICommonContentProvider;

+

+/**

+ * @generated

+ */

+public class IntermediateModelNavigatorContentProvider implements

+		ICommonContentProvider {

+

+	/**

+	 * @generated

+	 */

+	private static final Object[] EMPTY_ARRAY = new Object[0];

+

+	/**

+	 * @generated

+	 */

+	private Viewer myViewer;

+

+	/**

+	 * @generated

+	 */

+	private AdapterFactoryEditingDomain myEditingDomain;

+

+	/**

+	 * @generated

+	 */

+	private WorkspaceSynchronizer myWorkspaceSynchronizer;

+

+	/**

+	 * @generated

+	 */

+	private Runnable myViewerRefreshRunnable;

+

+	/**

+	 * @generated

+	 */

+	@SuppressWarnings({ "unchecked", "serial", "rawtypes" })

+	public IntermediateModelNavigatorContentProvider() {

+		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE

+				.createEditingDomain();

+		myEditingDomain = (AdapterFactoryEditingDomain) editingDomain;

+		myEditingDomain.setResourceToReadOnlyMap(new HashMap() {

+			public Object get(Object key) {

+				if (!containsKey(key)) {

+					put(key, Boolean.TRUE);

+				}

+				return super.get(key);

+			}

+		});

+		myViewerRefreshRunnable = new Runnable() {

+			public void run() {

+				if (myViewer != null) {

+					myViewer.refresh();

+				}

+			}

+		};

+		myWorkspaceSynchronizer = new WorkspaceSynchronizer(editingDomain,

+				new WorkspaceSynchronizer.Delegate() {

+					public void dispose() {

+					}

+

+					public boolean handleResourceChanged(final Resource resource) {

+						unloadAllResources();

+						asyncRefresh();

+						return true;

+					}

+

+					public boolean handleResourceDeleted(Resource resource) {

+						unloadAllResources();

+						asyncRefresh();

+						return true;

+					}

+

+					public boolean handleResourceMoved(Resource resource,

+							final URI newURI) {

+						unloadAllResources();

+						asyncRefresh();

+						return true;

+					}

+				});

+	}

+

+	/**

+	 * @generated

+	 */

+	public void dispose() {

+		myWorkspaceSynchronizer.dispose();

+		myWorkspaceSynchronizer = null;

+		myViewerRefreshRunnable = null;

+		myViewer = null;

+		unloadAllResources();

+		((TransactionalEditingDomain) myEditingDomain).dispose();

+		myEditingDomain = null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

+		myViewer = viewer;

+	}

+

+	/**

+	 * @generated

+	 */

+	void unloadAllResources() {

+		for (Resource nextResource : myEditingDomain.getResourceSet()

+				.getResources()) {

+			nextResource.unload();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	void asyncRefresh() {

+		if (myViewer != null && !myViewer.getControl().isDisposed()) {

+			myViewer.getControl().getDisplay()

+					.asyncExec(myViewerRefreshRunnable);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public Object[] getElements(Object inputElement) {

+		return getChildren(inputElement);

+	}

+

+	/**

+	 * @generated

+	 */

+	public void restoreState(IMemento aMemento) {

+	}

+

+	/**

+	 * @generated

+	 */

+	public void saveState(IMemento aMemento) {

+	}

+

+	/**

+	 * @generated

+	 */

+	public void init(ICommonContentExtensionSite aConfig) {

+	}

+

+	/**

+	 * @generated

+	 */

+	public Object[] getChildren(Object parentElement) {

+		if (parentElement instanceof IFile) {

+			IFile file = (IFile) parentElement;

+			URI fileURI = URI.createPlatformResourceURI(file.getFullPath()

+					.toString(), true);

+			Resource resource = myEditingDomain.getResourceSet().getResource(

+					fileURI, true);

+			ArrayList<IntermediateModelNavigatorItem> result = new ArrayList<IntermediateModelNavigatorItem>();

+			ArrayList<View> topViews = new ArrayList<View>(resource

+					.getContents().size());

+			for (EObject o : resource.getContents()) {

+				if (o instanceof View) {

+					topViews.add((View) o);

+				}

+			}

+			result.addAll(createNavigatorItems(

+					selectViewsByType(topViews,

+							StpIntermediateModelEditPart.MODEL_ID), file, false));

+			return result.toArray();

+		}

+

+		if (parentElement instanceof IntermediateModelNavigatorGroup) {

+			IntermediateModelNavigatorGroup group = (IntermediateModelNavigatorGroup) parentElement;

+			return group.getChildren();

+		}

+

+		if (parentElement instanceof IntermediateModelNavigatorItem) {

+			IntermediateModelNavigatorItem navigatorItem = (IntermediateModelNavigatorItem) parentElement;

+			if (navigatorItem.isLeaf() || !isOwnView(navigatorItem.getView())) {

+				return EMPTY_ARRAY;

+			}

+			return getViewChildren(navigatorItem.getView(), parentElement);

+		}

+

+		return EMPTY_ARRAY;

+	}

+

+	/**

+	 * @generated

+	 */

+	private Object[] getViewChildren(View view, Object parentElement) {

+		switch (IntermediateModelVisualIDRegistry.getVisualID(view)) {

+

+		case StpIntermediateModelEditPart.VISUAL_ID: {

+			LinkedList<IntermediateModelAbstractNavigatorItem> result = new LinkedList<IntermediateModelAbstractNavigatorItem>();

+			Diagram sv = (Diagram) view;

+			IntermediateModelNavigatorGroup links = new IntermediateModelNavigatorGroup(

+					Messages.NavigatorGroupName_StpIntermediateModel_1000_links,

+					"icons/linksNavigatorGroup.gif", parentElement); //$NON-NLS-1$

+			Collection<View> connectedViews;

+			connectedViews = getChildrenByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ProcessCollectionEditPart.VISUAL_ID));

+			result.addAll(createNavigatorItems(connectedViews, parentElement,

+					false));

+			connectedViews = getChildrenByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ServiceCollectionEditPart.VISUAL_ID));

+			result.addAll(createNavigatorItems(connectedViews, parentElement,

+					false));

+			connectedViews = getDiagramLinksByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(TransitionEditPart.VISUAL_ID));

+			links.addChildren(createNavigatorItems(connectedViews, links, false));

+			connectedViews = getDiagramLinksByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(StepServiceModelEditPart.VISUAL_ID));

+			links.addChildren(createNavigatorItems(connectedViews, links, false));

+			connectedViews = getDiagramLinksByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ServiceNeedsEditPart.VISUAL_ID));

+			links.addChildren(createNavigatorItems(connectedViews, links, false));

+			if (!links.isEmpty()) {

+				result.add(links);

+			}

+			return result.toArray();

+		}

+

+		case TransitionEditPart.VISUAL_ID: {

+			LinkedList<IntermediateModelAbstractNavigatorItem> result = new LinkedList<IntermediateModelAbstractNavigatorItem>();

+			Edge sv = (Edge) view;

+			IntermediateModelNavigatorGroup target = new IntermediateModelNavigatorGroup(

+					Messages.NavigatorGroupName_Transition_4009_target,

+					"icons/linkTargetNavigatorGroup.gif", parentElement); //$NON-NLS-1$

+			IntermediateModelNavigatorGroup source = new IntermediateModelNavigatorGroup(

+					Messages.NavigatorGroupName_Transition_4009_source,

+					"icons/linkSourceNavigatorGroup.gif", parentElement); //$NON-NLS-1$

+			Collection<View> connectedViews;

+			connectedViews = getLinksTargetByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(StepEditPart.VISUAL_ID));

+			target.addChildren(createNavigatorItems(connectedViews, target,

+					true));

+			connectedViews = getLinksSourceByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(StepEditPart.VISUAL_ID));

+			source.addChildren(createNavigatorItems(connectedViews, source,

+					true));

+			if (!target.isEmpty()) {

+				result.add(target);

+			}

+			if (!source.isEmpty()) {

+				result.add(source);

+			}

+			return result.toArray();

+		}

+

+		case ProcessCollectionEditPart.VISUAL_ID: {

+			LinkedList<IntermediateModelAbstractNavigatorItem> result = new LinkedList<IntermediateModelAbstractNavigatorItem>();

+			Node sv = (Node) view;

+			Collection<View> connectedViews;

+			connectedViews = getChildrenByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ProcessEditPart.VISUAL_ID));

+			result.addAll(createNavigatorItems(connectedViews, parentElement,

+					false));

+			return result.toArray();

+		}

+

+		case ServiceEditPart.VISUAL_ID: {

+			LinkedList<IntermediateModelAbstractNavigatorItem> result = new LinkedList<IntermediateModelAbstractNavigatorItem>();

+			Node sv = (Node) view;

+			IntermediateModelNavigatorGroup incominglinks = new IntermediateModelNavigatorGroup(

+					Messages.NavigatorGroupName_Service_3009_incominglinks,

+					"icons/incomingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$

+			IntermediateModelNavigatorGroup outgoinglinks = new IntermediateModelNavigatorGroup(

+					Messages.NavigatorGroupName_Service_3009_outgoinglinks,

+					"icons/outgoingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$

+			Collection<View> connectedViews;

+			connectedViews = getIncomingLinksByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(StepServiceModelEditPart.VISUAL_ID));

+			incominglinks.addChildren(createNavigatorItems(connectedViews,

+					incominglinks, true));

+			connectedViews = getIncomingLinksByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ServiceNeedsEditPart.VISUAL_ID));

+			incominglinks.addChildren(createNavigatorItems(connectedViews,

+					incominglinks, true));

+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ServiceNeedsEditPart.VISUAL_ID));

+			outgoinglinks.addChildren(createNavigatorItems(connectedViews,

+					outgoinglinks, true));

+			if (!incominglinks.isEmpty()) {

+				result.add(incominglinks);

+			}

+			if (!outgoinglinks.isEmpty()) {

+				result.add(outgoinglinks);

+			}

+			return result.toArray();

+		}

+

+		case ServiceNeedsEditPart.VISUAL_ID: {

+			LinkedList<IntermediateModelAbstractNavigatorItem> result = new LinkedList<IntermediateModelAbstractNavigatorItem>();

+			Edge sv = (Edge) view;

+			IntermediateModelNavigatorGroup target = new IntermediateModelNavigatorGroup(

+					Messages.NavigatorGroupName_ServiceNeeds_4011_target,

+					"icons/linkTargetNavigatorGroup.gif", parentElement); //$NON-NLS-1$

+			IntermediateModelNavigatorGroup source = new IntermediateModelNavigatorGroup(

+					Messages.NavigatorGroupName_ServiceNeeds_4011_source,

+					"icons/linkSourceNavigatorGroup.gif", parentElement); //$NON-NLS-1$

+			Collection<View> connectedViews;

+			connectedViews = getLinksTargetByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ProcessEditPart.VISUAL_ID));

+			target.addChildren(createNavigatorItems(connectedViews, target,

+					true));

+			connectedViews = getLinksTargetByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ServiceEditPart.VISUAL_ID));

+			target.addChildren(createNavigatorItems(connectedViews, target,

+					true));

+			connectedViews = getLinksSourceByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ProcessEditPart.VISUAL_ID));

+			source.addChildren(createNavigatorItems(connectedViews, source,

+					true));

+			connectedViews = getLinksSourceByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ServiceEditPart.VISUAL_ID));

+			source.addChildren(createNavigatorItems(connectedViews, source,

+					true));

+			if (!target.isEmpty()) {

+				result.add(target);

+			}

+			if (!source.isEmpty()) {

+				result.add(source);

+			}

+			return result.toArray();

+		}

+

+		case StepServiceModelEditPart.VISUAL_ID: {

+			LinkedList<IntermediateModelAbstractNavigatorItem> result = new LinkedList<IntermediateModelAbstractNavigatorItem>();

+			Edge sv = (Edge) view;

+			IntermediateModelNavigatorGroup target = new IntermediateModelNavigatorGroup(

+					Messages.NavigatorGroupName_StepServiceModel_4010_target,

+					"icons/linkTargetNavigatorGroup.gif", parentElement); //$NON-NLS-1$

+			IntermediateModelNavigatorGroup source = new IntermediateModelNavigatorGroup(

+					Messages.NavigatorGroupName_StepServiceModel_4010_source,

+					"icons/linkSourceNavigatorGroup.gif", parentElement); //$NON-NLS-1$

+			Collection<View> connectedViews;

+			connectedViews = getLinksTargetByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ProcessEditPart.VISUAL_ID));

+			target.addChildren(createNavigatorItems(connectedViews, target,

+					true));

+			connectedViews = getLinksTargetByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ServiceEditPart.VISUAL_ID));

+			target.addChildren(createNavigatorItems(connectedViews, target,

+					true));

+			connectedViews = getLinksSourceByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(StepEditPart.VISUAL_ID));

+			source.addChildren(createNavigatorItems(connectedViews, source,

+					true));

+			if (!target.isEmpty()) {

+				result.add(target);

+			}

+			if (!source.isEmpty()) {

+				result.add(source);

+			}

+			return result.toArray();

+		}

+

+		case StepEditPart.VISUAL_ID: {

+			LinkedList<IntermediateModelAbstractNavigatorItem> result = new LinkedList<IntermediateModelAbstractNavigatorItem>();

+			Node sv = (Node) view;

+			IntermediateModelNavigatorGroup incominglinks = new IntermediateModelNavigatorGroup(

+					Messages.NavigatorGroupName_Step_3008_incominglinks,

+					"icons/incomingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$

+			IntermediateModelNavigatorGroup outgoinglinks = new IntermediateModelNavigatorGroup(

+					Messages.NavigatorGroupName_Step_3008_outgoinglinks,

+					"icons/outgoingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$

+			Collection<View> connectedViews;

+			connectedViews = getIncomingLinksByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(TransitionEditPart.VISUAL_ID));

+			incominglinks.addChildren(createNavigatorItems(connectedViews,

+					incominglinks, true));

+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(TransitionEditPart.VISUAL_ID));

+			outgoinglinks.addChildren(createNavigatorItems(connectedViews,

+					outgoinglinks, true));

+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(StepServiceModelEditPart.VISUAL_ID));

+			outgoinglinks.addChildren(createNavigatorItems(connectedViews,

+					outgoinglinks, true));

+			if (!incominglinks.isEmpty()) {

+				result.add(incominglinks);

+			}

+			if (!outgoinglinks.isEmpty()) {

+				result.add(outgoinglinks);

+			}

+			return result.toArray();

+		}

+

+		case ProcessEditPart.VISUAL_ID: {

+			LinkedList<IntermediateModelAbstractNavigatorItem> result = new LinkedList<IntermediateModelAbstractNavigatorItem>();

+			Node sv = (Node) view;

+			IntermediateModelNavigatorGroup incominglinks = new IntermediateModelNavigatorGroup(

+					Messages.NavigatorGroupName_Process_3007_incominglinks,

+					"icons/incomingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$

+			IntermediateModelNavigatorGroup outgoinglinks = new IntermediateModelNavigatorGroup(

+					Messages.NavigatorGroupName_Process_3007_outgoinglinks,

+					"icons/outgoingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$

+			Collection<View> connectedViews;

+			connectedViews = getChildrenByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(StepEditPart.VISUAL_ID));

+			result.addAll(createNavigatorItems(connectedViews, parentElement,

+					false));

+			connectedViews = getIncomingLinksByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(StepServiceModelEditPart.VISUAL_ID));

+			incominglinks.addChildren(createNavigatorItems(connectedViews,

+					incominglinks, true));

+			connectedViews = getIncomingLinksByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ServiceNeedsEditPart.VISUAL_ID));

+			incominglinks.addChildren(createNavigatorItems(connectedViews,

+					incominglinks, true));

+			connectedViews = getOutgoingLinksByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ServiceNeedsEditPart.VISUAL_ID));

+			outgoinglinks.addChildren(createNavigatorItems(connectedViews,

+					outgoinglinks, true));

+			if (!incominglinks.isEmpty()) {

+				result.add(incominglinks);

+			}

+			if (!outgoinglinks.isEmpty()) {

+				result.add(outgoinglinks);

+			}

+			return result.toArray();

+		}

+

+		case ServiceCollectionEditPart.VISUAL_ID: {

+			LinkedList<IntermediateModelAbstractNavigatorItem> result = new LinkedList<IntermediateModelAbstractNavigatorItem>();

+			Node sv = (Node) view;

+			Collection<View> connectedViews;

+			connectedViews = getChildrenByType(Collections.singleton(sv),

+					IntermediateModelVisualIDRegistry

+							.getType(ServiceEditPart.VISUAL_ID));

+			result.addAll(createNavigatorItems(connectedViews, parentElement,

+					false));

+			return result.toArray();

+		}

+		}

+		return EMPTY_ARRAY;

+	}

+

+	/**

+	 * @generated

+	 */

+	private Collection<View> getLinksSourceByType(Collection<Edge> edges,

+			String type) {

+		LinkedList<View> result = new LinkedList<View>();

+		for (Edge nextEdge : edges) {

+			View nextEdgeSource = nextEdge.getSource();

+			if (type.equals(nextEdgeSource.getType())

+					&& isOwnView(nextEdgeSource)) {

+				result.add(nextEdgeSource);

+			}

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	private Collection<View> getLinksTargetByType(Collection<Edge> edges,

+			String type) {

+		LinkedList<View> result = new LinkedList<View>();

+		for (Edge nextEdge : edges) {

+			View nextEdgeTarget = nextEdge.getTarget();

+			if (type.equals(nextEdgeTarget.getType())

+					&& isOwnView(nextEdgeTarget)) {

+				result.add(nextEdgeTarget);

+			}

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	private Collection<View> getOutgoingLinksByType(

+			Collection<? extends View> nodes, String type) {

+		LinkedList<View> result = new LinkedList<View>();

+		for (View nextNode : nodes) {

+			result.addAll(selectViewsByType(nextNode.getSourceEdges(), type));

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	private Collection<View> getIncomingLinksByType(

+			Collection<? extends View> nodes, String type) {

+		LinkedList<View> result = new LinkedList<View>();

+		for (View nextNode : nodes) {

+			result.addAll(selectViewsByType(nextNode.getTargetEdges(), type));

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	private Collection<View> getChildrenByType(

+			Collection<? extends View> nodes, String type) {

+		LinkedList<View> result = new LinkedList<View>();

+		for (View nextNode : nodes) {

+			result.addAll(selectViewsByType(nextNode.getChildren(), type));

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	private Collection<View> getDiagramLinksByType(

+			Collection<Diagram> diagrams, String type) {

+		ArrayList<View> result = new ArrayList<View>();

+		for (Diagram nextDiagram : diagrams) {

+			result.addAll(selectViewsByType(nextDiagram.getEdges(), type));

+		}

+		return result;

+	}

+

+	// TODO refactor as static method

+	/**

+	 * @generated

+	 */

+	private Collection<View> selectViewsByType(Collection<View> views,

+			String type) {

+		ArrayList<View> result = new ArrayList<View>();

+		for (View nextView : views) {

+			if (type.equals(nextView.getType()) && isOwnView(nextView)) {

+				result.add(nextView);

+			}

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	private boolean isOwnView(View view) {

+		return StpIntermediateModelEditPart.MODEL_ID

+				.equals(IntermediateModelVisualIDRegistry.getModelID(view));

+	}

+

+	/**

+	 * @generated

+	 */

+	private Collection<IntermediateModelNavigatorItem> createNavigatorItems(

+			Collection<View> views, Object parent, boolean isLeafs) {

+		ArrayList<IntermediateModelNavigatorItem> result = new ArrayList<IntermediateModelNavigatorItem>(

+				views.size());

+		for (View nextView : views) {

+			result.add(new IntermediateModelNavigatorItem(nextView, parent,

+					isLeafs));

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Object getParent(Object element) {

+		if (element instanceof IntermediateModelAbstractNavigatorItem) {

+			IntermediateModelAbstractNavigatorItem abstractNavigatorItem = (IntermediateModelAbstractNavigatorItem) element;

+			return abstractNavigatorItem.getParent();

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean hasChildren(Object element) {

+		return element instanceof IFile || getChildren(element).length > 0;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorGroup.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorGroup.java
new file mode 100755
index 0000000..47100fa
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorGroup.java
@@ -0,0 +1,98 @@
+package org.eclipse.soa.mangrove.diagram.navigator;

+

+import java.util.Collection;

+import java.util.LinkedList;

+

+/**

+ * @generated

+ */

+public class IntermediateModelNavigatorGroup extends

+		IntermediateModelAbstractNavigatorItem {

+

+	/**

+	 * @generated

+	 */

+	private String myGroupName;

+

+	/**

+	 * @generated

+	 */

+	private String myIcon;

+

+	/**

+	 * @generated

+	 */

+	private Collection myChildren = new LinkedList();

+

+	/**

+	 * @generated

+	 */

+	IntermediateModelNavigatorGroup(String groupName, String icon, Object parent) {

+		super(parent);

+		myGroupName = groupName;

+		myIcon = icon;

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getGroupName() {

+		return myGroupName;

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getIcon() {

+		return myIcon;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Object[] getChildren() {

+		return myChildren.toArray();

+	}

+

+	/**

+	 * @generated

+	 */

+	public void addChildren(Collection children) {

+		myChildren.addAll(children);

+	}

+

+	/**

+	 * @generated

+	 */

+	public void addChild(Object child) {

+		myChildren.add(child);

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean isEmpty() {

+		return myChildren.size() == 0;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean equals(Object obj) {

+		if (obj instanceof org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorGroup) {

+			org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorGroup anotherGroup = (org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorGroup) obj;

+			if (getGroupName().equals(anotherGroup.getGroupName())) {

+				return getParent().equals(anotherGroup.getParent());

+			}

+		}

+		return super.equals(obj);

+	}

+

+	/**

+	 * @generated

+	 */

+	public int hashCode() {

+		return getGroupName().hashCode();

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorItem.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorItem.java
new file mode 100755
index 0000000..aa783eb
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorItem.java
@@ -0,0 +1,95 @@
+package org.eclipse.soa.mangrove.diagram.navigator;

+

+import org.eclipse.core.runtime.IAdapterFactory;

+import org.eclipse.core.runtime.Platform;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.util.EcoreUtil;

+import org.eclipse.gmf.runtime.notation.View;

+

+/**

+ * @generated

+ */

+public class IntermediateModelNavigatorItem extends

+		IntermediateModelAbstractNavigatorItem {

+

+	/**

+	 * @generated

+	 */

+	static {

+		final Class[] supportedTypes = new Class[] { View.class, EObject.class };

+		Platform.getAdapterManager().registerAdapters(

+				new IAdapterFactory() {

+

+					public Object getAdapter(Object adaptableObject,

+							Class adapterType) {

+						if (adaptableObject instanceof org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorItem

+								&& (adapterType == View.class || adapterType == EObject.class)) {

+							return ((org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorItem) adaptableObject)

+									.getView();

+						}

+						return null;

+					}

+

+					public Class[] getAdapterList() {

+						return supportedTypes;

+					}

+				},

+				org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorItem.class);

+	}

+

+	/**

+	 * @generated

+	 */

+	private View myView;

+

+	/**

+	 * @generated

+	 */

+	private boolean myLeaf = false;

+

+	/**

+	 * @generated

+	 */

+	public IntermediateModelNavigatorItem(View view, Object parent,

+			boolean isLeaf) {

+		super(parent);

+		myView = view;

+		myLeaf = isLeaf;

+	}

+

+	/**

+	 * @generated

+	 */

+	public View getView() {

+		return myView;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean isLeaf() {

+		return myLeaf;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean equals(Object obj) {

+		if (obj instanceof org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorItem) {

+			return EcoreUtil

+					.getURI(getView())

+					.equals(EcoreUtil

+							.getURI(((org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorItem) obj)

+									.getView()));

+		}

+		return super.equals(obj);

+	}

+

+	/**

+	 * @generated

+	 */

+	public int hashCode() {

+		return EcoreUtil.getURI(getView()).hashCode();

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorLabelProvider.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorLabelProvider.java
new file mode 100755
index 0000000..7642195
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorLabelProvider.java
@@ -0,0 +1,361 @@
+package org.eclipse.soa.mangrove.diagram.navigator;

+

+import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;

+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;

+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.jface.resource.ImageDescriptor;

+import org.eclipse.jface.resource.ImageRegistry;

+import org.eclipse.jface.viewers.ITreePathLabelProvider;

+import org.eclipse.jface.viewers.LabelProvider;

+import org.eclipse.jface.viewers.TreePath;

+import org.eclipse.jface.viewers.ViewerLabel;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessCollectionPoolNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceNeedsEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceServiceNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepServiceModelEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.TransitionEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelParserProvider;

+import org.eclipse.swt.graphics.Image;

+import org.eclipse.ui.IMemento;

+import org.eclipse.ui.navigator.ICommonContentExtensionSite;

+import org.eclipse.ui.navigator.ICommonLabelProvider;

+

+/**

+ * @generated

+ */

+public class IntermediateModelNavigatorLabelProvider extends LabelProvider

+		implements ICommonLabelProvider, ITreePathLabelProvider {

+

+	/**

+	 * @generated

+	 */

+	static {

+		IntermediateModelDiagramEditorPlugin

+				.getInstance()

+				.getImageRegistry()

+				.put("Navigator?UnknownElement", ImageDescriptor.getMissingImageDescriptor()); //$NON-NLS-1$

+		IntermediateModelDiagramEditorPlugin

+				.getInstance()

+				.getImageRegistry()

+				.put("Navigator?ImageNotFound", ImageDescriptor.getMissingImageDescriptor()); //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	public void updateLabel(ViewerLabel label, TreePath elementPath) {

+		Object element = elementPath.getLastSegment();

+		if (element instanceof IntermediateModelNavigatorItem

+				&& !isOwnView(((IntermediateModelNavigatorItem) element)

+						.getView())) {

+			return;

+		}

+		label.setText(getText(element));

+		label.setImage(getImage(element));

+	}

+

+	/**

+	 * @generated

+	 */

+	public Image getImage(Object element) {

+		if (element instanceof IntermediateModelNavigatorGroup) {

+			IntermediateModelNavigatorGroup group = (IntermediateModelNavigatorGroup) element;

+			return IntermediateModelDiagramEditorPlugin.getInstance()

+					.getBundledImage(group.getIcon());

+		}

+

+		if (element instanceof IntermediateModelNavigatorItem) {

+			IntermediateModelNavigatorItem navigatorItem = (IntermediateModelNavigatorItem) element;

+			if (!isOwnView(navigatorItem.getView())) {

+				return super.getImage(element);

+			}

+			return getImage(navigatorItem.getView());

+		}

+

+		return super.getImage(element);

+	}

+

+	/**

+	 * @generated

+	 */

+	public Image getImage(View view) {

+		switch (IntermediateModelVisualIDRegistry.getVisualID(view)) {

+		case StpIntermediateModelEditPart.VISUAL_ID:

+			return getImage(

+					"Navigator?Diagram?http://eclipse.org/soa/mangrove?StpIntermediateModel", IntermediateModelElementTypes.StpIntermediateModel_1000); //$NON-NLS-1$

+		case TransitionEditPart.VISUAL_ID:

+			return getImage(

+					"Navigator?Link?http://eclipse.org/soa/mangrove?Transition", IntermediateModelElementTypes.Transition_4009); //$NON-NLS-1$

+		case ProcessCollectionEditPart.VISUAL_ID:

+			return getImage(

+					"Navigator?TopLevelNode?http://eclipse.org/soa/mangrove?ProcessCollection", IntermediateModelElementTypes.ProcessCollection_2005); //$NON-NLS-1$

+		case ServiceEditPart.VISUAL_ID:

+			return getImage(

+					"Navigator?Node?http://eclipse.org/soa/mangrove?Service", IntermediateModelElementTypes.Service_3009); //$NON-NLS-1$

+		case ServiceNeedsEditPart.VISUAL_ID:

+			return getImage(

+					"Navigator?Link?http://eclipse.org/soa/mangrove?Service?needs", IntermediateModelElementTypes.ServiceNeeds_4011); //$NON-NLS-1$

+		case StepServiceModelEditPart.VISUAL_ID:

+			return getImage(

+					"Navigator?Link?http://eclipse.org/soa/mangrove?Step?serviceModel", IntermediateModelElementTypes.StepServiceModel_4010); //$NON-NLS-1$

+		case StepEditPart.VISUAL_ID:

+			return getImage(

+					"Navigator?Node?http://eclipse.org/soa/mangrove?Step", IntermediateModelElementTypes.Step_3008); //$NON-NLS-1$

+		case ProcessEditPart.VISUAL_ID:

+			return getImage(

+					"Navigator?Node?http://eclipse.org/soa/mangrove?Process", IntermediateModelElementTypes.Process_3007); //$NON-NLS-1$

+		case ServiceCollectionEditPart.VISUAL_ID:

+			return getImage(

+					"Navigator?TopLevelNode?http://eclipse.org/soa/mangrove?ServiceCollection", IntermediateModelElementTypes.ServiceCollection_2006); //$NON-NLS-1$

+		}

+		return getImage("Navigator?UnknownElement", null); //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	private Image getImage(String key, IElementType elementType) {

+		ImageRegistry imageRegistry = IntermediateModelDiagramEditorPlugin

+				.getInstance().getImageRegistry();

+		Image image = imageRegistry.get(key);

+		if (image == null

+				&& elementType != null

+				&& IntermediateModelElementTypes

+						.isKnownElementType(elementType)) {

+			image = IntermediateModelElementTypes.getImage(elementType);

+			imageRegistry.put(key, image);

+		}

+

+		if (image == null) {

+			image = imageRegistry.get("Navigator?ImageNotFound"); //$NON-NLS-1$

+			imageRegistry.put(key, image);

+		}

+		return image;

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getText(Object element) {

+		if (element instanceof IntermediateModelNavigatorGroup) {

+			IntermediateModelNavigatorGroup group = (IntermediateModelNavigatorGroup) element;

+			return group.getGroupName();

+		}

+

+		if (element instanceof IntermediateModelNavigatorItem) {

+			IntermediateModelNavigatorItem navigatorItem = (IntermediateModelNavigatorItem) element;

+			if (!isOwnView(navigatorItem.getView())) {

+				return null;

+			}

+			return getText(navigatorItem.getView());

+		}

+

+		return super.getText(element);

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getText(View view) {

+		if (view.getElement() != null && view.getElement().eIsProxy()) {

+			return getUnresolvedDomainElementProxyText(view);

+		}

+		switch (IntermediateModelVisualIDRegistry.getVisualID(view)) {

+		case StpIntermediateModelEditPart.VISUAL_ID:

+			return getStpIntermediateModel_1000Text(view);

+		case TransitionEditPart.VISUAL_ID:

+			return getTransition_4009Text(view);

+		case ProcessCollectionEditPart.VISUAL_ID:

+			return getProcessCollection_2005Text(view);

+		case ServiceEditPart.VISUAL_ID:

+			return getService_3009Text(view);

+		case ServiceNeedsEditPart.VISUAL_ID:

+			return getServiceNeeds_4011Text(view);

+		case StepServiceModelEditPart.VISUAL_ID:

+			return getStepServiceModel_4010Text(view);

+		case StepEditPart.VISUAL_ID:

+			return getStep_3008Text(view);

+		case ProcessEditPart.VISUAL_ID:

+			return getProcess_3007Text(view);

+		case ServiceCollectionEditPart.VISUAL_ID:

+			return getServiceCollection_2006Text(view);

+		}

+		return getUnknownElementText(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	private String getStpIntermediateModel_1000Text(View view) {

+		return ""; //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	private String getTransition_4009Text(View view) {

+		return ""; //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	private String getProcessCollection_2005Text(View view) {

+		IParser parser = IntermediateModelParserProvider.getParser(

+				IntermediateModelElementTypes.ProcessCollection_2005, view

+						.getElement() != null ? view.getElement() : view,

+				IntermediateModelVisualIDRegistry

+						.getType(ProcessCollectionPoolNameEditPart.VISUAL_ID));

+		if (parser != null) {

+			return parser.getPrintString(new EObjectAdapter(

+					view.getElement() != null ? view.getElement() : view),

+					ParserOptions.NONE.intValue());

+		} else {

+			IntermediateModelDiagramEditorPlugin.getInstance().logError(

+					"Parser was not found for label " + 5011); //$NON-NLS-1$

+			return ""; //$NON-NLS-1$

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private String getService_3009Text(View view) {

+		IParser parser = IntermediateModelParserProvider.getParser(

+				IntermediateModelElementTypes.Service_3009,

+				view.getElement() != null ? view.getElement() : view,

+				IntermediateModelVisualIDRegistry

+						.getType(ServiceServiceNameEditPart.VISUAL_ID));

+		if (parser != null) {

+			return parser.getPrintString(new EObjectAdapter(

+					view.getElement() != null ? view.getElement() : view),

+					ParserOptions.NONE.intValue());

+		} else {

+			IntermediateModelDiagramEditorPlugin.getInstance().logError(

+					"Parser was not found for label " + 5012); //$NON-NLS-1$

+			return ""; //$NON-NLS-1$

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private String getServiceNeeds_4011Text(View view) {

+		return ""; //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	private String getStepServiceModel_4010Text(View view) {

+		return ""; //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	private String getStep_3008Text(View view) {

+		IParser parser = IntermediateModelParserProvider.getParser(

+				IntermediateModelElementTypes.Step_3008,

+				view.getElement() != null ? view.getElement() : view,

+				IntermediateModelVisualIDRegistry

+						.getType(StepNameEditPart.VISUAL_ID));

+		if (parser != null) {

+			return parser.getPrintString(new EObjectAdapter(

+					view.getElement() != null ? view.getElement() : view),

+					ParserOptions.NONE.intValue());

+		} else {

+			IntermediateModelDiagramEditorPlugin.getInstance().logError(

+					"Parser was not found for label " + 5009); //$NON-NLS-1$

+			return ""; //$NON-NLS-1$

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private String getProcess_3007Text(View view) {

+		IParser parser = IntermediateModelParserProvider.getParser(

+				IntermediateModelElementTypes.Process_3007,

+				view.getElement() != null ? view.getElement() : view,

+				IntermediateModelVisualIDRegistry

+						.getType(ProcessNameEditPart.VISUAL_ID));

+		if (parser != null) {

+			return parser.getPrintString(new EObjectAdapter(

+					view.getElement() != null ? view.getElement() : view),

+					ParserOptions.NONE.intValue());

+		} else {

+			IntermediateModelDiagramEditorPlugin.getInstance().logError(

+					"Parser was not found for label " + 5010); //$NON-NLS-1$

+			return ""; //$NON-NLS-1$

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private String getServiceCollection_2006Text(View view) {

+		return ""; //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	private String getUnknownElementText(View view) {

+		return "<UnknownElement Visual_ID = " + view.getType() + ">"; //$NON-NLS-1$  //$NON-NLS-2$

+	}

+

+	/**

+	 * @generated

+	 */

+	private String getUnresolvedDomainElementProxyText(View view) {

+		return "<Unresolved domain element Visual_ID = " + view.getType() + ">"; //$NON-NLS-1$  //$NON-NLS-2$

+	}

+

+	/**

+	 * @generated

+	 */

+	public void init(ICommonContentExtensionSite aConfig) {

+	}

+

+	/**

+	 * @generated

+	 */

+	public void restoreState(IMemento aMemento) {

+	}

+

+	/**

+	 * @generated

+	 */

+	public void saveState(IMemento aMemento) {

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getDescription(Object anElement) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	private boolean isOwnView(View view) {

+		return StpIntermediateModelEditPart.MODEL_ID

+				.equals(IntermediateModelVisualIDRegistry.getModelID(view));

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorLinkHelper.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorLinkHelper.java
new file mode 100755
index 0000000..d9594a8
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorLinkHelper.java
@@ -0,0 +1,128 @@
+package org.eclipse.soa.mangrove.diagram.navigator;

+

+import org.eclipse.core.resources.IFile;

+import org.eclipse.emf.common.ui.URIEditorInput;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.resource.Resource;

+import org.eclipse.emf.ecore.resource.ResourceSet;

+import org.eclipse.emf.ecore.util.EcoreUtil;

+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;

+import org.eclipse.gef.EditPart;

+import org.eclipse.gef.GraphicalViewer;

+import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor;

+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;

+import org.eclipse.gmf.runtime.notation.Diagram;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.jface.viewers.IStructuredSelection;

+import org.eclipse.jface.viewers.StructuredSelection;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+import org.eclipse.ui.IEditorInput;

+import org.eclipse.ui.IEditorPart;

+import org.eclipse.ui.IWorkbenchPage;

+import org.eclipse.ui.navigator.ILinkHelper;

+import org.eclipse.ui.part.FileEditorInput;

+

+/**

+ * @generated

+ */

+public class IntermediateModelNavigatorLinkHelper implements ILinkHelper {

+

+	/**

+	 * @generated

+	 */

+	private static IEditorInput getEditorInput(Diagram diagram) {

+		Resource diagramResource = diagram.eResource();

+		for (EObject nextEObject : diagramResource.getContents()) {

+			if (nextEObject == diagram) {

+				return new FileEditorInput(

+						WorkspaceSynchronizer.getFile(diagramResource));

+			}

+			if (nextEObject instanceof Diagram) {

+				break;

+			}

+		}

+		URI uri = EcoreUtil.getURI(diagram);

+		String editorName = uri.lastSegment() + '#'

+				+ diagram.eResource().getContents().indexOf(diagram);

+		IEditorInput editorInput = new URIEditorInput(uri, editorName);

+		return editorInput;

+	}

+

+	/**

+	 * @generated

+	 */

+	public IStructuredSelection findSelection(IEditorInput anInput) {

+		IDiagramDocument document = IntermediateModelDiagramEditorPlugin

+				.getInstance().getDocumentProvider()

+				.getDiagramDocument(anInput);

+		if (document == null) {

+			return StructuredSelection.EMPTY;

+		}

+		Diagram diagram = document.getDiagram();

+		if (diagram == null || diagram.eResource() == null) {

+			return StructuredSelection.EMPTY;

+		}

+		IFile file = WorkspaceSynchronizer.getFile(diagram.eResource());

+		if (file != null) {

+			IntermediateModelNavigatorItem item = new IntermediateModelNavigatorItem(

+					diagram, file, false);

+			return new StructuredSelection(item);

+		}

+		return StructuredSelection.EMPTY;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void activateEditor(IWorkbenchPage aPage,

+			IStructuredSelection aSelection) {

+		if (aSelection == null || aSelection.isEmpty()) {

+			return;

+		}

+		if (false == aSelection.getFirstElement() instanceof IntermediateModelAbstractNavigatorItem) {

+			return;

+		}

+

+		IntermediateModelAbstractNavigatorItem abstractNavigatorItem = (IntermediateModelAbstractNavigatorItem) aSelection

+				.getFirstElement();

+		View navigatorView = null;

+		if (abstractNavigatorItem instanceof IntermediateModelNavigatorItem) {

+			navigatorView = ((IntermediateModelNavigatorItem) abstractNavigatorItem)

+					.getView();

+		} else if (abstractNavigatorItem instanceof IntermediateModelNavigatorGroup) {

+			IntermediateModelNavigatorGroup navigatorGroup = (IntermediateModelNavigatorGroup) abstractNavigatorItem;

+			if (navigatorGroup.getParent() instanceof IntermediateModelNavigatorItem) {

+				navigatorView = ((IntermediateModelNavigatorItem) navigatorGroup

+						.getParent()).getView();

+			}

+		}

+		if (navigatorView == null) {

+			return;

+		}

+		IEditorInput editorInput = getEditorInput(navigatorView.getDiagram());

+		IEditorPart editor = aPage.findEditor(editorInput);

+		if (editor == null) {

+			return;

+		}

+		aPage.bringToTop(editor);

+		if (editor instanceof DiagramEditor) {

+			DiagramEditor diagramEditor = (DiagramEditor) editor;

+			ResourceSet diagramEditorResourceSet = diagramEditor

+					.getEditingDomain().getResourceSet();

+			EObject selectedView = diagramEditorResourceSet.getEObject(

+					EcoreUtil.getURI(navigatorView), true);

+			if (selectedView == null) {

+				return;

+			}

+			GraphicalViewer graphicalViewer = (GraphicalViewer) diagramEditor

+					.getAdapter(GraphicalViewer.class);

+			EditPart selectedEditPart = (EditPart) graphicalViewer

+					.getEditPartRegistry().get(selectedView);

+			if (selectedEditPart != null) {

+				graphicalViewer.select(selectedEditPart);

+			}

+		}

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorSorter.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorSorter.java
new file mode 100755
index 0000000..2d66bf7
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/navigator/IntermediateModelNavigatorSorter.java
@@ -0,0 +1,28 @@
+package org.eclipse.soa.mangrove.diagram.navigator;

+

+import org.eclipse.jface.viewers.ViewerSorter;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+

+/**

+ * @generated

+ */

+public class IntermediateModelNavigatorSorter extends ViewerSorter {

+

+	/**

+	 * @generated

+	 */

+	private static final int GROUP_CATEGORY = 4013;

+

+	/**

+	 * @generated

+	 */

+	public int category(Object element) {

+		if (element instanceof IntermediateModelNavigatorItem) {

+			IntermediateModelNavigatorItem item = (IntermediateModelNavigatorItem) element;

+			return IntermediateModelVisualIDRegistry

+					.getVisualID(item.getView());

+		}

+		return GROUP_CATEGORY;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/parsers/AbstractParser.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/parsers/AbstractParser.java
new file mode 100755
index 0000000..091c4ac
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/parsers/AbstractParser.java
@@ -0,0 +1,465 @@
+package org.eclipse.soa.mangrove.diagram.parsers;

+

+import java.util.Arrays;

+

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.emf.common.notify.Notification;

+import org.eclipse.emf.ecore.EAttribute;

+import org.eclipse.emf.ecore.EClassifier;

+import org.eclipse.emf.ecore.EDataType;

+import org.eclipse.emf.ecore.EEnum;

+import org.eclipse.emf.ecore.EEnumLiteral;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.transaction.TransactionalEditingDomain;

+import org.eclipse.emf.transaction.util.TransactionUtil;

+import org.eclipse.gmf.runtime.common.core.command.ICommand;

+import org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand;

+import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;

+import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;

+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;

+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;

+import org.eclipse.gmf.runtime.emf.type.core.commands.SetValueCommand;

+import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;

+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;

+import org.eclipse.osgi.util.NLS;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+import org.eclipse.soa.mangrove.diagram.part.Messages;

+

+/**

+ * @generated

+ */

+public abstract class AbstractParser implements IParser {

+

+	/**

+	 * @generated

+	 */

+	protected final EAttribute[] features;

+

+	/**

+	 * @generated

+	 */

+	protected final EAttribute[] editableFeatures;

+

+	/**

+	 * @generated

+	 */

+	private String viewPattern;

+

+	/**

+	 * @generated

+	 */

+	private String editorPattern;

+

+	/**

+	 * @generated

+	 */

+	private String editPattern;

+

+	/**

+	 * @generated

+	 */

+	public AbstractParser(EAttribute[] features) {

+		if (features == null || Arrays.asList(features).contains(null)) {

+			throw new IllegalArgumentException();

+		}

+		this.editableFeatures = this.features = features;

+	}

+

+	/**

+	 * @generated

+	 */

+	public AbstractParser(EAttribute[] features, EAttribute[] editableFeatures) {

+		if (features == null || Arrays.asList(features).contains(null)) {

+			throw new IllegalArgumentException();

+		}

+		this.features = features;

+		if (editableFeatures == null

+				|| Arrays.asList(editableFeatures).contains(null)) {

+			throw new IllegalArgumentException();

+		}

+		this.editableFeatures = editableFeatures;

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getViewPattern() {

+		return viewPattern;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setViewPattern(String viewPattern) {

+		this.viewPattern = viewPattern;

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getEditorPattern() {

+		return editorPattern;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setEditorPattern(String editorPattern) {

+		this.editorPattern = editorPattern;

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getEditPattern() {

+		return editPattern;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setEditPattern(String editPattern) {

+		this.editPattern = editPattern;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean isAffectingEvent(Object event, int flags) {

+		if (event instanceof Notification) {

+			return isAffectingFeature(((Notification) event).getFeature());

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean isAffectingFeature(Object feature) {

+		for (int i = 0; i < features.length; i++) {

+			if (features[i] == feature) {

+				return true;

+			}

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	public IContentAssistProcessor getCompletionProcessor(IAdaptable element) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Object[] getValues(EObject element) {

+		Object[] values = new Object[features.length];

+		for (int i = 0; i < features.length; i++) {

+			values[i] = getValue(element, features[i]);

+		}

+		return values;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Object[] getEditableValues(EObject element) {

+		Object[] values = new Object[editableFeatures.length];

+		for (int i = 0; i < editableFeatures.length; i++) {

+			values[i] = getValue(element, editableFeatures[i]);

+		}

+		return values;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Object getValue(EObject element, EAttribute feature) {

+		Object value = element.eGet(feature);

+		Class iClass = feature.getEAttributeType().getInstanceClass();

+		if (String.class.equals(iClass)) {

+			if (value == null) {

+				value = ""; //$NON-NLS-1$

+			}

+		}

+		return value;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected ICommand getParseCommand(IAdaptable adapter, Object[] values,

+			int flags) {

+		if (values == null

+				|| validateNewValues(values).getCode() != IParserEditStatus.EDITABLE) {

+			return UnexecutableCommand.INSTANCE;

+		}

+		EObject element = (EObject) adapter.getAdapter(EObject.class);

+		TransactionalEditingDomain editingDomain = TransactionUtil

+				.getEditingDomain(element);

+		if (editingDomain == null) {

+			return UnexecutableCommand.INSTANCE;

+		}

+		CompositeTransactionalCommand command = new CompositeTransactionalCommand(

+				editingDomain, "Set Values"); //$NON-NLS-1$

+		for (int i = 0; i < values.length; i++) {

+			command.compose(getModificationCommand(element,

+					editableFeatures[i], values[i]));

+		}

+		return command;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected ICommand getModificationCommand(EObject element,

+			EAttribute feature, Object value) {

+		value = getValidNewValue(feature, value);

+		if (value instanceof InvalidValue) {

+			return UnexecutableCommand.INSTANCE;

+		}

+		SetRequest request = new SetRequest(element, feature, value);

+		return new SetValueCommand(request);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IParserEditStatus validateNewValues(Object[] values) {

+		if (values.length != editableFeatures.length) {

+			return ParserEditStatus.UNEDITABLE_STATUS;

+		}

+		for (int i = 0; i < values.length; i++) {

+			Object value = getValidNewValue(editableFeatures[i], values[i]);

+			if (value instanceof InvalidValue) {

+				return new ParserEditStatus(

+						IntermediateModelDiagramEditorPlugin.ID,

+						IParserEditStatus.UNEDITABLE, value.toString());

+			}

+		}

+		return ParserEditStatus.EDITABLE_STATUS;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Object getValidNewValue(EAttribute feature, Object value) {

+		EClassifier type = feature.getEType();

+		if (type instanceof EDataType) {

+			Class iClass = type.getInstanceClass();

+			if (Boolean.TYPE.equals(iClass)) {

+				if (value instanceof Boolean) {

+					// ok

+				} else if (value instanceof String) {

+					value = Boolean.valueOf((String) value);

+				} else {

+					value = new InvalidValue(NLS.bind(

+							Messages.AbstractParser_UnexpectedValueType,

+							iClass.getName()));

+				}

+			} else if (Character.TYPE.equals(iClass)) {

+				if (value instanceof Character) {

+					// ok

+				} else if (value instanceof String) {

+					String s = (String) value;

+					if (s.length() == 0) {

+						value = null;

+					} else {

+						value = new Character(s.charAt(0));

+					}

+				} else {

+					value = new InvalidValue(NLS.bind(

+							Messages.AbstractParser_UnexpectedValueType,

+							iClass.getName()));

+				}

+			} else if (Byte.TYPE.equals(iClass)) {

+				if (value instanceof Byte) {

+					// ok

+				} else if (value instanceof Number) {

+					value = new Byte(((Number) value).byteValue());

+				} else if (value instanceof String) {

+					String s = (String) value;

+					if (s.length() == 0) {

+						value = null;

+					} else {

+						try {

+							value = Byte.valueOf(s);

+						} catch (NumberFormatException nfe) {

+							value = new InvalidValue(

+									NLS.bind(

+											Messages.AbstractParser_WrongStringConversion,

+											iClass.getName()));

+						}

+					}

+				} else {

+					value = new InvalidValue(NLS.bind(

+							Messages.AbstractParser_UnexpectedValueType,

+							iClass.getName()));

+				}

+			} else if (Short.TYPE.equals(iClass)) {

+				if (value instanceof Short) {

+					// ok

+				} else if (value instanceof Number) {

+					value = new Short(((Number) value).shortValue());

+				} else if (value instanceof String) {

+					String s = (String) value;

+					if (s.length() == 0) {

+						value = null;

+					} else {

+						try {

+							value = Short.valueOf(s);

+						} catch (NumberFormatException nfe) {

+							value = new InvalidValue(

+									NLS.bind(

+											Messages.AbstractParser_WrongStringConversion,

+											iClass.getName()));

+						}

+					}

+				} else {

+					value = new InvalidValue(NLS.bind(

+							Messages.AbstractParser_UnexpectedValueType,

+							iClass.getName()));

+				}

+			} else if (Integer.TYPE.equals(iClass)) {

+				if (value instanceof Integer) {

+					// ok

+				} else if (value instanceof Number) {

+					value = new Integer(((Number) value).intValue());

+				} else if (value instanceof String) {

+					String s = (String) value;

+					if (s.length() == 0) {

+						value = null;

+					} else {

+						try {

+							value = Integer.valueOf(s);

+						} catch (NumberFormatException nfe) {

+							value = new InvalidValue(

+									NLS.bind(

+											Messages.AbstractParser_WrongStringConversion,

+											iClass.getName()));

+						}

+					}

+				} else {

+					value = new InvalidValue(NLS.bind(

+							Messages.AbstractParser_UnexpectedValueType,

+							iClass.getName()));

+				}

+			} else if (Long.TYPE.equals(iClass)) {

+				if (value instanceof Long) {

+					// ok

+				} else if (value instanceof Number) {

+					value = new Long(((Number) value).longValue());

+				} else if (value instanceof String) {

+					String s = (String) value;

+					if (s.length() == 0) {

+						value = null;

+					} else {

+						try {

+							value = Long.valueOf(s);

+						} catch (NumberFormatException nfe) {

+							value = new InvalidValue(

+									NLS.bind(

+											Messages.AbstractParser_WrongStringConversion,

+											iClass.getName()));

+						}

+					}

+				} else {

+					value = new InvalidValue(NLS.bind(

+							Messages.AbstractParser_UnexpectedValueType,

+							iClass.getName()));

+				}

+			} else if (Float.TYPE.equals(iClass)) {

+				if (value instanceof Float) {

+					// ok

+				} else if (value instanceof Number) {

+					value = new Float(((Number) value).floatValue());

+				} else if (value instanceof String) {

+					String s = (String) value;

+					if (s.length() == 0) {

+						value = null;

+					} else {

+						try {

+							value = Float.valueOf(s);

+						} catch (NumberFormatException nfe) {

+							value = new InvalidValue(

+									NLS.bind(

+											Messages.AbstractParser_WrongStringConversion,

+											iClass.getName()));

+						}

+					}

+				} else {

+					value = new InvalidValue(NLS.bind(

+							Messages.AbstractParser_UnexpectedValueType,

+							iClass.getName()));

+				}

+			} else if (Double.TYPE.equals(iClass)) {

+				if (value instanceof Double) {

+					// ok

+				} else if (value instanceof Number) {

+					value = new Double(((Number) value).doubleValue());

+				} else if (value instanceof String) {

+					String s = (String) value;

+					if (s.length() == 0) {

+						value = null;

+					} else {

+						try {

+							value = Double.valueOf(s);

+						} catch (NumberFormatException nfe) {

+							value = new InvalidValue(

+									NLS.bind(

+											Messages.AbstractParser_WrongStringConversion,

+											iClass.getName()));

+						}

+					}

+				} else {

+					value = new InvalidValue(NLS.bind(

+							Messages.AbstractParser_UnexpectedValueType,

+							iClass.getName()));

+				}

+			} else if (type instanceof EEnum) {

+				if (value instanceof String) {

+					EEnumLiteral literal = ((EEnum) type)

+							.getEEnumLiteralByLiteral((String) value);

+					if (literal == null) {

+						value = new InvalidValue(NLS.bind(

+								Messages.AbstractParser_UnknownLiteral, value));

+					} else {

+						value = literal.getInstance();

+					}

+				} else {

+					value = new InvalidValue(NLS.bind(

+							Messages.AbstractParser_UnexpectedValueType,

+							String.class.getName()));

+				}

+			}

+		}

+		return value;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected class InvalidValue {

+

+		/**

+		 * @generated

+		 */

+		private String description;

+

+		/**

+		 * @generated

+		 */

+		public InvalidValue(String description) {

+			this.description = description;

+		}

+

+		/**

+		 * @generated

+		 */

+		public String toString() {

+			return description;

+		}

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/parsers/MessageFormatParser.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/parsers/MessageFormatParser.java
new file mode 100755
index 0000000..c09d378
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/parsers/MessageFormatParser.java
@@ -0,0 +1,205 @@
+package org.eclipse.soa.mangrove.diagram.parsers;

+

+import java.text.FieldPosition;

+import java.text.MessageFormat;

+import java.text.ParsePosition;

+

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.emf.ecore.EAttribute;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.common.core.command.ICommand;

+import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;

+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;

+import org.eclipse.osgi.util.NLS;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+import org.eclipse.soa.mangrove.diagram.part.Messages;

+

+/**

+ * @generated

+ */

+public class MessageFormatParser extends AbstractParser {

+

+	/**

+	 * @generated

+	 */

+	private String defaultPattern;

+

+	/**

+	 * @generated

+	 */

+	private String defaultEditablePattern;

+

+	/**

+	 * @generated

+	 */

+	private MessageFormat viewProcessor;

+

+	/**

+	 * @generated

+	 */

+	private MessageFormat editorProcessor;

+

+	/**

+	 * @generated

+	 */

+	private MessageFormat editProcessor;

+

+	/**

+	 * @generated

+	 */

+	public MessageFormatParser(EAttribute[] features) {

+		super(features);

+	}

+

+	/**

+	 * @generated

+	 */

+	public MessageFormatParser(EAttribute[] features,

+			EAttribute[] editableFeatures) {

+		super(features, editableFeatures);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected String getDefaultPattern() {

+		if (defaultPattern == null) {

+			StringBuffer sb = new StringBuffer();

+			for (int i = 0; i < features.length; i++) {

+				if (i > 0) {

+					sb.append(' ');

+				}

+				sb.append('{');

+				sb.append(i);

+				sb.append('}');

+			}

+			defaultPattern = sb.toString();

+		}

+		return defaultPattern;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setViewPattern(String viewPattern) {

+		super.setViewPattern(viewPattern);

+		viewProcessor = null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setEditorPattern(String editorPattern) {

+		super.setEditorPattern(editorPattern);

+		editorProcessor = null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected MessageFormat getViewProcessor() {

+		if (viewProcessor == null) {

+			viewProcessor = new MessageFormat(

+					getViewPattern() == null ? getDefaultPattern()

+							: getViewPattern());

+		}

+		return viewProcessor;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected MessageFormat getEditorProcessor() {

+		if (editorProcessor == null) {

+			editorProcessor = new MessageFormat(

+					getEditorPattern() == null ? getDefaultEditablePattern()

+							: getEditorPattern());

+		}

+		return editorProcessor;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected String getDefaultEditablePattern() {

+		if (defaultEditablePattern == null) {

+			StringBuffer sb = new StringBuffer();

+			for (int i = 0; i < editableFeatures.length; i++) {

+				if (i > 0) {

+					sb.append(' ');

+				}

+				sb.append('{');

+				sb.append(i);

+				sb.append('}');

+			}

+			defaultEditablePattern = sb.toString();

+		}

+		return defaultEditablePattern;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setEditPattern(String editPattern) {

+		super.setEditPattern(editPattern);

+		editProcessor = null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected MessageFormat getEditProcessor() {

+		if (editProcessor == null) {

+			editProcessor = new MessageFormat(

+					getEditPattern() == null ? getDefaultEditablePattern()

+							: getEditPattern());

+		}

+		return editProcessor;

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getEditString(IAdaptable adapter, int flags) {

+		EObject element = (EObject) adapter.getAdapter(EObject.class);

+		return getEditorProcessor().format(getEditableValues(element),

+				new StringBuffer(), new FieldPosition(0)).toString();

+	}

+

+	/**

+	 * @generated

+	 */

+	public IParserEditStatus isValidEditString(IAdaptable adapter,

+			String editString) {

+		ParsePosition pos = new ParsePosition(0);

+		Object[] values = getEditProcessor().parse(editString, pos);

+		if (values == null) {

+			return new ParserEditStatus(

+					IntermediateModelDiagramEditorPlugin.ID,

+					IParserEditStatus.UNEDITABLE, NLS.bind(

+							Messages.MessageFormatParser_InvalidInputError,

+							new Integer(pos.getErrorIndex())));

+		}

+		return validateNewValues(values);

+	}

+

+	/**

+	 * @generated

+	 */

+	public ICommand getParseCommand(IAdaptable adapter, String newString,

+			int flags) {

+		Object[] values = getEditProcessor().parse(newString,

+				new ParsePosition(0));

+		return getParseCommand(adapter, values, flags);

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getPrintString(IAdaptable adapter, int flags) {

+		EObject element = (EObject) adapter.getAdapter(EObject.class);

+		return getViewProcessor().format(getValues(element),

+				new StringBuffer(), new FieldPosition(0)).toString();

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/DeleteElementAction.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/DeleteElementAction.java
new file mode 100755
index 0000000..24fd2de
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/DeleteElementAction.java
@@ -0,0 +1,88 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import java.util.Iterator;

+import java.util.List;

+

+import org.eclipse.gef.EditPart;

+import org.eclipse.gef.Request;

+import org.eclipse.gef.commands.Command;

+import org.eclipse.gef.commands.UnexecutableCommand;

+import org.eclipse.gmf.runtime.diagram.ui.actions.AbstractDeleteFromAction;

+import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;

+import org.eclipse.gmf.runtime.diagram.ui.commands.CommandProxy;

+import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;

+import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages;

+import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;

+import org.eclipse.ui.ISharedImages;

+import org.eclipse.ui.IWorkbenchPage;

+import org.eclipse.ui.IWorkbenchPart;

+import org.eclipse.ui.PlatformUI;

+

+/**

+ * @generated

+ */

+public class DeleteElementAction extends AbstractDeleteFromAction {

+

+	/**

+	 * @generated

+	 */

+	public DeleteElementAction(IWorkbenchPart part) {

+		super(part);

+	}

+

+	/**

+	 * @generated

+	 */

+	public DeleteElementAction(IWorkbenchPage workbenchPage) {

+		super(workbenchPage);

+	}

+

+	/**

+	 * @generated

+	 */

+	public void init() {

+		super.init();

+		setId(ActionIds.ACTION_DELETE_FROM_MODEL);

+		setText(DiagramUIMessages.DiagramEditor_Delete_from_Model);

+		setToolTipText(DiagramUIMessages.DiagramEditor_Delete_from_ModelToolTip);

+		ISharedImages workbenchImages = PlatformUI.getWorkbench()

+				.getSharedImages();

+		setHoverImageDescriptor(workbenchImages

+				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));

+		setImageDescriptor(workbenchImages

+				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));

+		setDisabledImageDescriptor(workbenchImages

+				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED));

+	}

+

+	/**

+	 * @generated

+	 */

+	protected String getCommandLabel() {

+		return DiagramUIMessages.DiagramEditor_Delete_from_Model;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected Command getCommand(Request request) {

+		List operationSet = getOperationSet();

+		if (operationSet.isEmpty()) {

+			return UnexecutableCommand.INSTANCE;

+		}

+		Iterator editParts = operationSet.iterator();

+		CompositeTransactionalCommand command = new CompositeTransactionalCommand(

+				getEditingDomain(), getCommandLabel());

+		while (editParts.hasNext()) {

+			EditPart editPart = (EditPart) editParts.next();

+			Command curCommand = editPart.getCommand(request);

+			if (curCommand != null) {

+				command.compose(new CommandProxy(curCommand));

+			}

+		}

+		if (command.isEmpty() || command.size() != operationSet.size()) {

+			return UnexecutableCommand.INSTANCE;

+		}

+		return new ICommandProxy(command);

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/DiagramEditorContextMenuProvider.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/DiagramEditorContextMenuProvider.java
new file mode 100755
index 0000000..e54e285
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/DiagramEditorContextMenuProvider.java
@@ -0,0 +1,75 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.transaction.util.TransactionUtil;

+import org.eclipse.gef.EditPartViewer;

+import org.eclipse.gmf.runtime.common.ui.services.action.contributionitem.ContributionItemService;

+import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;

+import org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider;

+import org.eclipse.jface.action.IMenuManager;

+import org.eclipse.ui.IWorkbenchPart;

+

+/**

+ * @generated

+ */

+public class DiagramEditorContextMenuProvider extends

+		DiagramContextMenuProvider {

+

+	/**

+	 * @generated

+	 */

+	private IWorkbenchPart part;

+

+	/**

+	 * @generated

+	 */

+	private DeleteElementAction deleteAction;

+

+	/**

+	 * @generated

+	 */

+	public DiagramEditorContextMenuProvider(IWorkbenchPart part,

+			EditPartViewer viewer) {

+		super(part, viewer);

+		this.part = part;

+		deleteAction = new DeleteElementAction(part);

+		deleteAction.init();

+	}

+

+	/**

+	 * @generated

+	 */

+	public void dispose() {

+		if (deleteAction != null) {

+			deleteAction.dispose();

+			deleteAction = null;

+		}

+		super.dispose();

+	}

+

+	/**

+	 * @generated

+	 */

+	public void buildContextMenu(final IMenuManager menu) {

+		getViewer().flush();

+		try {

+			TransactionUtil.getEditingDomain(

+					(EObject) getViewer().getContents().getModel())

+					.runExclusive(new Runnable() {

+

+						public void run() {

+							ContributionItemService

+									.getInstance()

+									.contributeToPopupMenu(

+											DiagramEditorContextMenuProvider.this,

+											part);

+							menu.remove(ActionIds.ACTION_DELETE_FROM_MODEL);

+							menu.appendToGroup("editGroup", deleteAction);

+						}

+					});

+		} catch (Exception e) {

+			IntermediateModelDiagramEditorPlugin.getInstance().logError(

+					"Error building context menu", e);

+		}

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelCreationWizard.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelCreationWizard.java
new file mode 100755
index 0000000..e9b4b42
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelCreationWizard.java
@@ -0,0 +1,177 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import java.lang.reflect.InvocationTargetException;

+

+import org.eclipse.core.runtime.CoreException;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.emf.ecore.resource.Resource;

+import org.eclipse.jface.dialogs.ErrorDialog;

+import org.eclipse.jface.operation.IRunnableWithProgress;

+import org.eclipse.jface.viewers.IStructuredSelection;

+import org.eclipse.jface.wizard.Wizard;

+import org.eclipse.ui.INewWizard;

+import org.eclipse.ui.IWorkbench;

+import org.eclipse.ui.PartInitException;

+import org.eclipse.ui.actions.WorkspaceModifyOperation;

+

+/**

+ * @generated

+ */

+public class IntermediateModelCreationWizard extends Wizard implements

+		INewWizard {

+

+	/**

+	 * @generated

+	 */

+	private IWorkbench workbench;

+

+	/**

+	 * @generated

+	 */

+	protected IStructuredSelection selection;

+

+	/**

+	 * @generated

+	 */

+	protected IntermediateModelCreationWizardPage diagramModelFilePage;

+

+	/**

+	 * @generated

+	 */

+	protected IntermediateModelCreationWizardPage domainModelFilePage;

+

+	/**

+	 * @generated

+	 */

+	protected Resource diagram;

+

+	/**

+	 * @generated

+	 */

+	private boolean openNewlyCreatedDiagramEditor = true;

+

+	/**

+	 * @generated

+	 */

+	public IWorkbench getWorkbench() {

+		return workbench;

+	}

+

+	/**

+	 * @generated

+	 */

+	public IStructuredSelection getSelection() {

+		return selection;

+	}

+

+	/**

+	 * @generated

+	 */

+	public final Resource getDiagram() {

+		return diagram;

+	}

+

+	/**

+	 * @generated

+	 */

+	public final boolean isOpenNewlyCreatedDiagramEditor() {

+		return openNewlyCreatedDiagramEditor;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setOpenNewlyCreatedDiagramEditor(

+			boolean openNewlyCreatedDiagramEditor) {

+		this.openNewlyCreatedDiagramEditor = openNewlyCreatedDiagramEditor;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void init(IWorkbench workbench, IStructuredSelection selection) {

+		this.workbench = workbench;

+		this.selection = selection;

+		setWindowTitle(Messages.IntermediateModelCreationWizardTitle);

+		setDefaultPageImageDescriptor(IntermediateModelDiagramEditorPlugin

+				.getBundledImageDescriptor("icons/wizban/NewImWizard.gif")); //$NON-NLS-1$

+		setNeedsProgressMonitor(true);

+	}

+

+	/**

+	 * @generated

+	 */

+	public void addPages() {

+		diagramModelFilePage = new IntermediateModelCreationWizardPage(

+				"DiagramModelFile", getSelection(), "mangrove_diagram"); //$NON-NLS-1$ //$NON-NLS-2$

+		diagramModelFilePage

+				.setTitle(Messages.IntermediateModelCreationWizard_DiagramModelFilePageTitle);

+		diagramModelFilePage

+				.setDescription(Messages.IntermediateModelCreationWizard_DiagramModelFilePageDescription);

+		addPage(diagramModelFilePage);

+

+		domainModelFilePage = new IntermediateModelCreationWizardPage(

+				"DomainModelFile", getSelection(), "mangrove") { //$NON-NLS-1$ //$NON-NLS-2$

+

+			public void setVisible(boolean visible) {

+				if (visible) {

+					String fileName = diagramModelFilePage.getFileName();

+					fileName = fileName.substring(0, fileName.length()

+							- ".mangrove_diagram".length()); //$NON-NLS-1$

+					setFileName(IntermediateModelDiagramEditorUtil

+							.getUniqueFileName(getContainerFullPath(),

+									fileName, "mangrove")); //$NON-NLS-1$

+				}

+				super.setVisible(visible);

+			}

+		};

+		domainModelFilePage

+				.setTitle(Messages.IntermediateModelCreationWizard_DomainModelFilePageTitle);

+		domainModelFilePage

+				.setDescription(Messages.IntermediateModelCreationWizard_DomainModelFilePageDescription);

+		addPage(domainModelFilePage);

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean performFinish() {

+		IRunnableWithProgress op = new WorkspaceModifyOperation(null) {

+

+			protected void execute(IProgressMonitor monitor)

+					throws CoreException, InterruptedException {

+				diagram = IntermediateModelDiagramEditorUtil.createDiagram(

+						diagramModelFilePage.getURI(),

+						domainModelFilePage.getURI(), monitor);

+				if (isOpenNewlyCreatedDiagramEditor() && diagram != null) {

+					try {

+						IntermediateModelDiagramEditorUtil.openDiagram(diagram);

+					} catch (PartInitException e) {

+						ErrorDialog

+								.openError(

+										getContainer().getShell(),

+										Messages.IntermediateModelCreationWizardOpenEditorError,

+										null, e.getStatus());

+					}

+				}

+			}

+		};

+		try {

+			getContainer().run(false, true, op);

+		} catch (InterruptedException e) {

+			return false;

+		} catch (InvocationTargetException e) {

+			if (e.getTargetException() instanceof CoreException) {

+				ErrorDialog.openError(getContainer().getShell(),

+						Messages.IntermediateModelCreationWizardCreationError,

+						null,

+						((CoreException) e.getTargetException()).getStatus());

+			} else {

+				IntermediateModelDiagramEditorPlugin.getInstance().logError(

+						"Error creating diagram", e.getTargetException()); //$NON-NLS-1$

+			}

+			return false;

+		}

+		return diagram != null;

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelCreationWizardPage.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelCreationWizardPage.java
new file mode 100755
index 0000000..5a20684
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelCreationWizardPage.java
@@ -0,0 +1,89 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import org.eclipse.core.runtime.IPath;

+import org.eclipse.core.runtime.Path;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.jface.viewers.IStructuredSelection;

+import org.eclipse.osgi.util.NLS;

+import org.eclipse.swt.widgets.Composite;

+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;

+

+/**

+ * @generated

+ */

+public class IntermediateModelCreationWizardPage extends

+		WizardNewFileCreationPage {

+

+	/**

+	 * @generated

+	 */

+	private final String fileExtension;

+

+	/**

+	 * @generated

+	 */

+	public IntermediateModelCreationWizardPage(String pageName,

+			IStructuredSelection selection, String fileExtension) {

+		super(pageName, selection);

+		this.fileExtension = fileExtension;

+	}

+

+	/**

+	 * Override to create files with this extension.

+	 * 

+	 * @generated

+	 */

+	protected String getExtension() {

+		return fileExtension;

+	}

+

+	/**

+	 * @generated

+	 */

+	public URI getURI() {

+		return URI.createPlatformResourceURI(getFilePath().toString(), false);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IPath getFilePath() {

+		IPath path = getContainerFullPath();

+		if (path == null) {

+			path = new Path(""); //$NON-NLS-1$

+		}

+		String fileName = getFileName();

+		if (fileName != null) {

+			path = path.append(fileName);

+		}

+		return path;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void createControl(Composite parent) {

+		super.createControl(parent);

+		setFileName(IntermediateModelDiagramEditorUtil.getUniqueFileName(

+				getContainerFullPath(), getFileName(), getExtension()));

+		setPageComplete(validatePage());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean validatePage() {

+		if (!super.validatePage()) {

+			return false;

+		}

+		String extension = getExtension();

+		if (extension != null

+				&& !getFilePath().toString().endsWith("." + extension)) {

+			setErrorMessage(NLS.bind(

+					Messages.IntermediateModelCreationWizardPageExtensionError,

+					extension));

+			return false;

+		}

+		return true;

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramActionBarContributor.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramActionBarContributor.java
new file mode 100755
index 0000000..1ed909d
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramActionBarContributor.java
@@ -0,0 +1,40 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramActionBarContributor;

+import org.eclipse.jface.action.IMenuManager;

+import org.eclipse.ui.IActionBars;

+import org.eclipse.ui.IWorkbenchActionConstants;

+import org.eclipse.ui.IWorkbenchPage;

+

+/**

+ * @generated

+ */

+public class IntermediateModelDiagramActionBarContributor extends

+		DiagramActionBarContributor {

+

+	/**

+	 * @generated

+	 */

+	protected Class getEditorClass() {

+		return IntermediateModelDiagramEditor.class;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected String getEditorId() {

+		return IntermediateModelDiagramEditor.ID;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void init(IActionBars bars, IWorkbenchPage page) {

+		super.init(bars, page);

+		// print preview

+		IMenuManager fileMenu = bars.getMenuManager().findMenuUsingPath(

+				IWorkbenchActionConstants.M_FILE);

+		assert fileMenu != null;

+		fileMenu.remove("pageSetupAction"); //$NON-NLS-1$

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramEditor.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramEditor.java
new file mode 100755
index 0000000..4906a83
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramEditor.java
@@ -0,0 +1,296 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import org.eclipse.core.resources.IFile;

+import org.eclipse.core.resources.IMarker;

+import org.eclipse.core.resources.IWorkspaceRoot;

+import org.eclipse.core.resources.ResourcesPlugin;

+import org.eclipse.core.runtime.CoreException;

+import org.eclipse.core.runtime.IPath;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.core.runtime.IStatus;

+import org.eclipse.core.runtime.NullProgressMonitor;

+import org.eclipse.emf.common.ui.URIEditorInput;

+import org.eclipse.emf.transaction.TransactionalEditingDomain;

+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;

+import org.eclipse.gef.palette.PaletteRoot;

+import org.eclipse.gmf.runtime.common.ui.services.marker.MarkerNavigationService;

+import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;

+import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;

+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;

+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;

+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider;

+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor;

+import org.eclipse.gmf.runtime.notation.Diagram;

+import org.eclipse.jface.dialogs.ErrorDialog;

+import org.eclipse.jface.dialogs.IMessageProvider;

+import org.eclipse.jface.dialogs.MessageDialog;

+import org.eclipse.jface.viewers.ISelection;

+import org.eclipse.jface.viewers.StructuredSelection;

+import org.eclipse.jface.window.Window;

+import org.eclipse.osgi.util.NLS;

+import org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorItem;

+import org.eclipse.swt.widgets.Shell;

+import org.eclipse.ui.IEditorInput;

+import org.eclipse.ui.IEditorMatchingStrategy;

+import org.eclipse.ui.IEditorReference;

+import org.eclipse.ui.IFileEditorInput;

+import org.eclipse.ui.PlatformUI;

+import org.eclipse.ui.dialogs.SaveAsDialog;

+import org.eclipse.ui.ide.IGotoMarker;

+import org.eclipse.ui.navigator.resources.ProjectExplorer;

+import org.eclipse.ui.part.FileEditorInput;

+import org.eclipse.ui.part.IShowInTargetList;

+import org.eclipse.ui.part.ShowInContext;

+

+/**

+ * @generated

+ */

+public class IntermediateModelDiagramEditor extends DiagramDocumentEditor

+		implements IGotoMarker {

+

+	/**

+	 * @generated

+	 */

+	public static final String ID = "org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorID"; //$NON-NLS-1$

+

+	/**

+	 * @generated

+	 */

+	public static final String CONTEXT_ID = "org.eclipse.soa.mangrove.diagram.ui.diagramContext"; //$NON-NLS-1$

+

+	/**

+	 * @generated

+	 */

+	public IntermediateModelDiagramEditor() {

+		super(true);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected String getContextID() {

+		return CONTEXT_ID;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected PaletteRoot createPaletteRoot(PaletteRoot existingPaletteRoot) {

+		PaletteRoot root = super.createPaletteRoot(existingPaletteRoot);

+		new IntermediateModelPaletteFactory().fillPalette(root);

+		return root;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected PreferencesHint getPreferencesHint() {

+		return IntermediateModelDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;

+	}

+

+	/**

+	 * @generated

+	 */

+	public String getContributorId() {

+		return IntermediateModelDiagramEditorPlugin.ID;

+	}

+

+	/**

+	 * @generated

+	 */

+	@SuppressWarnings("rawtypes")

+	public Object getAdapter(Class type) {

+		if (type == IShowInTargetList.class) {

+			return new IShowInTargetList() {

+				public String[] getShowInTargetIds() {

+					return new String[] { ProjectExplorer.VIEW_ID };

+				}

+			};

+		}

+		return super.getAdapter(type);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IDocumentProvider getDocumentProvider(IEditorInput input) {

+		if (input instanceof IFileEditorInput

+				|| input instanceof URIEditorInput) {

+			return IntermediateModelDiagramEditorPlugin.getInstance()

+					.getDocumentProvider();

+		}

+		return super.getDocumentProvider(input);

+	}

+

+	/**

+	 * @generated

+	 */

+	public TransactionalEditingDomain getEditingDomain() {

+		IDocument document = getEditorInput() != null ? getDocumentProvider()

+				.getDocument(getEditorInput()) : null;

+		if (document instanceof IDiagramDocument) {

+			return ((IDiagramDocument) document).getEditingDomain();

+		}

+		return super.getEditingDomain();

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setDocumentProvider(IEditorInput input) {

+		if (input instanceof IFileEditorInput

+				|| input instanceof URIEditorInput) {

+			setDocumentProvider(IntermediateModelDiagramEditorPlugin

+					.getInstance().getDocumentProvider());

+		} else {

+			super.setDocumentProvider(input);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public void gotoMarker(IMarker marker) {

+		MarkerNavigationService.getInstance().gotoMarker(this, marker);

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean isSaveAsAllowed() {

+		return true;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void doSaveAs() {

+		performSaveAs(new NullProgressMonitor());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void performSaveAs(IProgressMonitor progressMonitor) {

+		Shell shell = getSite().getShell();

+		IEditorInput input = getEditorInput();

+		SaveAsDialog dialog = new SaveAsDialog(shell);

+		IFile original = input instanceof IFileEditorInput ? ((IFileEditorInput) input)

+				.getFile() : null;

+		if (original != null) {

+			dialog.setOriginalFile(original);

+		}

+		dialog.create();

+		IDocumentProvider provider = getDocumentProvider();

+		if (provider == null) {

+			// editor has been programmatically closed while the dialog was open

+			return;

+		}

+		if (provider.isDeleted(input) && original != null) {

+			String message = NLS.bind(

+					Messages.IntermediateModelDiagramEditor_SavingDeletedFile,

+					original.getName());

+			dialog.setErrorMessage(null);

+			dialog.setMessage(message, IMessageProvider.WARNING);

+		}

+		if (dialog.open() == Window.CANCEL) {

+			if (progressMonitor != null) {

+				progressMonitor.setCanceled(true);

+			}

+			return;

+		}

+		IPath filePath = dialog.getResult();

+		if (filePath == null) {

+			if (progressMonitor != null) {

+				progressMonitor.setCanceled(true);

+			}

+			return;

+		}

+		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();

+		IFile file = workspaceRoot.getFile(filePath);

+		final IEditorInput newInput = new FileEditorInput(file);

+		// Check if the editor is already open

+		IEditorMatchingStrategy matchingStrategy = getEditorDescriptor()

+				.getEditorMatchingStrategy();

+		IEditorReference[] editorRefs = PlatformUI.getWorkbench()

+				.getActiveWorkbenchWindow().getActivePage()

+				.getEditorReferences();

+		for (int i = 0; i < editorRefs.length; i++) {

+			if (matchingStrategy.matches(editorRefs[i], newInput)) {

+				MessageDialog

+						.openWarning(

+								shell,

+								Messages.IntermediateModelDiagramEditor_SaveAsErrorTitle,

+								Messages.IntermediateModelDiagramEditor_SaveAsErrorMessage);

+				return;

+			}

+		}

+		boolean success = false;

+		try {

+			provider.aboutToChange(newInput);

+			getDocumentProvider(newInput).saveDocument(progressMonitor,

+					newInput,

+					getDocumentProvider().getDocument(getEditorInput()), true);

+			success = true;

+		} catch (CoreException x) {

+			IStatus status = x.getStatus();

+			if (status == null || status.getSeverity() != IStatus.CANCEL) {

+				ErrorDialog

+						.openError(

+								shell,

+								Messages.IntermediateModelDiagramEditor_SaveErrorTitle,

+								Messages.IntermediateModelDiagramEditor_SaveErrorMessage,

+								x.getStatus());

+			}

+		} finally {

+			provider.changed(newInput);

+			if (success) {

+				setInput(newInput);

+			}

+		}

+		if (progressMonitor != null) {

+			progressMonitor.setCanceled(!success);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public ShowInContext getShowInContext() {

+		return new ShowInContext(getEditorInput(), getNavigatorSelection());

+	}

+

+	/**

+	 * @generated

+	 */

+	private ISelection getNavigatorSelection() {

+		IDiagramDocument document = getDiagramDocument();

+		if (document == null) {

+			return StructuredSelection.EMPTY;

+		}

+		Diagram diagram = document.getDiagram();

+		if (diagram == null || diagram.eResource() == null) {

+			return StructuredSelection.EMPTY;

+		}

+		IFile file = WorkspaceSynchronizer.getFile(diagram.eResource());

+		if (file != null) {

+			IntermediateModelNavigatorItem item = new IntermediateModelNavigatorItem(

+					diagram, file, false);

+			return new StructuredSelection(item);

+		}

+		return StructuredSelection.EMPTY;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void configureGraphicalViewer() {

+		super.configureGraphicalViewer();

+		DiagramEditorContextMenuProvider provider = new DiagramEditorContextMenuProvider(

+				this, getDiagramGraphicalViewer());

+		getDiagramGraphicalViewer().setContextMenu(provider);

+		getSite().registerContextMenu(ActionIds.DIAGRAM_EDITOR_CONTEXT_MENU,

+				provider, getDiagramGraphicalViewer());

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramEditorPlugin.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramEditorPlugin.java
new file mode 100755
index 0000000..aabda43
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramEditorPlugin.java
@@ -0,0 +1,293 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import java.util.ArrayList;

+import java.util.List;

+

+import org.eclipse.core.runtime.IPath;

+import org.eclipse.core.runtime.IStatus;

+import org.eclipse.core.runtime.Path;

+import org.eclipse.core.runtime.Platform;

+import org.eclipse.core.runtime.Status;

+import org.eclipse.emf.common.notify.AdapterFactory;

+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;

+import org.eclipse.emf.edit.provider.IItemLabelProvider;

+import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;

+import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;

+import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;

+import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;

+import org.eclipse.jface.resource.ImageDescriptor;

+import org.eclipse.soa.mangrove.diagram.edit.policies.IntermediateModelBaseItemSemanticEditPolicy;

+import org.eclipse.soa.mangrove.diagram.providers.ElementInitializers;

+import org.eclipse.soa.mangrove.provider.ImItemProviderAdapterFactory;

+import org.eclipse.swt.graphics.Image;

+import org.eclipse.ui.plugin.AbstractUIPlugin;

+import org.osgi.framework.BundleContext;

+

+/**

+ * @generated

+ */

+public class IntermediateModelDiagramEditorPlugin extends AbstractUIPlugin {

+

+	/**

+	 * @generated

+	 */

+	public static final String ID = "org.eclipse.soa.mangrove.diagram"; //$NON-NLS-1$

+

+	/**

+	 * @generated

+	 */

+	public static final PreferencesHint DIAGRAM_PREFERENCES_HINT = new PreferencesHint(

+			ID);

+

+	/**

+	 * @generated

+	 */

+	private static IntermediateModelDiagramEditorPlugin instance;

+

+	/**

+	 * @generated

+	 */

+	private ComposedAdapterFactory adapterFactory;

+

+	/**

+	 * @generated

+	 */

+	private IntermediateModelDocumentProvider documentProvider;

+

+	/**

+	 * @generated

+	 */

+	private IntermediateModelBaseItemSemanticEditPolicy.LinkConstraints linkConstraints;

+

+	/**

+	 * @generated

+	 */

+	private ElementInitializers initializers;

+

+	/**

+	 * @generated

+	 */

+	public IntermediateModelDiagramEditorPlugin() {

+	}

+

+	/**

+	 * @generated

+	 */

+	public void start(BundleContext context) throws Exception {

+		super.start(context);

+		instance = this;

+		PreferencesHint.registerPreferenceStore(DIAGRAM_PREFERENCES_HINT,

+				getPreferenceStore());

+		adapterFactory = createAdapterFactory();

+	}

+

+	/**

+	 * @generated

+	 */

+	public void stop(BundleContext context) throws Exception {

+		adapterFactory.dispose();

+		adapterFactory = null;

+		linkConstraints = null;

+		initializers = null;

+		instance = null;

+		super.stop(context);

+	}

+

+	/**

+	 * @generated

+	 */

+	public static IntermediateModelDiagramEditorPlugin getInstance() {

+		return instance;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected ComposedAdapterFactory createAdapterFactory() {

+		ArrayList<AdapterFactory> factories = new ArrayList<AdapterFactory>();

+		fillItemProviderFactories(factories);

+		return new ComposedAdapterFactory(factories);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void fillItemProviderFactories(List<AdapterFactory> factories) {

+		factories.add(new ImItemProviderAdapterFactory());

+		factories.add(new ResourceItemProviderAdapterFactory());

+		factories.add(new ReflectiveItemProviderAdapterFactory());

+	}

+

+	/**

+	 * @generated

+	 */

+	public AdapterFactory getItemProvidersAdapterFactory() {

+		return adapterFactory;

+	}

+

+	/**

+	 * @generated

+	 */

+	public ImageDescriptor getItemImageDescriptor(Object item) {

+		IItemLabelProvider labelProvider = (IItemLabelProvider) adapterFactory

+				.adapt(item, IItemLabelProvider.class);

+		if (labelProvider != null) {

+			return ExtendedImageRegistry.getInstance().getImageDescriptor(

+					labelProvider.getImage(item));

+		}

+		return null;

+	}

+

+	/**

+	 * Returns an image descriptor for the image file at the given

+	 * plug-in relative path.

+	 *

+	 * @generated

+	 * @param path the path

+	 * @return the image descriptor

+	 */

+	public static ImageDescriptor getBundledImageDescriptor(String path) {

+		return AbstractUIPlugin.imageDescriptorFromPlugin(ID, path);

+	}

+

+	/**

+	 * Respects images residing in any plug-in. If path is relative,

+	 * then this bundle is looked up for the image, otherwise, for absolute 

+	 * path, first segment is taken as id of plug-in with image

+	 *

+	 * @generated

+	 * @param path the path to image, either absolute (with plug-in id as first segment), or relative for bundled images

+	 * @return the image descriptor

+	 */

+	public static ImageDescriptor findImageDescriptor(String path) {

+		final IPath p = new Path(path);

+		if (p.isAbsolute() && p.segmentCount() > 1) {

+			return AbstractUIPlugin.imageDescriptorFromPlugin(p.segment(0), p

+					.removeFirstSegments(1).makeAbsolute().toString());

+		} else {

+			return getBundledImageDescriptor(p.makeAbsolute().toString());

+		}

+	}

+

+	/**

+	 * Returns an image for the image file at the given plug-in relative path.

+	 * Client do not need to dispose this image. Images will be disposed automatically.

+	 *

+	 * @generated

+	 * @param path the path

+	 * @return image instance

+	 */

+	public Image getBundledImage(String path) {

+		Image image = getImageRegistry().get(path);

+		if (image == null) {

+			getImageRegistry().put(path, getBundledImageDescriptor(path));

+			image = getImageRegistry().get(path);

+		}

+		return image;

+	}

+

+	/**

+	 * Returns string from plug-in's resource bundle

+	 *

+	 * @generated

+	 */

+	public static String getString(String key) {

+		return Platform.getResourceString(getInstance().getBundle(), "%" + key); //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	public IntermediateModelDocumentProvider getDocumentProvider() {

+		if (documentProvider == null) {

+			documentProvider = new IntermediateModelDocumentProvider();

+		}

+		return documentProvider;

+	}

+

+	/**

+	 * @generated

+	 */

+	public IntermediateModelBaseItemSemanticEditPolicy.LinkConstraints getLinkConstraints() {

+		return linkConstraints;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setLinkConstraints(

+			IntermediateModelBaseItemSemanticEditPolicy.LinkConstraints lc) {

+		this.linkConstraints = lc;

+	}

+

+	/**

+	 * @generated

+	 */

+	public ElementInitializers getElementInitializers() {

+		return initializers;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setElementInitializers(ElementInitializers i) {

+		this.initializers = i;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void logError(String error) {

+		logError(error, null);

+	}

+

+	/**

+	 * @generated

+	 */

+	public void logError(String error, Throwable throwable) {

+		if (error == null && throwable != null) {

+			error = throwable.getMessage();

+		}

+		getLog().log(

+				new Status(IStatus.ERROR,

+						IntermediateModelDiagramEditorPlugin.ID, IStatus.OK,

+						error, throwable));

+		debug(error, throwable);

+	}

+

+	/**

+	 * @generated

+	 */

+	public void logInfo(String message) {

+		logInfo(message, null);

+	}

+

+	/**

+	 * @generated

+	 */

+	public void logInfo(String message, Throwable throwable) {

+		if (message == null && throwable != null) {

+			message = throwable.getMessage();

+		}

+		getLog().log(

+				new Status(IStatus.INFO,

+						IntermediateModelDiagramEditorPlugin.ID, IStatus.OK,

+						message, throwable));

+		debug(message, throwable);

+	}

+

+	/**

+	 * @generated

+	 */

+	private void debug(String message, Throwable throwable) {

+		if (!isDebugging()) {

+			return;

+		}

+		if (message != null) {

+			System.err.println(message);

+		}

+		if (throwable != null) {

+			throwable.printStackTrace();

+		}

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramEditorUtil.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramEditorUtil.java
new file mode 100755
index 0000000..3a5f400
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramEditorUtil.java
@@ -0,0 +1,423 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import java.io.IOException;

+import java.util.Collections;

+import java.util.HashMap;

+import java.util.Iterator;

+import java.util.LinkedList;

+import java.util.List;

+import java.util.Map;

+import java.util.Set;

+

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.commands.operations.OperationHistoryFactory;

+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.IAdaptable;

+import org.eclipse.core.runtime.IPath;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.core.runtime.NullProgressMonitor;

+import org.eclipse.core.runtime.Path;

+import org.eclipse.core.runtime.SubProgressMonitor;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.resource.Resource;

+import org.eclipse.emf.ecore.xmi.XMLResource;

+import org.eclipse.emf.transaction.TransactionalEditingDomain;

+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;

+import org.eclipse.gef.EditPart;

+import org.eclipse.gmf.runtime.common.core.command.CommandResult;

+import org.eclipse.gmf.runtime.diagram.core.services.ViewService;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IPrimaryEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;

+import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart;

+import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;

+import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;

+import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;

+import org.eclipse.gmf.runtime.notation.Diagram;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.jface.dialogs.IDialogSettings;

+import org.eclipse.jface.wizard.Wizard;

+import org.eclipse.jface.wizard.WizardDialog;

+import org.eclipse.soa.mangrove.ImFactory;

+import org.eclipse.soa.mangrove.StpIntermediateModel;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart;

+import org.eclipse.swt.widgets.Shell;

+import org.eclipse.ui.IWorkbenchPage;

+import org.eclipse.ui.PartInitException;

+import org.eclipse.ui.PlatformUI;

+import org.eclipse.ui.part.FileEditorInput;

+

+/**

+ * @generated

+ */

+public class IntermediateModelDiagramEditorUtil {

+

+	/**

+	 * @generated

+	 */

+	public static Map<?, ?> getSaveOptions() {

+		HashMap<String, Object> saveOptions = new HashMap<String, Object>();

+		saveOptions.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$

+		saveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED,

+				Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);

+		return saveOptions;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static boolean openDiagram(Resource diagram)

+			throws PartInitException {

+		String path = diagram.getURI().toPlatformString(true);

+		IResource workspaceResource = ResourcesPlugin.getWorkspace().getRoot()

+				.findMember(new Path(path));

+		if (workspaceResource instanceof IFile) {

+			IWorkbenchPage page = PlatformUI.getWorkbench()

+					.getActiveWorkbenchWindow().getActivePage();

+			return null != page.openEditor(new FileEditorInput(

+					(IFile) workspaceResource),

+					IntermediateModelDiagramEditor.ID);

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static void setCharset(IFile file) {

+		if (file == null) {

+			return;

+		}

+		try {

+			file.setCharset("UTF-8", new NullProgressMonitor()); //$NON-NLS-1$

+		} catch (CoreException e) {

+			IntermediateModelDiagramEditorPlugin.getInstance().logError(

+					"Unable to set charset for file " + file.getFullPath(), e); //$NON-NLS-1$

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public static String getUniqueFileName(IPath containerFullPath,

+			String fileName, String extension) {

+		if (containerFullPath == null) {

+			containerFullPath = new Path(""); //$NON-NLS-1$

+		}

+		if (fileName == null || fileName.trim().length() == 0) {

+			fileName = "default"; //$NON-NLS-1$

+		}

+		IPath filePath = containerFullPath.append(fileName);

+		if (extension != null && !extension.equals(filePath.getFileExtension())) {

+			filePath = filePath.addFileExtension(extension);

+		}

+		extension = filePath.getFileExtension();

+		fileName = filePath.removeFileExtension().lastSegment();

+		int i = 1;

+		while (ResourcesPlugin.getWorkspace().getRoot().exists(filePath)) {

+			i++;

+			filePath = containerFullPath.append(fileName + i);

+			if (extension != null) {

+				filePath = filePath.addFileExtension(extension);

+			}

+		}

+		return filePath.lastSegment();

+	}

+

+	/**

+	 * Runs the wizard in a dialog.

+	 * 

+	 * @generated

+	 */

+	public static void runWizard(Shell shell, Wizard wizard, String settingsKey) {

+		IDialogSettings pluginDialogSettings = IntermediateModelDiagramEditorPlugin

+				.getInstance().getDialogSettings();

+		IDialogSettings wizardDialogSettings = pluginDialogSettings

+				.getSection(settingsKey);

+		if (wizardDialogSettings == null) {

+			wizardDialogSettings = pluginDialogSettings

+					.addNewSection(settingsKey);

+		}

+		wizard.setDialogSettings(wizardDialogSettings);

+		WizardDialog dialog = new WizardDialog(shell, wizard);

+		dialog.create();

+		dialog.getShell().setSize(Math.max(500, dialog.getShell().getSize().x),

+				500);

+		dialog.open();

+	}

+

+	/**

+	 * This method should be called within a workspace modify operation since it creates resources.

+	 * @generated

+	 */

+	public static Resource createDiagram(URI diagramURI, URI modelURI,

+			IProgressMonitor progressMonitor) {

+		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE

+				.createEditingDomain();

+		progressMonitor

+				.beginTask(

+						Messages.IntermediateModelDiagramEditorUtil_CreateDiagramProgressTask,

+						3);

+		final Resource diagramResource = editingDomain.getResourceSet()

+				.createResource(diagramURI);

+		final Resource modelResource = editingDomain.getResourceSet()

+				.createResource(modelURI);

+		final String diagramName = diagramURI.lastSegment();

+		AbstractTransactionalCommand command = new AbstractTransactionalCommand(

+				editingDomain,

+				Messages.IntermediateModelDiagramEditorUtil_CreateDiagramCommandLabel,

+				Collections.EMPTY_LIST) {

+			protected CommandResult doExecuteWithResult(

+					IProgressMonitor monitor, IAdaptable info)

+					throws ExecutionException {

+				StpIntermediateModel model = createInitialModel();

+				attachModelToResource(model, modelResource);

+

+				Diagram diagram = ViewService

+						.createDiagram(

+								model,

+								StpIntermediateModelEditPart.MODEL_ID,

+								IntermediateModelDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);

+				if (diagram != null) {

+					diagramResource.getContents().add(diagram);

+					diagram.setName(diagramName);

+					diagram.setElement(model);

+				}

+

+				try {

+					modelResource

+							.save(org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorUtil

+									.getSaveOptions());

+					diagramResource

+							.save(org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorUtil

+									.getSaveOptions());

+				} catch (IOException e) {

+

+					IntermediateModelDiagramEditorPlugin

+							.getInstance()

+							.logError(

+									"Unable to store model and diagram resources", e); //$NON-NLS-1$

+				}

+				return CommandResult.newOKCommandResult();

+			}

+		};

+		try {

+			OperationHistoryFactory.getOperationHistory().execute(command,

+					new SubProgressMonitor(progressMonitor, 1), null);

+		} catch (ExecutionException e) {

+			IntermediateModelDiagramEditorPlugin.getInstance().logError(

+					"Unable to create model and diagram", e); //$NON-NLS-1$

+		}

+		setCharset(WorkspaceSynchronizer.getFile(modelResource));

+		setCharset(WorkspaceSynchronizer.getFile(diagramResource));

+		return diagramResource;

+	}

+

+	/**

+	 * Create a new instance of domain element associated with canvas.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	private static StpIntermediateModel createInitialModel() {

+		return ImFactory.eINSTANCE.createStpIntermediateModel();

+	}

+

+	/**

+	 * Store model element in the resource.

+	 * <!-- begin-user-doc -->

+	 * <!-- end-user-doc -->

+	 * @generated

+	 */

+	private static void attachModelToResource(StpIntermediateModel model,

+			Resource resource) {

+		resource.getContents().add(model);

+	}

+

+	/**

+	 * @generated

+	 */

+	public static void selectElementsInDiagram(

+			IDiagramWorkbenchPart diagramPart, List<EditPart> editParts) {

+		diagramPart.getDiagramGraphicalViewer().deselectAll();

+

+		EditPart firstPrimary = null;

+		for (EditPart nextPart : editParts) {

+			diagramPart.getDiagramGraphicalViewer().appendSelection(nextPart);

+			if (firstPrimary == null && nextPart instanceof IPrimaryEditPart) {

+				firstPrimary = nextPart;

+			}

+		}

+

+		if (!editParts.isEmpty()) {

+			diagramPart.getDiagramGraphicalViewer().reveal(

+					firstPrimary != null ? firstPrimary : (EditPart) editParts

+							.get(0));

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private static int findElementsInDiagramByID(DiagramEditPart diagramPart,

+			EObject element, List<EditPart> editPartCollector) {

+		IDiagramGraphicalViewer viewer = (IDiagramGraphicalViewer) diagramPart

+				.getViewer();

+		final int intialNumOfEditParts = editPartCollector.size();

+

+		if (element instanceof View) { // support notation element lookup

+			EditPart editPart = (EditPart) viewer.getEditPartRegistry().get(

+					element);

+			if (editPart != null) {

+				editPartCollector.add(editPart);

+				return 1;

+			}

+		}

+

+		String elementID = EMFCoreUtil.getProxyID(element);

+		@SuppressWarnings("unchecked")

+		List<EditPart> associatedParts = viewer.findEditPartsForElement(

+				elementID, IGraphicalEditPart.class);

+		// perform the possible hierarchy disjoint -> take the top-most parts only

+		for (EditPart nextPart : associatedParts) {

+			EditPart parentPart = nextPart.getParent();

+			while (parentPart != null && !associatedParts.contains(parentPart)) {

+				parentPart = parentPart.getParent();

+			}

+			if (parentPart == null) {

+				editPartCollector.add(nextPart);

+			}

+		}

+

+		if (intialNumOfEditParts == editPartCollector.size()) {

+			if (!associatedParts.isEmpty()) {

+				editPartCollector.add(associatedParts.get(0));

+			} else {

+				if (element.eContainer() != null) {

+					return findElementsInDiagramByID(diagramPart,

+							element.eContainer(), editPartCollector);

+				}

+			}

+		}

+		return editPartCollector.size() - intialNumOfEditParts;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static View findView(DiagramEditPart diagramEditPart,

+			EObject targetElement, LazyElement2ViewMap lazyElement2ViewMap) {

+		boolean hasStructuralURI = false;

+		if (targetElement.eResource() instanceof XMLResource) {

+			hasStructuralURI = ((XMLResource) targetElement.eResource())

+					.getID(targetElement) == null;

+		}

+

+		View view = null;

+		LinkedList<EditPart> editPartHolder = new LinkedList<EditPart>();

+		if (hasStructuralURI

+				&& !lazyElement2ViewMap.getElement2ViewMap().isEmpty()) {

+			view = lazyElement2ViewMap.getElement2ViewMap().get(targetElement);

+		} else if (findElementsInDiagramByID(diagramEditPart, targetElement,

+				editPartHolder) > 0) {

+			EditPart editPart = editPartHolder.get(0);

+			view = editPart.getModel() instanceof View ? (View) editPart

+					.getModel() : null;

+		}

+

+		return (view == null) ? diagramEditPart.getDiagramView() : view;

+	}

+

+	/**

+	 * XXX This is quite suspicious code (especially editPartTmpHolder) and likely to be removed soon

+	 * @generated

+	 */

+	public static class LazyElement2ViewMap {

+		/**

+		 * @generated

+		 */

+		private Map<EObject, View> element2ViewMap;

+

+		/**

+		 * @generated

+		 */

+		private View scope;

+

+		/**

+		 * @generated

+		 */

+		private Set<? extends EObject> elementSet;

+

+		/**

+		 * @generated

+		 */

+		public LazyElement2ViewMap(View scope, Set<? extends EObject> elements) {

+			this.scope = scope;

+			this.elementSet = elements;

+		}

+

+		/**

+		 * @generated

+		 */

+		public final Map<EObject, View> getElement2ViewMap() {

+			if (element2ViewMap == null) {

+				element2ViewMap = new HashMap<EObject, View>();

+				// map possible notation elements to itself as these can't be found by view.getElement()

+				for (EObject element : elementSet) {

+					if (element instanceof View) {

+						View view = (View) element;

+						if (view.getDiagram() == scope.getDiagram()) {

+							element2ViewMap.put(element, view); // take only those that part of our diagram

+						}

+					}

+				}

+

+				buildElement2ViewMap(scope, element2ViewMap, elementSet);

+			}

+			return element2ViewMap;

+		}

+

+		/**

+		 * @generated

+		 */

+		private static boolean buildElement2ViewMap(View parentView,

+				Map<EObject, View> element2ViewMap,

+				Set<? extends EObject> elements) {

+			if (elements.size() == element2ViewMap.size()) {

+				return true;

+			}

+

+			if (parentView.isSetElement()

+					&& !element2ViewMap.containsKey(parentView.getElement())

+					&& elements.contains(parentView.getElement())) {

+				element2ViewMap.put(parentView.getElement(), parentView);

+				if (elements.size() == element2ViewMap.size()) {

+					return true;

+				}

+			}

+			boolean complete = false;

+			for (Iterator<?> it = parentView.getChildren().iterator(); it

+					.hasNext() && !complete;) {

+				complete = buildElement2ViewMap((View) it.next(),

+						element2ViewMap, elements);

+			}

+			for (Iterator<?> it = parentView.getSourceEdges().iterator(); it

+					.hasNext() && !complete;) {

+				complete = buildElement2ViewMap((View) it.next(),

+						element2ViewMap, elements);

+			}

+			for (Iterator<?> it = parentView.getTargetEdges().iterator(); it

+					.hasNext() && !complete;) {

+				complete = buildElement2ViewMap((View) it.next(),

+						element2ViewMap, elements);

+			}

+			return complete;

+		}

+	} //LazyElement2ViewMap	

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramUpdateCommand.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramUpdateCommand.java
new file mode 100755
index 0000000..7f69c52
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramUpdateCommand.java
@@ -0,0 +1,85 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import java.util.Iterator;

+import java.util.List;

+

+import org.eclipse.core.commands.ExecutionEvent;

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.commands.IHandler;

+import org.eclipse.core.commands.IHandlerListener;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gef.EditPart;

+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.jface.viewers.ISelection;

+import org.eclipse.jface.viewers.IStructuredSelection;

+import org.eclipse.ui.PlatformUI;

+

+/**

+ * @generated

+ */

+public class IntermediateModelDiagramUpdateCommand implements IHandler {

+

+	/**

+	 * @generated

+	 */

+	public void addHandlerListener(IHandlerListener handlerListener) {

+	}

+

+	/**

+	 * @generated

+	 */

+	public void dispose() {

+	}

+

+	/**

+	 * @generated

+	 */

+	public Object execute(ExecutionEvent event) throws ExecutionException {

+		ISelection selection = PlatformUI.getWorkbench()

+				.getActiveWorkbenchWindow().getSelectionService()

+				.getSelection();

+		if (selection instanceof IStructuredSelection) {

+			IStructuredSelection structuredSelection = (IStructuredSelection) selection;

+			if (structuredSelection.size() != 1) {

+				return null;

+			}

+			if (structuredSelection.getFirstElement() instanceof EditPart

+					&& ((EditPart) structuredSelection.getFirstElement())

+							.getModel() instanceof View) {

+				EObject modelElement = ((View) ((EditPart) structuredSelection

+						.getFirstElement()).getModel()).getElement();

+				List editPolicies = CanonicalEditPolicy

+						.getRegisteredEditPolicies(modelElement);

+				for (Iterator it = editPolicies.iterator(); it.hasNext();) {

+					CanonicalEditPolicy nextEditPolicy = (CanonicalEditPolicy) it

+							.next();

+					nextEditPolicy.refresh();

+				}

+

+			}

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean isEnabled() {

+		return true;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean isHandled() {

+		return true;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void removeHandlerListener(IHandlerListener handlerListener) {

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramUpdater.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramUpdater.java
new file mode 100755
index 0000000..951a269
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDiagramUpdater.java
@@ -0,0 +1,632 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import java.util.Collection;

+import java.util.Collections;

+import java.util.Iterator;

+import java.util.LinkedList;

+import java.util.List;

+import java.util.Map;

+

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.EStructuralFeature;

+import org.eclipse.emf.ecore.util.EcoreUtil;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.gmf.tooling.runtime.update.DiagramUpdater;

+import org.eclipse.soa.mangrove.ImPackage;

+import org.eclipse.soa.mangrove.Process;

+import org.eclipse.soa.mangrove.ProcessCollection;

+import org.eclipse.soa.mangrove.Service;

+import org.eclipse.soa.mangrove.ServiceCollection;

+import org.eclipse.soa.mangrove.Step;

+import org.eclipse.soa.mangrove.StpIntermediateModel;

+import org.eclipse.soa.mangrove.Transition;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceNeedsEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepServiceModelEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.TransitionEditPart;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+

+/**

+ * @generated

+ */

+public class IntermediateModelDiagramUpdater {

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelNodeDescriptor> getSemanticChildren(

+			View view) {

+		switch (IntermediateModelVisualIDRegistry.getVisualID(view)) {

+		case StpIntermediateModelEditPart.VISUAL_ID:

+			return getStpIntermediateModel_1000SemanticChildren(view);

+		case ProcessCollectionEditPart.VISUAL_ID:

+			return getProcessCollection_2005SemanticChildren(view);

+		case ServiceCollectionEditPart.VISUAL_ID:

+			return getServiceCollection_2006SemanticChildren(view);

+		case ProcessEditPart.VISUAL_ID:

+			return getProcess_3007SemanticChildren(view);

+		}

+		return Collections.emptyList();

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelNodeDescriptor> getStpIntermediateModel_1000SemanticChildren(

+			View view) {

+		if (!view.isSetElement()) {

+			return Collections.emptyList();

+		}

+		StpIntermediateModel modelElement = (StpIntermediateModel) view

+				.getElement();

+		LinkedList<IntermediateModelNodeDescriptor> result = new LinkedList<IntermediateModelNodeDescriptor>();

+		{

+			ProcessCollection childElement = modelElement

+					.getProcessCollection();

+			int visualID = IntermediateModelVisualIDRegistry.getNodeVisualID(

+					view, childElement);

+			if (visualID == ProcessCollectionEditPart.VISUAL_ID) {

+				result.add(new IntermediateModelNodeDescriptor(childElement,

+						visualID));

+			}

+		}

+		{

+			ServiceCollection childElement = modelElement

+					.getServiceCollection();

+			int visualID = IntermediateModelVisualIDRegistry.getNodeVisualID(

+					view, childElement);

+			if (visualID == ServiceCollectionEditPart.VISUAL_ID) {

+				result.add(new IntermediateModelNodeDescriptor(childElement,

+						visualID));

+			}

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelNodeDescriptor> getProcessCollection_2005SemanticChildren(

+			View view) {

+		if (!view.isSetElement()) {

+			return Collections.emptyList();

+		}

+		ProcessCollection modelElement = (ProcessCollection) view.getElement();

+		LinkedList<IntermediateModelNodeDescriptor> result = new LinkedList<IntermediateModelNodeDescriptor>();

+		for (Iterator<?> it = modelElement.getProcesses().iterator(); it

+				.hasNext();) {

+			Process childElement = (Process) it.next();

+			int visualID = IntermediateModelVisualIDRegistry.getNodeVisualID(

+					view, childElement);

+			if (visualID == ProcessEditPart.VISUAL_ID) {

+				result.add(new IntermediateModelNodeDescriptor(childElement,

+						visualID));

+				continue;

+			}

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelNodeDescriptor> getServiceCollection_2006SemanticChildren(

+			View view) {

+		if (!view.isSetElement()) {

+			return Collections.emptyList();

+		}

+		ServiceCollection modelElement = (ServiceCollection) view.getElement();

+		LinkedList<IntermediateModelNodeDescriptor> result = new LinkedList<IntermediateModelNodeDescriptor>();

+		for (Iterator<?> it = modelElement.getServices().iterator(); it

+				.hasNext();) {

+			Service childElement = (Service) it.next();

+			int visualID = IntermediateModelVisualIDRegistry.getNodeVisualID(

+					view, childElement);

+			if (visualID == ServiceEditPart.VISUAL_ID) {

+				result.add(new IntermediateModelNodeDescriptor(childElement,

+						visualID));

+				continue;

+			}

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelNodeDescriptor> getProcess_3007SemanticChildren(

+			View view) {

+		if (!view.isSetElement()) {

+			return Collections.emptyList();

+		}

+		Process modelElement = (Process) view.getElement();

+		LinkedList<IntermediateModelNodeDescriptor> result = new LinkedList<IntermediateModelNodeDescriptor>();

+		for (Iterator<?> it = modelElement.getSteps().iterator(); it.hasNext();) {

+			Step childElement = (Step) it.next();

+			int visualID = IntermediateModelVisualIDRegistry.getNodeVisualID(

+					view, childElement);

+			if (visualID == StepEditPart.VISUAL_ID) {

+				result.add(new IntermediateModelNodeDescriptor(childElement,

+						visualID));

+				continue;

+			}

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getContainedLinks(

+			View view) {

+		switch (IntermediateModelVisualIDRegistry.getVisualID(view)) {

+		case StpIntermediateModelEditPart.VISUAL_ID:

+			return getStpIntermediateModel_1000ContainedLinks(view);

+		case ProcessCollectionEditPart.VISUAL_ID:

+			return getProcessCollection_2005ContainedLinks(view);

+		case ServiceCollectionEditPart.VISUAL_ID:

+			return getServiceCollection_2006ContainedLinks(view);

+		case ProcessEditPart.VISUAL_ID:

+			return getProcess_3007ContainedLinks(view);

+		case StepEditPart.VISUAL_ID:

+			return getStep_3008ContainedLinks(view);

+		case ServiceEditPart.VISUAL_ID:

+			return getService_3009ContainedLinks(view);

+		case TransitionEditPart.VISUAL_ID:

+			return getTransition_4009ContainedLinks(view);

+		}

+		return Collections.emptyList();

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getIncomingLinks(

+			View view) {

+		switch (IntermediateModelVisualIDRegistry.getVisualID(view)) {

+		case ProcessCollectionEditPart.VISUAL_ID:

+			return getProcessCollection_2005IncomingLinks(view);

+		case ServiceCollectionEditPart.VISUAL_ID:

+			return getServiceCollection_2006IncomingLinks(view);

+		case ProcessEditPart.VISUAL_ID:

+			return getProcess_3007IncomingLinks(view);

+		case StepEditPart.VISUAL_ID:

+			return getStep_3008IncomingLinks(view);

+		case ServiceEditPart.VISUAL_ID:

+			return getService_3009IncomingLinks(view);

+		case TransitionEditPart.VISUAL_ID:

+			return getTransition_4009IncomingLinks(view);

+		}

+		return Collections.emptyList();

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getOutgoingLinks(

+			View view) {

+		switch (IntermediateModelVisualIDRegistry.getVisualID(view)) {

+		case ProcessCollectionEditPart.VISUAL_ID:

+			return getProcessCollection_2005OutgoingLinks(view);

+		case ServiceCollectionEditPart.VISUAL_ID:

+			return getServiceCollection_2006OutgoingLinks(view);

+		case ProcessEditPart.VISUAL_ID:

+			return getProcess_3007OutgoingLinks(view);

+		case StepEditPart.VISUAL_ID:

+			return getStep_3008OutgoingLinks(view);

+		case ServiceEditPart.VISUAL_ID:

+			return getService_3009OutgoingLinks(view);

+		case TransitionEditPart.VISUAL_ID:

+			return getTransition_4009OutgoingLinks(view);

+		}

+		return Collections.emptyList();

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getStpIntermediateModel_1000ContainedLinks(

+			View view) {

+		return Collections.emptyList();

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getProcessCollection_2005ContainedLinks(

+			View view) {

+		return Collections.emptyList();

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getServiceCollection_2006ContainedLinks(

+			View view) {

+		return Collections.emptyList();

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getProcess_3007ContainedLinks(

+			View view) {

+		Process modelElement = (Process) view.getElement();

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		result.addAll(getContainedTypeModelFacetLinks_Transition_4009(modelElement));

+		result.addAll(getOutgoingFeatureModelFacetLinks_Service_Needs_4011(modelElement));

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getStep_3008ContainedLinks(

+			View view) {

+		Step modelElement = (Step) view.getElement();

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		result.addAll(getOutgoingFeatureModelFacetLinks_Step_ServiceModel_4010(modelElement));

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getService_3009ContainedLinks(

+			View view) {

+		Service modelElement = (Service) view.getElement();

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		result.addAll(getOutgoingFeatureModelFacetLinks_Service_Needs_4011(modelElement));

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getTransition_4009ContainedLinks(

+			View view) {

+		return Collections.emptyList();

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getProcessCollection_2005IncomingLinks(

+			View view) {

+		return Collections.emptyList();

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getServiceCollection_2006IncomingLinks(

+			View view) {

+		return Collections.emptyList();

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getProcess_3007IncomingLinks(

+			View view) {

+		Process modelElement = (Process) view.getElement();

+		Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences = EcoreUtil.CrossReferencer

+				.find(view.eResource().getResourceSet().getResources());

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		result.addAll(getIncomingFeatureModelFacetLinks_Step_ServiceModel_4010(

+				modelElement, crossReferences));

+		result.addAll(getIncomingFeatureModelFacetLinks_Service_Needs_4011(

+				modelElement, crossReferences));

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getStep_3008IncomingLinks(

+			View view) {

+		Step modelElement = (Step) view.getElement();

+		Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences = EcoreUtil.CrossReferencer

+				.find(view.eResource().getResourceSet().getResources());

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		result.addAll(getIncomingTypeModelFacetLinks_Transition_4009(

+				modelElement, crossReferences));

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getService_3009IncomingLinks(

+			View view) {

+		Service modelElement = (Service) view.getElement();

+		Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences = EcoreUtil.CrossReferencer

+				.find(view.eResource().getResourceSet().getResources());

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		result.addAll(getIncomingFeatureModelFacetLinks_Step_ServiceModel_4010(

+				modelElement, crossReferences));

+		result.addAll(getIncomingFeatureModelFacetLinks_Service_Needs_4011(

+				modelElement, crossReferences));

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getTransition_4009IncomingLinks(

+			View view) {

+		return Collections.emptyList();

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getProcessCollection_2005OutgoingLinks(

+			View view) {

+		return Collections.emptyList();

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getServiceCollection_2006OutgoingLinks(

+			View view) {

+		return Collections.emptyList();

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getProcess_3007OutgoingLinks(

+			View view) {

+		Process modelElement = (Process) view.getElement();

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		result.addAll(getOutgoingFeatureModelFacetLinks_Service_Needs_4011(modelElement));

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getStep_3008OutgoingLinks(

+			View view) {

+		Step modelElement = (Step) view.getElement();

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		result.addAll(getOutgoingTypeModelFacetLinks_Transition_4009(modelElement));

+		result.addAll(getOutgoingFeatureModelFacetLinks_Step_ServiceModel_4010(modelElement));

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getService_3009OutgoingLinks(

+			View view) {

+		Service modelElement = (Service) view.getElement();

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		result.addAll(getOutgoingFeatureModelFacetLinks_Service_Needs_4011(modelElement));

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static List<IntermediateModelLinkDescriptor> getTransition_4009OutgoingLinks(

+			View view) {

+		return Collections.emptyList();

+	}

+

+	/**

+	 * @generated

+	 */

+	private static Collection<IntermediateModelLinkDescriptor> getContainedTypeModelFacetLinks_Transition_4009(

+			Process container) {

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		for (Iterator<?> links = container.getTransitions().iterator(); links

+				.hasNext();) {

+			EObject linkObject = (EObject) links.next();

+			if (false == linkObject instanceof Transition) {

+				continue;

+			}

+			Transition link = (Transition) linkObject;

+			if (TransitionEditPart.VISUAL_ID != IntermediateModelVisualIDRegistry

+					.getLinkWithClassVisualID(link)) {

+				continue;

+			}

+			Step dst = link.getTarget();

+			Step src = link.getSource();

+			result.add(new IntermediateModelLinkDescriptor(src, dst, link,

+					IntermediateModelElementTypes.Transition_4009,

+					TransitionEditPart.VISUAL_ID));

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	private static Collection<IntermediateModelLinkDescriptor> getIncomingTypeModelFacetLinks_Transition_4009(

+			Step target,

+			Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences) {

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		Collection<EStructuralFeature.Setting> settings = crossReferences

+				.get(target);

+		for (EStructuralFeature.Setting setting : settings) {

+			if (setting.getEStructuralFeature() != ImPackage.eINSTANCE

+					.getTransition_Target()

+					|| false == setting.getEObject() instanceof Transition) {

+				continue;

+			}

+			Transition link = (Transition) setting.getEObject();

+			if (TransitionEditPart.VISUAL_ID != IntermediateModelVisualIDRegistry

+					.getLinkWithClassVisualID(link)) {

+				continue;

+			}

+			Step src = link.getSource();

+			result.add(new IntermediateModelLinkDescriptor(src, target, link,

+					IntermediateModelElementTypes.Transition_4009,

+					TransitionEditPart.VISUAL_ID));

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	private static Collection<IntermediateModelLinkDescriptor> getIncomingFeatureModelFacetLinks_Step_ServiceModel_4010(

+			Service target,

+			Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences) {

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		Collection<EStructuralFeature.Setting> settings = crossReferences

+				.get(target);

+		for (EStructuralFeature.Setting setting : settings) {

+			if (setting.getEStructuralFeature() == ImPackage.eINSTANCE

+					.getStep_ServiceModel()) {

+				result.add(new IntermediateModelLinkDescriptor(setting

+						.getEObject(), target,

+						IntermediateModelElementTypes.StepServiceModel_4010,

+						StepServiceModelEditPart.VISUAL_ID));

+			}

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	private static Collection<IntermediateModelLinkDescriptor> getIncomingFeatureModelFacetLinks_Service_Needs_4011(

+			Service target,

+			Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences) {

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		Collection<EStructuralFeature.Setting> settings = crossReferences

+				.get(target);

+		for (EStructuralFeature.Setting setting : settings) {

+			if (setting.getEStructuralFeature() == ImPackage.eINSTANCE

+					.getService_Needs()) {

+				result.add(new IntermediateModelLinkDescriptor(setting

+						.getEObject(), target,

+						IntermediateModelElementTypes.ServiceNeeds_4011,

+						ServiceNeedsEditPart.VISUAL_ID));

+			}

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	private static Collection<IntermediateModelLinkDescriptor> getOutgoingTypeModelFacetLinks_Transition_4009(

+			Step source) {

+		Process container = null;

+		// Find container element for the link.

+		// Climb up by containment hierarchy starting from the source

+		// and return the first element that is instance of the container class.

+		for (EObject element = source; element != null && container == null; element = element

+				.eContainer()) {

+			if (element instanceof Process) {

+				container = (Process) element;

+			}

+		}

+		if (container == null) {

+			return Collections.emptyList();

+		}

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		for (Iterator<?> links = container.getTransitions().iterator(); links

+				.hasNext();) {

+			EObject linkObject = (EObject) links.next();

+			if (false == linkObject instanceof Transition) {

+				continue;

+			}

+			Transition link = (Transition) linkObject;

+			if (TransitionEditPart.VISUAL_ID != IntermediateModelVisualIDRegistry

+					.getLinkWithClassVisualID(link)) {

+				continue;

+			}

+			Step dst = link.getTarget();

+			Step src = link.getSource();

+			if (src != source) {

+				continue;

+			}

+			result.add(new IntermediateModelLinkDescriptor(src, dst, link,

+					IntermediateModelElementTypes.Transition_4009,

+					TransitionEditPart.VISUAL_ID));

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	private static Collection<IntermediateModelLinkDescriptor> getOutgoingFeatureModelFacetLinks_Step_ServiceModel_4010(

+			Step source) {

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		Service destination = source.getServiceModel();

+		if (destination == null) {

+			return result;

+		}

+		result.add(new IntermediateModelLinkDescriptor(source, destination,

+				IntermediateModelElementTypes.StepServiceModel_4010,

+				StepServiceModelEditPart.VISUAL_ID));

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	private static Collection<IntermediateModelLinkDescriptor> getOutgoingFeatureModelFacetLinks_Service_Needs_4011(

+			Service source) {

+		LinkedList<IntermediateModelLinkDescriptor> result = new LinkedList<IntermediateModelLinkDescriptor>();

+		for (Iterator<?> destinations = source.getNeeds().iterator(); destinations

+				.hasNext();) {

+			Service destination = (Service) destinations.next();

+			result.add(new IntermediateModelLinkDescriptor(source, destination,

+					IntermediateModelElementTypes.ServiceNeeds_4011,

+					ServiceNeedsEditPart.VISUAL_ID));

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static final DiagramUpdater TYPED_INSTANCE = new DiagramUpdater() {

+		/**

+		 * @generated

+		 */

+

+		public List<IntermediateModelNodeDescriptor> getSemanticChildren(

+				View view) {

+			return IntermediateModelDiagramUpdater.getSemanticChildren(view);

+		}

+

+		/**

+		 * @generated

+		 */

+

+		public List<IntermediateModelLinkDescriptor> getContainedLinks(View view) {

+			return IntermediateModelDiagramUpdater.getContainedLinks(view);

+		}

+

+		/**

+		 * @generated

+		 */

+

+		public List<IntermediateModelLinkDescriptor> getIncomingLinks(View view) {

+			return IntermediateModelDiagramUpdater.getIncomingLinks(view);

+		}

+

+		/**

+		 * @generated

+		 */

+

+		public List<IntermediateModelLinkDescriptor> getOutgoingLinks(View view) {

+			return IntermediateModelDiagramUpdater.getOutgoingLinks(view);

+		}

+	};

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDocumentProvider.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDocumentProvider.java
new file mode 100755
index 0000000..f4837c1
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelDocumentProvider.java
@@ -0,0 +1,1134 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import java.io.IOException;

+import java.util.ArrayList;

+import java.util.Collections;

+import java.util.HashMap;

+import java.util.Iterator;

+import java.util.LinkedList;

+import java.util.List;

+import java.util.Map;

+

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.resources.IFile;

+import org.eclipse.core.resources.IResource;

+import org.eclipse.core.resources.IResourceStatus;

+import org.eclipse.core.resources.IStorage;

+import org.eclipse.core.resources.ResourcesPlugin;

+import org.eclipse.core.runtime.CoreException;

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.core.runtime.IStatus;

+import org.eclipse.core.runtime.Path;

+import org.eclipse.core.runtime.Status;

+import org.eclipse.core.runtime.jobs.ISchedulingRule;

+import org.eclipse.core.runtime.jobs.MultiRule;

+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.common.ui.URIEditorInput;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.resource.Resource;

+import org.eclipse.emf.ecore.resource.ResourceSet;

+import org.eclipse.emf.ecore.util.EContentAdapter;

+import org.eclipse.emf.ecore.util.EcoreUtil;

+import org.eclipse.emf.transaction.NotificationFilter;

+import org.eclipse.emf.transaction.TransactionalEditingDomain;

+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;

+import org.eclipse.gmf.runtime.common.core.command.CommandResult;

+import org.eclipse.gmf.runtime.diagram.core.DiagramEditingDomainFactory;

+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.AbstractDocumentProvider;

+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramDocument;

+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;

+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocumentProvider;

+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;

+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.internal.EditorStatusCodes;

+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.internal.util.DiagramIOUtil;

+import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;

+import org.eclipse.gmf.runtime.emf.core.resources.GMFResourceFactory;

+import org.eclipse.gmf.runtime.notation.Diagram;

+import org.eclipse.jface.operation.IRunnableContext;

+import org.eclipse.osgi.util.NLS;

+import org.eclipse.swt.widgets.Display;

+import org.eclipse.ui.IEditorInput;

+import org.eclipse.ui.part.FileEditorInput;

+

+/**

+ * @generated

+ */

+public class IntermediateModelDocumentProvider extends AbstractDocumentProvider

+		implements IDiagramDocumentProvider {

+

+	/**

+	 * @generated

+	 */

+	protected ElementInfo createElementInfo(Object element)

+			throws CoreException {

+		if (false == element instanceof FileEditorInput

+				&& false == element instanceof URIEditorInput) {

+			throw new CoreException(

+					new Status(

+							IStatus.ERROR,

+							IntermediateModelDiagramEditorPlugin.ID,

+							0,

+							NLS.bind(

+									Messages.IntermediateModelDocumentProvider_IncorrectInputError,

+									new Object[] {

+											element,

+											"org.eclipse.ui.part.FileEditorInput", "org.eclipse.emf.common.ui.URIEditorInput" }), //$NON-NLS-1$ //$NON-NLS-2$ 

+							null));

+		}

+		IEditorInput editorInput = (IEditorInput) element;

+		IDiagramDocument document = (IDiagramDocument) createDocument(editorInput);

+

+		ResourceSetInfo info = new ResourceSetInfo(document, editorInput);

+		info.setModificationStamp(computeModificationStamp(info));

+		info.fStatus = null;

+		return info;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IDocument createDocument(Object element) throws CoreException {

+		if (false == element instanceof FileEditorInput

+				&& false == element instanceof URIEditorInput) {

+			throw new CoreException(

+					new Status(

+							IStatus.ERROR,

+							IntermediateModelDiagramEditorPlugin.ID,

+							0,

+							NLS.bind(

+									Messages.IntermediateModelDocumentProvider_IncorrectInputError,

+									new Object[] {

+											element,

+											"org.eclipse.ui.part.FileEditorInput", "org.eclipse.emf.common.ui.URIEditorInput" }), //$NON-NLS-1$ //$NON-NLS-2$ 

+							null));

+		}

+		IDocument document = createEmptyDocument();

+		setDocumentContent(document, (IEditorInput) element);

+		setupDocument(element, document);

+		return document;

+	}

+

+	/**

+	 * Sets up the given document as it would be provided for the given element. The

+	 * content of the document is not changed. This default implementation is empty.

+	 * Subclasses may reimplement.

+	 * 

+	 * @param element the blue-print element

+	 * @param document the document to set up

+	 * @generated

+	 */

+	protected void setupDocument(Object element, IDocument document) {

+		// for subclasses

+	}

+

+	/**

+	 * @generated

+	 */

+	private long computeModificationStamp(ResourceSetInfo info) {

+		int result = 0;

+		for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it

+				.hasNext();) {

+			Resource nextResource = it.next();

+			IFile file = WorkspaceSynchronizer.getFile(nextResource);

+			if (file != null) {

+				if (file.getLocation() != null) {

+					result += file.getLocation().toFile().lastModified();

+				} else {

+					result += file.getModificationStamp();

+				}

+			}

+		}

+		return result;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IDocument createEmptyDocument() {

+		DiagramDocument document = new DiagramDocument();

+		document.setEditingDomain(createEditingDomain());

+		return document;

+	}

+

+	/**

+	 * @generated

+	 */

+	private TransactionalEditingDomain createEditingDomain() {

+		TransactionalEditingDomain editingDomain = DiagramEditingDomainFactory

+				.getInstance().createEditingDomain();

+		editingDomain.setID("org.eclipse.soa.mangrove.diagram.EditingDomain"); //$NON-NLS-1$

+		final NotificationFilter diagramResourceModifiedFilter = NotificationFilter

+				.createNotifierFilter(editingDomain.getResourceSet())

+				.and(NotificationFilter.createEventTypeFilter(Notification.ADD))

+				.and(NotificationFilter.createFeatureFilter(ResourceSet.class,

+						ResourceSet.RESOURCE_SET__RESOURCES));

+		editingDomain.getResourceSet().eAdapters().add(new Adapter() {

+

+			private Notifier myTarger;

+

+			public Notifier getTarget() {

+				return myTarger;

+			}

+

+			public boolean isAdapterForType(Object type) {

+				return false;

+			}

+

+			public void notifyChanged(Notification notification) {

+				if (diagramResourceModifiedFilter.matches(notification)) {

+					Object value = notification.getNewValue();

+					if (value instanceof Resource) {

+						((Resource) value).setTrackingModification(true);

+					}

+				}

+			}

+

+			public void setTarget(Notifier newTarget) {

+				myTarger = newTarget;

+			}

+

+		});

+

+		return editingDomain;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setDocumentContent(IDocument document, IEditorInput element)

+			throws CoreException {

+		IDiagramDocument diagramDocument = (IDiagramDocument) document;

+		TransactionalEditingDomain domain = diagramDocument.getEditingDomain();

+		if (element instanceof FileEditorInput) {

+			IStorage storage = ((FileEditorInput) element).getStorage();

+			Diagram diagram = DiagramIOUtil.load(domain, storage, true,

+					getProgressMonitor());

+			document.setContent(diagram);

+		} else if (element instanceof URIEditorInput) {

+			URI uri = ((URIEditorInput) element).getURI();

+			Resource resource = null;

+			try {

+				resource = domain.getResourceSet().getResource(

+						uri.trimFragment(), false);

+				if (resource == null) {

+					resource = domain.getResourceSet().createResource(

+							uri.trimFragment());

+				}

+				if (!resource.isLoaded()) {

+					try {

+						Map options = new HashMap(

+								GMFResourceFactory.getDefaultLoadOptions());

+						// @see 171060 

+						// options.put(org.eclipse.emf.ecore.xmi.XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.TRUE);

+						resource.load(options);

+					} catch (IOException e) {

+						resource.unload();

+						throw e;

+					}

+				}

+				if (uri.fragment() != null) {

+					EObject rootElement = resource.getEObject(uri.fragment());

+					if (rootElement instanceof Diagram) {

+						document.setContent((Diagram) rootElement);

+						return;

+					}

+				} else {

+					for (Iterator it = resource.getContents().iterator(); it

+							.hasNext();) {

+						Object rootElement = it.next();

+						if (rootElement instanceof Diagram) {

+							document.setContent((Diagram) rootElement);

+							return;

+						}

+					}

+				}

+				throw new RuntimeException(

+						Messages.IntermediateModelDocumentProvider_NoDiagramInResourceError);

+			} catch (Exception e) {

+				CoreException thrownExcp = null;

+				if (e instanceof CoreException) {

+					thrownExcp = (CoreException) e;

+				} else {

+					String msg = e.getLocalizedMessage();

+					thrownExcp = new CoreException(

+							new Status(

+									IStatus.ERROR,

+									IntermediateModelDiagramEditorPlugin.ID,

+									0,

+									msg != null ? msg

+											: Messages.IntermediateModelDocumentProvider_DiagramLoadingError,

+									e));

+				}

+				throw thrownExcp;

+			}

+		} else {

+			throw new CoreException(

+					new Status(

+							IStatus.ERROR,

+							IntermediateModelDiagramEditorPlugin.ID,

+							0,

+							NLS.bind(

+									Messages.IntermediateModelDocumentProvider_IncorrectInputError,

+									new Object[] {

+											element,

+											"org.eclipse.ui.part.FileEditorInput", "org.eclipse.emf.common.ui.URIEditorInput" }), //$NON-NLS-1$ //$NON-NLS-2$ 

+							null));

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public long getModificationStamp(Object element) {

+		ResourceSetInfo info = getResourceSetInfo(element);

+		if (info != null) {

+			return computeModificationStamp(info);

+		}

+		return super.getModificationStamp(element);

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean isDeleted(Object element) {

+		IDiagramDocument document = getDiagramDocument(element);

+		if (document != null) {

+			Resource diagramResource = document.getDiagram().eResource();

+			if (diagramResource != null) {

+				IFile file = WorkspaceSynchronizer.getFile(diagramResource);

+				return file == null || file.getLocation() == null

+						|| !file.getLocation().toFile().exists();

+			}

+		}

+		return super.isDeleted(element);

+	}

+

+	/**

+	 * @generated

+	 */

+	public ResourceSetInfo getResourceSetInfo(Object editorInput) {

+		return (ResourceSetInfo) super.getElementInfo(editorInput);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void disposeElementInfo(Object element, ElementInfo info) {

+		if (info instanceof ResourceSetInfo) {

+			ResourceSetInfo resourceSetInfo = (ResourceSetInfo) info;

+			resourceSetInfo.dispose();

+		}

+		super.disposeElementInfo(element, info);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void doValidateState(Object element, Object computationContext)

+			throws CoreException {

+		ResourceSetInfo info = getResourceSetInfo(element);

+		if (info != null) {

+			LinkedList<IFile> files2Validate = new LinkedList<IFile>();

+			for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it

+					.hasNext();) {

+				Resource nextResource = it.next();

+				IFile file = WorkspaceSynchronizer.getFile(nextResource);

+				if (file != null && file.isReadOnly()) {

+					files2Validate.add(file);

+				}

+			}

+			ResourcesPlugin.getWorkspace().validateEdit(

+					(IFile[]) files2Validate.toArray(new IFile[files2Validate

+							.size()]), computationContext);

+		}

+

+		super.doValidateState(element, computationContext);

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean isReadOnly(Object element) {

+		ResourceSetInfo info = getResourceSetInfo(element);

+		if (info != null) {

+			if (info.isUpdateCache()) {

+				try {

+					updateCache(element);

+				} catch (CoreException ex) {

+					IntermediateModelDiagramEditorPlugin

+							.getInstance()

+							.logError(

+									Messages.IntermediateModelDocumentProvider_isModifiable,

+									ex);

+					// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.StorageDocumentProvider_isModifiable

+				}

+			}

+			return info.isReadOnly();

+		}

+		return super.isReadOnly(element);

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean isModifiable(Object element) {

+		if (!isStateValidated(element)) {

+			if (element instanceof FileEditorInput

+					|| element instanceof URIEditorInput) {

+				return true;

+			}

+		}

+		ResourceSetInfo info = getResourceSetInfo(element);

+		if (info != null) {

+			if (info.isUpdateCache()) {

+				try {

+					updateCache(element);

+				} catch (CoreException ex) {

+					IntermediateModelDiagramEditorPlugin

+							.getInstance()

+							.logError(

+									Messages.IntermediateModelDocumentProvider_isModifiable,

+									ex);

+					// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.StorageDocumentProvider_isModifiable

+				}

+			}

+			return info.isModifiable();

+		}

+		return super.isModifiable(element);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void updateCache(Object element) throws CoreException {

+		ResourceSetInfo info = getResourceSetInfo(element);

+		if (info != null) {

+			for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it

+					.hasNext();) {

+				Resource nextResource = it.next();

+				IFile file = WorkspaceSynchronizer.getFile(nextResource);

+				if (file != null && file.isReadOnly()) {

+					info.setReadOnly(true);

+					info.setModifiable(false);

+					return;

+				}

+			}

+			info.setReadOnly(false);

+			info.setModifiable(true);

+			return;

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void doUpdateStateCache(Object element) throws CoreException {

+		ResourceSetInfo info = getResourceSetInfo(element);

+		if (info != null) {

+			info.setUpdateCache(true);

+		}

+		super.doUpdateStateCache(element);

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean isSynchronized(Object element) {

+		ResourceSetInfo info = getResourceSetInfo(element);

+		if (info != null) {

+			return info.isSynchronized();

+		}

+		return super.isSynchronized(element);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected ISchedulingRule getResetRule(Object element) {

+		ResourceSetInfo info = getResourceSetInfo(element);

+		if (info != null) {

+			LinkedList<ISchedulingRule> rules = new LinkedList<ISchedulingRule>();

+			for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it

+					.hasNext();) {

+				Resource nextResource = it.next();

+				IFile file = WorkspaceSynchronizer.getFile(nextResource);

+				if (file != null) {

+					rules.add(ResourcesPlugin.getWorkspace().getRuleFactory()

+							.modifyRule(file));

+				}

+			}

+			return new MultiRule(

+					(ISchedulingRule[]) rules.toArray(new ISchedulingRule[rules

+							.size()]));

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected ISchedulingRule getSaveRule(Object element) {

+		ResourceSetInfo info = getResourceSetInfo(element);

+		if (info != null) {

+			LinkedList<ISchedulingRule> rules = new LinkedList<ISchedulingRule>();

+			for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it

+					.hasNext();) {

+				Resource nextResource = it.next();

+				IFile file = WorkspaceSynchronizer.getFile(nextResource);

+				if (file != null) {

+					rules.add(computeSchedulingRule(file));

+				}

+			}

+			return new MultiRule(

+					(ISchedulingRule[]) rules.toArray(new ISchedulingRule[rules

+							.size()]));

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected ISchedulingRule getSynchronizeRule(Object element) {

+		ResourceSetInfo info = getResourceSetInfo(element);

+		if (info != null) {

+			LinkedList<ISchedulingRule> rules = new LinkedList<ISchedulingRule>();

+			for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it

+					.hasNext();) {

+				Resource nextResource = it.next();

+				IFile file = WorkspaceSynchronizer.getFile(nextResource);

+				if (file != null) {

+					rules.add(ResourcesPlugin.getWorkspace().getRuleFactory()

+							.refreshRule(file));

+				}

+			}

+			return new MultiRule(

+					(ISchedulingRule[]) rules.toArray(new ISchedulingRule[rules

+							.size()]));

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected ISchedulingRule getValidateStateRule(Object element) {

+		ResourceSetInfo info = getResourceSetInfo(element);

+		if (info != null) {

+			LinkedList<ISchedulingRule> files = new LinkedList<ISchedulingRule>();

+			for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it

+					.hasNext();) {

+				Resource nextResource = it.next();

+				IFile file = WorkspaceSynchronizer.getFile(nextResource);

+				if (file != null) {

+					files.add(file);

+				}

+			}

+			return ResourcesPlugin

+					.getWorkspace()

+					.getRuleFactory()

+					.validateEditRule(

+							(IFile[]) files.toArray(new IFile[files.size()]));

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	private ISchedulingRule computeSchedulingRule(IResource toCreateOrModify) {

+		if (toCreateOrModify.exists())

+			return ResourcesPlugin.getWorkspace().getRuleFactory()

+					.modifyRule(toCreateOrModify);

+

+		IResource parent = toCreateOrModify;

+		do {

+			/*

+			 * XXX This is a workaround for

+			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=67601

+			 * IResourceRuleFactory.createRule should iterate the hierarchy

+			 * itself.

+			 */

+			toCreateOrModify = parent;

+			parent = toCreateOrModify.getParent();

+		} while (parent != null && !parent.exists());

+

+		return ResourcesPlugin.getWorkspace().getRuleFactory()

+				.createRule(toCreateOrModify);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void doSynchronize(Object element, IProgressMonitor monitor)

+			throws CoreException {

+		ResourceSetInfo info = getResourceSetInfo(element);

+		if (info != null) {

+			for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it

+					.hasNext();) {

+				Resource nextResource = it.next();

+				handleElementChanged(info, nextResource, monitor);

+			}

+			return;

+		}

+		super.doSynchronize(element, monitor);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void doSaveDocument(IProgressMonitor monitor, Object element,

+			IDocument document, boolean overwrite) throws CoreException {

+		ResourceSetInfo info = getResourceSetInfo(element);

+		if (info != null) {

+			if (!overwrite && !info.isSynchronized()) {

+				throw new CoreException(

+						new Status(

+								IStatus.ERROR,

+								IntermediateModelDiagramEditorPlugin.ID,

+								IResourceStatus.OUT_OF_SYNC_LOCAL,

+								Messages.IntermediateModelDocumentProvider_UnsynchronizedFileSaveError,

+								null));

+			}

+			info.stopResourceListening();

+			fireElementStateChanging(element);

+			try {

+				monitor.beginTask(

+						Messages.IntermediateModelDocumentProvider_SaveDiagramTask,

+						info.getResourceSet().getResources().size() + 1); //"Saving diagram"

+				for (Iterator<Resource> it = info.getLoadedResourcesIterator(); it

+						.hasNext();) {

+					Resource nextResource = it.next();

+					monitor.setTaskName(NLS

+							.bind(Messages.IntermediateModelDocumentProvider_SaveNextResourceTask,

+									nextResource.getURI()));

+					if (nextResource.isLoaded()

+							&& !info.getEditingDomain()

+									.isReadOnly(nextResource)) {

+						try {

+							nextResource

+									.save(IntermediateModelDiagramEditorUtil

+											.getSaveOptions());

+						} catch (IOException e) {

+							fireElementStateChangeFailed(element);

+							throw new CoreException(new Status(IStatus.ERROR,

+									IntermediateModelDiagramEditorPlugin.ID,

+									EditorStatusCodes.RESOURCE_FAILURE,

+									e.getLocalizedMessage(), null));

+						}

+					}

+					monitor.worked(1);

+				}

+				monitor.done();

+				info.setModificationStamp(computeModificationStamp(info));

+			} catch (RuntimeException x) {

+				fireElementStateChangeFailed(element);

+				throw x;

+			} finally {

+				info.startResourceListening();

+			}

+		} else {

+			URI newResoruceURI;

+			List<IFile> affectedFiles = null;

+			if (element instanceof FileEditorInput) {

+				IFile newFile = ((FileEditorInput) element).getFile();

+				affectedFiles = Collections.singletonList(newFile);

+				newResoruceURI = URI.createPlatformResourceURI(newFile

+						.getFullPath().toString(), true);

+			} else if (element instanceof URIEditorInput) {

+				newResoruceURI = ((URIEditorInput) element).getURI();

+			} else {

+				fireElementStateChangeFailed(element);

+				throw new CoreException(

+						new Status(

+								IStatus.ERROR,

+								IntermediateModelDiagramEditorPlugin.ID,

+								0,

+								NLS.bind(

+										Messages.IntermediateModelDocumentProvider_IncorrectInputError,

+										new Object[] {

+												element,

+												"org.eclipse.ui.part.FileEditorInput", "org.eclipse.emf.common.ui.URIEditorInput" }), //$NON-NLS-1$ //$NON-NLS-2$ 

+								null));

+			}

+			if (false == document instanceof IDiagramDocument) {

+				fireElementStateChangeFailed(element);

+				throw new CoreException(

+						new Status(

+								IStatus.ERROR,

+								IntermediateModelDiagramEditorPlugin.ID,

+								0,

+								"Incorrect document used: " + document + " instead of org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument", null)); //$NON-NLS-1$ //$NON-NLS-2$

+			}

+			IDiagramDocument diagramDocument = (IDiagramDocument) document;

+			final Resource newResource = diagramDocument.getEditingDomain()

+					.getResourceSet().createResource(newResoruceURI);

+			final Diagram diagramCopy = (Diagram) EcoreUtil

+					.copy(diagramDocument.getDiagram());

+			try {

+				new AbstractTransactionalCommand(

+						diagramDocument.getEditingDomain(),

+						NLS.bind(

+								Messages.IntermediateModelDocumentProvider_SaveAsOperation,

+								diagramCopy.getName()), affectedFiles) {

+					protected CommandResult doExecuteWithResult(

+							IProgressMonitor monitor, IAdaptable info)

+							throws ExecutionException {

+						newResource.getContents().add(diagramCopy);

+						return CommandResult.newOKCommandResult();

+					}

+				}.execute(monitor, null);

+				newResource.save(IntermediateModelDiagramEditorUtil

+						.getSaveOptions());

+			} catch (ExecutionException e) {

+				fireElementStateChangeFailed(element);

+				throw new CoreException(new Status(IStatus.ERROR,

+						IntermediateModelDiagramEditorPlugin.ID, 0,

+						e.getLocalizedMessage(), null));

+			} catch (IOException e) {

+				fireElementStateChangeFailed(element);

+				throw new CoreException(new Status(IStatus.ERROR,

+						IntermediateModelDiagramEditorPlugin.ID, 0,

+						e.getLocalizedMessage(), null));

+			}

+			newResource.unload();

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void handleElementChanged(ResourceSetInfo info,

+			Resource changedResource, IProgressMonitor monitor) {

+		IFile file = WorkspaceSynchronizer.getFile(changedResource);

+		if (file != null) {

+			try {

+				file.refreshLocal(IResource.DEPTH_INFINITE, monitor);

+			} catch (CoreException ex) {

+				IntermediateModelDiagramEditorPlugin

+						.getInstance()

+						.logError(

+								Messages.IntermediateModelDocumentProvider_handleElementContentChanged,

+								ex);

+				// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.FileDocumentProvider_handleElementContentChanged

+			}

+		}

+		changedResource.unload();

+

+		fireElementContentAboutToBeReplaced(info.getEditorInput());

+		removeUnchangedElementListeners(info.getEditorInput(), info);

+		info.fStatus = null;

+		try {

+			setDocumentContent(info.fDocument, info.getEditorInput());

+		} catch (CoreException e) {

+			info.fStatus = e.getStatus();

+		}

+		if (!info.fCanBeSaved) {

+			info.setModificationStamp(computeModificationStamp(info));

+		}

+		addUnchangedElementListeners(info.getEditorInput(), info);

+		fireElementContentReplaced(info.getEditorInput());

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void handleElementMoved(IEditorInput input, URI uri) {

+		if (input instanceof FileEditorInput) {

+			IFile newFile = ResourcesPlugin

+					.getWorkspace()

+					.getRoot()

+					.getFile(

+							new Path(URI.decode(uri.path()))

+									.removeFirstSegments(1));

+			fireElementMoved(input, newFile == null ? null

+					: new FileEditorInput(newFile));

+			return;

+		}

+		// TODO: append suffix to the URI! (use diagram as a parameter)

+		fireElementMoved(input, new URIEditorInput(uri));

+	}

+

+	/**

+	 * @generated

+	 */

+	public IEditorInput createInputWithEditingDomain(IEditorInput editorInput,

+			TransactionalEditingDomain domain) {

+		return editorInput;

+	}

+

+	/**

+	 * @generated

+	 */

+	public IDiagramDocument getDiagramDocument(Object element) {

+		IDocument doc = getDocument(element);

+		if (doc instanceof IDiagramDocument) {

+			return (IDiagramDocument) doc;

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected class ResourceSetInfo extends ElementInfo {

+

+		/**

+		 * @generated

+		 */

+		private long myModificationStamp = IResource.NULL_STAMP;

+

+		/**

+		 * @generated

+		 */

+		private WorkspaceSynchronizer mySynchronizer;

+

+		/**

+		 * @generated

+		 */

+		private LinkedList<Resource> myUnSynchronizedResources = new LinkedList<Resource>();

+

+		/**

+		 * @generated

+		 */

+		private IDiagramDocument myDocument;

+

+		/**

+		 * @generated

+		 */

+		private IEditorInput myEditorInput;

+

+		/**

+		 * @generated

+		 */

+		private boolean myUpdateCache = true;

+

+		/**

+		 * @generated

+		 */

+		private boolean myModifiable = false;

+

+		/**

+		 * @generated

+		 */

+		private boolean myReadOnly = true;

+

+		/**

+		 * @generated

+		 */

+		private ResourceSetModificationListener myResourceSetListener;

+

+		/**

+		 * @generated

+		 */

+		public ResourceSetInfo(IDiagramDocument document,

+				IEditorInput editorInput) {

+			super(document);

+			myDocument = document;

+			myEditorInput = editorInput;

+			startResourceListening();

+			myResourceSetListener = new ResourceSetModificationListener(this);

+			getResourceSet().eAdapters().add(myResourceSetListener);

+		}

+

+		/**

+		 * @generated

+		 */

+		public long getModificationStamp() {

+			return myModificationStamp;

+		}

+

+		/**

+		 * @generated

+		 */

+		public void setModificationStamp(long modificationStamp) {

+			myModificationStamp = modificationStamp;

+		}

+

+		/**

+		 * @generated

+		 */

+		public TransactionalEditingDomain getEditingDomain() {

+			return myDocument.getEditingDomain();

+		}

+

+		/**

+		 * @generated

+		 */

+		public ResourceSet getResourceSet() {

+			return getEditingDomain().getResourceSet();

+		}

+

+		/**

+		 * @generated

+		 */

+		public Iterator<Resource> getLoadedResourcesIterator() {

+			return new ArrayList<Resource>(getResourceSet().getResources())

+					.iterator();

+		}

+

+		/**

+		 * @generated

+		 */

+		public IEditorInput getEditorInput() {

+			return myEditorInput;

+		}

+

+		/**

+		 * @generated

+		 */

+		public void dispose() {

+			stopResourceListening();

+			getResourceSet().eAdapters().remove(myResourceSetListener);

+			for (Iterator<Resource> it = getLoadedResourcesIterator(); it

+					.hasNext();) {

+				Resource resource = it.next();

+				resource.unload();

+			}

+			getEditingDomain().dispose();

+		}

+

+		/**

+		 * @generated

+		 */

+		public boolean isSynchronized() {

+			return myUnSynchronizedResources.size() == 0;

+		}

+

+		/**

+		 * @generated

+		 */

+		public void setUnSynchronized(Resource resource) {

+			myUnSynchronizedResources.add(resource);

+		}

+

+		/**

+		 * @generated

+		 */

+		public void setSynchronized(Resource resource) {

+			myUnSynchronizedResources.remove(resource);

+		}

+

+		/**

+		 * @generated

+		 */

+		public final void stopResourceListening() {

+			mySynchronizer.dispose();

+			mySynchronizer = null;

+		}

+

+		/**

+		 * @generated

+		 */

+		public final void startResourceListening() {

+			mySynchronizer = new WorkspaceSynchronizer(getEditingDomain(),

+					new SynchronizerDelegate());

+		}

+

+		/**

+		 * @generated

+		 */

+		public boolean isUpdateCache() {

+			return myUpdateCache;

+		}

+

+		/**

+		 * @generated

+		 */

+		public void setUpdateCache(boolean update) {

+			myUpdateCache = update;

+		}

+

+		/**

+		 * @generated

+		 */

+		public boolean isModifiable() {

+			return myModifiable;

+		}

+

+		/**

+		 * @generated

+		 */

+		public void setModifiable(boolean modifiable) {

+			myModifiable = modifiable;

+		}

+

+		/**

+		 * @generated

+		 */

+		public boolean isReadOnly() {

+			return myReadOnly;

+		}

+

+		/**

+		 * @generated

+		 */

+		public void setReadOnly(boolean readOnly) {

+			myReadOnly = readOnly;

+		}

+

+		/**

+		 * @generated

+		 */

+		private class SynchronizerDelegate implements

+				WorkspaceSynchronizer.Delegate {

+

+			/**

+			 * @generated

+			 */

+			public void dispose() {

+			}

+

+			/**

+			 * @generated

+			 */

+			public boolean handleResourceChanged(final Resource resource) {

+				synchronized (ResourceSetInfo.this) {

+					if (ResourceSetInfo.this.fCanBeSaved) {

+						ResourceSetInfo.this.setUnSynchronized(resource);

+						return true;

+					}

+				}

+				Display.getDefault().asyncExec(new Runnable() {

+					public void run() {

+						handleElementChanged(ResourceSetInfo.this, resource,

+								null);

+					}

+				});

+				return true;

+			}

+

+			/**

+			 * @generated

+			 */

+			public boolean handleResourceDeleted(Resource resource) {

+				synchronized (ResourceSetInfo.this) {

+					if (ResourceSetInfo.this.fCanBeSaved) {

+						ResourceSetInfo.this.setUnSynchronized(resource);

+						return true;

+					}

+				}

+				Display.getDefault().asyncExec(new Runnable() {

+					public void run() {

+						fireElementDeleted(ResourceSetInfo.this

+								.getEditorInput());

+					}

+				});

+				return true;

+			}

+

+			/**

+			 * @generated

+			 */

+			public boolean handleResourceMoved(Resource resource,

+					final URI newURI) {

+				synchronized (ResourceSetInfo.this) {

+					if (ResourceSetInfo.this.fCanBeSaved) {

+						ResourceSetInfo.this.setUnSynchronized(resource);

+						return true;

+					}

+				}

+				if (myDocument.getDiagram().eResource() == resource) {

+					Display.getDefault().asyncExec(new Runnable() {

+						public void run() {

+							handleElementMoved(

+									ResourceSetInfo.this.getEditorInput(),

+									newURI);

+						}

+					});

+				} else {

+					handleResourceDeleted(resource);

+				}

+				return true;

+			}

+

+		}

+

+	}

+

+	/**

+	 * @generated

+	 */

+	private class ResourceSetModificationListener extends EContentAdapter {

+

+		/**

+		 * @generated

+		 */

+		private NotificationFilter myModifiedFilter;

+

+		/**

+		 * @generated

+		 */

+		private ResourceSetInfo myInfo;

+

+		/**

+		 * @generated

+		 */

+		public ResourceSetModificationListener(ResourceSetInfo info) {

+			myInfo = info;

+			myModifiedFilter = NotificationFilter

+					.createEventTypeFilter(Notification.SET)

+					.or(NotificationFilter

+							.createEventTypeFilter(Notification.UNSET))

+					.and(NotificationFilter.createFeatureFilter(Resource.class,

+							Resource.RESOURCE__IS_MODIFIED));

+		}

+

+		/**

+		 * @generated

+		 */

+		public void notifyChanged(Notification notification) {

+			if (notification.getNotifier() instanceof ResourceSet) {

+				super.notifyChanged(notification);

+			}

+			if (!notification.isTouch()

+					&& myModifiedFilter.matches(notification)) {

+				if (notification.getNotifier() instanceof Resource) {

+					Resource resource = (Resource) notification.getNotifier();

+					if (resource.isLoaded()) {

+						boolean modified = false;

+						for (Iterator/*<org.eclipse.emf.ecore.resource.Resource>*/it = myInfo

+								.getLoadedResourcesIterator(); it.hasNext()

+								&& !modified;) {

+							Resource nextResource = (Resource) it.next();

+							if (nextResource.isLoaded()) {

+								modified = nextResource.isModified();

+							}

+						}

+						boolean dirtyStateChanged = false;

+						synchronized (myInfo) {

+							if (modified != myInfo.fCanBeSaved) {

+								myInfo.fCanBeSaved = modified;

+								dirtyStateChanged = true;

+							}

+							if (!resource.isModified()) {

+								myInfo.setSynchronized(resource);

+							}

+						}

+						if (dirtyStateChanged) {

+							fireElementDirtyStateChanged(

+									myInfo.getEditorInput(), modified);

+

+							if (!modified) {

+								myInfo.setModificationStamp(computeModificationStamp(myInfo));

+							}

+						}

+					}

+				}

+			}

+		}

+

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelInitDiagramFileAction.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelInitDiagramFileAction.java
new file mode 100755
index 0000000..3c26169
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelInitDiagramFileAction.java
@@ -0,0 +1,97 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import org.eclipse.core.resources.IFile;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.common.util.WrappedException;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.resource.Resource;

+import org.eclipse.emf.ecore.resource.ResourceSet;

+import org.eclipse.emf.transaction.TransactionalEditingDomain;

+import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;

+import org.eclipse.jface.action.IAction;

+import org.eclipse.jface.dialogs.MessageDialog;

+import org.eclipse.jface.viewers.ISelection;

+import org.eclipse.jface.viewers.IStructuredSelection;

+import org.eclipse.jface.wizard.Wizard;

+import org.eclipse.osgi.util.NLS;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart;

+import org.eclipse.swt.widgets.Shell;

+import org.eclipse.ui.IObjectActionDelegate;

+import org.eclipse.ui.IWorkbenchPart;

+

+/**

+ * @generated

+ */

+public class IntermediateModelInitDiagramFileAction implements

+		IObjectActionDelegate {

+

+	/**

+	 * @generated

+	 */

+	private IWorkbenchPart targetPart;

+

+	/**

+	 * @generated

+	 */

+	private URI domainModelURI;

+

+	/**

+	 * @generated

+	 */

+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {

+		this.targetPart = targetPart;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void selectionChanged(IAction action, ISelection selection) {

+		domainModelURI = null;

+		action.setEnabled(false);

+		if (selection instanceof IStructuredSelection == false

+				|| selection.isEmpty()) {

+			return;

+		}

+		IFile file = (IFile) ((IStructuredSelection) selection)

+				.getFirstElement();

+		domainModelURI = URI.createPlatformResourceURI(file.getFullPath()

+				.toString(), true);

+		action.setEnabled(true);

+	}

+

+	/**

+	 * @generated

+	 */

+	private Shell getShell() {

+		return targetPart.getSite().getShell();

+	}

+

+	/**

+	 * @generated

+	 */

+	public void run(IAction action) {

+		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE

+				.createEditingDomain();

+		ResourceSet resourceSet = editingDomain.getResourceSet();

+		EObject diagramRoot = null;

+		try {

+			Resource resource = resourceSet.getResource(domainModelURI, true);

+			diagramRoot = (EObject) resource.getContents().get(0);

+		} catch (WrappedException ex) {

+			IntermediateModelDiagramEditorPlugin.getInstance().logError(

+					"Unable to load resource: " + domainModelURI, ex); //$NON-NLS-1$

+		}

+		if (diagramRoot == null) {

+			MessageDialog.openError(getShell(),

+					Messages.InitDiagramFile_ResourceErrorDialogTitle,

+					Messages.InitDiagramFile_ResourceErrorDialogMessage);

+			return;

+		}

+		Wizard wizard = new IntermediateModelNewDiagramFileWizard(

+				domainModelURI, diagramRoot, editingDomain);

+		wizard.setWindowTitle(NLS.bind(Messages.InitDiagramFile_WizardTitle,

+				StpIntermediateModelEditPart.MODEL_ID));

+		IntermediateModelDiagramEditorUtil.runWizard(getShell(), wizard,

+				"InitDiagramFile"); //$NON-NLS-1$

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelLinkDescriptor.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelLinkDescriptor.java
new file mode 100755
index 0000000..f6fc48c
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelLinkDescriptor.java
@@ -0,0 +1,27 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.tooling.runtime.update.UpdaterLinkDescriptor;

+

+/**

+ * @generated

+ */

+public class IntermediateModelLinkDescriptor extends UpdaterLinkDescriptor {

+	/**

+	 * @generated

+	 */

+	public IntermediateModelLinkDescriptor(EObject source, EObject destination,

+			IElementType elementType, int linkVID) {

+		super(source, destination, elementType, linkVID);

+	}

+

+	/**

+	 * @generated

+	 */

+	public IntermediateModelLinkDescriptor(EObject source, EObject destination,

+			EObject linkElement, IElementType elementType, int linkVID) {

+		super(source, destination, linkElement, elementType, linkVID);

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelMatchingStrategy.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelMatchingStrategy.java
new file mode 100755
index 0000000..e6bee38
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelMatchingStrategy.java
@@ -0,0 +1,37 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import org.eclipse.emf.common.ui.URIEditorInput;

+import org.eclipse.ui.IEditorInput;

+import org.eclipse.ui.IEditorMatchingStrategy;

+import org.eclipse.ui.IEditorReference;

+import org.eclipse.ui.PartInitException;

+

+/**

+ * @generated

+ */

+public class IntermediateModelMatchingStrategy implements

+		IEditorMatchingStrategy {

+

+	/**

+	 * @generated

+	 */

+	public boolean matches(IEditorReference editorRef, IEditorInput input) {

+		IEditorInput editorInput;

+		try {

+			editorInput = editorRef.getEditorInput();

+		} catch (PartInitException e) {

+			return false;

+		}

+

+		if (editorInput.equals(input)) {

+			return true;

+		}

+		if (editorInput instanceof URIEditorInput

+				&& input instanceof URIEditorInput) {

+			return ((URIEditorInput) editorInput).getURI().equals(

+					((URIEditorInput) input).getURI());

+		}

+		return false;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelNewDiagramFileWizard.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelNewDiagramFileWizard.java
new file mode 100755
index 0000000..ae9d742
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelNewDiagramFileWizard.java
@@ -0,0 +1,203 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import java.io.IOException;

+import java.util.LinkedList;

+

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.core.commands.operations.OperationHistoryFactory;

+import org.eclipse.core.resources.IFile;

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.core.runtime.IPath;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.core.runtime.NullProgressMonitor;

+import org.eclipse.core.runtime.Path;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.resource.Resource;

+import org.eclipse.emf.ecore.resource.ResourceSet;

+import org.eclipse.emf.transaction.TransactionalEditingDomain;

+import org.eclipse.gmf.runtime.common.core.command.CommandResult;

+import org.eclipse.gmf.runtime.diagram.core.services.ViewService;

+import org.eclipse.gmf.runtime.diagram.core.services.view.CreateDiagramViewOperation;

+import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;

+import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;

+import org.eclipse.gmf.runtime.notation.Diagram;

+import org.eclipse.jface.viewers.StructuredSelection;

+import org.eclipse.jface.wizard.Wizard;

+import org.eclipse.osgi.util.NLS;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart;

+import org.eclipse.ui.PartInitException;

+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;

+

+/**

+ * @generated

+ */

+public class IntermediateModelNewDiagramFileWizard extends Wizard {

+

+	/**

+	 * @generated

+	 */

+	private WizardNewFileCreationPage myFileCreationPage;

+

+	/**

+	 * @generated

+	 */

+	private ModelElementSelectionPage diagramRootElementSelectionPage;

+

+	/**

+	 * @generated

+	 */

+	private TransactionalEditingDomain myEditingDomain;

+

+	/**

+	 * @generated

+	 */

+	public IntermediateModelNewDiagramFileWizard(URI domainModelURI,

+			EObject diagramRoot, TransactionalEditingDomain editingDomain) {

+		assert domainModelURI != null : "Domain model uri must be specified"; //$NON-NLS-1$

+		assert diagramRoot != null : "Doagram root element must be specified"; //$NON-NLS-1$

+		assert editingDomain != null : "Editing domain must be specified"; //$NON-NLS-1$

+

+		myFileCreationPage = new WizardNewFileCreationPage(

+				Messages.IntermediateModelNewDiagramFileWizard_CreationPageName,

+				StructuredSelection.EMPTY);

+		myFileCreationPage

+				.setTitle(Messages.IntermediateModelNewDiagramFileWizard_CreationPageTitle);

+		myFileCreationPage

+				.setDescription(NLS

+						.bind(Messages.IntermediateModelNewDiagramFileWizard_CreationPageDescription,

+								StpIntermediateModelEditPart.MODEL_ID));

+		IPath filePath;

+		String fileName = URI.decode(domainModelURI.trimFileExtension()

+				.lastSegment());

+		if (domainModelURI.isPlatformResource()) {

+			filePath = new Path(domainModelURI.trimSegments(1)

+					.toPlatformString(true));

+		} else if (domainModelURI.isFile()) {

+			filePath = new Path(domainModelURI.trimSegments(1).toFileString());

+		} else {

+			// TODO : use some default path

+			throw new IllegalArgumentException(

+					"Unsupported URI: " + domainModelURI); //$NON-NLS-1$

+		}

+		myFileCreationPage.setContainerFullPath(filePath);

+		myFileCreationPage.setFileName(IntermediateModelDiagramEditorUtil

+				.getUniqueFileName(filePath, fileName, "mangrove_diagram")); //$NON-NLS-1$

+

+		diagramRootElementSelectionPage = new DiagramRootElementSelectionPage(

+				Messages.IntermediateModelNewDiagramFileWizard_RootSelectionPageName);

+		diagramRootElementSelectionPage

+				.setTitle(Messages.IntermediateModelNewDiagramFileWizard_RootSelectionPageTitle);

+		diagramRootElementSelectionPage

+				.setDescription(Messages.IntermediateModelNewDiagramFileWizard_RootSelectionPageDescription);

+		diagramRootElementSelectionPage.setModelElement(diagramRoot);

+

+		myEditingDomain = editingDomain;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void addPages() {

+		addPage(myFileCreationPage);

+		addPage(diagramRootElementSelectionPage);

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean performFinish() {

+		LinkedList<IFile> affectedFiles = new LinkedList<IFile>();

+		IFile diagramFile = myFileCreationPage.createNewFile();

+		IntermediateModelDiagramEditorUtil.setCharset(diagramFile);

+		affectedFiles.add(diagramFile);

+		URI diagramModelURI = URI.createPlatformResourceURI(diagramFile

+				.getFullPath().toString(), true);

+		ResourceSet resourceSet = myEditingDomain.getResourceSet();

+		final Resource diagramResource = resourceSet

+				.createResource(diagramModelURI);

+		AbstractTransactionalCommand command = new AbstractTransactionalCommand(

+				myEditingDomain,

+				Messages.IntermediateModelNewDiagramFileWizard_InitDiagramCommand,

+				affectedFiles) {

+

+			protected CommandResult doExecuteWithResult(

+					IProgressMonitor monitor, IAdaptable info)

+					throws ExecutionException {

+				int diagramVID = IntermediateModelVisualIDRegistry

+						.getDiagramVisualID(diagramRootElementSelectionPage

+								.getModelElement());

+				if (diagramVID != StpIntermediateModelEditPart.VISUAL_ID) {

+					return CommandResult

+							.newErrorCommandResult(Messages.IntermediateModelNewDiagramFileWizard_IncorrectRootError);

+				}

+				Diagram diagram = ViewService

+						.createDiagram(

+								diagramRootElementSelectionPage

+										.getModelElement(),

+								StpIntermediateModelEditPart.MODEL_ID,

+								IntermediateModelDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);

+				diagramResource.getContents().add(diagram);

+				return CommandResult.newOKCommandResult();

+			}

+		};

+		try {

+			OperationHistoryFactory.getOperationHistory().execute(command,

+					new NullProgressMonitor(), null);

+			diagramResource.save(IntermediateModelDiagramEditorUtil

+					.getSaveOptions());

+			IntermediateModelDiagramEditorUtil.openDiagram(diagramResource);

+		} catch (ExecutionException e) {

+			IntermediateModelDiagramEditorPlugin.getInstance().logError(

+					"Unable to create model and diagram", e); //$NON-NLS-1$

+		} catch (IOException ex) {

+			IntermediateModelDiagramEditorPlugin.getInstance().logError(

+					"Save operation failed for: " + diagramModelURI, ex); //$NON-NLS-1$

+		} catch (PartInitException ex) {

+			IntermediateModelDiagramEditorPlugin.getInstance().logError(

+					"Unable to open editor", ex); //$NON-NLS-1$

+		}

+		return true;

+	}

+

+	/**

+	 * @generated

+	 */

+	private static class DiagramRootElementSelectionPage extends

+			ModelElementSelectionPage {

+

+		/**

+		 * @generated

+		 */

+		protected DiagramRootElementSelectionPage(String pageName) {

+			super(pageName);

+		}

+

+		/**

+		 * @generated

+		 */

+		protected String getSelectionTitle() {

+			return Messages.IntermediateModelNewDiagramFileWizard_RootSelectionPageSelectionTitle;

+		}

+

+		/**

+		 * @generated

+		 */

+		protected boolean validatePage() {

+			if (selectedModelElement == null) {

+				setErrorMessage(Messages.IntermediateModelNewDiagramFileWizard_RootSelectionPageNoSelectionMessage);

+				return false;

+			}

+			boolean result = ViewService

+					.getInstance()

+					.provides(

+							new CreateDiagramViewOperation(

+									new EObjectAdapter(selectedModelElement),

+									StpIntermediateModelEditPart.MODEL_ID,

+									IntermediateModelDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT));

+			setErrorMessage(result ? null

+					: Messages.IntermediateModelNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage);

+			return result;

+		}

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelNodeDescriptor.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelNodeDescriptor.java
new file mode 100755
index 0000000..98ec1d2
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelNodeDescriptor.java
@@ -0,0 +1,17 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.tooling.runtime.update.UpdaterNodeDescriptor;

+

+/**

+ * @generated

+ */

+public class IntermediateModelNodeDescriptor extends UpdaterNodeDescriptor {

+	/**

+	 * @generated

+	 */

+	public IntermediateModelNodeDescriptor(EObject modelElement, int visualID) {

+		super(modelElement, visualID);

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelPaletteFactory.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelPaletteFactory.java
new file mode 100755
index 0000000..c675f14
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelPaletteFactory.java
@@ -0,0 +1,352 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import java.util.Collections;

+import java.util.Iterator;

+import java.util.List;

+

+import org.eclipse.gef.Tool;

+import org.eclipse.gef.palette.PaletteContainer;

+import org.eclipse.gef.palette.PaletteDrawer;

+import org.eclipse.gef.palette.PaletteEntry;

+import org.eclipse.gef.palette.PaletteRoot;

+import org.eclipse.gef.palette.PaletteSeparator;

+import org.eclipse.gef.palette.PanningSelectionToolEntry;

+import org.eclipse.gef.palette.ToolEntry;

+import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeConnectionTool;

+import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeCreationTool;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+

+/**

+ * @generated

+ */

+public class IntermediateModelPaletteFactory {

+

+	/**

+	 * @generated

+	 */

+	public void fillPalette(PaletteRoot paletteRoot) {

+		cleanStandardTools(paletteRoot);

+		paletteRoot.add(createMangrove1Group());

+		paletteRoot.add(createTravelServices2Group());

+		paletteRoot.add(createFinancialServices3Group());

+	}

+

+	/**

+	 * Workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=159289

+	 * @generated

+	 */

+	private void cleanStandardTools(PaletteRoot paletteRoot) {

+		for (Iterator it = paletteRoot.getChildren().iterator(); it.hasNext();) {

+			PaletteEntry entry = (PaletteEntry) it.next();

+			if (!"standardGroup".equals(entry.getId())) { //$NON-NLS-1$

+				continue;

+			}

+			for (Iterator it2 = ((PaletteContainer) entry).getChildren()

+					.iterator(); it2.hasNext();) {

+				PaletteEntry entry2 = (PaletteEntry) it2.next();

+				if ("zoomTool".equals(entry2.getId())) { //$NON-NLS-1$

+					it2.remove();

+				} else if ("noteStack".equals(entry2.getId())) { //$NON-NLS-1$

+					it2.remove();

+				} else if ("selectionTool".equals(entry2.getId())) { //$NON-NLS-1$

+					it2.remove();

+				}

+				if (paletteRoot.getDefaultEntry() == entry2) {

+					paletteRoot.setDefaultEntry(null);

+				}

+			}

+		}

+	}

+

+	/**

+	 * Creates "mangrove" palette tool group

+	 * @generated

+	 */

+	private PaletteContainer createMangrove1Group() {

+		PaletteDrawer paletteContainer = new PaletteDrawer(

+				Messages.Mangrove1Group_title);

+		paletteContainer.setId("createMangrove1Group"); //$NON-NLS-1$

+		paletteContainer.setDescription(Messages.Mangrove1Group_desc);

+		paletteContainer.add(createStandardToolsTool());

+		paletteContainer.add(new PaletteSeparator());

+		paletteContainer.add(createProcessCollection3CreationTool());

+		paletteContainer.add(createProcess4CreationTool());

+		paletteContainer.add(createStep5CreationTool());

+		paletteContainer.add(createTransition6CreationTool());

+		paletteContainer.add(new PaletteSeparator());

+		paletteContainer.add(createServiceCollection8CreationTool());

+		paletteContainer.add(createService9CreationTool());

+		paletteContainer.add(createServiceService10CreationTool());

+		paletteContainer.add(new PaletteSeparator());

+		paletteContainer.add(createStepServiceConnection12CreationTool());

+		paletteContainer.add(new PaletteSeparator());

+		return paletteContainer;

+	}

+

+	/**

+	 * Creates "Travel Services" palette tool group

+	 * @generated

+	 */

+	private PaletteContainer createTravelServices2Group() {

+		PaletteDrawer paletteContainer = new PaletteDrawer(

+				Messages.TravelServices2Group_title);

+		paletteContainer.setId("createTravelServices2Group"); //$NON-NLS-1$

+		paletteContainer.add(createHotel1CreationTool());

+		paletteContainer.add(createWeather2CreationTool());

+		return paletteContainer;

+	}

+

+	/**

+	 * Creates "Financial Services" palette tool group

+	 * @generated

+	 */

+	private PaletteContainer createFinancialServices3Group() {

+		PaletteDrawer paletteContainer = new PaletteDrawer(

+				Messages.FinancialServices3Group_title);

+		paletteContainer.setId("createFinancialServices3Group"); //$NON-NLS-1$

+		paletteContainer.setDescription(Messages.FinancialServices3Group_desc);

+		paletteContainer.add(createCreditCard1CreationTool());

+		paletteContainer.add(createShoppingCart2CreationTool());

+		return paletteContainer;

+	}

+

+	/**

+	 * @generated

+	 */

+	private ToolEntry createStandardToolsTool() {

+		PanningSelectionToolEntry entry = new PanningSelectionToolEntry();

+		entry.setId("createStandardToolsTool"); //$NON-NLS-1$

+		return entry;

+	}

+

+	/**

+	 * @generated

+	 */

+	private ToolEntry createProcessCollection3CreationTool() {

+		NodeToolEntry entry = new NodeToolEntry(

+				Messages.ProcessCollection3CreationTool_title,

+				Messages.ProcessCollection3CreationTool_desc,

+				Collections

+						.singletonList(IntermediateModelElementTypes.ProcessCollection_2005));

+		entry.setId("createProcessCollection3CreationTool"); //$NON-NLS-1$

+		entry.setSmallIcon(IntermediateModelElementTypes

+				.getImageDescriptor(IntermediateModelElementTypes.ProcessCollection_2005));

+		entry.setLargeIcon(entry.getSmallIcon());

+		return entry;

+	}

+

+	/**

+	 * @generated

+	 */

+	private ToolEntry createProcess4CreationTool() {

+		NodeToolEntry entry = new NodeToolEntry(

+				Messages.Process4CreationTool_title,

+				Messages.Process4CreationTool_desc,

+				Collections

+						.singletonList(IntermediateModelElementTypes.Process_3007));

+		entry.setId("createProcess4CreationTool"); //$NON-NLS-1$

+		entry.setSmallIcon(IntermediateModelElementTypes

+				.getImageDescriptor(IntermediateModelElementTypes.Process_3007));

+		entry.setLargeIcon(entry.getSmallIcon());

+		return entry;

+	}

+

+	/**

+	 * @generated

+	 */

+	private ToolEntry createStep5CreationTool() {

+		NodeToolEntry entry = new NodeToolEntry(

+				Messages.Step5CreationTool_title,

+				Messages.Step5CreationTool_desc,

+				Collections

+						.singletonList(IntermediateModelElementTypes.Step_3008));

+		entry.setId("createStep5CreationTool"); //$NON-NLS-1$

+		entry.setSmallIcon(IntermediateModelElementTypes

+				.getImageDescriptor(IntermediateModelElementTypes.Step_3008));

+		entry.setLargeIcon(entry.getSmallIcon());

+		return entry;

+	}

+

+	/**

+	 * @generated

+	 */

+	private ToolEntry createTransition6CreationTool() {

+		LinkToolEntry entry = new LinkToolEntry(

+				Messages.Transition6CreationTool_title,

+				Messages.Transition6CreationTool_desc,

+				Collections

+						.singletonList(IntermediateModelElementTypes.Transition_4009));

+		entry.setId("createTransition6CreationTool"); //$NON-NLS-1$

+		entry.setSmallIcon(IntermediateModelElementTypes

+				.getImageDescriptor(IntermediateModelElementTypes.Transition_4009));

+		entry.setLargeIcon(entry.getSmallIcon());

+		return entry;

+	}

+

+	/**

+	 * @generated

+	 */

+	private ToolEntry createServiceCollection8CreationTool() {

+		NodeToolEntry entry = new NodeToolEntry(

+				Messages.ServiceCollection8CreationTool_title,

+				Messages.ServiceCollection8CreationTool_desc,

+				Collections

+						.singletonList(IntermediateModelElementTypes.ServiceCollection_2006));

+		entry.setId("createServiceCollection8CreationTool"); //$NON-NLS-1$

+		entry.setSmallIcon(IntermediateModelElementTypes

+				.getImageDescriptor(IntermediateModelElementTypes.ServiceCollection_2006));

+		entry.setLargeIcon(entry.getSmallIcon());

+		return entry;

+	}

+

+	/**

+	 * @generated

+	 */

+	private ToolEntry createService9CreationTool() {

+		NodeToolEntry entry = new NodeToolEntry(

+				Messages.Service9CreationTool_title,

+				Messages.Service9CreationTool_desc,

+				Collections

+						.singletonList(IntermediateModelElementTypes.Service_3009));

+		entry.setId("createService9CreationTool"); //$NON-NLS-1$

+		entry.setSmallIcon(IntermediateModelElementTypes

+				.getImageDescriptor(IntermediateModelElementTypes.Service_3009));

+		entry.setLargeIcon(entry.getSmallIcon());

+		return entry;

+	}

+

+	/**

+	 * @generated

+	 */

+	private ToolEntry createServiceService10CreationTool() {

+		LinkToolEntry entry = new LinkToolEntry(

+				Messages.ServiceService10CreationTool_title,

+				Messages.ServiceService10CreationTool_desc,

+				Collections

+						.singletonList(IntermediateModelElementTypes.ServiceNeeds_4011));

+		entry.setId("createServiceService10CreationTool"); //$NON-NLS-1$

+		entry.setSmallIcon(IntermediateModelElementTypes

+				.getImageDescriptor(IntermediateModelElementTypes.ServiceNeeds_4011));

+		entry.setLargeIcon(entry.getSmallIcon());

+		return entry;

+	}

+

+	/**

+	 * @generated

+	 */

+	private ToolEntry createStepServiceConnection12CreationTool() {

+		LinkToolEntry entry = new LinkToolEntry(

+				Messages.StepServiceConnection12CreationTool_title,

+				Messages.StepServiceConnection12CreationTool_desc,

+				Collections

+						.singletonList(IntermediateModelElementTypes.StepServiceModel_4010));

+		entry.setId("createStepServiceConnection12CreationTool"); //$NON-NLS-1$

+		entry.setSmallIcon(IntermediateModelElementTypes

+				.getImageDescriptor(IntermediateModelElementTypes.StepServiceModel_4010));

+		entry.setLargeIcon(entry.getSmallIcon());

+		return entry;

+	}

+

+	/**

+	 * @generated

+	 */

+	private ToolEntry createHotel1CreationTool() {

+		ToolEntry entry = new ToolEntry(Messages.Hotel1CreationTool_title,

+				null, null, null) {

+		};

+		entry.setId("createHotel1CreationTool"); //$NON-NLS-1$

+		return entry;

+	}

+

+	/**

+	 * @generated

+	 */

+	private ToolEntry createWeather2CreationTool() {

+		ToolEntry entry = new ToolEntry(Messages.Weather2CreationTool_title,

+				Messages.Weather2CreationTool_desc, null, null) {

+		};

+		entry.setId("createWeather2CreationTool"); //$NON-NLS-1$

+		return entry;

+	}

+

+	/**

+	 * @generated

+	 */

+	private ToolEntry createCreditCard1CreationTool() {

+		ToolEntry entry = new ToolEntry(Messages.CreditCard1CreationTool_title,

+				null, null, null) {

+		};

+		entry.setId("createCreditCard1CreationTool"); //$NON-NLS-1$

+		return entry;

+	}

+

+	/**

+	 * @generated

+	 */

+	private ToolEntry createShoppingCart2CreationTool() {

+		ToolEntry entry = new ToolEntry(

+				Messages.ShoppingCart2CreationTool_title, null, null, null) {

+		};

+		entry.setId("createShoppingCart2CreationTool"); //$NON-NLS-1$

+		return entry;

+	}

+

+	/**

+	 * @generated

+	 */

+	private static class NodeToolEntry extends ToolEntry {

+

+		/**

+		 * @generated

+		 */

+		private final List<IElementType> elementTypes;

+

+		/**

+		 * @generated

+		 */

+		private NodeToolEntry(String title, String description,

+				List<IElementType> elementTypes) {

+			super(title, description, null, null);

+			this.elementTypes = elementTypes;

+		}

+

+		/**

+		 * @generated

+		 */

+		public Tool createTool() {

+			Tool tool = new UnspecifiedTypeCreationTool(elementTypes);

+			tool.setProperties(getToolProperties());

+			return tool;

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private static class LinkToolEntry extends ToolEntry {

+

+		/**

+		 * @generated

+		 */

+		private final List<IElementType> relationshipTypes;

+

+		/**

+		 * @generated

+		 */

+		private LinkToolEntry(String title, String description,

+				List<IElementType> relationshipTypes) {

+			super(title, description, null, null);

+			this.relationshipTypes = relationshipTypes;

+		}

+

+		/**

+		 * @generated

+		 */

+		public Tool createTool() {

+			Tool tool = new UnspecifiedTypeConnectionTool(relationshipTypes);

+			tool.setProperties(getToolProperties());

+			return tool;

+		}

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelUriEditorInputTester.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelUriEditorInputTester.java
new file mode 100755
index 0000000..995136c
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelUriEditorInputTester.java
@@ -0,0 +1,23 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import org.eclipse.core.expressions.PropertyTester;

+import org.eclipse.emf.common.ui.URIEditorInput;

+

+/**

+ * @generated

+ */

+public class IntermediateModelUriEditorInputTester extends PropertyTester {

+

+	/**

+	 * @generated

+	 */

+	public boolean test(Object receiver, String method, Object[] args,

+			Object expectedValue) {

+		if (false == receiver instanceof URIEditorInput) {

+			return false;

+		}

+		URIEditorInput editorInput = (URIEditorInput) receiver;

+		return "mangrove_diagram".equals(editorInput.getURI().fileExtension()); //$NON-NLS-1$

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelVisualIDRegistry.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelVisualIDRegistry.java
new file mode 100755
index 0000000..055c9c3
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/IntermediateModelVisualIDRegistry.java
@@ -0,0 +1,346 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import org.eclipse.core.runtime.Platform;

+import org.eclipse.emf.ecore.EAnnotation;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.notation.Diagram;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.gmf.tooling.runtime.structure.DiagramStructure;

+import org.eclipse.soa.mangrove.ImPackage;

+import org.eclipse.soa.mangrove.StpIntermediateModel;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessCollectionPoolNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceServiceNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.TransitionEditPart;

+

+/**

+ * This registry is used to determine which type of visual object should be

+ * created for the corresponding Diagram, Node, ChildNode or Link represented

+ * by a domain model object.

+ * 

+ * @generated

+ */

+public class IntermediateModelVisualIDRegistry {

+

+	/**

+	 * @generated

+	 */

+	private static final String DEBUG_KEY = "org.eclipse.soa.mangrove.diagram/debug/visualID"; //$NON-NLS-1$

+

+	/**

+	 * @generated

+	 */

+	public static int getVisualID(View view) {

+		if (view instanceof Diagram) {

+			if (StpIntermediateModelEditPart.MODEL_ID.equals(view.getType())) {

+				return StpIntermediateModelEditPart.VISUAL_ID;

+			} else {

+				return -1;

+			}

+		}

+		return org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry

+				.getVisualID(view.getType());

+	}

+

+	/**

+	 * @generated

+	 */

+	public static String getModelID(View view) {

+		View diagram = view.getDiagram();

+		while (view != diagram) {

+			EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$

+			if (annotation != null) {

+				return (String) annotation.getDetails().get("modelID"); //$NON-NLS-1$

+			}

+			view = (View) view.eContainer();

+		}

+		return diagram != null ? diagram.getType() : null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static int getVisualID(String type) {

+		try {

+			return Integer.parseInt(type);

+		} catch (NumberFormatException e) {

+			if (Boolean.TRUE.toString().equalsIgnoreCase(

+					Platform.getDebugOption(DEBUG_KEY))) {

+				IntermediateModelDiagramEditorPlugin.getInstance().logError(

+						"Unable to parse view type as a visualID number: "

+								+ type);

+			}

+		}

+		return -1;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static String getType(int visualID) {

+		return Integer.toString(visualID);

+	}

+

+	/**

+	 * @generated

+	 */

+	public static int getDiagramVisualID(EObject domainElement) {

+		if (domainElement == null) {

+			return -1;

+		}

+		if (ImPackage.eINSTANCE.getStpIntermediateModel().isSuperTypeOf(

+				domainElement.eClass())

+				&& isDiagram((StpIntermediateModel) domainElement)) {

+			return StpIntermediateModelEditPart.VISUAL_ID;

+		}

+		return -1;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static int getNodeVisualID(View containerView, EObject domainElement) {

+		if (domainElement == null) {

+			return -1;

+		}

+		String containerModelID = org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry

+				.getModelID(containerView);

+		if (!StpIntermediateModelEditPart.MODEL_ID.equals(containerModelID)) {

+			return -1;

+		}

+		int containerVisualID;

+		if (StpIntermediateModelEditPart.MODEL_ID.equals(containerModelID)) {

+			containerVisualID = org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry

+					.getVisualID(containerView);

+		} else {

+			if (containerView instanceof Diagram) {

+				containerVisualID = StpIntermediateModelEditPart.VISUAL_ID;

+			} else {

+				return -1;

+			}

+		}

+		switch (containerVisualID) {

+		case StpIntermediateModelEditPart.VISUAL_ID:

+			if (ImPackage.eINSTANCE.getProcessCollection().isSuperTypeOf(

+					domainElement.eClass())) {

+				return ProcessCollectionEditPart.VISUAL_ID;

+			}

+			if (ImPackage.eINSTANCE.getServiceCollection().isSuperTypeOf(

+					domainElement.eClass())) {

+				return ServiceCollectionEditPart.VISUAL_ID;

+			}

+			break;

+		case ProcessCollectionEditPart.VISUAL_ID:

+			if (ImPackage.eINSTANCE.getProcess().isSuperTypeOf(

+					domainElement.eClass())) {

+				return ProcessEditPart.VISUAL_ID;

+			}

+			break;

+		case ServiceCollectionEditPart.VISUAL_ID:

+			if (ImPackage.eINSTANCE.getService().isSuperTypeOf(

+					domainElement.eClass())) {

+				return ServiceEditPart.VISUAL_ID;

+			}

+			break;

+		case ProcessEditPart.VISUAL_ID:

+			if (ImPackage.eINSTANCE.getStep().isSuperTypeOf(

+					domainElement.eClass())) {

+				return StepEditPart.VISUAL_ID;

+			}

+			break;

+		}

+		return -1;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static boolean canCreateNode(View containerView, int nodeVisualID) {

+		String containerModelID = org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry

+				.getModelID(containerView);

+		if (!StpIntermediateModelEditPart.MODEL_ID.equals(containerModelID)) {

+			return false;

+		}

+		int containerVisualID;

+		if (StpIntermediateModelEditPart.MODEL_ID.equals(containerModelID)) {

+			containerVisualID = org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry

+					.getVisualID(containerView);

+		} else {

+			if (containerView instanceof Diagram) {

+				containerVisualID = StpIntermediateModelEditPart.VISUAL_ID;

+			} else {

+				return false;

+			}

+		}

+		switch (containerVisualID) {

+		case StpIntermediateModelEditPart.VISUAL_ID:

+			if (ProcessCollectionEditPart.VISUAL_ID == nodeVisualID) {

+				return true;

+			}

+			if (ServiceCollectionEditPart.VISUAL_ID == nodeVisualID) {

+				return true;

+			}

+			break;

+		case ProcessCollectionEditPart.VISUAL_ID:

+			if (ProcessCollectionPoolNameEditPart.VISUAL_ID == nodeVisualID) {

+				return true;

+			}

+			if (ProcessEditPart.VISUAL_ID == nodeVisualID) {

+				return true;

+			}

+			break;

+		case ServiceCollectionEditPart.VISUAL_ID:

+			if (ServiceEditPart.VISUAL_ID == nodeVisualID) {

+				return true;

+			}

+			break;

+		case ProcessEditPart.VISUAL_ID:

+			if (ProcessNameEditPart.VISUAL_ID == nodeVisualID) {

+				return true;

+			}

+			if (StepEditPart.VISUAL_ID == nodeVisualID) {

+				return true;

+			}

+			break;

+		case StepEditPart.VISUAL_ID:

+			if (StepNameEditPart.VISUAL_ID == nodeVisualID) {

+				return true;

+			}

+			break;

+		case ServiceEditPart.VISUAL_ID:

+			if (ServiceServiceNameEditPart.VISUAL_ID == nodeVisualID) {

+				return true;

+			}

+			break;

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static int getLinkWithClassVisualID(EObject domainElement) {

+		if (domainElement == null) {

+			return -1;

+		}

+		if (ImPackage.eINSTANCE.getTransition().isSuperTypeOf(

+				domainElement.eClass())) {

+			return TransitionEditPart.VISUAL_ID;

+		}

+		return -1;

+	}

+

+	/**

+	 * User can change implementation of this method to handle some specific

+	 * situations not covered by default logic.

+	 * 

+	 * @generated

+	 */

+	private static boolean isDiagram(StpIntermediateModel element) {

+		return true;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static boolean checkNodeVisualID(View containerView,

+			EObject domainElement, int candidate) {

+		if (candidate == -1) {

+			//unrecognized id is always bad

+			return false;

+		}

+		int basic = getNodeVisualID(containerView, domainElement);

+		return basic == candidate;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static boolean isCompartmentVisualID(int visualID) {

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static boolean isSemanticLeafVisualID(int visualID) {

+		switch (visualID) {

+		case StpIntermediateModelEditPart.VISUAL_ID:

+			return false;

+		case StepEditPart.VISUAL_ID:

+		case ServiceEditPart.VISUAL_ID:

+			return true;

+		default:

+			break;

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static final DiagramStructure TYPED_INSTANCE = new DiagramStructure() {

+		/**

+		 * @generated

+		 */

+

+		public int getVisualID(View view) {

+			return org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry

+					.getVisualID(view);

+		}

+

+		/**

+		 * @generated

+		 */

+

+		public String getModelID(View view) {

+			return org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry

+					.getModelID(view);

+		}

+

+		/**

+		 * @generated

+		 */

+

+		public int getNodeVisualID(View containerView, EObject domainElement) {

+			return org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry

+					.getNodeVisualID(containerView, domainElement);

+		}

+

+		/**

+		 * @generated

+		 */

+

+		public boolean checkNodeVisualID(View containerView,

+				EObject domainElement, int candidate) {

+			return org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry

+					.checkNodeVisualID(containerView, domainElement, candidate);

+		}

+

+		/**

+		 * @generated

+		 */

+

+		public boolean isCompartmentVisualID(int visualID) {

+			return org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry

+					.isCompartmentVisualID(visualID);

+		}

+

+		/**

+		 * @generated

+		 */

+

+		public boolean isSemanticLeafVisualID(int visualID) {

+			return org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry

+					.isSemanticLeafVisualID(visualID);

+		}

+	};

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/LoadResourceAction.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/LoadResourceAction.java
new file mode 100755
index 0000000..8007200
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/LoadResourceAction.java
@@ -0,0 +1,31 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import org.eclipse.core.commands.AbstractHandler;

+import org.eclipse.core.commands.ExecutionEvent;

+import org.eclipse.core.commands.ExecutionException;

+import org.eclipse.emf.transaction.TransactionalEditingDomain;

+import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor;

+import org.eclipse.swt.widgets.Shell;

+import org.eclipse.ui.IEditorPart;

+import org.eclipse.ui.handlers.HandlerUtil;

+

+/**

+ * @generated

+ */

+public class LoadResourceAction extends AbstractHandler {

+	/**

+	 * @generated

+	 */

+	public Object execute(ExecutionEvent event) throws ExecutionException {

+		IEditorPart diagramEditor = HandlerUtil.getActiveEditorChecked(event);

+		Shell shell = diagramEditor.getEditorSite().getShell();

+		assert diagramEditor instanceof DiagramEditor;

+		TransactionalEditingDomain editingDomain = ((DiagramEditor) diagramEditor)

+				.getEditingDomain();

+		org.eclipse.emf.edit.ui.action.LoadResourceAction.LoadResourceDialog loadResourceDialog = new org.eclipse.emf.edit.ui.action.LoadResourceAction.LoadResourceDialog(

+				shell, editingDomain);

+		loadResourceDialog.open();

+		return null;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/Messages.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/Messages.java
new file mode 100755
index 0000000..d1476f1
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/Messages.java
@@ -0,0 +1,484 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import org.eclipse.osgi.util.NLS;

+

+/**

+ * @generated

+ */

+public class Messages extends NLS {

+

+	/**

+	 * @generated

+	 */

+	static {

+		NLS.initializeMessages("messages", Messages.class); //$NON-NLS-1$

+	}

+

+	/**

+	 * @generated

+	 */

+	private Messages() {

+	}

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelCreationWizardTitle;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelCreationWizard_DiagramModelFilePageTitle;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelCreationWizard_DiagramModelFilePageDescription;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelCreationWizard_DomainModelFilePageTitle;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelCreationWizard_DomainModelFilePageDescription;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelCreationWizardOpenEditorError;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelCreationWizardCreationError;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelCreationWizardPageExtensionError;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDiagramEditorUtil_OpenModelResourceErrorDialogTitle;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDiagramEditorUtil_OpenModelResourceErrorDialogMessage;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDiagramEditorUtil_CreateDiagramProgressTask;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDiagramEditorUtil_CreateDiagramCommandLabel;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDocumentProvider_isModifiable;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDocumentProvider_handleElementContentChanged;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDocumentProvider_IncorrectInputError;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDocumentProvider_NoDiagramInResourceError;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDocumentProvider_DiagramLoadingError;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDocumentProvider_UnsynchronizedFileSaveError;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDocumentProvider_SaveDiagramTask;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDocumentProvider_SaveNextResourceTask;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDocumentProvider_SaveAsOperation;

+

+	/**

+	 * @generated

+	 */

+	public static String InitDiagramFile_ResourceErrorDialogTitle;

+

+	/**

+	 * @generated

+	 */

+	public static String InitDiagramFile_ResourceErrorDialogMessage;

+

+	/**

+	 * @generated

+	 */

+	public static String InitDiagramFile_WizardTitle;

+

+	/**

+	 * @generated

+	 */

+	public static String InitDiagramFile_OpenModelFileDialogTitle;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelNewDiagramFileWizard_CreationPageName;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelNewDiagramFileWizard_CreationPageTitle;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelNewDiagramFileWizard_CreationPageDescription;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelNewDiagramFileWizard_RootSelectionPageName;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelNewDiagramFileWizard_RootSelectionPageTitle;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelNewDiagramFileWizard_RootSelectionPageDescription;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelNewDiagramFileWizard_RootSelectionPageSelectionTitle;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelNewDiagramFileWizard_RootSelectionPageNoSelectionMessage;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelNewDiagramFileWizard_InitDiagramCommand;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelNewDiagramFileWizard_IncorrectRootError;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDiagramEditor_SavingDeletedFile;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDiagramEditor_SaveAsErrorTitle;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDiagramEditor_SaveAsErrorMessage;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDiagramEditor_SaveErrorTitle;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelDiagramEditor_SaveErrorMessage;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelElementChooserDialog_SelectModelElementTitle;

+

+	/**

+	 * @generated

+	 */

+	public static String ModelElementSelectionPageMessage;

+

+	/**

+	 * @generated

+	 */

+	public static String ValidateActionMessage;

+

+	/**

+	 * @generated

+	 */

+	public static String Mangrove1Group_title;

+

+	/**

+	 * @generated

+	 */

+	public static String Mangrove1Group_desc;

+

+	/**

+	 * @generated

+	 */

+	public static String TravelServices2Group_title;

+

+	/**

+	 * @generated

+	 */

+	public static String FinancialServices3Group_title;

+

+	/**

+	 * @generated

+	 */

+	public static String FinancialServices3Group_desc;

+

+	/**

+	 * @generated

+	 */

+	public static String StandardToolsTool_title;

+

+	/**

+	 * @generated

+	 */

+	public static String ProcessCollection3CreationTool_title;

+

+	/**

+	 * @generated

+	 */

+	public static String ProcessCollection3CreationTool_desc;

+

+	/**

+	 * @generated

+	 */

+	public static String Process4CreationTool_title;

+

+	/**

+	 * @generated

+	 */

+	public static String Process4CreationTool_desc;

+

+	/**

+	 * @generated

+	 */

+	public static String Step5CreationTool_title;

+

+	/**

+	 * @generated

+	 */

+	public static String Step5CreationTool_desc;

+

+	/**

+	 * @generated

+	 */

+	public static String Transition6CreationTool_title;

+

+	/**

+	 * @generated

+	 */

+	public static String Transition6CreationTool_desc;

+

+	/**

+	 * @generated

+	 */

+	public static String ServiceCollection8CreationTool_title;

+

+	/**

+	 * @generated

+	 */

+	public static String ServiceCollection8CreationTool_desc;

+

+	/**

+	 * @generated

+	 */

+	public static String Service9CreationTool_title;

+

+	/**

+	 * @generated

+	 */

+	public static String Service9CreationTool_desc;

+

+	/**

+	 * @generated

+	 */

+	public static String ServiceService10CreationTool_title;

+

+	/**

+	 * @generated

+	 */

+	public static String ServiceService10CreationTool_desc;

+

+	/**

+	 * @generated

+	 */

+	public static String StepServiceConnection12CreationTool_title;

+

+	/**

+	 * @generated

+	 */

+	public static String StepServiceConnection12CreationTool_desc;

+

+	/**

+	 * @generated

+	 */

+	public static String Hotel1CreationTool_title;

+

+	/**

+	 * @generated

+	 */

+	public static String Weather2CreationTool_title;

+

+	/**

+	 * @generated

+	 */

+	public static String Weather2CreationTool_desc;

+

+	/**

+	 * @generated

+	 */

+	public static String CreditCard1CreationTool_title;

+

+	/**

+	 * @generated

+	 */

+	public static String ShoppingCart2CreationTool_title;

+

+	/**

+	 * @generated

+	 */

+	public static String CommandName_OpenDiagram;

+

+	/**

+	 * @generated

+	 */

+	public static String NavigatorGroupName_StpIntermediateModel_1000_links;

+

+	/**

+	 * @generated

+	 */

+	public static String NavigatorGroupName_Transition_4009_target;

+

+	/**

+	 * @generated

+	 */

+	public static String NavigatorGroupName_Transition_4009_source;

+

+	/**

+	 * @generated

+	 */

+	public static String NavigatorGroupName_Service_3009_incominglinks;

+

+	/**

+	 * @generated

+	 */

+	public static String NavigatorGroupName_Service_3009_outgoinglinks;

+

+	/**

+	 * @generated

+	 */

+	public static String NavigatorGroupName_ServiceNeeds_4011_target;

+

+	/**

+	 * @generated

+	 */

+	public static String NavigatorGroupName_ServiceNeeds_4011_source;

+

+	/**

+	 * @generated

+	 */

+	public static String NavigatorGroupName_StepServiceModel_4010_target;

+

+	/**

+	 * @generated

+	 */

+	public static String NavigatorGroupName_StepServiceModel_4010_source;

+

+	/**

+	 * @generated

+	 */

+	public static String NavigatorGroupName_Step_3008_incominglinks;

+

+	/**

+	 * @generated

+	 */

+	public static String NavigatorGroupName_Step_3008_outgoinglinks;

+

+	/**

+	 * @generated

+	 */

+	public static String NavigatorGroupName_Process_3007_incominglinks;

+

+	/**

+	 * @generated

+	 */

+	public static String NavigatorGroupName_Process_3007_outgoinglinks;

+

+	/**

+	 * @generated

+	 */

+	public static String NavigatorActionProvider_OpenDiagramActionName;

+

+	/**

+	 * @generated

+	 */

+	public static String AbstractParser_UnexpectedValueType;

+

+	/**

+	 * @generated

+	 */

+	public static String AbstractParser_WrongStringConversion;

+

+	/**

+	 * @generated

+	 */

+	public static String AbstractParser_UnknownLiteral;

+

+	/**

+	 * @generated

+	 */

+	public static String MessageFormatParser_InvalidInputError;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelModelingAssistantProviderTitle;

+

+	/**

+	 * @generated

+	 */

+	public static String IntermediateModelModelingAssistantProviderMessage;

+

+	//TODO: put accessor fields manually	

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/ModelElementSelectionPage.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/ModelElementSelectionPage.java
new file mode 100755
index 0000000..3b163d1
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/part/ModelElementSelectionPage.java
@@ -0,0 +1,150 @@
+package org.eclipse.soa.mangrove.diagram.part;

+

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.util.FeatureMap;

+import org.eclipse.emf.edit.provider.IWrapperItemProvider;

+import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;

+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;

+import org.eclipse.jface.viewers.ISelectionChangedListener;

+import org.eclipse.jface.viewers.IStructuredSelection;

+import org.eclipse.jface.viewers.SelectionChangedEvent;

+import org.eclipse.jface.viewers.StructuredSelection;

+import org.eclipse.jface.viewers.TreeViewer;

+import org.eclipse.jface.wizard.WizardPage;

+import org.eclipse.swt.SWT;

+import org.eclipse.swt.layout.GridData;

+import org.eclipse.swt.layout.GridLayout;

+import org.eclipse.swt.widgets.Composite;

+import org.eclipse.swt.widgets.Label;

+

+/**

+ * Wizard page that allows to select element from model.

+ * @generated

+ */

+public class ModelElementSelectionPage extends WizardPage {

+	/**

+	 * @generated

+	 */

+	protected EObject selectedModelElement;

+

+	/**

+	 * @generated

+	 */

+	private TreeViewer modelViewer;

+

+	/**

+	 * @generated

+	 */

+	public ModelElementSelectionPage(String pageName) {

+		super(pageName);

+	}

+

+	/**

+	 * @generated

+	 */

+	public EObject getModelElement() {

+		return selectedModelElement;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setModelElement(EObject modelElement) {

+		selectedModelElement = modelElement;

+		if (modelViewer != null) {

+			if (selectedModelElement != null) {

+				modelViewer.setInput(selectedModelElement.eResource());

+				modelViewer.setSelection(new StructuredSelection(

+						selectedModelElement));

+			} else {

+				modelViewer.setInput(null);

+			}

+			setPageComplete(validatePage());

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	public void createControl(Composite parent) {

+		initializeDialogUnits(parent);

+

+		Composite plate = new Composite(parent, SWT.NONE);

+		plate.setLayoutData(new GridData(GridData.FILL_BOTH));

+		GridLayout layout = new GridLayout();

+		layout.marginWidth = 0;

+		plate.setLayout(layout);

+		setControl(plate);

+

+		Label label = new Label(plate, SWT.NONE);

+		label.setText(getSelectionTitle());

+		label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));

+

+		modelViewer = new TreeViewer(plate, SWT.SINGLE | SWT.H_SCROLL

+				| SWT.V_SCROLL | SWT.BORDER);

+		GridData layoutData = new GridData(GridData.FILL_BOTH);

+		layoutData.heightHint = 300;

+		layoutData.widthHint = 300;

+		modelViewer.getTree().setLayoutData(layoutData);

+		modelViewer.setContentProvider(new AdapterFactoryContentProvider(

+				IntermediateModelDiagramEditorPlugin.getInstance()

+						.getItemProvidersAdapterFactory()));

+		modelViewer.setLabelProvider(new AdapterFactoryLabelProvider(

+				IntermediateModelDiagramEditorPlugin.getInstance()

+						.getItemProvidersAdapterFactory()));

+		if (selectedModelElement != null) {

+			modelViewer.setInput(selectedModelElement.eResource());

+			modelViewer.setSelection(new StructuredSelection(

+					selectedModelElement));

+		}

+		modelViewer

+				.addSelectionChangedListener(new ISelectionChangedListener() {

+					public void selectionChanged(SelectionChangedEvent event) {

+						ModelElementSelectionPage.this

+								.updateSelection((IStructuredSelection) event

+										.getSelection());

+					}

+				});

+

+		setPageComplete(validatePage());

+	}

+

+	/**

+	 * Override to provide custom model element description.

+	 * @generated

+	 */

+	protected String getSelectionTitle() {

+		return Messages.ModelElementSelectionPageMessage;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void updateSelection(IStructuredSelection selection) {

+		selectedModelElement = null;

+		if (selection.size() == 1) {

+			Object selectedElement = selection.getFirstElement();

+			if (selectedElement instanceof IWrapperItemProvider) {

+				selectedElement = ((IWrapperItemProvider) selectedElement)

+						.getValue();

+			}

+			if (selectedElement instanceof FeatureMap.Entry) {

+				selectedElement = ((FeatureMap.Entry) selectedElement)

+						.getValue();

+			}

+			if (selectedElement instanceof EObject) {

+				selectedModelElement = (EObject) selectedElement;

+			}

+		}

+		setPageComplete(validatePage());

+	}

+

+	/**

+	 * Override to provide specific validation of the selected model element.

+	 * @generated

+	 */

+	protected boolean validatePage() {

+		return true;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramAppearancePreferencePage.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramAppearancePreferencePage.java
new file mode 100755
index 0000000..9c4e41c
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramAppearancePreferencePage.java
@@ -0,0 +1,18 @@
+package org.eclipse.soa.mangrove.diagram.preferences;

+

+import org.eclipse.gmf.runtime.diagram.ui.preferences.AppearancePreferencePage;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+

+/**

+ * @generated

+ */

+public class DiagramAppearancePreferencePage extends AppearancePreferencePage {

+

+	/**

+	 * @generated

+	 */

+	public DiagramAppearancePreferencePage() {

+		setPreferenceStore(IntermediateModelDiagramEditorPlugin.getInstance()

+				.getPreferenceStore());

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramConnectionsPreferencePage.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramConnectionsPreferencePage.java
new file mode 100755
index 0000000..db7968b
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramConnectionsPreferencePage.java
@@ -0,0 +1,18 @@
+package org.eclipse.soa.mangrove.diagram.preferences;

+

+import org.eclipse.gmf.runtime.diagram.ui.preferences.ConnectionsPreferencePage;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+

+/**

+ * @generated

+ */

+public class DiagramConnectionsPreferencePage extends ConnectionsPreferencePage {

+

+	/**

+	 * @generated

+	 */

+	public DiagramConnectionsPreferencePage() {

+		setPreferenceStore(IntermediateModelDiagramEditorPlugin.getInstance()

+				.getPreferenceStore());

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramGeneralPreferencePage.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramGeneralPreferencePage.java
new file mode 100755
index 0000000..25c3b97
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramGeneralPreferencePage.java
@@ -0,0 +1,18 @@
+package org.eclipse.soa.mangrove.diagram.preferences;

+

+import org.eclipse.gmf.runtime.diagram.ui.preferences.DiagramsPreferencePage;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+

+/**

+ * @generated

+ */

+public class DiagramGeneralPreferencePage extends DiagramsPreferencePage {

+

+	/**

+	 * @generated

+	 */

+	public DiagramGeneralPreferencePage() {

+		setPreferenceStore(IntermediateModelDiagramEditorPlugin.getInstance()

+				.getPreferenceStore());

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramPreferenceInitializer.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramPreferenceInitializer.java
new file mode 100755
index 0000000..03b6fcf
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramPreferenceInitializer.java
@@ -0,0 +1,32 @@
+package org.eclipse.soa.mangrove.diagram.preferences;

+

+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;

+import org.eclipse.jface.preference.IPreferenceStore;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+

+/**

+ * @generated

+ */

+public class DiagramPreferenceInitializer extends AbstractPreferenceInitializer {

+

+	/**

+	 * @generated

+	 */

+	public void initializeDefaultPreferences() {

+		IPreferenceStore store = getPreferenceStore();

+		DiagramGeneralPreferencePage.initDefaults(store);

+		DiagramAppearancePreferencePage.initDefaults(store);

+		DiagramConnectionsPreferencePage.initDefaults(store);

+		DiagramPrintingPreferencePage.initDefaults(store);

+		DiagramRulersAndGridPreferencePage.initDefaults(store);

+

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IPreferenceStore getPreferenceStore() {

+		return IntermediateModelDiagramEditorPlugin.getInstance()

+				.getPreferenceStore();

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramPrintingPreferencePage.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramPrintingPreferencePage.java
new file mode 100755
index 0000000..4d9d8f1
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramPrintingPreferencePage.java
@@ -0,0 +1,18 @@
+package org.eclipse.soa.mangrove.diagram.preferences;

+

+import org.eclipse.gmf.runtime.diagram.ui.preferences.PrintingPreferencePage;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+

+/**

+ * @generated

+ */

+public class DiagramPrintingPreferencePage extends PrintingPreferencePage {

+

+	/**

+	 * @generated

+	 */

+	public DiagramPrintingPreferencePage() {

+		setPreferenceStore(IntermediateModelDiagramEditorPlugin.getInstance()

+				.getPreferenceStore());

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramRulersAndGridPreferencePage.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramRulersAndGridPreferencePage.java
new file mode 100755
index 0000000..927eccf
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/preferences/DiagramRulersAndGridPreferencePage.java
@@ -0,0 +1,18 @@
+package org.eclipse.soa.mangrove.diagram.preferences;

+

+import org.eclipse.gmf.runtime.diagram.ui.preferences.RulerGridPreferencePage;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+

+/**

+ * @generated

+ */

+public class DiagramRulersAndGridPreferencePage extends RulerGridPreferencePage {

+

+	/**

+	 * @generated

+	 */

+	public DiagramRulersAndGridPreferencePage() {

+		setPreferenceStore(IntermediateModelDiagramEditorPlugin.getInstance()

+				.getPreferenceStore());

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/ElementInitializers.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/ElementInitializers.java
new file mode 100755
index 0000000..fe68e0d
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/ElementInitializers.java
@@ -0,0 +1,26 @@
+package org.eclipse.soa.mangrove.diagram.providers;

+

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+

+/**

+ * @generated

+ */

+public class ElementInitializers {

+

+	protected ElementInitializers() {

+		// use #getInstance to access cached instance

+	}

+

+	/**

+	 * @generated

+	 */

+	public static ElementInitializers getInstance() {

+		ElementInitializers cached = IntermediateModelDiagramEditorPlugin

+				.getInstance().getElementInitializers();

+		if (cached == null) {

+			IntermediateModelDiagramEditorPlugin.getInstance()

+					.setElementInitializers(cached = new ElementInitializers());

+		}

+		return cached;

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelEditPartProvider.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelEditPartProvider.java
new file mode 100755
index 0000000..8417c57
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelEditPartProvider.java
@@ -0,0 +1,142 @@
+package org.eclipse.soa.mangrove.diagram.providers;

+

+import java.lang.ref.WeakReference;

+

+import org.eclipse.gef.EditPart;

+import org.eclipse.gef.EditPartFactory;

+import org.eclipse.gmf.runtime.common.core.service.IOperation;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;

+import org.eclipse.gmf.runtime.diagram.ui.services.editpart.AbstractEditPartProvider;

+import org.eclipse.gmf.runtime.diagram.ui.services.editpart.CreateGraphicEditPartOperation;

+import org.eclipse.gmf.runtime.diagram.ui.services.editpart.IEditPartOperation;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.diagram.edit.parts.IntermediateModelEditPartFactory;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+

+/**

+ * @generated

+ */

+public class IntermediateModelEditPartProvider extends AbstractEditPartProvider {

+

+	/**

+	 * @generated

+	 */

+	private EditPartFactory factory;

+

+	/**

+	 * @generated

+	 */

+	private boolean allowCaching;

+

+	/**

+	 * @generated

+	 */

+	private WeakReference cachedPart;

+

+	/**

+	 * @generated

+	 */

+	private WeakReference cachedView;

+

+	/**

+	 * @generated

+	 */

+	public IntermediateModelEditPartProvider() {

+		setFactory(new IntermediateModelEditPartFactory());

+		setAllowCaching(true);

+	}

+

+	/**

+	 * @generated

+	 */

+	public final EditPartFactory getFactory() {

+		return factory;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected void setFactory(EditPartFactory factory) {

+		this.factory = factory;

+	}

+

+	/**

+	 * @generated

+	 */

+	public final boolean isAllowCaching() {

+		return allowCaching;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected synchronized void setAllowCaching(boolean allowCaching) {

+		this.allowCaching = allowCaching;

+		if (!allowCaching) {

+			cachedPart = null;

+			cachedView = null;

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IGraphicalEditPart createEditPart(View view) {

+		EditPart part = factory.createEditPart(null, view);

+		if (part instanceof IGraphicalEditPart) {

+			return (IGraphicalEditPart) part;

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IGraphicalEditPart getCachedPart(View view) {

+		if (cachedView != null && cachedView.get() == view) {

+			return (IGraphicalEditPart) cachedPart.get();

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public synchronized IGraphicalEditPart createGraphicEditPart(View view) {

+		if (isAllowCaching()) {

+			IGraphicalEditPart part = getCachedPart(view);

+			cachedPart = null;

+			cachedView = null;

+			if (part != null) {

+				return part;

+			}

+		}

+		return createEditPart(view);

+	}

+

+	/**

+	 * @generated

+	 */

+	public synchronized boolean provides(IOperation operation) {

+		if (operation instanceof CreateGraphicEditPartOperation) {

+			View view = ((IEditPartOperation) operation).getView();

+			if (!StpIntermediateModelEditPart.MODEL_ID

+					.equals(IntermediateModelVisualIDRegistry.getModelID(view))) {

+				return false;

+			}

+			if (isAllowCaching() && getCachedPart(view) != null) {

+				return true;

+			}

+			IGraphicalEditPart part = createEditPart(view);

+			if (part != null) {

+				if (isAllowCaching()) {

+					cachedPart = new WeakReference(part);

+					cachedView = new WeakReference(view);

+				}

+				return true;

+			}

+		}

+		return false;

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelElementTypes.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelElementTypes.java
new file mode 100755
index 0000000..698bbe5
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelElementTypes.java
@@ -0,0 +1,283 @@
+package org.eclipse.soa.mangrove.diagram.providers;

+

+import java.util.HashSet;

+import java.util.IdentityHashMap;

+import java.util.Map;

+import java.util.Set;

+

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.emf.ecore.EClass;

+import org.eclipse.emf.ecore.EClassifier;

+import org.eclipse.emf.ecore.ENamedElement;

+import org.eclipse.emf.ecore.EStructuralFeature;

+import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.jface.resource.ImageDescriptor;

+import org.eclipse.jface.resource.ImageRegistry;

+import org.eclipse.soa.mangrove.ImPackage;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceNeedsEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepServiceModelEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.TransitionEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+import org.eclipse.swt.graphics.Image;

+

+/**

+ * @generated

+ */

+public class IntermediateModelElementTypes {

+

+	/**

+	 * @generated

+	 */

+	private IntermediateModelElementTypes() {

+	}

+

+	/**

+	 * @generated

+	 */

+	private static Map<IElementType, ENamedElement> elements;

+

+	/**

+	 * @generated

+	 */

+	private static ImageRegistry imageRegistry;

+

+	/**

+	 * @generated

+	 */

+	private static Set<IElementType> KNOWN_ELEMENT_TYPES;

+

+	/**

+	 * @generated

+	 */

+	public static final IElementType StpIntermediateModel_1000 = getElementType("org.eclipse.soa.mangrove.diagram.StpIntermediateModel_1000"); //$NON-NLS-1$

+	/**

+	 * @generated

+	 */

+	public static final IElementType ProcessCollection_2005 = getElementType("org.eclipse.soa.mangrove.diagram.ProcessCollection_2005"); //$NON-NLS-1$

+	/**

+	 * @generated

+	 */

+	public static final IElementType ServiceCollection_2006 = getElementType("org.eclipse.soa.mangrove.diagram.ServiceCollection_2006"); //$NON-NLS-1$

+	/**

+	 * @generated

+	 */

+	public static final IElementType Process_3007 = getElementType("org.eclipse.soa.mangrove.diagram.Process_3007"); //$NON-NLS-1$

+	/**

+	 * @generated

+	 */

+	public static final IElementType Step_3008 = getElementType("org.eclipse.soa.mangrove.diagram.Step_3008"); //$NON-NLS-1$

+	/**

+	 * @generated

+	 */

+	public static final IElementType Service_3009 = getElementType("org.eclipse.soa.mangrove.diagram.Service_3009"); //$NON-NLS-1$

+	/**

+	 * @generated

+	 */

+	public static final IElementType Transition_4009 = getElementType("org.eclipse.soa.mangrove.diagram.Transition_4009"); //$NON-NLS-1$

+	/**

+	 * @generated

+	 */

+	public static final IElementType StepServiceModel_4010 = getElementType("org.eclipse.soa.mangrove.diagram.StepServiceModel_4010"); //$NON-NLS-1$

+	/**

+	 * @generated

+	 */

+	public static final IElementType ServiceNeeds_4011 = getElementType("org.eclipse.soa.mangrove.diagram.ServiceNeeds_4011"); //$NON-NLS-1$

+

+	/**

+	 * @generated

+	 */

+	private static ImageRegistry getImageRegistry() {

+		if (imageRegistry == null) {

+			imageRegistry = new ImageRegistry();

+		}

+		return imageRegistry;

+	}

+

+	/**

+	 * @generated

+	 */

+	private static String getImageRegistryKey(ENamedElement element) {

+		return element.getName();

+	}

+

+	/**

+	 * @generated

+	 */

+	private static ImageDescriptor getProvidedImageDescriptor(

+			ENamedElement element) {

+		if (element instanceof EStructuralFeature) {

+			EStructuralFeature feature = ((EStructuralFeature) element);

+			EClass eContainingClass = feature.getEContainingClass();

+			EClassifier eType = feature.getEType();

+			if (eContainingClass != null && !eContainingClass.isAbstract()) {

+				element = eContainingClass;

+			} else if (eType instanceof EClass

+					&& !((EClass) eType).isAbstract()) {

+				element = eType;

+			}

+		}

+		if (element instanceof EClass) {

+			EClass eClass = (EClass) element;

+			if (!eClass.isAbstract()) {

+				return IntermediateModelDiagramEditorPlugin.getInstance()

+						.getItemImageDescriptor(

+								eClass.getEPackage().getEFactoryInstance()

+										.create(eClass));

+			}

+		}

+		// TODO : support structural features

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static ImageDescriptor getImageDescriptor(ENamedElement element) {

+		String key = getImageRegistryKey(element);

+		ImageDescriptor imageDescriptor = getImageRegistry().getDescriptor(key);

+		if (imageDescriptor == null) {

+			imageDescriptor = getProvidedImageDescriptor(element);

+			if (imageDescriptor == null) {

+				imageDescriptor = ImageDescriptor.getMissingImageDescriptor();

+			}

+			getImageRegistry().put(key, imageDescriptor);

+		}

+		return imageDescriptor;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static Image getImage(ENamedElement element) {

+		String key = getImageRegistryKey(element);

+		Image image = getImageRegistry().get(key);

+		if (image == null) {

+			ImageDescriptor imageDescriptor = getProvidedImageDescriptor(element);

+			if (imageDescriptor == null) {

+				imageDescriptor = ImageDescriptor.getMissingImageDescriptor();

+			}

+			getImageRegistry().put(key, imageDescriptor);

+			image = getImageRegistry().get(key);

+		}

+		return image;

+	}

+

+	/**

+	 * @generated

+	 */

+	public static ImageDescriptor getImageDescriptor(IAdaptable hint) {

+		ENamedElement element = getElement(hint);

+		if (element == null) {

+			return null;

+		}

+		return getImageDescriptor(element);

+	}

+

+	/**

+	 * @generated

+	 */

+	public static Image getImage(IAdaptable hint) {

+		ENamedElement element = getElement(hint);

+		if (element == null) {

+			return null;

+		}

+		return getImage(element);

+	}

+

+	/**

+	 * Returns 'type' of the ecore object associated with the hint.

+	 * 

+	 * @generated

+	 */

+	public static ENamedElement getElement(IAdaptable hint) {

+		Object type = hint.getAdapter(IElementType.class);

+		if (elements == null) {

+			elements = new IdentityHashMap<IElementType, ENamedElement>();

+

+			elements.put(StpIntermediateModel_1000,

+					ImPackage.eINSTANCE.getStpIntermediateModel());

+

+			elements.put(ProcessCollection_2005,

+					ImPackage.eINSTANCE.getProcessCollection());

+

+			elements.put(ServiceCollection_2006,

+					ImPackage.eINSTANCE.getServiceCollection());

+

+			elements.put(Process_3007, ImPackage.eINSTANCE.getProcess());

+

+			elements.put(Step_3008, ImPackage.eINSTANCE.getStep());

+

+			elements.put(Service_3009, ImPackage.eINSTANCE.getService());

+

+			elements.put(Transition_4009, ImPackage.eINSTANCE.getTransition());

+

+			elements.put(StepServiceModel_4010,

+					ImPackage.eINSTANCE.getStep_ServiceModel());

+

+			elements.put(ServiceNeeds_4011,

+					ImPackage.eINSTANCE.getService_Needs());

+		}

+		return (ENamedElement) elements.get(type);

+	}

+

+	/**

+	 * @generated

+	 */

+	private static IElementType getElementType(String id) {

+		return ElementTypeRegistry.getInstance().getType(id);

+	}

+

+	/**

+	 * @generated

+	 */

+	public static boolean isKnownElementType(IElementType elementType) {

+		if (KNOWN_ELEMENT_TYPES == null) {

+			KNOWN_ELEMENT_TYPES = new HashSet<IElementType>();

+			KNOWN_ELEMENT_TYPES.add(StpIntermediateModel_1000);

+			KNOWN_ELEMENT_TYPES.add(ProcessCollection_2005);

+			KNOWN_ELEMENT_TYPES.add(ServiceCollection_2006);

+			KNOWN_ELEMENT_TYPES.add(Process_3007);

+			KNOWN_ELEMENT_TYPES.add(Step_3008);

+			KNOWN_ELEMENT_TYPES.add(Service_3009);

+			KNOWN_ELEMENT_TYPES.add(Transition_4009);

+			KNOWN_ELEMENT_TYPES.add(StepServiceModel_4010);

+			KNOWN_ELEMENT_TYPES.add(ServiceNeeds_4011);

+		}

+		return KNOWN_ELEMENT_TYPES.contains(elementType);

+	}

+

+	/**

+	 * @generated

+	 */

+	public static IElementType getElementType(int visualID) {

+		switch (visualID) {

+		case StpIntermediateModelEditPart.VISUAL_ID:

+			return StpIntermediateModel_1000;

+		case ProcessCollectionEditPart.VISUAL_ID:

+			return ProcessCollection_2005;

+		case ServiceCollectionEditPart.VISUAL_ID:

+			return ServiceCollection_2006;

+		case ProcessEditPart.VISUAL_ID:

+			return Process_3007;

+		case StepEditPart.VISUAL_ID:

+			return Step_3008;

+		case ServiceEditPart.VISUAL_ID:

+			return Service_3009;

+		case TransitionEditPart.VISUAL_ID:

+			return Transition_4009;

+		case StepServiceModelEditPart.VISUAL_ID:

+			return StepServiceModel_4010;

+		case ServiceNeedsEditPart.VISUAL_ID:

+			return ServiceNeeds_4011;

+		}

+		return null;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelIconProvider.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelIconProvider.java
new file mode 100755
index 0000000..df36c9f
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelIconProvider.java
@@ -0,0 +1,32 @@
+package org.eclipse.soa.mangrove.diagram.providers;

+

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;

+import org.eclipse.gmf.runtime.common.core.service.IOperation;

+import org.eclipse.gmf.runtime.common.ui.services.icon.GetIconOperation;

+import org.eclipse.gmf.runtime.common.ui.services.icon.IIconProvider;

+import org.eclipse.swt.graphics.Image;

+

+/**

+ * @generated

+ */

+public class IntermediateModelIconProvider extends AbstractProvider implements

+		IIconProvider {

+

+	/**

+	 * @generated

+	 */

+	public Image getIcon(IAdaptable hint, int flags) {

+		return IntermediateModelElementTypes.getImage(hint);

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean provides(IOperation operation) {

+		if (operation instanceof GetIconOperation) {

+			return ((GetIconOperation) operation).execute(this) != null;

+		}

+		return false;

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelModelingAssistantProvider.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelModelingAssistantProvider.java
new file mode 100755
index 0000000..e57f2d7
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelModelingAssistantProvider.java
@@ -0,0 +1,247 @@
+package org.eclipse.soa.mangrove.diagram.providers;

+

+import java.util.ArrayList;

+import java.util.Collection;

+import java.util.Collections;

+import java.util.HashSet;

+import java.util.Iterator;

+import java.util.List;

+

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;

+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;

+import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.emf.ui.services.modelingassistant.ModelingAssistantProvider;

+import org.eclipse.gmf.runtime.notation.Diagram;

+import org.eclipse.jface.viewers.ILabelProvider;

+import org.eclipse.jface.window.Window;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelDiagramEditorPlugin;

+import org.eclipse.soa.mangrove.diagram.part.Messages;

+import org.eclipse.swt.widgets.Display;

+import org.eclipse.swt.widgets.Shell;

+import org.eclipse.ui.dialogs.ElementListSelectionDialog;

+

+/**

+ * @generated

+ */

+public class IntermediateModelModelingAssistantProvider extends

+		ModelingAssistantProvider {

+

+	/**

+	 * @generated

+	 */

+	public List getTypesForPopupBar(IAdaptable host) {

+		IGraphicalEditPart editPart = (IGraphicalEditPart) host

+				.getAdapter(IGraphicalEditPart.class);

+		if (editPart instanceof StpIntermediateModelEditPart) {

+			ArrayList<IElementType> types = new ArrayList<IElementType>(2);

+			types.add(IntermediateModelElementTypes.ProcessCollection_2005);

+			types.add(IntermediateModelElementTypes.ServiceCollection_2006);

+			return types;

+		}

+		if (editPart instanceof ProcessCollectionEditPart) {

+			ArrayList<IElementType> types = new ArrayList<IElementType>(1);

+			types.add(IntermediateModelElementTypes.Process_3007);

+			return types;

+		}

+		if (editPart instanceof ServiceCollectionEditPart) {

+			ArrayList<IElementType> types = new ArrayList<IElementType>(1);

+			types.add(IntermediateModelElementTypes.Service_3009);

+			return types;

+		}

+		if (editPart instanceof ProcessEditPart) {

+			ArrayList<IElementType> types = new ArrayList<IElementType>(1);

+			types.add(IntermediateModelElementTypes.Step_3008);

+			return types;

+		}

+		return Collections.EMPTY_LIST;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List getRelTypesOnSource(IAdaptable source) {

+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source

+				.getAdapter(IGraphicalEditPart.class);

+		if (sourceEditPart instanceof ProcessEditPart) {

+			return ((ProcessEditPart) sourceEditPart).getMARelTypesOnSource();

+		}

+		if (sourceEditPart instanceof StepEditPart) {

+			return ((StepEditPart) sourceEditPart).getMARelTypesOnSource();

+		}

+		if (sourceEditPart instanceof ServiceEditPart) {

+			return ((ServiceEditPart) sourceEditPart).getMARelTypesOnSource();

+		}

+		return Collections.EMPTY_LIST;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List getRelTypesOnTarget(IAdaptable target) {

+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target

+				.getAdapter(IGraphicalEditPart.class);

+		if (targetEditPart instanceof ProcessEditPart) {

+			return ((ProcessEditPart) targetEditPart).getMARelTypesOnTarget();

+		}

+		if (targetEditPart instanceof StepEditPart) {

+			return ((StepEditPart) targetEditPart).getMARelTypesOnTarget();

+		}

+		if (targetEditPart instanceof ServiceEditPart) {

+			return ((ServiceEditPart) targetEditPart).getMARelTypesOnTarget();

+		}

+		return Collections.EMPTY_LIST;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List getRelTypesOnSourceAndTarget(IAdaptable source,

+			IAdaptable target) {

+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source

+				.getAdapter(IGraphicalEditPart.class);

+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target

+				.getAdapter(IGraphicalEditPart.class);

+		if (sourceEditPart instanceof ProcessEditPart) {

+			return ((ProcessEditPart) sourceEditPart)

+					.getMARelTypesOnSourceAndTarget(targetEditPart);

+		}

+		if (sourceEditPart instanceof StepEditPart) {

+			return ((StepEditPart) sourceEditPart)

+					.getMARelTypesOnSourceAndTarget(targetEditPart);

+		}

+		if (sourceEditPart instanceof ServiceEditPart) {

+			return ((ServiceEditPart) sourceEditPart)

+					.getMARelTypesOnSourceAndTarget(targetEditPart);

+		}

+		return Collections.EMPTY_LIST;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List getTypesForSource(IAdaptable target,

+			IElementType relationshipType) {

+		IGraphicalEditPart targetEditPart = (IGraphicalEditPart) target

+				.getAdapter(IGraphicalEditPart.class);

+		if (targetEditPart instanceof ProcessEditPart) {

+			return ((ProcessEditPart) targetEditPart)

+					.getMATypesForSource(relationshipType);

+		}

+		if (targetEditPart instanceof StepEditPart) {

+			return ((StepEditPart) targetEditPart)

+					.getMATypesForSource(relationshipType);

+		}

+		if (targetEditPart instanceof ServiceEditPart) {

+			return ((ServiceEditPart) targetEditPart)

+					.getMATypesForSource(relationshipType);

+		}

+		return Collections.EMPTY_LIST;

+	}

+

+	/**

+	 * @generated

+	 */

+	public List getTypesForTarget(IAdaptable source,

+			IElementType relationshipType) {

+		IGraphicalEditPart sourceEditPart = (IGraphicalEditPart) source

+				.getAdapter(IGraphicalEditPart.class);

+		if (sourceEditPart instanceof ProcessEditPart) {

+			return ((ProcessEditPart) sourceEditPart)

+					.getMATypesForTarget(relationshipType);

+		}

+		if (sourceEditPart instanceof StepEditPart) {

+			return ((StepEditPart) sourceEditPart)

+					.getMATypesForTarget(relationshipType);

+		}

+		if (sourceEditPart instanceof ServiceEditPart) {

+			return ((ServiceEditPart) sourceEditPart)

+					.getMATypesForTarget(relationshipType);

+		}

+		return Collections.EMPTY_LIST;

+	}

+

+	/**

+	 * @generated

+	 */

+	public EObject selectExistingElementForSource(IAdaptable target,

+			IElementType relationshipType) {

+		return selectExistingElement(target,

+				getTypesForSource(target, relationshipType));

+	}

+

+	/**

+	 * @generated

+	 */

+	public EObject selectExistingElementForTarget(IAdaptable source,

+			IElementType relationshipType) {

+		return selectExistingElement(source,

+				getTypesForTarget(source, relationshipType));

+	}

+

+	/**

+	 * @generated

+	 */

+	protected EObject selectExistingElement(IAdaptable host, Collection types) {

+		if (types.isEmpty()) {

+			return null;

+		}

+		IGraphicalEditPart editPart = (IGraphicalEditPart) host

+				.getAdapter(IGraphicalEditPart.class);

+		if (editPart == null) {

+			return null;

+		}

+		Diagram diagram = (Diagram) editPart.getRoot().getContents().getModel();

+		HashSet<EObject> elements = new HashSet<EObject>();

+		for (Iterator<EObject> it = diagram.getElement().eAllContents(); it

+				.hasNext();) {

+			EObject element = it.next();

+			if (isApplicableElement(element, types)) {

+				elements.add(element);

+			}

+		}

+		if (elements.isEmpty()) {

+			return null;

+		}

+		return selectElement((EObject[]) elements.toArray(new EObject[elements

+				.size()]));

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean isApplicableElement(EObject element, Collection types) {

+		IElementType type = ElementTypeRegistry.getInstance().getElementType(

+				element);

+		return types.contains(type);

+	}

+

+	/**

+	 * @generated

+	 */

+	protected EObject selectElement(EObject[] elements) {

+		Shell shell = Display.getCurrent().getActiveShell();

+		ILabelProvider labelProvider = new AdapterFactoryLabelProvider(

+				IntermediateModelDiagramEditorPlugin.getInstance()

+						.getItemProvidersAdapterFactory());

+		ElementListSelectionDialog dialog = new ElementListSelectionDialog(

+				shell, labelProvider);

+		dialog.setMessage(Messages.IntermediateModelModelingAssistantProviderMessage);

+		dialog.setTitle(Messages.IntermediateModelModelingAssistantProviderTitle);

+		dialog.setMultipleSelection(false);

+		dialog.setElements(elements);

+		EObject selected = null;

+		if (dialog.open() == Window.OK) {

+			selected = (EObject) dialog.getFirstResult();

+		}

+		return selected;

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelParserProvider.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelParserProvider.java
new file mode 100755
index 0000000..bdd83cd
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelParserProvider.java
@@ -0,0 +1,188 @@
+package org.eclipse.soa.mangrove.diagram.providers;

+

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.emf.ecore.EAttribute;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;

+import org.eclipse.gmf.runtime.common.core.service.IOperation;

+import org.eclipse.gmf.runtime.common.ui.services.parser.GetParserOperation;

+import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;

+import org.eclipse.gmf.runtime.common.ui.services.parser.IParserProvider;

+import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.soa.mangrove.ImPackage;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessCollectionPoolNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceServiceNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepNameEditPart;

+import org.eclipse.soa.mangrove.diagram.parsers.MessageFormatParser;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+

+/**

+ * @generated

+ */

+public class IntermediateModelParserProvider extends AbstractProvider implements

+		IParserProvider {

+

+	/**

+	 * @generated

+	 */

+	private IParser processCollectionPoolName_5011Parser;

+

+	/**

+	 * @generated

+	 */

+	private IParser getProcessCollectionPoolName_5011Parser() {

+		if (processCollectionPoolName_5011Parser == null) {

+			EAttribute[] features = new EAttribute[] { ImPackage.eINSTANCE

+					.getProcessCollection_PoolName() };

+			MessageFormatParser parser = new MessageFormatParser(features);

+			processCollectionPoolName_5011Parser = parser;

+		}

+		return processCollectionPoolName_5011Parser;

+	}

+

+	/**

+	 * @generated

+	 */

+	private IParser processName_5010Parser;

+

+	/**

+	 * @generated

+	 */

+	private IParser getProcessName_5010Parser() {

+		if (processName_5010Parser == null) {

+			EAttribute[] features = new EAttribute[] { ImPackage.eINSTANCE

+					.getProcess_Name() };

+			MessageFormatParser parser = new MessageFormatParser(features);

+			processName_5010Parser = parser;

+		}

+		return processName_5010Parser;

+	}

+

+	/**

+	 * @generated

+	 */

+	private IParser stepName_5009Parser;

+

+	/**

+	 * @generated

+	 */

+	private IParser getStepName_5009Parser() {

+		if (stepName_5009Parser == null) {

+			EAttribute[] features = new EAttribute[] { ImPackage.eINSTANCE

+					.getStep_Name() };

+			MessageFormatParser parser = new MessageFormatParser(features);

+			stepName_5009Parser = parser;

+		}

+		return stepName_5009Parser;

+	}

+

+	/**

+	 * @generated

+	 */

+	private IParser serviceServiceName_5012Parser;

+

+	/**

+	 * @generated

+	 */

+	private IParser getServiceServiceName_5012Parser() {

+		if (serviceServiceName_5012Parser == null) {

+			EAttribute[] features = new EAttribute[] { ImPackage.eINSTANCE

+					.getService_ServiceName() };

+			MessageFormatParser parser = new MessageFormatParser(features);

+			serviceServiceName_5012Parser = parser;

+		}

+		return serviceServiceName_5012Parser;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IParser getParser(int visualID) {

+		switch (visualID) {

+		case ProcessCollectionPoolNameEditPart.VISUAL_ID:

+			return getProcessCollectionPoolName_5011Parser();

+		case ProcessNameEditPart.VISUAL_ID:

+			return getProcessName_5010Parser();

+		case StepNameEditPart.VISUAL_ID:

+			return getStepName_5009Parser();

+		case ServiceServiceNameEditPart.VISUAL_ID:

+			return getServiceServiceName_5012Parser();

+		}

+		return null;

+	}

+

+	/**

+	 * Utility method that consults ParserService

+	 * @generated

+	 */

+	public static IParser getParser(IElementType type, EObject object,

+			String parserHint) {

+		return ParserService.getInstance().getParser(

+				new HintAdapter(type, object, parserHint));

+	}

+

+	/**

+	 * @generated

+	 */

+	public IParser getParser(IAdaptable hint) {

+		String vid = (String) hint.getAdapter(String.class);

+		if (vid != null) {

+			return getParser(IntermediateModelVisualIDRegistry.getVisualID(vid));

+		}

+		View view = (View) hint.getAdapter(View.class);

+		if (view != null) {

+			return getParser(IntermediateModelVisualIDRegistry

+					.getVisualID(view));

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public boolean provides(IOperation operation) {

+		if (operation instanceof GetParserOperation) {

+			IAdaptable hint = ((GetParserOperation) operation).getHint();

+			if (IntermediateModelElementTypes.getElement(hint) == null) {

+				return false;

+			}

+			return getParser(hint) != null;

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	private static class HintAdapter extends ParserHintAdapter {

+

+		/**

+		 * @generated

+		 */

+		private final IElementType elementType;

+

+		/**

+		 * @generated

+		 */

+		public HintAdapter(IElementType type, EObject object, String parserHint) {

+			super(object, parserHint);

+			assert type != null;

+			elementType = type;

+		}

+

+		/**

+		 * @generated

+		 */

+		public Object getAdapter(Class adapter) {

+			if (IElementType.class.equals(adapter)) {

+				return elementType;

+			}

+			return super.getAdapter(adapter);

+		}

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelViewProvider.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelViewProvider.java
new file mode 100755
index 0000000..1924e35
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/providers/IntermediateModelViewProvider.java
@@ -0,0 +1,689 @@
+package org.eclipse.soa.mangrove.diagram.providers;

+

+import java.util.ArrayList;

+

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.emf.ecore.EAnnotation;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.EcoreFactory;

+import org.eclipse.emf.transaction.util.TransactionUtil;

+import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;

+import org.eclipse.gmf.runtime.common.core.service.IOperation;

+import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;

+import org.eclipse.gmf.runtime.diagram.core.providers.IViewProvider;

+import org.eclipse.gmf.runtime.diagram.core.services.view.CreateDiagramViewOperation;

+import org.eclipse.gmf.runtime.diagram.core.services.view.CreateEdgeViewOperation;

+import org.eclipse.gmf.runtime.diagram.core.services.view.CreateNodeViewOperation;

+import org.eclipse.gmf.runtime.diagram.core.services.view.CreateViewForKindOperation;

+import org.eclipse.gmf.runtime.diagram.core.services.view.CreateViewOperation;

+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;

+import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants;

+import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;

+import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.emf.type.core.IHintedType;

+import org.eclipse.gmf.runtime.notation.DecorationNode;

+import org.eclipse.gmf.runtime.notation.Diagram;

+import org.eclipse.gmf.runtime.notation.Edge;

+import org.eclipse.gmf.runtime.notation.FontStyle;

+import org.eclipse.gmf.runtime.notation.MeasurementUnit;

+import org.eclipse.gmf.runtime.notation.Node;

+import org.eclipse.gmf.runtime.notation.NotationFactory;

+import org.eclipse.gmf.runtime.notation.NotationPackage;

+import org.eclipse.gmf.runtime.notation.RelativeBendpoints;

+import org.eclipse.gmf.runtime.notation.Routing;

+import org.eclipse.gmf.runtime.notation.Shape;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.gmf.runtime.notation.datatype.RelativeBendpoint;

+import org.eclipse.jface.preference.IPreferenceStore;

+import org.eclipse.jface.preference.PreferenceConverter;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessCollectionPoolNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ProcessNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceCollectionEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceNeedsEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.ServiceServiceNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepNameEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StepServiceModelEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.StpIntermediateModelEditPart;

+import org.eclipse.soa.mangrove.diagram.edit.parts.TransitionEditPart;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.swt.SWT;

+import org.eclipse.swt.graphics.FontData;

+

+/**

+ * @generated

+ */

+public class IntermediateModelViewProvider extends AbstractProvider implements

+		IViewProvider {

+

+	/**

+	 * @generated

+	 */

+	public final boolean provides(IOperation operation) {

+		if (operation instanceof CreateViewForKindOperation) {

+			return provides((CreateViewForKindOperation) operation);

+		}

+		assert operation instanceof CreateViewOperation;

+		if (operation instanceof CreateDiagramViewOperation) {

+			return provides((CreateDiagramViewOperation) operation);

+		} else if (operation instanceof CreateEdgeViewOperation) {

+			return provides((CreateEdgeViewOperation) operation);

+		} else if (operation instanceof CreateNodeViewOperation) {

+			return provides((CreateNodeViewOperation) operation);

+		}

+		return false;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean provides(CreateViewForKindOperation op) {

+		/*

+		 if (op.getViewKind() == Node.class)

+		 return getNodeViewClass(op.getSemanticAdapter(), op.getContainerView(), op.getSemanticHint()) != null;

+		 if (op.getViewKind() == Edge.class)

+		 return getEdgeViewClass(op.getSemanticAdapter(), op.getContainerView(), op.getSemanticHint()) != null;

+		 */

+		return true;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean provides(CreateDiagramViewOperation op) {

+		return StpIntermediateModelEditPart.MODEL_ID.equals(op

+				.getSemanticHint())

+				&& IntermediateModelVisualIDRegistry

+						.getDiagramVisualID(getSemanticElement(op

+								.getSemanticAdapter())) != -1;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean provides(CreateNodeViewOperation op) {

+		if (op.getContainerView() == null) {

+			return false;

+		}

+		IElementType elementType = getSemanticElementType(op

+				.getSemanticAdapter());

+		EObject domainElement = getSemanticElement(op.getSemanticAdapter());

+		int visualID;

+		if (op.getSemanticHint() == null) {

+			// Semantic hint is not specified. Can be a result of call from CanonicalEditPolicy.

+			// In this situation there should be NO elementType, visualID will be determined

+			// by VisualIDRegistry.getNodeVisualID() for domainElement.

+			if (elementType != null || domainElement == null) {

+				return false;

+			}

+			visualID = IntermediateModelVisualIDRegistry.getNodeVisualID(

+					op.getContainerView(), domainElement);

+		} else {

+			visualID = IntermediateModelVisualIDRegistry.getVisualID(op

+					.getSemanticHint());

+			if (elementType != null) {

+				if (!IntermediateModelElementTypes

+						.isKnownElementType(elementType)

+						|| (!(elementType instanceof IHintedType))) {

+					return false; // foreign element type

+				}

+				String elementTypeHint = ((IHintedType) elementType)

+						.getSemanticHint();

+				if (!op.getSemanticHint().equals(elementTypeHint)) {

+					return false; // if semantic hint is specified it should be the same as in element type

+				}

+				if (domainElement != null

+						&& visualID != IntermediateModelVisualIDRegistry

+								.getNodeVisualID(op.getContainerView(),

+										domainElement)) {

+					return false; // visual id for node EClass should match visual id from element type

+				}

+			} else {

+				if (!StpIntermediateModelEditPart.MODEL_ID

+						.equals(IntermediateModelVisualIDRegistry.getModelID(op

+								.getContainerView()))) {

+					return false; // foreign diagram

+				}

+				switch (visualID) {

+				case ProcessCollectionEditPart.VISUAL_ID:

+				case ServiceCollectionEditPart.VISUAL_ID:

+				case ProcessEditPart.VISUAL_ID:

+				case StepEditPart.VISUAL_ID:

+				case ServiceEditPart.VISUAL_ID:

+					if (domainElement == null

+							|| visualID != IntermediateModelVisualIDRegistry

+									.getNodeVisualID(op.getContainerView(),

+											domainElement)) {

+						return false; // visual id in semantic hint should match visual id for domain element

+					}

+					break;

+				default:

+					return false;

+				}

+			}

+		}

+		return ProcessCollectionEditPart.VISUAL_ID == visualID

+				|| ServiceCollectionEditPart.VISUAL_ID == visualID

+				|| ProcessEditPart.VISUAL_ID == visualID

+				|| StepEditPart.VISUAL_ID == visualID

+				|| ServiceEditPart.VISUAL_ID == visualID;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected boolean provides(CreateEdgeViewOperation op) {

+		IElementType elementType = getSemanticElementType(op

+				.getSemanticAdapter());

+		if (!IntermediateModelElementTypes.isKnownElementType(elementType)

+				|| (!(elementType instanceof IHintedType))) {

+			return false; // foreign element type

+		}

+		String elementTypeHint = ((IHintedType) elementType).getSemanticHint();

+		if (elementTypeHint == null

+				|| (op.getSemanticHint() != null && !elementTypeHint.equals(op

+						.getSemanticHint()))) {

+			return false; // our hint is visual id and must be specified, and it should be the same as in element type

+		}

+		int visualID = IntermediateModelVisualIDRegistry

+				.getVisualID(elementTypeHint);

+		EObject domainElement = getSemanticElement(op.getSemanticAdapter());

+		if (domainElement != null

+				&& visualID != IntermediateModelVisualIDRegistry

+						.getLinkWithClassVisualID(domainElement)) {

+			return false; // visual id for link EClass should match visual id from element type

+		}

+		return true;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Diagram createDiagram(IAdaptable semanticAdapter,

+			String diagramKind, PreferencesHint preferencesHint) {

+		Diagram diagram = NotationFactory.eINSTANCE.createDiagram();

+		diagram.getStyles().add(NotationFactory.eINSTANCE.createDiagramStyle());

+		diagram.setType(StpIntermediateModelEditPart.MODEL_ID);

+		diagram.setElement(getSemanticElement(semanticAdapter));

+		diagram.setMeasurementUnit(MeasurementUnit.PIXEL_LITERAL);

+		return diagram;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Node createNode(IAdaptable semanticAdapter, View containerView,

+			String semanticHint, int index, boolean persisted,

+			PreferencesHint preferencesHint) {

+		final EObject domainElement = getSemanticElement(semanticAdapter);

+		final int visualID;

+		if (semanticHint == null) {

+			visualID = IntermediateModelVisualIDRegistry.getNodeVisualID(

+					containerView, domainElement);

+		} else {

+			visualID = IntermediateModelVisualIDRegistry

+					.getVisualID(semanticHint);

+		}

+		switch (visualID) {

+		case ProcessCollectionEditPart.VISUAL_ID:

+			return createProcessCollection_2005(domainElement, containerView,

+					index, persisted, preferencesHint);

+		case ServiceCollectionEditPart.VISUAL_ID:

+			return createServiceCollection_2006(domainElement, containerView,

+					index, persisted, preferencesHint);

+		case ProcessEditPart.VISUAL_ID:

+			return createProcess_3007(domainElement, containerView, index,

+					persisted, preferencesHint);

+		case StepEditPart.VISUAL_ID:

+			return createStep_3008(domainElement, containerView, index,

+					persisted, preferencesHint);

+		case ServiceEditPart.VISUAL_ID:

+			return createService_3009(domainElement, containerView, index,

+					persisted, preferencesHint);

+		}

+		// can't happen, provided #provides(CreateNodeViewOperation) is correct

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Edge createEdge(IAdaptable semanticAdapter, View containerView,

+			String semanticHint, int index, boolean persisted,

+			PreferencesHint preferencesHint) {

+		IElementType elementType = getSemanticElementType(semanticAdapter);

+		String elementTypeHint = ((IHintedType) elementType).getSemanticHint();

+		switch (IntermediateModelVisualIDRegistry.getVisualID(elementTypeHint)) {

+		case TransitionEditPart.VISUAL_ID:

+			return createTransition_4009(getSemanticElement(semanticAdapter),

+					containerView, index, persisted, preferencesHint);

+		case StepServiceModelEditPart.VISUAL_ID:

+			return createStepServiceModel_4010(containerView, index, persisted,

+					preferencesHint);

+		case ServiceNeedsEditPart.VISUAL_ID:

+			return createServiceNeeds_4011(containerView, index, persisted,

+					preferencesHint);

+		}

+		// can never happen, provided #provides(CreateEdgeViewOperation) is correct

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Node createProcessCollection_2005(EObject domainElement,

+			View containerView, int index, boolean persisted,

+			PreferencesHint preferencesHint) {

+		Node node = NotationFactory.eINSTANCE.createNode();

+		node.getStyles()

+				.add(NotationFactory.eINSTANCE.createDescriptionStyle());

+		node.getStyles().add(NotationFactory.eINSTANCE.createFontStyle());

+		node.getStyles().add(NotationFactory.eINSTANCE.createLineStyle());

+		node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());

+		node.setType(IntermediateModelVisualIDRegistry

+				.getType(ProcessCollectionEditPart.VISUAL_ID));

+		ViewUtil.insertChildView(containerView, node, index, persisted);

+		node.setElement(domainElement);

+		stampShortcut(containerView, node);

+		// initializeFromPreferences 

+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint

+				.getPreferenceStore();

+

+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(

+				prefStore, IPreferenceConstants.PREF_LINE_COLOR);

+		ViewUtil.setStructuralFeatureValue(node,

+				NotationPackage.eINSTANCE.getLineStyle_LineColor(),

+				FigureUtilities.RGBToInteger(lineRGB));

+		FontStyle nodeFontStyle = (FontStyle) node

+				.getStyle(NotationPackage.Literals.FONT_STYLE);

+		if (nodeFontStyle != null) {

+			FontData fontData = PreferenceConverter.getFontData(prefStore,

+					IPreferenceConstants.PREF_DEFAULT_FONT);

+			nodeFontStyle.setFontName(fontData.getName());

+			nodeFontStyle.setFontHeight(fontData.getHeight());

+			nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);

+			nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);

+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter

+					.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);

+			nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB)

+					.intValue());

+		}

+		Node label5011 = createLabel(node,

+				IntermediateModelVisualIDRegistry

+						.getType(ProcessCollectionPoolNameEditPart.VISUAL_ID));

+		return node;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Node createServiceCollection_2006(EObject domainElement,

+			View containerView, int index, boolean persisted,

+			PreferencesHint preferencesHint) {

+		Node node = NotationFactory.eINSTANCE.createNode();

+		node.getStyles()

+				.add(NotationFactory.eINSTANCE.createDescriptionStyle());

+		node.getStyles().add(NotationFactory.eINSTANCE.createFontStyle());

+		node.getStyles().add(NotationFactory.eINSTANCE.createLineStyle());

+		node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());

+		node.setType(IntermediateModelVisualIDRegistry

+				.getType(ServiceCollectionEditPart.VISUAL_ID));

+		ViewUtil.insertChildView(containerView, node, index, persisted);

+		node.setElement(domainElement);

+		stampShortcut(containerView, node);

+		// initializeFromPreferences 

+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint

+				.getPreferenceStore();

+

+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(

+				prefStore, IPreferenceConstants.PREF_LINE_COLOR);

+		ViewUtil.setStructuralFeatureValue(node,

+				NotationPackage.eINSTANCE.getLineStyle_LineColor(),

+				FigureUtilities.RGBToInteger(lineRGB));

+		FontStyle nodeFontStyle = (FontStyle) node

+				.getStyle(NotationPackage.Literals.FONT_STYLE);

+		if (nodeFontStyle != null) {

+			FontData fontData = PreferenceConverter.getFontData(prefStore,

+					IPreferenceConstants.PREF_DEFAULT_FONT);

+			nodeFontStyle.setFontName(fontData.getName());

+			nodeFontStyle.setFontHeight(fontData.getHeight());

+			nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);

+			nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);

+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter

+					.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);

+			nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB)

+					.intValue());

+		}

+		return node;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Node createProcess_3007(EObject domainElement, View containerView,

+			int index, boolean persisted, PreferencesHint preferencesHint) {

+		Shape node = NotationFactory.eINSTANCE.createShape();

+		node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());

+		node.setType(IntermediateModelVisualIDRegistry

+				.getType(ProcessEditPart.VISUAL_ID));

+		ViewUtil.insertChildView(containerView, node, index, persisted);

+		node.setElement(domainElement);

+		// initializeFromPreferences 

+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint

+				.getPreferenceStore();

+

+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(

+				prefStore, IPreferenceConstants.PREF_LINE_COLOR);

+		ViewUtil.setStructuralFeatureValue(node,

+				NotationPackage.eINSTANCE.getLineStyle_LineColor(),

+				FigureUtilities.RGBToInteger(lineRGB));

+		FontStyle nodeFontStyle = (FontStyle) node

+				.getStyle(NotationPackage.Literals.FONT_STYLE);

+		if (nodeFontStyle != null) {

+			FontData fontData = PreferenceConverter.getFontData(prefStore,

+					IPreferenceConstants.PREF_DEFAULT_FONT);

+			nodeFontStyle.setFontName(fontData.getName());

+			nodeFontStyle.setFontHeight(fontData.getHeight());

+			nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);

+			nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);

+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter

+					.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);

+			nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB)

+					.intValue());

+		}

+		org.eclipse.swt.graphics.RGB fillRGB = PreferenceConverter.getColor(

+				prefStore, IPreferenceConstants.PREF_FILL_COLOR);

+		ViewUtil.setStructuralFeatureValue(node,

+				NotationPackage.eINSTANCE.getFillStyle_FillColor(),

+				FigureUtilities.RGBToInteger(fillRGB));

+		Node label5010 = createLabel(node,

+				IntermediateModelVisualIDRegistry

+						.getType(ProcessNameEditPart.VISUAL_ID));

+		return node;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Node createStep_3008(EObject domainElement, View containerView,

+			int index, boolean persisted, PreferencesHint preferencesHint) {

+		Node node = NotationFactory.eINSTANCE.createNode();

+		node.getStyles()

+				.add(NotationFactory.eINSTANCE.createDescriptionStyle());

+		node.getStyles().add(NotationFactory.eINSTANCE.createFontStyle());

+		node.getStyles().add(NotationFactory.eINSTANCE.createLineStyle());

+		node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());

+		node.setType(IntermediateModelVisualIDRegistry

+				.getType(StepEditPart.VISUAL_ID));

+		ViewUtil.insertChildView(containerView, node, index, persisted);

+		node.setElement(domainElement);

+		// initializeFromPreferences 

+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint

+				.getPreferenceStore();

+

+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(

+				prefStore, IPreferenceConstants.PREF_LINE_COLOR);

+		ViewUtil.setStructuralFeatureValue(node,

+				NotationPackage.eINSTANCE.getLineStyle_LineColor(),

+				FigureUtilities.RGBToInteger(lineRGB));

+		FontStyle nodeFontStyle = (FontStyle) node

+				.getStyle(NotationPackage.Literals.FONT_STYLE);

+		if (nodeFontStyle != null) {

+			FontData fontData = PreferenceConverter.getFontData(prefStore,

+					IPreferenceConstants.PREF_DEFAULT_FONT);

+			nodeFontStyle.setFontName(fontData.getName());

+			nodeFontStyle.setFontHeight(fontData.getHeight());

+			nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);

+			nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);

+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter

+					.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);

+			nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB)

+					.intValue());

+		}

+		Node label5009 = createLabel(node,

+				IntermediateModelVisualIDRegistry

+						.getType(StepNameEditPart.VISUAL_ID));

+		return node;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Node createService_3009(EObject domainElement, View containerView,

+			int index, boolean persisted, PreferencesHint preferencesHint) {

+		Node node = NotationFactory.eINSTANCE.createNode();

+		node.getStyles()

+				.add(NotationFactory.eINSTANCE.createDescriptionStyle());

+		node.getStyles().add(NotationFactory.eINSTANCE.createFontStyle());

+		node.getStyles().add(NotationFactory.eINSTANCE.createLineStyle());

+		node.setLayoutConstraint(NotationFactory.eINSTANCE.createBounds());

+		node.setType(IntermediateModelVisualIDRegistry

+				.getType(ServiceEditPart.VISUAL_ID));

+		ViewUtil.insertChildView(containerView, node, index, persisted);

+		node.setElement(domainElement);

+		// initializeFromPreferences 

+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint

+				.getPreferenceStore();

+

+		org.eclipse.swt.graphics.RGB lineRGB = PreferenceConverter.getColor(

+				prefStore, IPreferenceConstants.PREF_LINE_COLOR);

+		ViewUtil.setStructuralFeatureValue(node,

+				NotationPackage.eINSTANCE.getLineStyle_LineColor(),

+				FigureUtilities.RGBToInteger(lineRGB));

+		FontStyle nodeFontStyle = (FontStyle) node

+				.getStyle(NotationPackage.Literals.FONT_STYLE);

+		if (nodeFontStyle != null) {

+			FontData fontData = PreferenceConverter.getFontData(prefStore,

+					IPreferenceConstants.PREF_DEFAULT_FONT);

+			nodeFontStyle.setFontName(fontData.getName());

+			nodeFontStyle.setFontHeight(fontData.getHeight());

+			nodeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);

+			nodeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);

+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter

+					.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);

+			nodeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB)

+					.intValue());

+		}

+		Node label5012 = createLabel(node,

+				IntermediateModelVisualIDRegistry

+						.getType(ServiceServiceNameEditPart.VISUAL_ID));

+		return node;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Edge createTransition_4009(EObject domainElement,

+			View containerView, int index, boolean persisted,

+			PreferencesHint preferencesHint) {

+		Edge edge = NotationFactory.eINSTANCE.createEdge();

+		edge.getStyles().add(NotationFactory.eINSTANCE.createRoutingStyle());

+		edge.getStyles().add(NotationFactory.eINSTANCE.createFontStyle());

+		RelativeBendpoints bendpoints = NotationFactory.eINSTANCE

+				.createRelativeBendpoints();

+		ArrayList<RelativeBendpoint> points = new ArrayList<RelativeBendpoint>(

+				2);

+		points.add(new RelativeBendpoint());

+		points.add(new RelativeBendpoint());

+		bendpoints.setPoints(points);

+		edge.setBendpoints(bendpoints);

+		ViewUtil.insertChildView(containerView, edge, index, persisted);

+		edge.setType(IntermediateModelVisualIDRegistry

+				.getType(TransitionEditPart.VISUAL_ID));

+		edge.setElement(domainElement);

+		// initializePreferences

+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint

+				.getPreferenceStore();

+		FontStyle edgeFontStyle = (FontStyle) edge

+				.getStyle(NotationPackage.Literals.FONT_STYLE);

+		if (edgeFontStyle != null) {

+			FontData fontData = PreferenceConverter.getFontData(prefStore,

+					IPreferenceConstants.PREF_DEFAULT_FONT);

+			edgeFontStyle.setFontName(fontData.getName());

+			edgeFontStyle.setFontHeight(fontData.getHeight());

+			edgeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);

+			edgeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);

+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter

+					.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);

+			edgeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB)

+					.intValue());

+		}

+		Routing routing = Routing.get(prefStore

+				.getInt(IPreferenceConstants.PREF_LINE_STYLE));

+		if (routing != null) {

+			ViewUtil.setStructuralFeatureValue(edge,

+					NotationPackage.eINSTANCE.getRoutingStyle_Routing(),

+					routing);

+		}

+		return edge;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Edge createStepServiceModel_4010(View containerView, int index,

+			boolean persisted, PreferencesHint preferencesHint) {

+		Edge edge = NotationFactory.eINSTANCE.createEdge();

+		edge.getStyles().add(NotationFactory.eINSTANCE.createRoutingStyle());

+		edge.getStyles().add(NotationFactory.eINSTANCE.createFontStyle());

+		RelativeBendpoints bendpoints = NotationFactory.eINSTANCE

+				.createRelativeBendpoints();

+		ArrayList<RelativeBendpoint> points = new ArrayList<RelativeBendpoint>(

+				2);

+		points.add(new RelativeBendpoint());

+		points.add(new RelativeBendpoint());

+		bendpoints.setPoints(points);

+		edge.setBendpoints(bendpoints);

+		ViewUtil.insertChildView(containerView, edge, index, persisted);

+		edge.setType(IntermediateModelVisualIDRegistry

+				.getType(StepServiceModelEditPart.VISUAL_ID));

+		edge.setElement(null);

+		// initializePreferences

+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint

+				.getPreferenceStore();

+		FontStyle edgeFontStyle = (FontStyle) edge

+				.getStyle(NotationPackage.Literals.FONT_STYLE);

+		if (edgeFontStyle != null) {

+			FontData fontData = PreferenceConverter.getFontData(prefStore,

+					IPreferenceConstants.PREF_DEFAULT_FONT);

+			edgeFontStyle.setFontName(fontData.getName());

+			edgeFontStyle.setFontHeight(fontData.getHeight());

+			edgeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);

+			edgeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);

+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter

+					.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);

+			edgeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB)

+					.intValue());

+		}

+		Routing routing = Routing.get(prefStore

+				.getInt(IPreferenceConstants.PREF_LINE_STYLE));

+		if (routing != null) {

+			ViewUtil.setStructuralFeatureValue(edge,

+					NotationPackage.eINSTANCE.getRoutingStyle_Routing(),

+					routing);

+		}

+		return edge;

+	}

+

+	/**

+	 * @generated

+	 */

+	public Edge createServiceNeeds_4011(View containerView, int index,

+			boolean persisted, PreferencesHint preferencesHint) {

+		Edge edge = NotationFactory.eINSTANCE.createEdge();

+		edge.getStyles().add(NotationFactory.eINSTANCE.createRoutingStyle());

+		edge.getStyles().add(NotationFactory.eINSTANCE.createFontStyle());

+		RelativeBendpoints bendpoints = NotationFactory.eINSTANCE

+				.createRelativeBendpoints();

+		ArrayList<RelativeBendpoint> points = new ArrayList<RelativeBendpoint>(

+				2);

+		points.add(new RelativeBendpoint());

+		points.add(new RelativeBendpoint());

+		bendpoints.setPoints(points);

+		edge.setBendpoints(bendpoints);

+		ViewUtil.insertChildView(containerView, edge, index, persisted);

+		edge.setType(IntermediateModelVisualIDRegistry

+				.getType(ServiceNeedsEditPart.VISUAL_ID));

+		edge.setElement(null);

+		// initializePreferences

+		final IPreferenceStore prefStore = (IPreferenceStore) preferencesHint

+				.getPreferenceStore();

+		FontStyle edgeFontStyle = (FontStyle) edge

+				.getStyle(NotationPackage.Literals.FONT_STYLE);

+		if (edgeFontStyle != null) {

+			FontData fontData = PreferenceConverter.getFontData(prefStore,

+					IPreferenceConstants.PREF_DEFAULT_FONT);

+			edgeFontStyle.setFontName(fontData.getName());

+			edgeFontStyle.setFontHeight(fontData.getHeight());

+			edgeFontStyle.setBold((fontData.getStyle() & SWT.BOLD) != 0);

+			edgeFontStyle.setItalic((fontData.getStyle() & SWT.ITALIC) != 0);

+			org.eclipse.swt.graphics.RGB fontRGB = PreferenceConverter

+					.getColor(prefStore, IPreferenceConstants.PREF_FONT_COLOR);

+			edgeFontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB)

+					.intValue());

+		}

+		Routing routing = Routing.get(prefStore

+				.getInt(IPreferenceConstants.PREF_LINE_STYLE));

+		if (routing != null) {

+			ViewUtil.setStructuralFeatureValue(edge,

+					NotationPackage.eINSTANCE.getRoutingStyle_Routing(),

+					routing);

+		}

+		return edge;

+	}

+

+	/**

+	 * @generated

+	 */

+	private void stampShortcut(View containerView, Node target) {

+		if (!StpIntermediateModelEditPart.MODEL_ID

+				.equals(IntermediateModelVisualIDRegistry

+						.getModelID(containerView))) {

+			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE

+					.createEAnnotation();

+			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$

+			shortcutAnnotation.getDetails().put(

+					"modelID", StpIntermediateModelEditPart.MODEL_ID); //$NON-NLS-1$

+			target.getEAnnotations().add(shortcutAnnotation);

+		}

+	}

+

+	/**

+	 * @generated

+	 */

+	private Node createLabel(View owner, String hint) {

+		DecorationNode rv = NotationFactory.eINSTANCE.createDecorationNode();

+		rv.setType(hint);

+		ViewUtil.insertChildView(owner, rv, ViewUtil.APPEND, true);

+		return rv;

+	}

+

+	/**

+	 * @generated

+	 */

+	private EObject getSemanticElement(IAdaptable semanticAdapter) {

+		if (semanticAdapter == null) {

+			return null;

+		}

+		EObject eObject = (EObject) semanticAdapter.getAdapter(EObject.class);

+		if (eObject != null) {

+			return EMFCoreUtil.resolve(

+					TransactionUtil.getEditingDomain(eObject), eObject);

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	private IElementType getSemanticElementType(IAdaptable semanticAdapter) {

+		if (semanticAdapter == null) {

+			return null;

+		}

+		return (IElementType) semanticAdapter.getAdapter(IElementType.class);

+	}

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/sheet/IntermediateModelPropertySection.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/sheet/IntermediateModelPropertySection.java
new file mode 100755
index 0000000..acb75ef
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/sheet/IntermediateModelPropertySection.java
@@ -0,0 +1,117 @@
+package org.eclipse.soa.mangrove.diagram.sheet;

+

+import java.util.ArrayList;

+import java.util.Iterator;

+

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.emf.common.notify.AdapterFactory;

+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;

+import org.eclipse.emf.edit.provider.IItemPropertySource;

+import org.eclipse.emf.edit.ui.provider.PropertySource;

+import org.eclipse.emf.transaction.TransactionalEditingDomain;

+import org.eclipse.emf.transaction.util.TransactionUtil;

+import org.eclipse.gef.EditPart;

+import org.eclipse.gmf.runtime.diagram.ui.properties.sections.AdvancedPropertySection;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.jface.viewers.ISelection;

+import org.eclipse.jface.viewers.StructuredSelection;

+import org.eclipse.ui.IWorkbenchPart;

+import org.eclipse.ui.views.properties.IPropertySource;

+import org.eclipse.ui.views.properties.IPropertySourceProvider;

+

+/**

+ * @generated

+ */

+public class IntermediateModelPropertySection extends AdvancedPropertySection

+		implements IPropertySourceProvider {

+

+	/**

+	 * @generated

+	 */

+	public IPropertySource getPropertySource(Object object) {

+		if (object instanceof IPropertySource) {

+			return (IPropertySource) object;

+		}

+		AdapterFactory af = getAdapterFactory(object);

+		if (af != null) {

+			IItemPropertySource ips = (IItemPropertySource) af.adapt(object,

+					IItemPropertySource.class);

+			if (ips != null) {

+				return new PropertySource(object, ips);

+			}

+		}

+		if (object instanceof IAdaptable) {

+			return (IPropertySource) ((IAdaptable) object)

+					.getAdapter(IPropertySource.class);

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	protected IPropertySourceProvider getPropertySourceProvider() {

+		return this;

+	}

+

+	/**

+	 * Modify/unwrap selection.

+	 * @generated

+	 */

+	protected Object transformSelection(Object selected) {

+

+		if (selected instanceof EditPart) {

+			Object model = ((EditPart) selected).getModel();

+			return model instanceof View ? ((View) model).getElement() : null;

+		}

+		if (selected instanceof View) {

+			return ((View) selected).getElement();

+		}

+		if (selected instanceof IAdaptable) {

+			View view = (View) ((IAdaptable) selected).getAdapter(View.class);

+			if (view != null) {

+				return view.getElement();

+			}

+		}

+		return selected;

+	}

+

+	/**

+	 * @generated

+	 */

+	public void setInput(IWorkbenchPart part, ISelection selection) {

+		if (selection.isEmpty()

+				|| false == selection instanceof StructuredSelection) {

+			super.setInput(part, selection);

+			return;

+		}

+		final StructuredSelection structuredSelection = ((StructuredSelection) selection);

+		ArrayList transformedSelection = new ArrayList(

+				structuredSelection.size());

+		for (Iterator it = structuredSelection.iterator(); it.hasNext();) {

+			Object r = transformSelection(it.next());

+			if (r != null) {

+				transformedSelection.add(r);

+			}

+		}

+		super.setInput(part, new StructuredSelection(transformedSelection));

+	}

+

+	/**

+	 * @generated

+	 */

+	protected AdapterFactory getAdapterFactory(Object object) {

+		if (getEditingDomain() instanceof AdapterFactoryEditingDomain) {

+			return ((AdapterFactoryEditingDomain) getEditingDomain())

+					.getAdapterFactory();

+		}

+		TransactionalEditingDomain editingDomain = TransactionUtil

+				.getEditingDomain(object);

+		if (editingDomain != null) {

+			return ((AdapterFactoryEditingDomain) editingDomain)

+					.getAdapterFactory();

+		}

+		return null;

+	}

+

+}

diff --git a/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/sheet/IntermediateModelSheetLabelProvider.java b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/sheet/IntermediateModelSheetLabelProvider.java
new file mode 100755
index 0000000..8d91542
--- /dev/null
+++ b/org.eclipse.soa.mangrove.ui/trunk/org.eclipse.soa.mangrove.diagram/src/org/eclipse/soa/mangrove/diagram/sheet/IntermediateModelSheetLabelProvider.java
@@ -0,0 +1,82 @@
+package org.eclipse.soa.mangrove.diagram.sheet;

+

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.gmf.runtime.emf.type.core.IElementType;

+import org.eclipse.gmf.runtime.notation.View;

+import org.eclipse.jface.viewers.BaseLabelProvider;

+import org.eclipse.jface.viewers.ILabelProvider;

+import org.eclipse.jface.viewers.IStructuredSelection;

+import org.eclipse.soa.mangrove.diagram.navigator.IntermediateModelNavigatorGroup;

+import org.eclipse.soa.mangrove.diagram.part.IntermediateModelVisualIDRegistry;

+import org.eclipse.soa.mangrove.diagram.providers.IntermediateModelElementTypes;

+import org.eclipse.swt.graphics.Image;

+

+/**

+ * @generated

+ */

+public class IntermediateModelSheetLabelProvider extends BaseLabelProvider

+		implements ILabelProvider {

+

+	/**

+	 * @generated

+	 */

+	public String getText(Object element) {

+		element = unwrap(element);

+		if (element instanceof IntermediateModelNavigatorGroup) {

+			return ((IntermediateModelNavigatorGroup) element).getGroupName();

+		}

+		IElementType etype = getElementType(getView(element));

+		return etype == null ? "" : etype.getDisplayName();

+	}

+

+	/**

+	 * @generated

+	 */

+	public Image getImage(Object element) {

+		IElementType etype = getElementType(getView(unwrap(element)));

+		return etype == null ? null : IntermediateModelElementTypes

+				.getImage(etype);

+	}

+

+	/**

+	 * @generated

+	 */

+	private Object unwrap(Object element) {

+		if (element instanceof IStructuredSelection) {

+			return ((IStructuredSelection) element).getFirstElement();

+		}

+		return element;

+	}

+

+	/**

+	 * @generated

+	 */

+	private View getView(Object element) {

+		if (element instanceof View) {

+			return (View) element;

+		}

+		if (element instanceof IAdaptable) {

+			return (View) ((IAdaptable) element).getAdapter(View.class);

+		}

+		return null;

+	}

+

+	/**

+	 * @generated

+	 */

+	private IElementType getElementType(View view) {

+		// For intermediate views climb up the containment hierarchy to find the one associated with an element type.

+		while (view != null) {

+			int vid = IntermediateModelVisualIDRegistry.getVisualID(view);

+			IElementType etype = IntermediateModelElementTypes

+					.getElementType(vid);

+			if (etype != null) {

+				return etype;

+			}

+			view = view.eContainer() instanceof View ? (View) view.eContainer()

+					: null;

+		}

+		return null;

+	}

+

+}