diff --git a/README.md b/README.md
index a01a8b1eeff5b81bf8c6aecd56bf330f4e9428e0..97e65600c55767c57ba6b145434d8c10393f25aa 100644
--- a/README.md
+++ b/README.md
@@ -21,11 +21,11 @@ For availability of commercial support, please contact Formal Mind (http://www.f
 - We use gradle to manage the dependencies to the libraries, thus you will need gradle installed on your computer. 
   (see http://www.gradle.org/)
 
-- In the de.prob.releng directory run the downloadCli and collectDependencies tasks (gradle downloadCli collectDependencies). This will download the latest nightly build of the Prolog binary and the required Java libraries (such as apache commons, etc.)
+- In the workspace directory run the completeInstall task (gradle completeInstall), alternatively you can also run the downloadCli and collectDependencies tasks (gradle downloadCli collectDependencies). This will download the latest nightly build of the Prolog binary and the required Java libraries (such as apache commons, etc.)
 
 - Install Eclipse (Indigo/Juno) for RCP Development
 
-- Import the projects into Eclipse. You can leave out de.prob.releng.  At this point Eclipse will complain about errors, the reason is that the target platform (i.e., Rodin) hasn't been setup yet).
+- Import the projects into Eclipse. At this point Eclipse will complain about errors, the reason is that the target platform (i.e., Rodin) hasn't been setup yet).
 
 - Open the file prob_target.target from the de.prob.core project and click on "Set as Target Platform". Grab a coffee. 
 
diff --git a/de.prob.releng/build.gradle b/build.gradle
similarity index 76%
rename from de.prob.releng/build.gradle
rename to build.gradle
index 305917fb15e6f7ee5021f8da9bff4224b75d1a7a..b3b707af1a07cd484b0a4c0c003099f7a460eb65 100644
--- a/de.prob.releng/build.gradle
+++ b/build.gradle
@@ -1,11 +1,22 @@
 
-targetRepositories = ["http://cobra.cs.uni-duesseldorf.de/prob_dev_target/","http://download.eclipse.org/releases/indigo/","http://rodin-b-sharp.sourceforge.net/updates"]	
+targetRepositories = ["http://www.stups.uni-duesseldorf.de/prob_dev_target/","http://download.eclipse.org/releases/indigo/","http://rodin-b-sharp.sourceforge.net/updates"]	
+
+groupID = "de.prob"
 
 apply from: 'tycho_build.gradle'
 
 // Local tasks
 
 
+task bMotionStudioHelpCustumBuild(type: Exec){
+	
+	commandLine 'ant', '-f','de.bmotionstudio.help/customBuild.xml'
+}
+
+install.dependsOn bMotionStudioHelpCustumBuild
+
+completeInstall.dependsOn bMotionStudioHelpCustumBuild
+
 project(':de.prob.core') {
 
 	repositories {
@@ -84,14 +95,19 @@ task downloadCli << {
 	
 }
 
+
+completeInstall.dependsOn downloadCli
+completeInstall.dependsOn subprojects.setClassPath
+
 task deleteOldArtifacts(type: Delete) {
   	String updateSite = workspacePath+'updatesite'
 	delete updateSite
 }
 
 task collectArtifacts(type:Copy) {
-	    from "../"+groupID+'.repository/target/repository/'
-	    into '../updatesite'
-	    from "../index.html"
-	    into '../updatesite'
+	    from workspacePath + groupID+'.repository/target/repository/'
+	    into workspacePath + 'updatesite'
+	    from workspacePath + "index.html"
+	    into workspacePath + 'updatesite'
 }
+
diff --git a/de.bmotionstudio.gef.editor/.classpath b/de.bmotionstudio.gef.editor/.classpath
index 0ebdd2991947f519db624b4393a3de4e1e841303..cb2a56821c95aacfefc3381f5c0fa697013c8516 100644
--- a/de.bmotionstudio.gef.editor/.classpath
+++ b/de.bmotionstudio.gef.editor/.classpath
@@ -1,11 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry exported="true" kind="lib" path="lib/ext/groovy-all-1.8.6.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/ext/antlr-2.7.7.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/ext/asm-4.0.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/ext/groovy-2.0.5.jar"/>
 	<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="src" path="src"/>
-	<classpathentry exported="true" kind="lib" path="lib/ext/xpp3_min-1.1.4c.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/ext/xstream-1.3.1.jar" sourcepath="D:/xstream-distribution-1.3.1-src.zip"/>
-	<classpathentry exported="true" kind="lib" path="lib/ext/animation-1.2.0.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/de.bmotionstudio.gef.editor/META-INF/MANIFEST.MF b/de.bmotionstudio.gef.editor/META-INF/MANIFEST.MF
index 2b1c131339b3221022a735f828e0a7a060cdb714..d51f7c6fbfc3643ab3835dfea27032834f06a5f2 100644
--- a/de.bmotionstudio.gef.editor/META-INF/MANIFEST.MF
+++ b/de.bmotionstudio.gef.editor/META-INF/MANIFEST.MF
@@ -2,60 +2,150 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: BMotion Studio Editor Plug-in
 Bundle-SymbolicName: de.bmotionstudio.gef.editor;singleton:=true
-Bundle-Version: 5.3.2.qualifier
+Bundle-Version: 5.4.0.qualifier
 Bundle-Activator: de.bmotionstudio.gef.editor.BMotionEditorPlugin
 Require-Bundle: org.eclipse.ui;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.ui.ide;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.ui.views;bundle-version="[3.5.0,4.0.0)";visibility:=reexport,
  org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
- org.eclipse.jface;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.core.databinding;bundle-version="[1.2.0,2.0.0)",
  org.eclipse.jface.databinding;bundle-version="[1.2.1,2.0.0)",
  org.eclipse.core.databinding.beans;bundle-version="[1.1.1,2.0.0)",
  org.eclipse.gef;bundle-version="[3.7.0,4.0.0)";visibility:=reexport,
- de.prob.core;bundle-version="[9.2.0,9.3.0)";visibility:=reexport,
+ de.prob.core;bundle-version="[9.3.0,9.4.0)";visibility:=reexport,
  org.eventb.core;bundle-version="[2.1.0,2.6.0)"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Eclipse-BuddyPolicy: registered
+Eclipse-RegisterBuddy: de.prob.core
 Bundle-Vendor: HHU Düsseldorf STUPS Group
-Export-Package: com.thoughtworks.xstream,
- com.thoughtworks.xstream.alias,
- com.thoughtworks.xstream.annotations,
- com.thoughtworks.xstream.converters,
- com.thoughtworks.xstream.converters.basic,
- com.thoughtworks.xstream.converters.collections,
- com.thoughtworks.xstream.converters.enums,
- com.thoughtworks.xstream.converters.extended,
- com.thoughtworks.xstream.converters.javabean,
- com.thoughtworks.xstream.converters.reflection,
- com.thoughtworks.xstream.core,
- com.thoughtworks.xstream.core.util,
- com.thoughtworks.xstream.io,
- com.thoughtworks.xstream.io.binary,
- com.thoughtworks.xstream.io.copy,
- com.thoughtworks.xstream.io.json,
- com.thoughtworks.xstream.io.path,
- com.thoughtworks.xstream.io.xml,
- com.thoughtworks.xstream.io.xml.xppdom,
- com.thoughtworks.xstream.mapper,
- com.thoughtworks.xstream.persistence,
- de.bmotionstudio.gef.editor,
- de.bmotionstudio.gef.editor.attribute,
- de.bmotionstudio.gef.editor.command,
- de.bmotionstudio.gef.editor.edit,
- de.bmotionstudio.gef.editor.editpolicy,
- de.bmotionstudio.gef.editor.figure,
- de.bmotionstudio.gef.editor.library,
- de.bmotionstudio.gef.editor.eventb,
- de.bmotionstudio.gef.editor.model,
- de.bmotionstudio.gef.editor.observer,
- de.bmotionstudio.gef.editor.part,
- de.bmotionstudio.gef.editor.property,
- de.bmotionstudio.gef.editor.scheduler,
- de.bmotionstudio.gef.editor.util
-Bundle-ClassPath: lib/ext/xpp3_min-1.1.4c.jar,
- lib/ext/xstream-1.3.1.jar,
- lib/ext/animation-1.2.0.jar,
- .,
- lib/ext/groovy-all-1.8.6.jar
+Export-Package: de.bmotionstudio.gef.editor;
+  uses:="org.eclipse.jface.wizard,
+   org.eclipse.core.runtime,
+   de.prob.core,
+   org.eclipse.gef.editparts,
+   org.eclipse.gef.palette,
+   org.eclipse.jface.action,
+   org.eclipse.gef.commands,
+   org.eclipse.core.resources,
+   org.eclipse.jface.viewers,
+   de.bmotionstudio.gef.editor.model,
+   org.eclipse.gef.ui.parts,
+   org.eclipse.gef,
+   org.eclipse.gef.ui.properties,
+   org.eclipse.jface.resource,
+   org.eclipse.gef.ui.actions,
+   org.eclipse.ui,
+   org.eclipse.ui.views.properties,
+   org.eclipse.ui.plugin,
+   de.bmotionstudio.gef.editor.part,
+   com.thoughtworks.xstream,
+   org.eclipse.ui.part,
+   org.eclipse.draw2d,
+   de.prob.core.domainobjects,
+   org.eclipse.gef.requests,
+   org.eclipse.swt.graphics,
+   org.osgi.framework,
+   org.eclipse.swt.widgets,
+   org.eclipse.gef.ui.palette",
+ de.bmotionstudio.gef.editor.attribute;uses:="org.eclipse.ui.views.properties,de.bmotionstudio.gef.editor.model",
+ de.bmotionstudio.gef.editor.command;
+  uses:="de.bmotionstudio.gef.editor.observer,
+   org.eclipse.gef.commands,
+   org.eclipse.draw2d.geometry,
+   de.bmotionstudio.gef.editor.model,
+   de.bmotionstudio.gef.editor.scheduler",
+ de.bmotionstudio.gef.editor.edit;
+  uses:="org.eclipse.jface.window,
+   org.eclipse.core.databinding,
+   de.bmotionstudio.gef.editor.part,
+   org.eclipse.draw2d,
+   org.eclipse.gef.tools,
+   org.eclipse.jface.databinding.viewers,
+   org.eclipse.jface.fieldassist,
+   org.eclipse.core.databinding.observable.value,
+   org.eclipse.jface.bindings.keys,
+   org.eclipse.jface.viewers,
+   org.eclipse.swt.graphics,
+   de.bmotionstudio.gef.editor.model,
+   org.eclipse.swt.widgets",
+ de.bmotionstudio.gef.editor.editpolicy;
+  uses:="org.eclipse.gef.commands,
+   org.eclipse.gef.requests,
+   org.eclipse.draw2d.geometry,
+   de.bmotionstudio.gef.editor.model,
+   org.eclipse.gef.editpolicies,
+   org.eclipse.draw2d,
+   org.eclipse.gef",
+ de.bmotionstudio.gef.editor.eventb;
+  uses:="org.eventb.core.basis,
+   org.eclipse.core.resources,
+   org.eventb.core.ast,
+   org.eventb.core,
+   de.bmotionstudio.gef.editor.model,
+   de.bmotionstudio.gef.editor",
+ de.bmotionstudio.gef.editor.figure;
+  uses:="org.eclipse.draw2d.geometry,
+   org.eclipse.swt.graphics,
+   de.bmotionstudio.gef.editor.model,
+   org.eclipse.draw2d",
+ de.bmotionstudio.gef.editor.library;
+  uses:="org.eclipse.ui,
+   org.eclipse.ui.part,
+   de.bmotionstudio.gef.editor,
+   org.eclipse.jface.action,
+   org.eclipse.gef.dnd,
+   org.eclipse.gef.commands,
+   org.eclipse.jface.viewers,
+   org.eclipse.swt.graphics,
+   org.eclipse.draw2d.geometry,
+   de.bmotionstudio.gef.editor.model,
+   org.eclipse.swt.widgets,
+   org.eclipse.gef",
+ de.bmotionstudio.gef.editor.model;
+  uses:="org.eclipse.core.runtime,
+   de.bmotionstudio.gef.editor.attribute,
+   de.bmotionstudio.gef.editor,
+   de.bmotionstudio.gef.editor.observer,
+   org.eclipse.gef.commands,
+   org.eclipse.core.resources,
+   org.eclipse.swt.graphics,
+   org.eclipse.draw2d.geometry,
+   org.eclipse.gef.rulers,
+   de.bmotionstudio.gef.editor.scheduler",
+ de.bmotionstudio.gef.editor.observer;
+  uses:="org.eclipse.swt.graphics,
+   de.bmotionstudio.gef.editor.model,
+   org.eclipse.draw2d,
+   de.bmotionstudio.gef.editor.scheduler,
+   de.bmotionstudio.gef.editor",
+ de.bmotionstudio.gef.editor.part;
+  uses:="de.bmotionstudio.gef.editor.observer,
+   org.eclipse.core.runtime,
+   org.eclipse.gef.editparts,
+   org.eclipse.swt.graphics,
+   de.bmotionstudio.gef.editor.model,
+   org.eclipse.draw2d,
+   de.bmotionstudio.gef.editor.library,
+   org.eclipse.gef",
+ de.bmotionstudio.gef.editor.property;
+  uses:="org.eclipse.swt.events,
+   org.eclipse.ui.views.properties,
+   org.eclipse.swt.graphics,
+   org.eclipse.jface.viewers,
+   org.eclipse.swt.widgets,
+   org.eclipse.jface.dialogs,
+   de.bmotionstudio.gef.editor.library",
+ de.bmotionstudio.gef.editor.scheduler;
+  uses:="de.bmotionstudio.gef.editor.observer,
+   org.eclipse.swt.graphics,
+   de.bmotionstudio.gef.editor.model,
+   de.bmotionstudio.gef.editor",
+ de.bmotionstudio.gef.editor.util;
+  uses:="org.eclipse.jface.viewers,
+   de.bmotionstudio.gef.editor.model,
+   org.eclipse.swt.widgets,
+   de.bmotionstudio.gef.editor"
+Bundle-ClassPath: .,
+ lib/ext/groovy-2.0.5.jar,
+ lib/ext/asm-4.0.jar,
+ lib/ext/antlr-2.7.7.jar
diff --git a/de.bmotionstudio.gef.editor/build.properties b/de.bmotionstudio.gef.editor/build.properties
index 1243f18c1c52ce2e7e47bf70e1289a643ef7c821..a433f56191f5a8f12e1f8259edcce7e36b0298d2 100644
--- a/de.bmotionstudio.gef.editor/build.properties
+++ b/de.bmotionstudio.gef.editor/build.properties
@@ -5,6 +5,5 @@ bin.includes = plugin.xml,\
                .,\
                icons/,\
                schema/,\
-               lib/,\
-               lib/ext/groovy-all-1.8.6.jar
+               lib/ext/
 
diff --git a/de.bmotionstudio.gef.editor/icons/eclipse16/caught_ovr.gif b/de.bmotionstudio.gef.editor/icons/eclipse16/caught_ovr.gif
new file mode 100644
index 0000000000000000000000000000000000000000..02de6e8a1f6b3c25436285fad6236364d0ccd0fa
Binary files /dev/null and b/de.bmotionstudio.gef.editor/icons/eclipse16/caught_ovr.gif differ
diff --git a/de.bmotionstudio.gef.editor/icons/eclipse16/caught_ovr_d.gif b/de.bmotionstudio.gef.editor/icons/eclipse16/caught_ovr_d.gif
new file mode 100644
index 0000000000000000000000000000000000000000..7c7e6dd3350d9534fe8cde6a1a57d0a15b3540af
Binary files /dev/null and b/de.bmotionstudio.gef.editor/icons/eclipse16/caught_ovr_d.gif differ
diff --git a/de.bmotionstudio.gef.editor/icons/eclipse16/smartmode_co.gif b/de.bmotionstudio.gef.editor/icons/eclipse16/smartmode_co.gif
new file mode 100644
index 0000000000000000000000000000000000000000..542dddca3f29bc0bdb8149eafc372c37c6a0b1fd
Binary files /dev/null and b/de.bmotionstudio.gef.editor/icons/eclipse16/smartmode_co.gif differ
diff --git a/de.bmotionstudio.gef.editor/icons/eclipse16/uncaught_ovr.gif b/de.bmotionstudio.gef.editor/icons/eclipse16/uncaught_ovr.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6c06996c59ce22e74a0d13be0f0fe1ee2eb23932
Binary files /dev/null and b/de.bmotionstudio.gef.editor/icons/eclipse16/uncaught_ovr.gif differ
diff --git a/de.bmotionstudio.gef.editor/icons/eclipse16/uncaught_ovr_d.gif b/de.bmotionstudio.gef.editor/icons/eclipse16/uncaught_ovr_d.gif
new file mode 100644
index 0000000000000000000000000000000000000000..b25010f273841e5f985a3afb4f8eaaef434cf2b8
Binary files /dev/null and b/de.bmotionstudio.gef.editor/icons/eclipse16/uncaught_ovr_d.gif differ
diff --git a/de.bmotionstudio.gef.editor/icons/eclipse16/updated_co.gif b/de.bmotionstudio.gef.editor/icons/eclipse16/updated_co.gif
new file mode 100644
index 0000000000000000000000000000000000000000..0d686ab4593b4242cc91a9e79bbbd4bf177f1d69
Binary files /dev/null and b/de.bmotionstudio.gef.editor/icons/eclipse16/updated_co.gif differ
diff --git a/de.bmotionstudio.gef.editor/icons/eclipse16/updated_col.gif b/de.bmotionstudio.gef.editor/icons/eclipse16/updated_col.gif
new file mode 100644
index 0000000000000000000000000000000000000000..cab08b4083c5102f7c5f203ee59e7e605dcd11a2
Binary files /dev/null and b/de.bmotionstudio.gef.editor/icons/eclipse16/updated_col.gif differ
diff --git a/de.bmotionstudio.gef.editor/icons/icon_bringtobottom.gif b/de.bmotionstudio.gef.editor/icons/icon_bringtobottom.gif
deleted file mode 100644
index 274f6f0dfcb2aa75701585a99b4e03c2289d008f..0000000000000000000000000000000000000000
Binary files a/de.bmotionstudio.gef.editor/icons/icon_bringtobottom.gif and /dev/null differ
diff --git a/de.bmotionstudio.gef.editor/icons/icon_bringtobottomstep.gif b/de.bmotionstudio.gef.editor/icons/icon_bringtobottomstep.gif
deleted file mode 100644
index 80b09d8774d1377f7abbdc59b8421781f306ae0c..0000000000000000000000000000000000000000
Binary files a/de.bmotionstudio.gef.editor/icons/icon_bringtobottomstep.gif and /dev/null differ
diff --git a/de.bmotionstudio.gef.editor/icons/icon_bringtotop.gif b/de.bmotionstudio.gef.editor/icons/icon_bringtotop.gif
deleted file mode 100644
index 20d2a1527a77b343e2fdcc9f5c68ba14ef3713f8..0000000000000000000000000000000000000000
Binary files a/de.bmotionstudio.gef.editor/icons/icon_bringtotop.gif and /dev/null differ
diff --git a/de.bmotionstudio.gef.editor/icons/icon_bringtotopstep.gif b/de.bmotionstudio.gef.editor/icons/icon_bringtotopstep.gif
deleted file mode 100644
index a1631a01d725320c62d59798c8c5e80997b74288..0000000000000000000000000000000000000000
Binary files a/de.bmotionstudio.gef.editor/icons/icon_bringtotopstep.gif and /dev/null differ
diff --git a/de.bmotionstudio.gef.editor/icons/icon_invisible.gif b/de.bmotionstudio.gef.editor/icons/icon_invisible.gif
new file mode 100644
index 0000000000000000000000000000000000000000..2b5ef47f3c817f65e6f2b16eed6091735fc6588c
Binary files /dev/null and b/de.bmotionstudio.gef.editor/icons/icon_invisible.gif differ
diff --git a/de.bmotionstudio.gef.editor/icons/icon_signal.gif b/de.bmotionstudio.gef.editor/icons/icon_signal.gif
new file mode 100644
index 0000000000000000000000000000000000000000..ee4876b95526aa12a17cc3713708b6896664e417
Binary files /dev/null and b/de.bmotionstudio.gef.editor/icons/icon_signal.gif differ
diff --git a/de.bmotionstudio.gef.editor/icons/icon_switch.gif b/de.bmotionstudio.gef.editor/icons/icon_switch.gif
new file mode 100644
index 0000000000000000000000000000000000000000..241ab08a60917d3580b7769bf2bcfb0eb83bc3d9
Binary files /dev/null and b/de.bmotionstudio.gef.editor/icons/icon_switch.gif differ
diff --git a/de.bmotionstudio.gef.editor/icons/icon_tank.gif b/de.bmotionstudio.gef.editor/icons/icon_tank.gif
new file mode 100644
index 0000000000000000000000000000000000000000..f5a20232c661c5afea954c41cb11a8d839e407b2
Binary files /dev/null and b/de.bmotionstudio.gef.editor/icons/icon_tank.gif differ
diff --git a/de.bmotionstudio.gef.editor/icons/icon_track.gif b/de.bmotionstudio.gef.editor/icons/icon_track.gif
new file mode 100644
index 0000000000000000000000000000000000000000..bffb895aecfd7b28da7ce1ad3fbdaf0944e35072
Binary files /dev/null and b/de.bmotionstudio.gef.editor/icons/icon_track.gif differ
diff --git a/de.bmotionstudio.gef.editor/icons/icon_tracknode.gif b/de.bmotionstudio.gef.editor/icons/icon_tracknode.gif
new file mode 100644
index 0000000000000000000000000000000000000000..cfe56a4a424ee501a3c17c0b235d692227806ac2
Binary files /dev/null and b/de.bmotionstudio.gef.editor/icons/icon_tracknode.gif differ
diff --git a/de.bmotionstudio.gef.editor/lib/ext/animation-1.2.0.jar b/de.bmotionstudio.gef.editor/lib/ext/animation-1.2.0.jar
deleted file mode 100644
index 8b763ca7874bde10b122e7988c525454b04faee1..0000000000000000000000000000000000000000
Binary files a/de.bmotionstudio.gef.editor/lib/ext/animation-1.2.0.jar and /dev/null differ
diff --git a/de.bmotionstudio.gef.editor/lib/ext/antlr-2.7.7.jar b/de.bmotionstudio.gef.editor/lib/ext/antlr-2.7.7.jar
new file mode 100644
index 0000000000000000000000000000000000000000..5e5f14b35584eac2a9f0f888769f0ab93ca6d849
Binary files /dev/null and b/de.bmotionstudio.gef.editor/lib/ext/antlr-2.7.7.jar differ
diff --git a/de.bmotionstudio.gef.editor/lib/ext/asm-4.0.jar b/de.bmotionstudio.gef.editor/lib/ext/asm-4.0.jar
new file mode 100644
index 0000000000000000000000000000000000000000..cca0d9cebf10f36c1f377a0f5534a8728f529a6b
Binary files /dev/null and b/de.bmotionstudio.gef.editor/lib/ext/asm-4.0.jar differ
diff --git a/de.bmotionstudio.gef.editor/lib/ext/groovy-2.0.5.jar b/de.bmotionstudio.gef.editor/lib/ext/groovy-2.0.5.jar
new file mode 100644
index 0000000000000000000000000000000000000000..f0ad9f47048ce6d2b04be8a879846d4aaf5ffcb7
Binary files /dev/null and b/de.bmotionstudio.gef.editor/lib/ext/groovy-2.0.5.jar differ
diff --git a/de.bmotionstudio.gef.editor/lib/ext/groovy-all-1.8.6.jar b/de.bmotionstudio.gef.editor/lib/ext/groovy-all-1.8.6.jar
deleted file mode 100644
index 03c02efae3759e2ba7d2a5766ade154550202ded..0000000000000000000000000000000000000000
Binary files a/de.bmotionstudio.gef.editor/lib/ext/groovy-all-1.8.6.jar and /dev/null differ
diff --git a/de.bmotionstudio.gef.editor/lib/ext/xpp3_min-1.1.4c.jar b/de.bmotionstudio.gef.editor/lib/ext/xpp3_min-1.1.4c.jar
deleted file mode 100644
index 813a9a830bd0c09bfb45084633ccbe88ba64498f..0000000000000000000000000000000000000000
Binary files a/de.bmotionstudio.gef.editor/lib/ext/xpp3_min-1.1.4c.jar and /dev/null differ
diff --git a/de.bmotionstudio.gef.editor/lib/ext/xstream-1.3.1.jar b/de.bmotionstudio.gef.editor/lib/ext/xstream-1.3.1.jar
deleted file mode 100644
index 4ef4219c6f62944a898fd5bec4bfeb8671109d5b..0000000000000000000000000000000000000000
Binary files a/de.bmotionstudio.gef.editor/lib/ext/xstream-1.3.1.jar and /dev/null differ
diff --git a/de.bmotionstudio.gef.editor/plugin.xml b/de.bmotionstudio.gef.editor/plugin.xml
index 5be99e2974e7bb3004ff6166878b13223ed00f95..f1d465afcd7efc7c5ebae8ca9f8eeb8541137848 100644
--- a/de.bmotionstudio.gef.editor/plugin.xml
+++ b/de.bmotionstudio.gef.editor/plugin.xml
@@ -142,13 +142,13 @@
    <extension
          point="de.prob.core.animation">
       <listener
-            class="de.bmotionstudio.gef.editor.animation.StaticListenerRegistry">
+            class="de.bmotionstudio.gef.editor.StaticListenerRegistry">
       </listener>
    </extension>
    <extension
          point="de.prob.core.lifecycle">
       <listener
-            class="de.bmotionstudio.gef.editor.animation.StaticListenerRegistry">
+            class="de.bmotionstudio.gef.editor.StaticListenerRegistry">
       </listener>
    </extension>
    <extension
@@ -255,6 +255,56 @@
             name="Cell"
             service="de.bmotionstudio.gef.editor.service.BTableCellService">
       </control>
+      <control
+            groupid="de.bmotionstudio.gef.editor.railway.group"
+            icon="icons/icon_signal.gif"
+            id="de.bmotionstudio.gef.editor.signal"
+            name="Signal"
+            service="de.bmotionstudio.gef.editor.service.SignalService">
+      </control>
+      <control
+            groupid="de.bmotionstudio.gef.editor.railway.group"
+            icon="icons/eclipse16/smartmode_co.gif"
+            id="de.bmotionstudio.gef.editor.light"
+            name="Light"
+            service="de.bmotionstudio.gef.editor.service.LightService">
+      </control>
+      <control
+            groupid="de.bmotionstudio.gef.editor.industry.group"
+            icon="icons/icon_tank.gif"
+            id="de.bmotionstudio.gef.editor.tank"
+            name="Tank"
+            service="de.bmotionstudio.gef.editor.service.TankService">
+      </control>
+      <control
+            groupid="de.bmotionstudio.gef.editor.railway.group"
+            icon="icons/icon_tracknode.gif"
+            id="de.bmotionstudio.gef.editor.tracknode"
+            name="Node"
+            service="de.bmotionstudio.gef.editor.service.TrackNodeService">
+      </control>
+      <control
+            groupid="de.bmotionstudio.gef.editor.railway.group"
+            icon="icons/icon_track.gif"
+            id="de.bmotionstudio.gef.editor.track"
+            name="Trac"
+            service="de.bmotionstudio.gef.editor.service.TrackService">
+      </control>
+      <control
+            groupid="de.bmotionstudio.gef.editor.railway.group"
+            icon="icons/icon_switch.gif"
+            id="de.bmotionstudio.gef.editor.switch"
+            name="Switch"
+            service="de.bmotionstudio.gef.editor.service.SwitchService">
+      </control>
+      <group
+            id="de.bmotionstudio.gef.editor.railway.group"
+            name="Railway">
+      </group>
+      <group
+            id="de.bmotionstudio.gef.editor.industry.group"
+            name="Industry">
+      </group>
    </extension>
    <extension
          point="de.bmotionstudio.gef.editor.observer">
@@ -290,6 +340,10 @@
             class="de.bmotionstudio.gef.editor.observer.ExternalObserverScript"
             name="External Observer Script">
       </observer>
+      <observer
+            class="de.bmotionstudio.gef.editor.observer.TableObserver"
+            name="Table Observer">
+      </observer>
       <observer
             class="de.bmotionstudio.gef.editor.observer.ColumnObserver"
             name="Column Observer">
@@ -380,6 +434,24 @@
             <control
                   id="de.bmotionstudio.gef.editor.table">
             </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.tablecolumn">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.signal">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.tank">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.switch">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.track">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.light">
+            </control>            
          </observer>
          <observer
                id="de.bmotionstudio.gef.editor.observer.SwitchCoordinates">
@@ -413,6 +485,15 @@
             <control
                   id="de.bmotionstudio.gef.editor.table">
             </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.signal">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.tank">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.switch">
+            </control>            
          </observer>
          <observer
                id="de.bmotionstudio.gef.editor.observer.SimpleValueDisplay">
@@ -470,6 +551,24 @@
             <control
                   id="de.bmotionstudio.gef.editor.table">
             </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.tablecolumn">
+            </control>
+          <control
+                  id="de.bmotionstudio.gef.editor.signal">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.tank">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.switch">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.track">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.light">
+            </control>                
          </observer>
          <observer
                id="de.bmotionstudio.gef.editor.observer.SwitchChildCoordinates">
@@ -518,6 +617,24 @@
             <control
                   id="de.bmotionstudio.gef.editor.table">
             </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.tablecolumn">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.light">
+            </control>    
+            <control
+                  id="de.bmotionstudio.gef.editor.signal">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.switch">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.track">
+            </control>
+            <control
+                  id="de.bmotionstudio.gef.editor.tracknode">
+            </control>                            
          </observer>
          <observer
                id="de.bmotionstudio.gef.editor.observer.SwitchImage">
@@ -540,6 +657,12 @@
                   id="de.bmotionstudio.gef.editor.tablecolumn">
             </control>
          </observer>
-      </include>
+         <observer
+               id="de.bmotionstudio.gef.editor.observer.TableObserver">
+            <control
+                  id="de.bmotionstudio.gef.editor.table">
+            </control>
+         </observer>
+      </include>   
    </extension>   
 </plugin>
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/AbstractBControlService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/AbstractBControlService.java
index f0a5f6c8febb8efdc0da4eb6b840e2d4792b7c50..3f3fd561503b1fa2b0afb3cd0dc629e141ddc594 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/AbstractBControlService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/AbstractBControlService.java
@@ -13,6 +13,8 @@ import org.eclipse.ui.plugin.AbstractUIPlugin;
 
 import de.bmotionstudio.gef.editor.internal.BControlTemplate;
 import de.bmotionstudio.gef.editor.model.Visualization;
+import de.bmotionstudio.gef.editor.part.BControlTreeEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractTreeEditPart;
 
 /**
  * @author Lukas Ladenberger
@@ -40,4 +42,8 @@ public abstract class AbstractBControlService {
 		return true;
 	}
 
+	public BMSAbstractTreeEditPart createTreeEditPart() {
+		return new BControlTreeEditPart();
+	}
+
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/Animation.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/Animation.java
index 736d82ce4494168f138ef4a9d5975d56b4a8084e..0725ead409ccbc55cc3a602e498d3189b6ba9b9c 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/Animation.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/Animation.java
@@ -13,7 +13,6 @@ import java.util.Map;
 
 import org.eclipse.swt.widgets.Display;
 
-import de.bmotionstudio.gef.editor.animation.StaticListenerRegistry;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.Visualization;
 import de.prob.core.Animator;
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/AttributeConstants.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/AttributeConstants.java
index 56ddf9afb27f53172c11eb238f659cb74684dda4..664615ca8d4eb21b522bf5b08cdc3d618283e8b6 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/AttributeConstants.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/AttributeConstants.java
@@ -51,6 +51,19 @@ public final class AttributeConstants {
 	public static final String ATTRIBUTE_COORDINATES = "de.bmotionstudio.gef.editor.attribute.BAttributeCoordinates";
 	public static final String ATTRIBUTE_MISC = "de.bmotionstudio.gef.editor.attribute.BAttributeMisc";
 	public static final String ATTRIBUTE_MAIN = "de.bmotionstudio.gef.editor.attribute.BAttributeMain";
+	public static final String ATTRIBUTE_CONNECTION = "de.bmotionstudio.gef.editor.attribute.BAttributeConnection";
+
+	public static final String ATTRIBUTE_TRACK_DIRECTION = "de.bmotionstudio.gef.editor.attribute.AttributeTrackDirection";
+	public static final String ATTRIBUTE_SWITCH_DIRECTION = "de.bmotionstudio.gef.editor.attribute.AttributeSwitchDirection";
+	public static final String ATTRIBUTE_SWITCH_POSITION = "de.bmotionstudio.gef.editor.attribute.AttributeSwitchPosition";
+	public static final String ATTRIBUTE_SIGNAL_COLOR = "de.bmotionstudio.gef.editor.attribute.AttributeSignalColor";
+	public static final String ATTRIBUTE_LIGHTS = "de.bmotionstudio.gef.editor.attribute.AttributeLights";
+	public static final String ATTRIBUTE_FILL_HEIGHT = "de.bmotionstudio.gef.editor.attribute.AttributeFillHeight";
+	public static final String ATTRIBUTE_FILL_COLOR = "de.bmotionstudio.gef.editor.attribute.AttributeFillColor";
+	public static final String ATTRIBUTE_SHOWS_MEASURE = "de.bmotionstudio.gef.editor.attribute.AttributeShowMeasure";
+	public static final String ATTRIBUTE_MEASURE_MAXPOS = "de.bmotionstudio.gef.editor.attribute.AttributeMeasureMaxPos";
+	public static final String ATTRIBUTE_MEASURE_INTERVAL = "de.bmotionstudio.gef.editor.attribute.AttributeMeasureInterval";
+	public static final String ATTRIBUTE_BLOCKS = "de.bmotionstudio.gef.editor.attribute.AttributeBlocks";
 
 	public static final String EVENT_MOUSECLICK = "de.bmotionstudio.gef.editor.event.OnClickEvent";
 	public static final String EVENT_MOUSEDBLCLICK = "de.bmotionstudio.gef.editor.event.OnDblClickEvent";
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/AppContextMenuProvider.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSContextMenuProvider.java
similarity index 64%
rename from de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/AppContextMenuProvider.java
rename to de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSContextMenuProvider.java
index 221e61ab8575c5fd656f01a173c4c8bf4c58ff7b..9822355aa3049caf66bd4c8c764786da49fd4053 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/AppContextMenuProvider.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMSContextMenuProvider.java
@@ -14,6 +14,7 @@ import org.eclipse.core.runtime.IExtensionRegistry;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.gef.ContextMenuProvider;
 import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.editparts.AbstractEditPart;
 import org.eclipse.gef.ui.actions.ActionRegistry;
 import org.eclipse.gef.ui.actions.GEFActionConstants;
 import org.eclipse.jface.action.IAction;
@@ -24,11 +25,11 @@ import org.eclipse.ui.actions.ActionFactory;
 
 import de.bmotionstudio.gef.editor.action.OpenSchedulerEventAction;
 import de.bmotionstudio.gef.editor.model.BControl;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
-import de.bmotionstudio.gef.editor.part.VisualizationPart;
+import de.bmotionstudio.gef.editor.model.ObserverRootVirtualTreeNode;
+import de.bmotionstudio.gef.editor.model.Visualization;
 import de.bmotionstudio.gef.editor.scheduler.SchedulerEvent;
 
-public class AppContextMenuProvider extends ContextMenuProvider {
+public class BMSContextMenuProvider extends ContextMenuProvider {
 
 	private ActionRegistry actionRegistry;
 
@@ -36,7 +37,7 @@ public class AppContextMenuProvider extends ContextMenuProvider {
 
 	private String[] eventIDs = { AttributeConstants.EVENT_MOUSECLICK };
 
-	public AppContextMenuProvider(EditPartViewer viewer, ActionRegistry registry) {
+	public BMSContextMenuProvider(EditPartViewer viewer, ActionRegistry registry) {
 		super(viewer);
 		setActionRegistry(registry);
 	}
@@ -54,42 +55,53 @@ public class AppContextMenuProvider extends ContextMenuProvider {
 		action = getActionRegistry().getAction(ActionFactory.REDO.getId());
 		menu.appendToGroup(GEFActionConstants.GROUP_UNDO, action);
 
-		action = actionRegistry.getAction(ActionFactory.COPY.getId());
+		action = getActionRegistry().getAction(ActionFactory.COPY.getId());
 		menu.appendToGroup(GEFActionConstants.GROUP_COPY, action);
 
-		action = actionRegistry.getAction(ActionFactory.PASTE.getId());
+		action = getActionRegistry().getAction(ActionFactory.PASTE.getId());
 		menu.appendToGroup(GEFActionConstants.GROUP_COPY, action);
 
 		action = getActionRegistry().getAction(ActionFactory.DELETE.getId());
 		menu.appendToGroup(GEFActionConstants.GROUP_EDIT, action);
 
-		buildCustomMenu(menu);
+		Object sel = ((IStructuredSelection) getViewer().getSelection())
+				.getFirstElement();
 
-		buildObserverMenu(menu);
-
-		buildEventMenu(menu);
+		if (sel instanceof AbstractEditPart) {
+			AbstractEditPart editPart = (AbstractEditPart) sel;
+			buildCustomMenu(menu, editPart);
+			buildObserverMenu(menu, editPart);
+			buildEventMenu(menu, editPart);
+		}
 
 	}
 
-	private void buildCustomMenu(IMenuManager menu) {
+	private void buildCustomMenu(IMenuManager menu, AbstractEditPart editPart) {
 
-		IExtensionPoint extensionPoint = registry
-				.getExtensionPoint("de.bmotionstudio.gef.editor.installMenu");
-		for (IExtension extension : extensionPoint.getExtensions()) {
-			for (IConfigurationElement configurationElement : extension
-					.getConfigurationElements()) {
+		Object model = editPart.getModel();
 
-				if ("menu".equals(configurationElement.getName())) {
+		if (model instanceof BControl) {
 
-					try {
+			IExtensionPoint extensionPoint = registry
+					.getExtensionPoint("de.bmotionstudio.gef.editor.installMenu");
+			for (IExtension extension : extensionPoint.getExtensions()) {
+				for (IConfigurationElement configurationElement : extension
+						.getConfigurationElements()) {
+
+					if ("menu".equals(configurationElement.getName())) {
+
+						try {
+
+							IInstallMenu installMenuClass = (IInstallMenu) configurationElement
+									.createExecutableExtension("class");
 
-						IInstallMenu installMenuClass = (IInstallMenu) configurationElement
-								.createExecutableExtension("class");
+							installMenuClass.installMenu(menu,
+									getActionRegistry());
 
-						installMenuClass.installMenu(menu, getActionRegistry());
+						} catch (final CoreException e) {
+							e.printStackTrace();
+						}
 
-					} catch (final CoreException e) {
-						e.printStackTrace();
 					}
 
 				}
@@ -100,55 +112,55 @@ public class AppContextMenuProvider extends ContextMenuProvider {
 
 	}
 
-	private void buildObserverMenu(IMenuManager menu) {
+	private void buildObserverMenu(IMenuManager menu, AbstractEditPart editPart) {
+
+		Object model = editPart.getModel();
+
+		BControl bcontrol = null;
+
+		if (model instanceof BControl)
+			bcontrol = (BControl) model;
+		else if (model instanceof ObserverRootVirtualTreeNode)
+			bcontrol = ((ObserverRootVirtualTreeNode) model).getControl();
+		else
+			return;
 
-		final MenuManager handleObserverMenu = new MenuManager("Observers",
+		final MenuManager handleObserverMenu = new MenuManager("Observer",
 				BMotionStudioImage.getImageDescriptor(
 						BMotionEditorPlugin.PLUGIN_ID,
 						"icons/icon_observer.gif"), "observerMenu");
 		menu.appendToGroup(GEFActionConstants.GROUP_ADD, handleObserverMenu);
 
-		IStructuredSelection selection = (IStructuredSelection) BMotionEditorPlugin
-				.getActiveEditor().getEditorSite().getSelectionProvider()
-				.getSelection();
-
-		if (selection.getFirstElement() instanceof AppAbstractEditPart) {
-
-			BControl bcontrol = (BControl) ((AppAbstractEditPart) selection
-					.getFirstElement()).getModel();
-
-			IExtensionPoint extensionPoint = registry
-					.getExtensionPoint("de.bmotionstudio.gef.editor.observer");
-			for (IExtension extension : extensionPoint.getExtensions()) {
-				for (IConfigurationElement configurationElement : extension
-						.getConfigurationElements()) {
-
-					if ("observer".equals(configurationElement.getName())) {
+		IExtensionPoint extensionPoint = registry
+				.getExtensionPoint("de.bmotionstudio.gef.editor.observer");
+		for (IExtension extension : extensionPoint.getExtensions()) {
+			for (IConfigurationElement configurationElement : extension
+					.getConfigurationElements()) {
 
-						final String observerClassName = configurationElement
-								.getAttribute("class");
-						final String observerName = configurationElement
-								.getAttribute("name");
+				if ("observer".equals(configurationElement.getName())) {
 
-						if (checkIncludeObserver(observerClassName, bcontrol)) {
+					final String observerClassName = configurationElement
+							.getAttribute("class");
+					final String observerName = configurationElement
+							.getAttribute("name");
 
-							IAction action = getActionRegistry().getAction(
-									"de.bmotionstudio.gef.editor.observerAction."
-											+ observerClassName);
-							action.setText(observerName);
-							action.setToolTipText(observerName);
+					if (checkIncludeObserver(observerClassName, bcontrol)) {
 
-							if (bcontrol.hasObserver(observerClassName)) {
-								action.setImageDescriptor(BMotionStudioImage
-										.getImageDescriptor(
-												BMotionEditorPlugin.PLUGIN_ID,
-												"icons/icon_chop.gif"));
-							} else {
-								action.setImageDescriptor(null);
-							}
-							handleObserverMenu.add(action);
+						IAction action = getActionRegistry().getAction(
+								"de.bmotionstudio.gef.editor.observerAction."
+										+ observerClassName);
+						action.setText(observerName);
+						action.setToolTipText(observerName);
 
+						if (bcontrol.hasObserver(observerClassName)) {
+							action.setImageDescriptor(BMotionStudioImage
+									.getImageDescriptor(
+											BMotionEditorPlugin.PLUGIN_ID,
+											"icons/icon_chop.gif"));
+						} else {
+							action.setImageDescriptor(null);
 						}
+						handleObserverMenu.add(action);
 
 					}
 
@@ -212,23 +224,19 @@ public class AppContextMenuProvider extends ContextMenuProvider {
 
 	}
 
-	private void buildEventMenu(IMenuManager menu) {
+	private void buildEventMenu(IMenuManager menu, AbstractEditPart editPart) {
 
-		MenuManager handleEventMenu = new MenuManager("Events",
-				BMotionStudioImage.getImageDescriptor(
-						BMotionEditorPlugin.PLUGIN_ID, "icons/icon_event.png"),
-				"eventMenu");
-		menu.appendToGroup(GEFActionConstants.GROUP_ADD, handleEventMenu);
+		Object model = editPart.getModel();
 
-		IStructuredSelection selection = (IStructuredSelection) BMotionEditorPlugin
-				.getActiveEditor().getEditorSite().getSelectionProvider()
-				.getSelection();
+		if (model instanceof BControl && !(model instanceof Visualization)) {
 
-		if ((selection.getFirstElement() instanceof AppAbstractEditPart)
-				&& !(selection.getFirstElement() instanceof VisualizationPart)) {
+			MenuManager handleEventMenu = new MenuManager("Events",
+					BMotionStudioImage.getImageDescriptor(
+							BMotionEditorPlugin.PLUGIN_ID,
+							"icons/icon_event.png"), "eventMenu");
+			menu.appendToGroup(GEFActionConstants.GROUP_ADD, handleEventMenu);
 
-			BControl bcontrol = (BControl) ((AppAbstractEditPart) selection
-					.getFirstElement()).getModel();
+			BControl bcontrol = (BControl) model;
 
 			// Has event
 			if (bcontrol.hasEvent(eventIDs[0])) {
@@ -297,7 +305,6 @@ public class AppContextMenuProvider extends ContextMenuProvider {
 				}
 
 			}
-
 		}
 
 	}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionSelectionSynchronizer.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionSelectionSynchronizer.java
index 3bf703a63778ad8c668afb657a682a507cc22e94..69891a07f7a660d48bd101972cb780b570ce730e 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionSelectionSynchronizer.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionSelectionSynchronizer.java
@@ -16,30 +16,20 @@ import de.bmotionstudio.gef.editor.model.BControl;
 
 public class BMotionSelectionSynchronizer extends SelectionSynchronizer {
 
-	private BMotionStudioEditor editor;
-
-	public BMotionSelectionSynchronizer(BMotionStudioEditor editor) {
-		this.editor = editor;
-	}
-
 	protected EditPart convert(EditPartViewer viewer, EditPart part) {
-
+		EditPart p = super.convert(viewer, part);
 		if (viewer instanceof ScrollingGraphicalViewer
 				|| viewer instanceof TreeViewer) {
-			BControl control = (BControl) part.getModel();
-			String id = control.getID();
-			BControl editControl = editor.getEditPage().getVisualization()
-					.getBControl(id);
-			Object temp = viewer.getEditPartRegistry().get(editControl);
-			EditPart newPart = null;
-			if (temp != null) {
-				newPart = (EditPart) temp;
+			Object model = part.getModel();
+			if (model instanceof BControl) {
+				Object temp = viewer.getEditPartRegistry().get(model);
+				EditPart newPart = null;
+				if (temp != null)
+					newPart = (EditPart) temp;
+				return newPart;
 			}
-			return newPart;
-		} else {
-			return super.convert(viewer, part);
 		}
-
+		return p;
 	}
 
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditor.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditor.java
index 2d5013b10dc8c12cb1449236c5f642b195fd85ca..dd47255931b716b376cf656bbb4905283cc79d93 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditor.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditor.java
@@ -35,7 +35,6 @@ import org.xml.sax.SAXException;
 import com.thoughtworks.xstream.XStream;
 import com.thoughtworks.xstream.mapper.MapperWrapper;
 
-import de.bmotionstudio.gef.editor.animation.StaticListenerRegistry;
 import de.bmotionstudio.gef.editor.internal.BMSConverter512;
 import de.bmotionstudio.gef.editor.model.Visualization;
 import de.prob.core.ILifecycleListener;
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditorPage.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditorPage.java
index 6fb06c9db4e6fee602bb85500ddfb0720370fbfb..38ddeb19632431e6baa08b70600459407bf4ac7c 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditorPage.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioEditorPage.java
@@ -70,6 +70,7 @@ import org.eclipse.gef.ui.rulers.RulerComposite;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.SashForm;
 import org.eclipse.swt.events.DisposeEvent;
@@ -104,8 +105,10 @@ import de.bmotionstudio.gef.editor.library.AttributeTransferDropTargetListener;
 import de.bmotionstudio.gef.editor.model.BMotionRuler;
 import de.bmotionstudio.gef.editor.model.BMotionRulerProvider;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppEditPartFactory;
-import de.bmotionstudio.gef.editor.part.AppTreeEditPartFactory;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractTreeEditPart;
+import de.bmotionstudio.gef.editor.part.BMSEditPartFactory;
+import de.bmotionstudio.gef.editor.part.BMSTreeEditPartFactory;
 
 public class BMotionStudioEditorPage extends GraphicalEditorWithFlyoutPalette {
 
@@ -152,10 +155,18 @@ public class BMotionStudioEditorPage extends GraphicalEditorWithFlyoutPalette {
 
 	@Override
 	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+
 		// If not the active editor, ignore selection changed.
-		if (getBMotionStudioEditor().equals(
+		if (!getBMotionStudioEditor().equals(
 				getSite().getPage().getActiveEditor()))
+			return;
+
+		Object selectedElement = ((IStructuredSelection) selection)
+				.getFirstElement();
+		if (selectedElement instanceof BMSAbstractEditPart
+				|| selectedElement instanceof BMSAbstractTreeEditPart)
 			updateActions(getSelectionActions());
+
 	}
 
 	/**
@@ -495,7 +506,7 @@ public class BMotionStudioEditorPage extends GraphicalEditorWithFlyoutPalette {
 		super.configureGraphicalViewer();
 		ScrollingGraphicalViewer viewer = (ScrollingGraphicalViewer) getGraphicalViewer();
 
-		viewer.setEditPartFactory(new AppEditPartFactory());
+		viewer.setEditPartFactory(new BMSEditPartFactory());
 
 		ScalableRootEditPart rootEditPart = new ScalableRootEditPart();
 		GridLayer gridLayer = (GridLayer) rootEditPart
@@ -533,7 +544,7 @@ public class BMotionStudioEditorPage extends GraphicalEditorWithFlyoutPalette {
 		getActionRegistry().registerAction(
 				new ToggleGridAction(getGraphicalViewer()));
 
-		ContextMenuProvider provider = new AppContextMenuProvider(viewer,
+		ContextMenuProvider provider = new BMSContextMenuProvider(viewer,
 				getActionRegistry());
 		viewer.setContextMenu(provider);
 		
@@ -634,8 +645,7 @@ public class BMotionStudioEditorPage extends GraphicalEditorWithFlyoutPalette {
 	@Override
 	public SelectionSynchronizer getSelectionSynchronizer() {
 		if (bmotionSelectionSynchronizer == null)
-			bmotionSelectionSynchronizer = new BMotionSelectionSynchronizer(
-					bmotionStudioEditor);
+			bmotionSelectionSynchronizer = new BMotionSelectionSynchronizer();
 		return bmotionSelectionSynchronizer;
 	}
 
@@ -670,8 +680,8 @@ public class BMotionStudioEditorPage extends GraphicalEditorWithFlyoutPalette {
 
 		protected void configureOutlineViewer() {
 			getViewer().setEditDomain(getEditDomain());
-			getViewer().setEditPartFactory(new AppTreeEditPartFactory());
-			ContextMenuProvider provider = new AppContextMenuProvider(
+			getViewer().setEditPartFactory(new BMSTreeEditPartFactory());
+			ContextMenuProvider provider = new BMSContextMenuProvider(
 					getViewer(), getActionRegistry());
 			getViewer().setContextMenu(provider);
 			getViewer().setKeyHandler(getCommonKeyHandler());
@@ -736,13 +746,6 @@ public class BMotionStudioEditorPage extends GraphicalEditorWithFlyoutPalette {
 				}
 
 			};
-			// collapseAllAction
-			// .setImageDescriptor(ImageDescriptor
-			// .createFromImage(PlatformUI
-			// .getWorkbench()
-			// .getSharedImages()
-			// .getImage(
-			// ISharedImages.IMG_ELCL_COLLAPSEALL)));
 
 			getSite().getActionBars().getMenuManager().add(expandAllAction);
 			getSite().getActionBars().getMenuManager().add(collapseAllAction);
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioRunPage.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioRunPage.java
index 36b084166896ebf03787820cba0f5221acd09430..ee49bff3c4f1f2116d8c0c3f5016c236c46a2fee 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioRunPage.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/BMotionStudioRunPage.java
@@ -31,7 +31,7 @@ import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.actions.ActionFactory;
 
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppEditPartFactory;
+import de.bmotionstudio.gef.editor.part.BMSEditPartFactory;
 
 public class BMotionStudioRunPage extends GraphicalEditor {
 
@@ -125,7 +125,7 @@ public class BMotionStudioRunPage extends GraphicalEditor {
 		super.configureGraphicalViewer();
 		ScrollingGraphicalViewer viewer = (ScrollingGraphicalViewer) getGraphicalViewer();
 
-		viewer.setEditPartFactory(new AppEditPartFactory());
+		viewer.setEditPartFactory(new BMSEditPartFactory());
 
 		ScalableRootEditPart rootEditPart = new ScalableRootEditPart();
 		viewer.setRootEditPart(rootEditPart);
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/EditorImageRegistry.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/EditorImageRegistry.java
index 907bae7fe86f3a5689d699007f4592afe20fa782..56b16757ec2c66df568c7fcd22408130837cacc3 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/EditorImageRegistry.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/EditorImageRegistry.java
@@ -25,6 +25,9 @@ public class EditorImageRegistry implements IBMotionStudioImageRegistry {
 	public static final String IMG_ICON_CONNECTION24 = "icon_connection24";
 	public static final String IMG_ICON_NEW_WIZ = "icon_new_wiz";
 	public static final String IMG_ICON_DELETE_EDIT = "icon_delete_edit";
+	public static final String IMG_ICON_TR_UP = "icon_tr_up";
+	public static final String IMG_ICON_TR_LEFT = "icon_tr_left";
+	public static final String IMG_ICON_CONTROL_HIDDEN = "icon_control_hidden";
 
 	public static final String IMG_ICON_JPG = "icon_jpg";
 	public static final String IMG_ICON_GIF = "icon_gif";
@@ -61,10 +64,20 @@ public class EditorImageRegistry implements IBMotionStudioImageRegistry {
 				BMotionEditorPlugin.PLUGIN_ID, "icons/icon_connection16.gif");
 		BMotionStudioImage.registerImage(IMG_ICON_CONNECTION24,
 				BMotionEditorPlugin.PLUGIN_ID, "icons/icon_connection24.gif");
+		BMotionStudioImage.registerImage(IMG_ICON_CONTROL_HIDDEN,
+				BMotionEditorPlugin.PLUGIN_ID, "icons/icon_invisible.gif");
 		BMotionStudioImage.registerImage(IMG_ICON_NEW_WIZ, "org.eclipse.ui",
 				"$nl$/icons/full/etool16/new_wiz.gif");
 		BMotionStudioImage.registerImage(IMG_ICON_DELETE_EDIT,
 				"org.eclipse.ui", "$nl$/icons/full/etool16/delete_edit.gif");
+		BMotionStudioImage.registerImage(IMG_ICON_DELETE_EDIT,
+				"org.eclipse.ui", "$nl$/icons/full/etool16/delete_edit.gif");
+		BMotionStudioImage
+				.registerImage(IMG_ICON_TR_UP, BMotionEditorPlugin.PLUGIN_ID,
+						"icons/eclipse16/updated_co.gif");
+		BMotionStudioImage.registerImage(IMG_ICON_TR_LEFT,
+				BMotionEditorPlugin.PLUGIN_ID,
+				"icons/eclipse16/updated_col.gif");
 
 		BMotionStudioImage.registerImage(IMG_ICON_JPG,
 				BMotionEditorPlugin.PLUGIN_ID, "icons/icon_jpg.gif");
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/IBControlService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/IBControlService.java
index 832bd0c1df5d40bcba75a573b11c182aff40a13c..a55c324a812e760764e8e0c8a0aa1d19de10bdfe 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/IBControlService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/IBControlService.java
@@ -11,7 +11,8 @@ import org.eclipse.gef.palette.ToolEntry;
 
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractTreeEditPart;
 
 /**
  * @author Lukas Ladenberger
@@ -21,7 +22,9 @@ public interface IBControlService {
 
 	public BControl createControl(Visualization visualization);
 
-	public AppAbstractEditPart createEditPart();
+	public BMSAbstractEditPart createEditPart();
+
+	public BMSAbstractTreeEditPart createTreeEditPart();
 
 	public ToolEntry createToolEntry(Visualization visualization,
 			IConfigurationElement configurationElement);
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/animation/StaticListenerRegistry.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/StaticListenerRegistry.java
similarity index 94%
rename from de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/animation/StaticListenerRegistry.java
rename to de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/StaticListenerRegistry.java
index 8f7c73084ab2477a8d512b4671fb60de638edd53..9adfbab8813ae75f0cadeed5d362dd5852160261 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/animation/StaticListenerRegistry.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/StaticListenerRegistry.java
@@ -4,7 +4,7 @@
  * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
  * */
 
-package de.bmotionstudio.gef.editor.animation;
+package de.bmotionstudio.gef.editor;
 
 import java.util.HashSet;
 import java.util.Set;
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BMotionObserverWizardDialog.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BMotionObserverWizardDialog.java
index 46ff0b2aefbf331ebb500d982903448255c75270..b5ccee629af599d22f068f274a63be7b2e341788 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BMotionObserverWizardDialog.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BMotionObserverWizardDialog.java
@@ -16,7 +16,7 @@ public class BMotionObserverWizardDialog extends BMotionAbstractWizardDialog {
 
 	public BMotionObserverWizardDialog(IWorkbenchPart workbenchPart, IWizard newWizard) {
 		super(workbenchPart, newWizard);
-		setShellStyle(SWT.CLOSE);
+		setShellStyle(SWT.CLOSE | SWT.RESIZE);
 		setDeleteToolTip("Delete Observer");
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToBottomAction.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToBottomAction.java
index 0a599f4e003db6814fba319f412f22720939b1d6..ab2dcc35ee639bf6ba7384b39de759dbc84bee86 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToBottomAction.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToBottomAction.java
@@ -17,7 +17,7 @@ import org.eclipse.ui.plugin.AbstractUIPlugin;
 import de.bmotionstudio.gef.editor.BMotionEditorPlugin;
 import de.bmotionstudio.gef.editor.command.BringToBottomCommand;
 import de.bmotionstudio.gef.editor.model.BControl;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.VisualizationPart;
 
 public class BringToBottomAction extends SelectionAction {
@@ -34,7 +34,8 @@ public class BringToBottomAction extends SelectionAction {
 		setToolTipText("Bring to bottom");
 		setId(ID);
 		ImageDescriptor icon = AbstractUIPlugin.imageDescriptorFromPlugin(
-				BMotionEditorPlugin.PLUGIN_ID, "icons/icon_bringtobottom.gif");
+				BMotionEditorPlugin.PLUGIN_ID,
+				"icons/eclipse16/caught_ovr_d.gif");
 		if (icon != null) {
 			setImageDescriptor(icon);
 		}
@@ -66,9 +67,9 @@ public class BringToBottomAction extends SelectionAction {
 		List<?> selectedObjects = getSelectedObjects();
 
 		for (Object obj : selectedObjects) {
-			if (obj instanceof AppAbstractEditPart) {
+			if (obj instanceof BMSAbstractEditPart) {
 				modelList
-						.add((BControl) ((AppAbstractEditPart) obj).getModel());
+						.add((BControl) ((BMSAbstractEditPart) obj).getModel());
 			}
 		}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToBottomStepAction.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToBottomStepAction.java
index 5ab0686daa9e7509083ae407650666b0fac39618..9073dfdde11e7f235c0182a01a271c90023bd156 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToBottomStepAction.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToBottomStepAction.java
@@ -17,7 +17,7 @@ import org.eclipse.ui.plugin.AbstractUIPlugin;
 import de.bmotionstudio.gef.editor.BMotionEditorPlugin;
 import de.bmotionstudio.gef.editor.command.BringToBottomStepCommand;
 import de.bmotionstudio.gef.editor.model.BControl;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.VisualizationPart;
 
 public class BringToBottomStepAction extends SelectionAction {
@@ -35,7 +35,7 @@ public class BringToBottomStepAction extends SelectionAction {
 		setId(ID);
 		ImageDescriptor icon = AbstractUIPlugin.imageDescriptorFromPlugin(
 				BMotionEditorPlugin.PLUGIN_ID,
-				"icons/icon_bringtobottomstep.gif");
+				"icons/eclipse16/uncaught_ovr_d.gif");
 		if (icon != null) {
 			setImageDescriptor(icon);
 		}
@@ -67,9 +67,9 @@ public class BringToBottomStepAction extends SelectionAction {
 		List<?> selectedObjects = getSelectedObjects();
 
 		for (Object obj : selectedObjects) {
-			if (obj instanceof AppAbstractEditPart) {
+			if (obj instanceof BMSAbstractEditPart) {
 				modelList
-						.add((BControl) ((AppAbstractEditPart) obj).getModel());
+						.add((BControl) ((BMSAbstractEditPart) obj).getModel());
 			}
 		}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToTopAction.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToTopAction.java
index 0789ad7329d4d4d50343a28f13bff3c397fe243d..9229eb4f691a049825ec7dc9050b06099308d75c 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToTopAction.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToTopAction.java
@@ -17,7 +17,7 @@ import org.eclipse.ui.plugin.AbstractUIPlugin;
 import de.bmotionstudio.gef.editor.BMotionEditorPlugin;
 import de.bmotionstudio.gef.editor.command.BringToTopCommand;
 import de.bmotionstudio.gef.editor.model.BControl;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.VisualizationPart;
 
 public class BringToTopAction extends SelectionAction {
@@ -33,8 +33,9 @@ public class BringToTopAction extends SelectionAction {
 		setText("Bring to top");
 		setToolTipText("Bring to top");
 		setId(ID);
-		ImageDescriptor icon = AbstractUIPlugin.imageDescriptorFromPlugin(
-				BMotionEditorPlugin.PLUGIN_ID, "icons/icon_bringtotop.gif");
+		ImageDescriptor icon = AbstractUIPlugin
+				.imageDescriptorFromPlugin(BMotionEditorPlugin.PLUGIN_ID,
+						"icons/eclipse16/caught_ovr.gif");
 		if (icon != null) {
 			setImageDescriptor(icon);
 		}
@@ -62,8 +63,8 @@ public class BringToTopAction extends SelectionAction {
 		List<BControl> controlList = new ArrayList<BControl>();
 		List<?> selectedObjects = getSelectedObjects();
 		for (Object obj : selectedObjects) {
-			if (obj instanceof AppAbstractEditPart) {
-				controlList.add((BControl) ((AppAbstractEditPart) obj)
+			if (obj instanceof BMSAbstractEditPart) {
+				controlList.add((BControl) ((BMSAbstractEditPart) obj)
 						.getModel());
 			}
 		}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToTopStepAction.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToTopStepAction.java
index 2e0e89c5d76013b7fc913b1ed8b280512cad01b8..588eb5e6a479eab8034c2cac5ddcba6036cb64a4 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToTopStepAction.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/BringToTopStepAction.java
@@ -17,7 +17,7 @@ import org.eclipse.ui.plugin.AbstractUIPlugin;
 import de.bmotionstudio.gef.editor.BMotionEditorPlugin;
 import de.bmotionstudio.gef.editor.command.BringToTopStepCommand;
 import de.bmotionstudio.gef.editor.model.BControl;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.VisualizationPart;
 
 public class BringToTopStepAction extends SelectionAction {
@@ -34,7 +34,8 @@ public class BringToTopStepAction extends SelectionAction {
 		setToolTipText("Bring to top (Step)");
 		setId(ID);
 		ImageDescriptor icon = AbstractUIPlugin.imageDescriptorFromPlugin(
-				BMotionEditorPlugin.PLUGIN_ID, "icons/icon_bringtotopstep.gif");
+				BMotionEditorPlugin.PLUGIN_ID,
+				"icons/eclipse16/uncaught_ovr.gif");
 		if (icon != null) {
 			setImageDescriptor(icon);
 		}
@@ -66,9 +67,9 @@ public class BringToTopStepAction extends SelectionAction {
 		List<?> selectedObjects = getSelectedObjects();
 
 		for (Object obj : selectedObjects) {
-			if (obj instanceof AppAbstractEditPart) {
+			if (obj instanceof BMSAbstractEditPart) {
 				modelList
-						.add((BControl) ((AppAbstractEditPart) obj).getModel());
+						.add((BControl) ((BMSAbstractEditPart) obj).getModel());
 			}
 		}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/CopyAction.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/CopyAction.java
index 7f59b18c7d63d10518003dbcc5c57c5301f3da5a..d2e6dfdcccfaf7818c317c221d5f93b6fff237b3 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/CopyAction.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/CopyAction.java
@@ -53,10 +53,11 @@ public class CopyAction extends SelectionAction {
 			Object nextElement = it.next();
 			if (nextElement instanceof EditPart) {
 				EditPart ep = (EditPart) nextElement;
-				BControl node = (BControl) ep.getModel();
-				if (!cmd.isCopyableControl(node))
-					return null;
-				cmd.addElement(node);
+				if (ep.getModel() instanceof BControl) {
+					BControl node = (BControl) ep.getModel();
+					if (cmd.isCopyableControl(node))
+						cmd.addElement(node);
+				}
 			}
 
 		}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/FitImageAction.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/FitImageAction.java
index c8e06a550d8a87acc93298e9e087fed126fafb7f..c0b1dd01618bf5766ae3e2c6e9f9aae8e8c35c47 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/FitImageAction.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/FitImageAction.java
@@ -54,10 +54,12 @@ public class FitImageAction extends SelectionAction {
 		for (Object obj : selectedObjects) {
 			if (obj instanceof EditPart) {
 				EditPart part = (EditPart) obj;
-				BControl bcontrol = (BControl) part.getModel();
-				if (bcontrol
-						.getAttributeValue(AttributeConstants.ATTRIBUTE_IMAGE) != null) {
-					return true;
+				if (part.getModel() instanceof BControl) {
+					BControl bcontrol = (BControl) part.getModel();
+					if (bcontrol
+							.getAttributeValue(AttributeConstants.ATTRIBUTE_IMAGE) != null) {
+						return true;
+					}
 				}
 			}
 		}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/OpenObserverAction.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/OpenObserverAction.java
index f63e35f8a0cc0a6d2ef637b27692362e2527d7f5..4ed52392ac795a04f75fad7fcda720ef926d3210 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/OpenObserverAction.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/OpenObserverAction.java
@@ -14,11 +14,12 @@ import org.eclipse.gef.ui.actions.SelectionAction;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.ui.IWorkbenchPart;
 
-import de.bmotionstudio.gef.editor.AttributeConstants;
 import de.bmotionstudio.gef.editor.BMotionEditorPlugin;
 import de.bmotionstudio.gef.editor.BMotionStudioImage;
-import de.bmotionstudio.gef.editor.command.ObserverCommand;
+import de.bmotionstudio.gef.editor.command.RemoveObserverCommand;
+import de.bmotionstudio.gef.editor.command.SetObserverCommand;
 import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.model.ObserverRootVirtualTreeNode;
 import de.bmotionstudio.gef.editor.observer.Observer;
 import de.bmotionstudio.gef.editor.observer.ObserverWizard;
 import de.prob.logging.Logger;
@@ -26,9 +27,6 @@ import de.prob.logging.Logger;
 public class OpenObserverAction extends SelectionAction {
 
 	private String className;
-	private Observer clonedObserver;
-	private Observer newObserver;
-	private BControl actionControl;
 
 	public OpenObserverAction(IWorkbenchPart part) {
 		super(part);
@@ -48,35 +46,35 @@ public class OpenObserverAction extends SelectionAction {
 	@Override
 	public void run() {
 
-		clonedObserver = null;
-
-		actionControl = getControl();
+		BControl actionControl = getControl();
 
 		if (actionControl != null) {
 
-			newObserver = getControl().getObserver(getClassName());
+			Observer oldObserver = null;
+			Observer observer = getControl().getObserver(getClassName());
 
-			// Add Observer
-			if (newObserver == null) {
+			// If an observer does not exist, add one
+			if (observer == null) {
 
 				try {
-					newObserver = (Observer) BMotionEditorPlugin
+					observer = (Observer) BMotionEditorPlugin
 							.getObserverExtension(getClassName())
 							.createExecutableExtension("class");
 				} catch (CoreException e) {
 				}
 
-			} else { // Edit Observer
+			} else { // else edit the current observer
 
-				// Clone Observer
+				// therefore, clone the current observer, if the user aborts
+				// editing the current observer
 				try {
-					clonedObserver = newObserver.clone();
+					oldObserver = observer.clone();
 				} catch (CloneNotSupportedException e) {
 				}
 
 			}
 
-			ObserverWizard wizard = newObserver.getWizard(getControl());
+			ObserverWizard wizard = observer.getWizard(actionControl);
 
 			if (wizard != null) {
 
@@ -84,65 +82,76 @@ public class OpenObserverAction extends SelectionAction {
 						getWorkbenchPart(), wizard);
 				dialog.create();
 				dialog.getShell().setSize(wizard.getSize());
-				String title = "Observer: "
-						+ newObserver.getName()
-						+ " Control: "
-						+ getControl().getAttributeValue(
-								AttributeConstants.ATTRIBUTE_ID);
+				String title = "Observer: " + observer.getName()
+						+ " Control: " + getControl().getID();
 				wizard.setWindowTitle("BMotion Studio Observer Wizard");
 				dialog.setTitle(title);
-				dialog.setMessage(newObserver.getDescription());
+				dialog.setMessage(observer.getDescription());
 				dialog.setTitleImage(BMotionStudioImage
 						.getImage(BMotionStudioImage.IMG_LOGO_BMOTION64));
 				int status = dialog.open();
 
+				// The user clicked on the "OK" button in order to confirm his
+				// changes on the observer
 				if (status == WizardDialog.OK) {
 
-					ObserverCommand observerCommand = createObserverCommandCommand();
-					observerCommand.setNewObserver(newObserver);
-
+					// If the observer delete flag is set to true, delete the
+					// observer anyway
 					if (wizard.isObserverDelete()) {
-
-						RemoveObserverAction action = new RemoveObserverAction(
-								getWorkbenchPart());
-						action.setControl(getControl());
-						action.setObserver(newObserver);
-						action.run();
-
+						RemoveObserverCommand cmd = createRemoveObserverCommand(
+								observer, actionControl);
+						execute(cmd);
 					} else {
-						if (clonedObserver != null) {
-							observerCommand.setClonedObserver(clonedObserver);
-						}
-						execute(observerCommand);
+						SetObserverCommand cmd = createObserverSetCommand(
+								actionControl, observer, oldObserver);
+						execute(cmd);
 					}
 
+					// else the user canceled his changes on the observer
 				} else if (status == WizardDialog.CANCEL) {
 
-					if (clonedObserver != null)
-						actionControl.addObserver(clonedObserver);
+					// Reset observer without using a command!
+					if (oldObserver != null)
+						actionControl.getObservers().put(oldObserver.getID(),
+								oldObserver);
 
+					// else the user clicked on the delete button in order to
+					// delete the observer
 				} else if (status == BMotionObserverWizardDialog.DELETE) {
-					RemoveObserverAction action = new RemoveObserverAction(
-							getWorkbenchPart());
-					action.setControl(getControl());
-					action.setObserver(newObserver);
-					action.run();
+					RemoveObserverCommand cmd = createRemoveObserverCommand(
+							observer, actionControl);
+					execute(cmd);
 				}
 
 			} else {
 				Logger.notifyUserWithoutBugreport("The Observer \""
-						+ newObserver.getName()
+						+ observer.getName()
 						+ "\" does not support a wizard.");
 			}
 		}
 
 	}
 
-	public ObserverCommand createObserverCommandCommand() {
-		ObserverCommand command = new ObserverCommand();
-		command.setClassName(getClassName());
-		command.setControl(actionControl);
-		return command;
+	private RemoveObserverCommand createRemoveObserverCommand(
+			Observer observer, BControl control) {
+		RemoveObserverCommand cmd = new RemoveObserverCommand();
+		cmd.setControl(control);
+		cmd.setObserver(observer);
+		return cmd;
+	}
+
+	public SetObserverCommand createObserverSetCommand(BControl control,
+			Observer newObserver, Observer oldObserver) {
+		SetObserverCommand cmd = new SetObserverCommand();
+		cmd.setNewObserver(newObserver);
+		cmd.setOldObserver(oldObserver);
+		cmd.setControl(control);
+		return cmd;
+	}
+
+	public SetObserverCommand createObserverSetCommand(BControl control,
+			Observer newObserver) {
+		return createObserverSetCommand(control, newObserver, null);
 	}
 
 	public void setClassName(String className) {
@@ -162,8 +171,15 @@ public class OpenObserverAction extends SelectionAction {
 
 		if ((objects.get(0) instanceof EditPart)) {
 			EditPart part = (EditPart) objects.get(0);
-			return (BControl) part.getModel();
+			BControl control = null;
+			if (part.getModel() instanceof ObserverRootVirtualTreeNode)
+				control = ((ObserverRootVirtualTreeNode) part.getModel())
+						.getControl();
+			else if (part.getModel() instanceof BControl)
+				control = (BControl) part.getModel();
+			return control;
 		}
+
 		return null;
 
 	}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/PasteAction.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/PasteAction.java
index 25cc581f3994b7b1facde5886068b8909095e454..35515085d31c1b240a6a825ad2569579997f7f91 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/PasteAction.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/PasteAction.java
@@ -52,10 +52,11 @@ public class PasteAction extends SelectionAction {
 			Object nextElement = it.next();
 			if (nextElement instanceof EditPart) {
 				EditPart ep = (EditPart) nextElement;
-				BControl node = (BControl) ep.getModel();
-				if (!cmd.isContainer(node))
-					return null;
-				cmd.addElement(node);
+				if (ep.getModel() instanceof BControl) {
+					BControl node = (BControl) ep.getModel();
+					if (cmd.isContainer(node))
+						cmd.addElement(node);
+				}
 			}
 		}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/RenameAction.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/RenameAction.java
index 9e3529477541ca7c0ad0fa5a963d155c71d2ebc4..080cadb502769b19452c9593a5c1acab8c2a7cff 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/RenameAction.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/RenameAction.java
@@ -21,7 +21,6 @@ import org.eclipse.ui.plugin.AbstractUIPlugin;
 
 import de.bmotionstudio.gef.editor.AttributeConstants;
 import de.bmotionstudio.gef.editor.BMotionEditorPlugin;
-import de.bmotionstudio.gef.editor.internal.RenameWizard;
 import de.bmotionstudio.gef.editor.model.BControl;
 
 public class RenameAction extends SelectionAction {
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/internal/RenameWizard.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/RenameWizard.java
similarity index 93%
rename from de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/internal/RenameWizard.java
rename to de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/RenameWizard.java
index 117a244f3aa03bc54f91db884197286d6d49db1b..34c95998316f8cf40ae8974e4b34245682a88989 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/internal/RenameWizard.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/action/RenameWizard.java
@@ -4,7 +4,7 @@
  * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
  * */
 
-package de.bmotionstudio.gef.editor.internal;
+package de.bmotionstudio.gef.editor.action;
 
 import org.eclipse.jface.wizard.Wizard;
 import org.eclipse.jface.wizard.WizardPage;
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/animation/AnimationMove.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/animation/AnimationMove.java
deleted file mode 100644
index c0a26f986af914db8ff304e31681264a89e9bca2..0000000000000000000000000000000000000000
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/animation/AnimationMove.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/** 
- * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
- * Heinrich Heine Universitaet Duesseldorf
- * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
- * */
-
-package de.bmotionstudio.gef.editor.animation;
-
-import java.util.ArrayList;
-
-import org.eclipse.draw2d.geometry.Point;
-
-import com.jgoodies.animation.AbstractAnimation;
-import com.jgoodies.animation.AnimationFunction;
-import com.jgoodies.animation.AnimationFunctions;
-import com.jgoodies.animation.Animator;
-
-import de.bmotionstudio.gef.editor.AttributeConstants;
-import de.bmotionstudio.gef.editor.model.BControl;
-
-public class AnimationMove extends AbstractAnimation {
-
-	private AnimationFunction af;
-
-	private ArrayList<Point> points = new ArrayList<Point>();
-
-	private Animator animator;
-
-	private BControl control;
-
-	public AnimationMove(long duration, boolean freezed, BControl control,
-			Integer toX, Integer toY) {
-		super(duration, freezed);
-
-		this.control = control;
-
-		Integer fromX = Integer.valueOf(control.getAttributeValue(
-				AttributeConstants.ATTRIBUTE_X).toString());
-		Integer fromY = Integer.valueOf(control.getAttributeValue(
-				AttributeConstants.ATTRIBUTE_Y).toString());
-
-		Bresenham br = new Bresenham();
-		br.plot(fromX, fromY, toX, toY);
-
-		points.clear();
-
-		while (br.next()) {
-			Point pt = new Point(br.getX(), br.getY());
-			points.add(pt);
-		}
-
-		af = AnimationFunctions.discrete(duration(), points
-				.toArray(new Point[points.size()]));
-	}
-
-	public void start() {
-		if (points != null) {
-			if (points.size() > 0) {
-				animator = new Animator(this, 30);
-				animator.start();
-			} else {
-				fireAnimationStopped(30);
-			}
-		}
-	}
-
-	protected void applyEffect(long time) {
-		Point pt = (Point) af.valueAt(time);
-		control.setLocation(pt);
-	}
-
-}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/animation/Bresenham.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/animation/Bresenham.java
deleted file mode 100644
index cd8105223e258f374e98d8cdde0369079a2130b9..0000000000000000000000000000000000000000
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/animation/Bresenham.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/** 
- * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
- * Heinrich Heine Universitaet Duesseldorf
- * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
- * */
-
-package de.bmotionstudio.gef.editor.animation;
-
-public final class Bresenham {
-
-	/** The start and end of the line */
-	// private int x1, y1, x2, y2;
-
-	/** Used for calculation */
-	private int dx, dy, error, x_inc, y_inc, xx, yy, length, count;
-
-	/** General case algorithm */
-	private static final Bresenham bresenham = new Bresenham();
-
-	/**
-	 * Construct a Bresenham algorithm.
-	 */
-	public Bresenham() {
-	}
-
-	/**
-	 * Plot a line between (x1,y1) and (x2,y2). To step through the line use
-	 * next().
-	 * 
-	 * @return the length of the line (which will be 1 more than you are
-	 *         expecting).
-	 */
-	public int plot(int x1, int y1, int x2, int y2) {
-		// this.x1 = x1;
-		// this.x2 = x2;
-		// this.y1 = y1;
-		// this.y2 = y2;
-
-		// compute horizontal and vertical deltas
-		dx = x2 - x1;
-		dy = y2 - y1;
-
-		// test which direction the line is going in i.e. slope angle
-		if (dx >= 0) {
-			x_inc = 1;
-		} else {
-			x_inc = -1;
-			dx = -dx; // need absolute value
-		}
-
-		// test y component of slope
-
-		if (dy >= 0) {
-			y_inc = 1;
-		} else {
-			y_inc = -1;
-			dy = -dy; // need absolute value
-		}
-
-		xx = x1;
-		yy = y1;
-
-		if (dx > 0)
-			error = dx >> 1;
-		else
-			error = dy >> 1;
-
-		count = 0;
-		length = Math.max(dx, dy) + 1;
-		return length;
-	}
-
-	/**
-	 * Get the next point in the line. You must not call next() if the previous
-	 * invocation of next() returned false.
-	 * 
-	 * Retrieve the X and Y coordinates of the line with getX() and getY().
-	 * 
-	 * @return true if there is another point to come.
-	 */
-	public boolean next() {
-		// now based on which delta is greater we can draw the line
-		if (dx > dy) {
-			// adjust the error term
-			error += dy;
-
-			// test if error has overflowed
-			if (error >= dx) {
-				error -= dx;
-
-				// move to next line
-				yy += y_inc;
-			}
-
-			// move to the next pixel
-			xx += x_inc;
-		} else {
-			// adjust the error term
-			error += dx;
-
-			// test if error overflowed
-			if (error >= dy) {
-				error -= dy;
-
-				// move to next line
-				xx += x_inc;
-			}
-
-			// move to the next pixel
-			yy += y_inc;
-		}
-
-		count++;
-		return count < length;
-	}
-
-	/**
-	 * @return the current X coordinate
-	 */
-	public int getX() {
-		return xx;
-	}
-
-	/**
-	 * @return the current Y coordinate
-	 */
-	public int getY() {
-		return yy;
-	}
-
-	/**
-	 * Plot a line between (x1,y1) and (x2,y2). The results are placed in x[]
-	 * and y[], which must be large enough.
-	 * 
-	 * @return the length of the line or the length of x[]/y[], whichever is
-	 *         smaller
-	 */
-	public static final int plot(final int x1, final int y1, final int x2,
-			final int y2, final int x[], final int y[]) {
-
-		int length = Math.min(x.length, Math.min(y.length, bresenham.plot(x1,
-				y1, x2, y2)));
-		for (int i = 0; i < length; i++) {
-			bresenham.next();
-			x[i] = bresenham.getX();
-			y[i] = bresenham.getY();
-		}
-
-		return length;
-
-		/*
-		 * 
-		 * int dx; // difference in x's int dy; // difference in y's int error =
-		 * 0; // the discriminant i.e. error i.e. decision variable int x_inc;
-		 * int y_inc; int index; // used for looping
-		 * 
-		 * // compute horizontal and vertical deltas dx = x2 - x1; dy = y2 - y1;
-		 * 
-		 * // test which direction the line is going in i.e. slope angle if (dx
-		 * >= 0) { x_inc = 1; } else { x_inc = -1; dx = -dx; // need absolute
-		 * value
-		 * 
-		 * }
-		 * 
-		 * // test y component of slope
-		 * 
-		 * if (dy >= 0) { y_inc = 1; } else { y_inc = -1; dy = -dy; // need
-		 * absolute value
-		 * 
-		 * }
-		 * 
-		 * int xx = x1, yy = y1;
-		 * 
-		 * // now based on which delta is greater we can draw the line if (dx >
-		 * dy) { error = dx >> 1; // draw the line for (index = 0; index <= dx
-		 * && index < x.length; index++) { // remember the point x[index] = xx;
-		 * y[index] = yy;
-		 * 
-		 * // adjust the error term error += dy;
-		 * 
-		 * // test if error has overflowed if (error >= dx) { error -= dx;
-		 * 
-		 * // move to next line yy += y_inc; }
-		 * 
-		 * // move to the next pixel xx += x_inc; } return Math.min(x.length,
-		 * dx); } else { error = dy >> 1; // draw the line for (index = 0; index
-		 * <= dy && index < y.length; index++) { // remember the point x[index]
-		 * = xx; y[index] = yy;
-		 * 
-		 * // adjust the error term error += dx;
-		 * 
-		 * // test if error overflowed if (error >= dy) { error -= dy;
-		 * 
-		 * // move to next line xx += x_inc; }
-		 * 
-		 * // move to the next pixel yy += y_inc; } return Math.min(y.length,
-		 * dy); }
-		 */
-	}
-}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AbstractAttribute.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AbstractAttribute.java
index 0de1ef287ce66ad14499141c51fe22e03cea03e6..b267dcac6b7cfb1b3521e9a7d086dc8e9e8a685f 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AbstractAttribute.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AbstractAttribute.java
@@ -14,6 +14,7 @@ import org.eclipse.ui.views.properties.IPropertyDescriptor;
 import org.eclipse.ui.views.properties.IPropertySource;
 import org.eclipse.ui.views.properties.PropertyDescriptor;
 
+import de.bmotionstudio.gef.editor.AttributeConstants;
 import de.bmotionstudio.gef.editor.model.BControl;
 
 /**
@@ -31,22 +32,20 @@ public abstract class AbstractAttribute implements IPropertySource, Cloneable {
 	private transient BControl control;
 	private transient PropertyDescriptor propertyDescriptor;
 	private transient Object initValue;
+	private transient Object defaultValue;
 	private transient boolean editable;
 	private transient boolean show;
 	private transient String group;
 
+	// The current value of the attribute
 	private Object value;
 
 	public AbstractAttribute(Object value) {
-		this(value, true, true);
-	}
-	
-	public AbstractAttribute(Object value, boolean isEditable,
-			boolean showInPropertiesView) {
 		this.value = value;
-		this.initValue = value;
-		this.editable = isEditable;
-		this.show = showInPropertiesView;
+		this.defaultValue = value;
+		this.group = AttributeConstants.ATTRIBUTE_MISC;
+		this.editable = true;
+		this.show = true;
 	}
 
 	private Object readResolve() {
@@ -64,7 +63,7 @@ public abstract class AbstractAttribute implements IPropertySource, Cloneable {
 
 	public PropertyDescriptor getPropertyDescriptor() {
 		propertyDescriptor = new PropertyDescriptor(getID(), getName());
-		if (editable) {
+		if (isEditable()) {
 			propertyDescriptor = preparePropertyDescriptor();
 			if (propertyDescriptor != null) {
 				propertyDescriptor.setValidator(new ICellEditorValidator() {
@@ -202,4 +201,12 @@ public abstract class AbstractAttribute implements IPropertySource, Cloneable {
 		this.control = control;
 	}
 
+	public Object getDefaultValue() {
+		return defaultValue;
+	}
+
+	public void setDefaultValue(Object defaultValue) {
+		this.defaultValue = defaultValue;
+	}
+
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeBlocks.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeBlocks.java
new file mode 100644
index 0000000000000000000000000000000000000000..c8bc0a271d4bbad53892d0fb4de6ef0d36efc7bd
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeBlocks.java
@@ -0,0 +1,42 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.attribute;
+
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.property.IntegerPropertyDescriptor;
+
+public class AttributeBlocks extends AbstractAttribute {
+
+	public AttributeBlocks(Object value) {
+		super(value);
+	}
+
+	public PropertyDescriptor preparePropertyDescriptor() {
+		IntegerPropertyDescriptor descriptor = new IntegerPropertyDescriptor(
+				getID(), getName());
+		return descriptor;
+	}
+
+	@Override
+	public String validateValue(Object value, BControl control) {
+		if (!(String.valueOf(value)).trim().matches("\\d*")) {
+			return "Value must be a number";
+		}
+		if ((String.valueOf(value)).trim().length() == 0) {
+			return "Value must not be empty string";
+		}
+		return null;
+	}
+
+	@Override
+	public String getName() {
+		return "Blocks";
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeFillColor.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeFillColor.java
new file mode 100644
index 0000000000000000000000000000000000000000..bf60950d26341e9d1d227aa21506c31f0d1041ca
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeFillColor.java
@@ -0,0 +1,48 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.attribute;
+
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.ui.views.properties.ColorPropertyDescriptor;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+
+public class AttributeFillColor extends AbstractAttribute {
+
+	public AttributeFillColor(Object value) {
+		super(value);
+	}
+
+	public PropertyDescriptor preparePropertyDescriptor() {
+		return new ColorPropertyDescriptor(getID(), getName());
+	}
+
+	@Override
+	public String getName() {
+		return "Fill-Color";
+	}
+
+	@Override
+	public Object unmarshal(String s) {
+
+		String colorStr = s.toLowerCase().replace(" ", "");
+		colorStr = colorStr.replace("rgb", "");
+		colorStr = colorStr.replace("}", "");
+		colorStr = colorStr.replace("{", "");
+		String[] str = String.valueOf(colorStr).split("\\,");
+		if (str.length == 3) {
+			int red = Integer.valueOf(str[0]);
+			int green = Integer.valueOf(str[1]);
+			int blue = Integer.valueOf(str[2]);
+			return new RGB(red, green, blue);
+		} else {
+			return new RGB(192, 192, 192);
+		}
+
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeFillHeight.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeFillHeight.java
new file mode 100644
index 0000000000000000000000000000000000000000..87fd14a739285a50037ea7b4924991b977ddd071
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeFillHeight.java
@@ -0,0 +1,42 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.attribute;
+
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.property.IntegerPropertyDescriptor;
+
+public class AttributeFillHeight extends AbstractAttribute {
+
+	public AttributeFillHeight(Object value) {
+		super(value);
+	}
+
+	public PropertyDescriptor preparePropertyDescriptor() {
+		IntegerPropertyDescriptor descriptor = new IntegerPropertyDescriptor(
+				getID(), getName());
+		return descriptor;
+	}
+
+	@Override
+	public String validateValue(Object value, BControl control) {
+		if (!(String.valueOf(value)).trim().matches("\\d*")) {
+			return "Value must be a number";
+		}
+		if ((String.valueOf(value)).trim().length() == 0) {
+			return "Value must not be empty string";
+		}
+		return null;
+	}
+
+	@Override
+	public String getName() {
+		return "Fill-Height";
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeLights.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeLights.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c1d0822a4fa6e2172c53408bad655d4a7157454
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeLights.java
@@ -0,0 +1,42 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.attribute;
+
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.property.IntegerPropertyDescriptor;
+
+public class AttributeLights extends AbstractAttribute {
+
+	public AttributeLights(Object value) {
+		super(value);
+	}
+
+	public PropertyDescriptor preparePropertyDescriptor() {
+		IntegerPropertyDescriptor descriptor = new IntegerPropertyDescriptor(
+				getID(), getName());
+		return descriptor;
+	}
+
+	@Override
+	public String validateValue(Object value, BControl control) {
+		if (!(String.valueOf(value)).trim().matches("\\d*")) {
+			return "Value must be a number";
+		}
+		if ((String.valueOf(value)).trim().length() == 0) {
+			return "Value must not be empty string";
+		}
+		return null;
+	}
+
+	@Override
+	public String getName() {
+		return "Lights";
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeMeasureInterval.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeMeasureInterval.java
new file mode 100644
index 0000000000000000000000000000000000000000..7c78a501ca1e55a99370a2b3e03ad4ce2ab5049e
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeMeasureInterval.java
@@ -0,0 +1,42 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.attribute;
+
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.property.IntegerPropertyDescriptor;
+
+public class AttributeMeasureInterval extends AbstractAttribute {
+
+	public AttributeMeasureInterval(Object value) {
+		super(value);
+	}
+
+	public PropertyDescriptor preparePropertyDescriptor() {
+		IntegerPropertyDescriptor descriptor = new IntegerPropertyDescriptor(
+				getID(), getName());
+		return descriptor;
+	}
+
+	@Override
+	public String validateValue(Object value, BControl control) {
+		if (!(String.valueOf(value)).trim().matches("\\d*")) {
+			return "Value must be a number";
+		}
+		if ((String.valueOf(value)).trim().length() == 0) {
+			return "Value must not be empty string";
+		}
+		return null;
+	}
+
+	@Override
+	public String getName() {
+		return "Measure-Interval";
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeMeasureMaxPos.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeMeasureMaxPos.java
new file mode 100644
index 0000000000000000000000000000000000000000..328348c8365d63e4def3e93ed930f2f321303bcd
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeMeasureMaxPos.java
@@ -0,0 +1,42 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.attribute;
+
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.property.IntegerPropertyDescriptor;
+
+public class AttributeMeasureMaxPos extends AbstractAttribute {
+
+	public AttributeMeasureMaxPos(Object value) {
+		super(value);
+	}
+
+	public PropertyDescriptor preparePropertyDescriptor() {
+		IntegerPropertyDescriptor descriptor = new IntegerPropertyDescriptor(
+				getID(), getName());
+		return descriptor;
+	}
+
+	@Override
+	public String validateValue(Object value, BControl control) {
+		if (!(String.valueOf(value)).trim().matches("\\d*")) {
+			return "Value must be a number";
+		}
+		if ((String.valueOf(value)).trim().length() == 0) {
+			return "Value must not be empty string";
+		}
+		return null;
+	}
+
+	@Override
+	public String getName() {
+		return "Measure-Max-Pos";
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeShowMeasure.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeShowMeasure.java
new file mode 100644
index 0000000000000000000000000000000000000000..2d53e7796a8e9a4e489695aceaf74773de1178f0
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeShowMeasure.java
@@ -0,0 +1,44 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.attribute;
+
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.property.CheckboxPropertyDescriptor;
+
+public class AttributeShowMeasure extends AbstractAttribute {
+
+	public AttributeShowMeasure(Object value) {
+		super(value);
+	}
+
+	public PropertyDescriptor preparePropertyDescriptor() {
+		return new CheckboxPropertyDescriptor(getID(), getName());
+	}
+
+	@Override
+	public String validateValue(Object value, BControl control) {
+		if ((String.valueOf(value)).trim().equalsIgnoreCase("true")
+				|| (String.valueOf(value)).trim().equalsIgnoreCase("false")) {
+			return null;
+		} else {
+			return "Value must be a Boolean value (\"true\" or \"false\")";
+		}
+	}
+
+	@Override
+	public String getName() {
+		return "Show-Measure";
+	}
+
+	@Override
+	public Object unmarshal(String s) {
+		return Boolean.valueOf(s);
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeSignalColor.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeSignalColor.java
new file mode 100644
index 0000000000000000000000000000000000000000..19bc13837938bb4447b7bcddc0dd0806f31212ca
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeSignalColor.java
@@ -0,0 +1,38 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+package de.bmotionstudio.gef.editor.attribute;
+
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+
+public class AttributeSignalColor extends AbstractAttribute {
+
+	public static final int RED = 0;
+	public static final int GREEN = 1;
+	public static final int NO_COLOR = 2;
+
+	public AttributeSignalColor(Object value) {
+		super(value);
+	}
+
+	@Override
+	protected PropertyDescriptor preparePropertyDescriptor() {
+		return new ComboBoxPropertyDescriptor(getID(), getName(), new String[] {
+				"Red", "Green", "No Color" });
+	}
+
+	@Override
+	public Object unmarshal(final String s) {
+		return Integer.valueOf(s);
+	}
+
+	@Override
+	public String getName() {
+		return "Signal Color";
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeSwitchDirection.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeSwitchDirection.java
new file mode 100644
index 0000000000000000000000000000000000000000..783b182283947934b9fc5e4d1ffb45e0ee2246d2
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeSwitchDirection.java
@@ -0,0 +1,39 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+package de.bmotionstudio.gef.editor.attribute;
+
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+
+public class AttributeSwitchDirection extends AbstractAttribute {
+
+	public static final int RIGHT_SOUTH = 0;
+	public static final int LEFT_SOUTH = 1;
+	public static final int RIGHT_NORTH = 2;
+	public static final int LEFT_NORTH = 3;
+
+	public AttributeSwitchDirection(Object value) {
+		super(value);
+	}
+
+	@Override
+	public Object unmarshal(final String s) {
+		return Integer.valueOf(s);
+	}
+
+	@Override
+	protected PropertyDescriptor preparePropertyDescriptor() {
+		return new ComboBoxPropertyDescriptor(getID(), getName(), new String[] {
+				"Right South", "Left South", "Right North", "Left North" });
+	}
+
+	@Override
+	public String getName() {
+		return "Switch Direction";
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeSwitchPosition.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeSwitchPosition.java
new file mode 100644
index 0000000000000000000000000000000000000000..a214d084617f0bdee8ba018ca05f497e6401ab00
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeSwitchPosition.java
@@ -0,0 +1,37 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+package de.bmotionstudio.gef.editor.attribute;
+
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+public class AttributeSwitchPosition extends AbstractAttribute {
+
+	public static final int LEFT = 0;
+	public static final int RIGHT = 1;
+	public static final int UNKNOWN = 2;
+
+	public AttributeSwitchPosition(Object value) {
+		super(value);
+	}
+
+	@Override
+	public Object unmarshal(final String s) {
+		return Integer.valueOf(s);
+	}
+
+	@Override
+	protected PropertyDescriptor preparePropertyDescriptor() {
+		return new ComboBoxPropertyDescriptor(getID(), getName(), new String[] {
+				"LEFT", "RIGHT", "UNKNOWN" });
+	}
+
+	@Override
+	public String getName() {
+		return "Switch Position";
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeTrackDirection.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeTrackDirection.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6a6dff2f2e2be9d93188ff9ea80dffbd4ddd002
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/AttributeTrackDirection.java
@@ -0,0 +1,36 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+package de.bmotionstudio.gef.editor.attribute;
+
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+public class AttributeTrackDirection extends AbstractAttribute {
+
+	public static final int RIGHT = 0;
+	public static final int LEFT = 1;
+
+	public AttributeTrackDirection(Object value) {
+		super(value);
+	}
+
+	@Override
+	public Object unmarshal(final String s) {
+		return Integer.valueOf(s);
+	}
+
+	@Override
+	protected PropertyDescriptor preparePropertyDescriptor() {
+		return new ComboBoxPropertyDescriptor(getID(), getName(), new String[] {
+				"R", "L" });
+	}
+
+	@Override
+	public String getName() {
+		return "Track Direction";
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeConnectionSourceDecoration.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeConnectionSourceDecoration.java
index 89a5c58c734618d066772afe071dc0d56dfee25b..0a63dffb6f8a8d0b709dde9ed4c1da1a212c1427 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeConnectionSourceDecoration.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeConnectionSourceDecoration.java
@@ -11,13 +11,13 @@ import org.eclipse.ui.views.properties.PropertyDescriptor;
 
 public class BAttributeConnectionSourceDecoration extends AbstractAttribute {
 
-	public static int DECORATION_NONE = 0;
-	public static int DECORATION_TRIANGLE = 1;
-
 	public BAttributeConnectionSourceDecoration(Object value) {
 		super(value);
 	}
 
+	public static int DECORATION_NONE = 0;
+	public static int DECORATION_TRIANGLE = 1;
+
 	@Override
 	protected PropertyDescriptor preparePropertyDescriptor() {
 		return new ComboBoxPropertyDescriptor(getID(), getName(), new String[] {
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeConnectionTargetDecoration.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeConnectionTargetDecoration.java
index fc9f9353cddc3a0533becdac8368e2e67909b373..0666b2593ff07f542384d97154175c2057889d6c 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeConnectionTargetDecoration.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeConnectionTargetDecoration.java
@@ -11,13 +11,13 @@ import org.eclipse.ui.views.properties.PropertyDescriptor;
 
 public class BAttributeConnectionTargetDecoration extends AbstractAttribute {
 
-	public static int DECORATION_NONE = 0;
-	public static int DECORATION_TRIANGLE = 1;
-
 	public BAttributeConnectionTargetDecoration(Object value) {
 		super(value);
 	}
 
+	public static int DECORATION_NONE = 0;
+	public static int DECORATION_TRIANGLE = 1;
+
 	@Override
 	protected PropertyDescriptor preparePropertyDescriptor() {
 		return new ComboBoxPropertyDescriptor(getID(), getName(), new String[] {
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeCoordinates.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeCoordinates.java
index 2aeb359d027bd32783119b814a50786e7f8c476b..193d963f3be639fc568ca7d4339a0f80181a67d5 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeCoordinates.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeCoordinates.java
@@ -27,12 +27,9 @@ public class BAttributeCoordinates extends AbstractAttribute {
 				Point point = (Point) element;
 				StringBuffer buf = new StringBuffer();
 				buf.append("[");
-				if (point.x >= 0)
-					buf.append(point.x);
-				if (point.y >= 0) {
-					buf.append(",  ");
-					buf.append(point.y);
-				}
+				buf.append(point.x);
+				buf.append(",  ");
+				buf.append(point.y);
 				buf.append("]");
 				return buf.toString();
 			}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeDirection.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeDirection.java
index 899f70124e929d6150108db251f236ec33856895..ffd7f2c1fc564bfd48c24cf47bf8016e7357e3a0 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeDirection.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeDirection.java
@@ -11,15 +11,15 @@ import org.eclipse.ui.views.properties.PropertyDescriptor;
 
 public class BAttributeDirection extends AbstractAttribute {
 
+	public BAttributeDirection(Object value) {
+		super(value);
+	}
+
 	public static final int NORTH = 0;
 	public static final int SOUTH = 1;
 	public static final int WEST = 2;
 	public static final int EAST = 3;
 
-	public BAttributeDirection(Object value) {
-		super(value);
-	}
-
 	@Override
 	protected PropertyDescriptor preparePropertyDescriptor() {
 		return new ComboBoxPropertyDescriptor(getID(), getName(), new String[] {
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeFalseValue.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeFalseValue.java
index 74a13b83fc362de800c0fcc8f04be96177e67318..342f0d7ab5761275cb97d0705ad3ed10ccbd4cea 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeFalseValue.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeFalseValue.java
@@ -1,3 +1,9 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
 package de.bmotionstudio.gef.editor.attribute;
 
 import org.eclipse.ui.views.properties.PropertyDescriptor;
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeLineWidth.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeLineWidth.java
index b9503fbf6287dbbfeb8d0729fd759c842cb9e728..82f43fda9cb00aa3fd4cbc51cd9625191b90f79d 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeLineWidth.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeLineWidth.java
@@ -7,16 +7,16 @@ import de.bmotionstudio.gef.editor.property.IntegerPropertyDescriptor;
 
 public class BAttributeLineWidth extends AbstractAttribute {
 
-	public BAttributeLineWidth(Object value) {
-		super(value);
-	}
-
 	public PropertyDescriptor preparePropertyDescriptor() {
 		IntegerPropertyDescriptor descriptor = new IntegerPropertyDescriptor(
 				getID(), getName());
 		return descriptor;
 	}
 
+	public BAttributeLineWidth(Object value) {
+		super(value);
+	}
+
 	@Override
 	public String validateValue(Object value, BControl control) {
 		if (!(String.valueOf(value)).trim().matches("\\d*")) {
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeOrientation.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeOrientation.java
index 365995bcfef2ae6b62f13a29989d01d5e38d0856..db025c10df17ae79035008eac615bd1a36069290 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeOrientation.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeOrientation.java
@@ -5,13 +5,13 @@ import org.eclipse.ui.views.properties.PropertyDescriptor;
 
 public class BAttributeOrientation extends AbstractAttribute {
 
-	public static final int HORIZONTAL = 0;
-	public static final int VERTICAL = 1;
-
 	public BAttributeOrientation(Object value) {
 		super(value);
 	}
 
+	public static final int HORIZONTAL = 0;
+	public static final int VERTICAL = 1;
+
 	@Override
 	protected PropertyDescriptor preparePropertyDescriptor() {
 		return new ComboBoxPropertyDescriptor(getID(), getName(), new String[] {
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeShape.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeShape.java
index b2200082614890de744321a1e8f86a278dcead36..506461deca4a39e20ff8bf3adecaeedb1555f601 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeShape.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeShape.java
@@ -11,15 +11,15 @@ import org.eclipse.ui.views.properties.PropertyDescriptor;
 
 public class BAttributeShape extends AbstractAttribute {
 
+	public BAttributeShape(Object value) {
+		super(value);
+	}
+
 	public static final int SHAPE_RECTANGLE = 0;
 	public static final int SHAPE_OVAL = 1;
 	public static final int SHAPE_TRIANGLE = 2;
 	public static final int SHAPE_DIAMOND = 3;
 
-	public BAttributeShape(Object value) {
-		super(value);
-	}
-
 	@Override
 	protected PropertyDescriptor preparePropertyDescriptor() {
 		return new ComboBoxPropertyDescriptor(getID(), getName(), new String[] {
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeSize.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeSize.java
index 1920190f623c1673e57861794d8c816dc21a6796..23094707bf3e913c307528b9d8d3bb5d1a5e0fda 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeSize.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeSize.java
@@ -18,6 +18,8 @@ public class BAttributeSize extends AbstractAttribute {
 		super(value);
 	}
 
+	public static final String ID = "de.bmotionstudio.gef.editor.attribute.BAttributeSize";
+
 	@Override
 	public PropertyDescriptor preparePropertyDescriptor() {
 		PropertyDescriptor descriptor = new PropertyDescriptor(getID(),
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/CopyCommand.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/CopyCommand.java
index 2fa07577284289e76f55eff2de0b69345de5ae8a..86190dff463fa8e2e8db039fcd6609a891555eef 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/CopyCommand.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/CopyCommand.java
@@ -12,6 +12,7 @@ import java.util.Iterator;
 import org.eclipse.gef.commands.Command;
 import org.eclipse.gef.ui.actions.Clipboard;
 
+import de.bmotionstudio.gef.editor.model.BConnection;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.Visualization;
 
@@ -51,7 +52,8 @@ public class CopyCommand extends Command {
 	}
 
 	public boolean isCopyableControl(BControl control) {
-		if (!(control instanceof Visualization))
+		if (!(control instanceof Visualization)
+				&& !(control instanceof BConnection))
 			return true;
 		return false;
 	}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/CopyPasteHelper.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/CopyPasteHelper.java
index 5d23251fd161bf8658b9517cebb05da2113aa460..119d6ffef4d5a0bd0bf1183ed31a34baec46f64f 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/CopyPasteHelper.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/CopyPasteHelper.java
@@ -7,12 +7,15 @@
 package de.bmotionstudio.gef.editor.command;
 
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 
 import de.bmotionstudio.gef.editor.model.BControl;
 
 public class CopyPasteHelper {
 
 	private ArrayList<BControl> list = new ArrayList<BControl>();
+	private Map<BControl, BControl> alreadyCloned = new HashMap<BControl, BControl>();
 	private int distance = 10;
 
 	public CopyPasteHelper(ArrayList<BControl> list, int distance) {
@@ -36,4 +39,8 @@ public class CopyPasteHelper {
 		return distance;
 	}
 
+	public Map<BControl, BControl> getAlreadyClonedMap() {
+		return alreadyCloned;
+	}
+
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/PasteCommand.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/PasteCommand.java
index 1136ff70658f845e0ba18e58ce42383d78b7483a..65f80d35058642eeb81d42fbb3350d7b4e5bbd25 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/PasteCommand.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/PasteCommand.java
@@ -15,6 +15,7 @@ import org.eclipse.gef.commands.Command;
 import org.eclipse.gef.ui.actions.Clipboard;
 
 import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.model.BConnection;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.Visualization;
 
@@ -22,7 +23,9 @@ public class PasteCommand extends Command {
 
 	private CopyPasteHelper cHelper;
 
-	private HashMap<BControl, BControl> list = new HashMap<BControl, BControl>();
+	// List with mapping original BControl ==> cloned BControl
+	private HashMap<BControl, BControl> mappingControl = new HashMap<BControl, BControl>();
+	private HashMap<BConnection, BConnection> mappingConnection = new HashMap<BConnection, BConnection>();
 
 	private List<BControl> parentControls = new ArrayList<BControl>();
 
@@ -38,7 +41,7 @@ public class PasteCommand extends Command {
 		while (it.hasNext()) {
 			BControl node = (BControl) it.next();
 			if (isPastableControl(node)) {
-				list.put(node, null);
+				mappingControl.put(node, null);
 			}
 		}
 		return true;
@@ -61,13 +64,15 @@ public class PasteCommand extends Command {
 		if (!canExecute())
 			return;
 
-		for (BControl parent : parentControls) {
+		try {
 
-			Iterator<BControl> it = list.keySet().iterator();
-			while (it.hasNext()) {
-				BControl control = (BControl) it.next();
-				control.setParent(parent);
-				try {
+			for (BControl parent : parentControls) {
+
+				// Copy/Paste controls
+				Iterator<BControl> it = mappingControl.keySet().iterator();
+				while (it.hasNext()) {
+					BControl control = (BControl) it.next();
+					control.setParent(parent);
 					BControl clone = (BControl) control.clone();
 					clone.setParent(parent);
 					int x = Integer.valueOf(Integer.valueOf(clone
@@ -80,43 +85,94 @@ public class PasteCommand extends Command {
 							+ cHelper.getDistance());
 					clone.setAttributeValue(AttributeConstants.ATTRIBUTE_Y, y
 							+ cHelper.getDistance());
-					list.put(control, clone);
+					mappingControl.put(control, clone);
 					cHelper.setDistance(cHelper.getDistance() + 10);
-				} catch (CloneNotSupportedException e) {
-					e.printStackTrace();
 				}
+				
+				// Copy/Paste connections
+				HashMap<BControl, BControl> helpMap = new HashMap<BControl, BControl>();
+				helpMap.putAll(cHelper.getAlreadyClonedMap());
+				helpMap.putAll(mappingControl);
+				Iterator<BControl> it2 = helpMap.keySet().iterator();
+				while (it2.hasNext()) {
+					BControl control = it2.next();
+					// Clone connections
+					for (BConnection c : control.getSourceConnections())
+						copyPasteConnection(c, helpMap);
+					for (BConnection c : control.getTargetConnections())
+						copyPasteConnection(c, helpMap);
+				}
+
+				redo();
+
 			}
-			redo();
 
+		} catch (CloneNotSupportedException e) {
+			e.printStackTrace();
 		}
 
 	}
 
+	private void copyPasteConnection(BConnection c,
+			HashMap<BControl, BControl> controlMap)
+			throws CloneNotSupportedException {
+		BConnection newConnection = mappingConnection.get(c);
+		if (newConnection == null) {
+			newConnection = (BConnection) c.clone();
+			newConnection.disconnect();
+			mappingConnection.put(c, newConnection);
+		}
+		BControl t = controlMap.get(newConnection.getTarget());
+		if (t == null)
+			t = newConnection.getTarget();
+		BControl s = controlMap.get(newConnection.getSource());
+		if (s == null)
+			s = newConnection.getSource();
+		newConnection.setTarget(t);
+		newConnection.setSource(s);
+	}
+
 	@Override
 	public void redo() {
-		Iterator<BControl> it = list.values().iterator();
+
+		Iterator<BControl> it = mappingControl.values().iterator();
 		while (it.hasNext()) {
 			BControl control = it.next();
 			if (isPastableControl(control)) {
 				control.getParent().addChild(control);
 			}
 		}
+
+		Iterator<BConnection> it2 = mappingConnection.values().iterator();
+		while (it2.hasNext()) {
+			BConnection connection = it2.next();
+			connection.reconnect();
+		}
+
 	}
 
 	@Override
 	public boolean canUndo() {
-		return !(list.isEmpty());
+		return !(mappingControl.isEmpty());
 	}
 
 	@Override
 	public void undo() {
-		Iterator<BControl> it = list.values().iterator();
+
+		Iterator<BControl> it = mappingControl.values().iterator();
 		while (it.hasNext()) {
 			BControl bcontrol = it.next();
 			if (isPastableControl(bcontrol)) {
 				bcontrol.getParent().removeChild(bcontrol);
 			}
 		}
+
+		Iterator<BConnection> it2 = mappingConnection.values().iterator();
+		while (it2.hasNext()) {
+			BConnection connection = it2.next();
+			connection.disconnect();
+		}
+
 	}
 
 	public boolean isPastableControl(BControl control) {
@@ -126,7 +182,7 @@ public class PasteCommand extends Command {
 	}
 
 	public HashMap<BControl, BControl> getList() {
-		return this.list;
+		return this.mappingControl;
 	}
 
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/ObserverCommand.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/SetObserverCommand.java
similarity index 61%
rename from de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/ObserverCommand.java
rename to de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/SetObserverCommand.java
index b27dd0d833d937e1c2d39fbd37043cd6c41c5a91..76d48c5491d39d8b67579dbb2c04b775c803a23f 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/ObserverCommand.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/command/SetObserverCommand.java
@@ -11,53 +11,46 @@ import org.eclipse.gef.commands.Command;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.observer.Observer;
 
-public class ObserverCommand extends Command {
+public class SetObserverCommand extends Command {
 
-	private String className;
-	private Observer clonedObserver;
+	private Observer oldObserver;
 	private Observer newObserver;
 	private Observer clonedNewObserver;
 	private BControl control;
 
 	public void execute() {
-
+		// Clone the new observer
 		try {
 			clonedNewObserver = newObserver.clone();
 		} catch (CloneNotSupportedException e) {
 			e.printStackTrace();
 		}
-
+		// Set the new observer
 		control.addObserver(newObserver);
-
 	}
 
 	public boolean canExecute() {
+		if (newObserver == null || control == null)
+			return false;
 		return true;
 	}
 
 	public void undo() {
-
-		// Remove completely new Observer
-		if (clonedObserver == null) {
-			control.removeObserver(getClassName());
-		} else { // Reset Observer
-			control.addObserver(clonedObserver);
+		// If we had an old observer, set the old one
+		if (oldObserver != null) {
+			control.addObserver(oldObserver);
+			// else remove the observer
+		} else {
+			control.removeObserver(newObserver);
 		}
-
 	}
 
 	public void redo() {
+		// Redo method adds the cloned observer, since the observer could be
+		// changed during set and redo action
 		control.addObserver(clonedNewObserver);
 	}
 
-	public void setClassName(String className) {
-		this.className = className;
-	}
-
-	public String getClassName() {
-		return className;
-	}
-
 	public void setControl(BControl control) {
 		this.control = control;
 	}
@@ -66,12 +59,12 @@ public class ObserverCommand extends Command {
 		return this.control;
 	}
 
-	public Observer getClonedObserver() {
-		return clonedObserver;
+	public Observer getOldObserver() {
+		return oldObserver;
 	}
 
-	public void setClonedObserver(Observer clonedObserver) {
-		this.clonedObserver = clonedObserver;
+	public void setOldObserver(Observer oldObserver) {
+		this.oldObserver = oldObserver;
 	}
 
 	public Observer getNewObserver() {
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/edit/TextEditManager.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/edit/TextEditManager.java
index 82065ecd1d75b43fcbabbcef511437de882d9256..c2ad978d12b81b1248409b800616cceddc1487f7 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/edit/TextEditManager.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/edit/TextEditManager.java
@@ -26,7 +26,7 @@ import org.eclipse.ui.part.CellEditorActionHandler;
 
 import de.bmotionstudio.gef.editor.AttributeConstants;
 import de.bmotionstudio.gef.editor.model.BControl;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 
 public class TextEditManager extends DirectEditManager {
 
@@ -41,7 +41,7 @@ public class TextEditManager extends DirectEditManager {
 		}
 	};
 
-	public TextEditManager(AppAbstractEditPart source, CellEditorLocator locator) {
+	public TextEditManager(BMSAbstractEditPart source, CellEditorLocator locator) {
 		super(source, null, locator);
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMotionNodeEditPolicy.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMSConnectionEditPolicy.java
similarity index 54%
rename from de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMotionNodeEditPolicy.java
rename to de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMSConnectionEditPolicy.java
index 71e68f16775c4bd77a02435070de5179d75e7607..86d7c74f263eef5a06034e143ae22034002f88ba 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMotionNodeEditPolicy.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMSConnectionEditPolicy.java
@@ -16,7 +16,7 @@ import de.bmotionstudio.gef.editor.command.ConnectionReconnectCommand;
 import de.bmotionstudio.gef.editor.model.BConnection;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class BMotionNodeEditPolicy extends GraphicalNodeEditPolicy {
+public class BMSConnectionEditPolicy extends GraphicalNodeEditPolicy {
 
 	/*
 	 * (non-Javadoc)
@@ -27,9 +27,12 @@ public class BMotionNodeEditPolicy extends GraphicalNodeEditPolicy {
 	 */
 	protected Command getConnectionCompleteCommand(
 			CreateConnectionRequest request) {
-		ConnectionCreateCommand cmd = (ConnectionCreateCommand) request
-				.getStartCommand();
-		cmd.setTarget((BControl) getHost().getModel());
+		ConnectionCreateCommand cmd = null;
+		Object newObject = request.getNewObject();
+		if (newObject instanceof BConnection) {
+			cmd = (ConnectionCreateCommand) request.getStartCommand();
+			cmd.setTarget((BControl) getHost().getModel());
+		}
 		return cmd;
 	}
 
@@ -41,12 +44,16 @@ public class BMotionNodeEditPolicy extends GraphicalNodeEditPolicy {
 	 * (org.eclipse.gef.requests.CreateConnectionRequest)
 	 */
 	protected Command getConnectionCreateCommand(CreateConnectionRequest request) {
-		BControl source = (BControl) getHost().getModel();
-		ConnectionCreateCommand cmd = new ConnectionCreateCommand(source);
-		BConnection con = (BConnection) request.getNewObject();
-		con.setVisualization(source.getVisualization());
-		cmd.setConnection(con);
-		request.setStartCommand(cmd);
+		ConnectionCreateCommand cmd = null;
+		Object newObject = request.getNewObject();
+		if (newObject instanceof BConnection) {
+			BControl source = (BControl) getHost().getModel();
+			cmd = new ConnectionCreateCommand(source);
+			BConnection con = (BConnection) newObject;
+			con.setVisualization(source.getVisualization());
+			cmd.setConnection(con);
+			request.setStartCommand(cmd);
+		}
 		return cmd;
 	}
 
@@ -57,12 +64,15 @@ public class BMotionNodeEditPolicy extends GraphicalNodeEditPolicy {
 	 * getReconnectSourceCommand (org.eclipse.gef.requests.ReconnectRequest)
 	 */
 	protected Command getReconnectSourceCommand(ReconnectRequest request) {
-		BConnection conn = (BConnection) request.getConnectionEditPart()
-				.getModel();
-		BControl newSource = (BControl) getHost().getModel();
-		ConnectionReconnectCommand cmd = new ConnectionReconnectCommand();
-		cmd.setNewSource(newSource);
-		cmd.setConnection(conn);
+		ConnectionReconnectCommand cmd = null;
+		Object newObject = request.getConnectionEditPart().getModel();
+		if (newObject instanceof BConnection) {
+			BConnection conn = (BConnection) newObject;
+			BControl newSource = (BControl) getHost().getModel();
+			cmd = new ConnectionReconnectCommand();
+			cmd.setNewSource(newSource);
+			cmd.setConnection(conn);
+		}
 		return cmd;
 	}
 
@@ -73,12 +83,15 @@ public class BMotionNodeEditPolicy extends GraphicalNodeEditPolicy {
 	 * getReconnectTargetCommand (org.eclipse.gef.requests.ReconnectRequest)
 	 */
 	protected Command getReconnectTargetCommand(ReconnectRequest request) {
-		BConnection conn = (BConnection) request.getConnectionEditPart()
-				.getModel();
-		BControl newTarget = (BControl) getHost().getModel();
-		ConnectionReconnectCommand cmd = new ConnectionReconnectCommand();
-		cmd.setNewTarget(newTarget);
-		cmd.setConnection(conn);
+		ConnectionReconnectCommand cmd = null;
+		Object newObject = request.getConnectionEditPart().getModel();
+		if (newObject instanceof BConnection) {
+			BConnection conn = (BConnection) newObject;
+			BControl newTarget = (BControl) getHost().getModel();
+			cmd = new ConnectionReconnectCommand();
+			cmd.setNewTarget(newTarget);
+			cmd.setConnection(conn);
+		}
 		return cmd;
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/AppDeletePolicy.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMSDeletePolicy.java
similarity index 89%
rename from de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/AppDeletePolicy.java
rename to de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMSDeletePolicy.java
index e6e18db463743f48589a4b97253412a7328a0084..21f255bd50f434c9648132b238f1f83c9af2c124 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/AppDeletePolicy.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMSDeletePolicy.java
@@ -13,7 +13,7 @@ import org.eclipse.gef.requests.GroupRequest;
 import de.bmotionstudio.gef.editor.command.DeleteCommand;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class AppDeletePolicy extends ComponentEditPolicy {
+public class BMSDeletePolicy extends ComponentEditPolicy {
 
 	protected Command createDeleteCommand(GroupRequest deleteRequest) {
 		DeleteCommand command = new DeleteCommand((BControl) getHost()
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/AppEditLayoutPolicy.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMSEditLayoutPolicy.java
similarity index 87%
rename from de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/AppEditLayoutPolicy.java
rename to de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMSEditLayoutPolicy.java
index 5fcc1fe24c6c002c48b4e7b7dd3dae3ccf268a1e..8eae508da5b13fa6318f457154eca3cecb12eb69 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/AppEditLayoutPolicy.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMSEditLayoutPolicy.java
@@ -27,9 +27,9 @@ import de.bmotionstudio.gef.editor.command.ChangeGuideCommand;
 import de.bmotionstudio.gef.editor.command.CreateCommand;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.BMotionGuide;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 
-public class AppEditLayoutPolicy extends XYLayoutEditPolicy {
+public class BMSEditLayoutPolicy extends XYLayoutEditPolicy {
 
 	@Override
 	protected Command createChangeConstraintCommand(EditPart child,
@@ -136,17 +136,18 @@ public class AppEditLayoutPolicy extends XYLayoutEditPolicy {
 	protected Command getCreateCommand(CreateRequest request) {
 
 		if (request.getType() == REQ_CREATE
-				&& getHost() instanceof AppAbstractEditPart) {
+				&& getHost() instanceof BMSAbstractEditPart) {
 
-			if (((BControl) ((AppAbstractEditPart) getHost()).getModel())
+			if (((BControl) ((BMSAbstractEditPart) getHost()).getModel())
 					.canHaveChildren()) {
 
 				BControl newObj = (BControl) request.getNewObject();
 
-				CreateCommand createCmd = new CreateCommand(
-						newObj, (BControl) getHost().getModel());
+				CreateCommand createCmd = new CreateCommand(newObj,
+						(BControl) getHost().getModel());
 
 				Rectangle constraint = (Rectangle) getConstraintFor(request);
+
 				constraint.x = (constraint.x < 0) ? 0 : constraint.x;
 				constraint.y = (constraint.y < 0) ? 0 : constraint.y;
 
@@ -157,19 +158,21 @@ public class AppEditLayoutPolicy extends XYLayoutEditPolicy {
 						.getAttributes().get(
 								AttributeConstants.ATTRIBUTE_HEIGHT);
 
-				if (atrWidth != null) {
-					constraint.width = Integer.valueOf(atrWidth.getValue()
-							.toString());
+				Integer cWidth = Integer.valueOf(atrWidth.getDefaultValue()
+						.toString());
+				if (!atrWidth.isEditable()) {
+					constraint.width = cWidth;
 				} else {
-					constraint.width = (constraint.width <= 0) ? 100
+					constraint.width = (constraint.width <= 0) ? cWidth
 							: constraint.width;
 				}
 
-				if (atrHeight != null) {
-					constraint.height = Integer.valueOf(atrHeight.getValue()
-							.toString());
+				Integer cHeight = Integer.valueOf(atrHeight.getDefaultValue()
+						.toString());
+				if (!atrHeight.isEditable()) {
+					constraint.height = cHeight;
 				} else {
-					constraint.height = (constraint.height <= 0) ? 100
+					constraint.height = (constraint.height <= 0) ? cHeight
 							: constraint.height;
 				}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMotionStudioResizableEditPolicy.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMSResizableEditPolicy.java
similarity index 93%
rename from de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMotionStudioResizableEditPolicy.java
rename to de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMSResizableEditPolicy.java
index cbe96daaf417a66b0d166d8d4fa292a28c853097..0c51a081ccef22f7cff3e5ee76d8273819b8f891 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMotionStudioResizableEditPolicy.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMSResizableEditPolicy.java
@@ -15,7 +15,7 @@ import org.eclipse.gef.GraphicalEditPart;
 import org.eclipse.gef.LayerConstants;
 import org.eclipse.gef.editpolicies.ResizableEditPolicy;
 
-public class BMotionStudioResizableEditPolicy extends ResizableEditPolicy {
+public class BMSResizableEditPolicy extends ResizableEditPolicy {
 
 	/**
 	 * Creates the figure used for feedback.
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMotionStudioFlowEditPolicy.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMotionStudioFlowEditPolicy.java
deleted file mode 100644
index 956819493c3a5554155a51cf5f936bd59fd19356..0000000000000000000000000000000000000000
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/BMotionStudioFlowEditPolicy.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/** 
- * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
- * Heinrich Heine Universitaet Duesseldorf
- * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
- * */
-package de.bmotionstudio.gef.editor.editpolicy;
-
-import org.eclipse.draw2d.FlowLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.ToolbarLayout;
-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.FlowLayoutEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-
-import de.bmotionstudio.gef.editor.command.AddCommand;
-import de.bmotionstudio.gef.editor.command.ReorderPartCommand;
-import de.bmotionstudio.gef.editor.model.BControl;
-import de.bmotionstudio.gef.editor.model.BTable;
-import de.bmotionstudio.gef.editor.model.BTableCell;
-import de.bmotionstudio.gef.editor.model.BTableColumn;
-
-public class BMotionStudioFlowEditPolicy extends FlowLayoutEditPolicy {
-
-	@Override
-	protected Command createAddCommand(EditPart child, EditPart after) {
-
-		BControl childModel = (BControl) child.getModel();
-		BControl parentModel = (BControl) getHost().getModel();
-		if ((childModel instanceof BTableColumn && parentModel instanceof BTable)
-				|| (childModel instanceof BTableCell
-						&& parentModel instanceof BTableColumn && childModel
-						.getParent().equals(parentModel))) {
-			AddCommand command = new AddCommand();
-			command.setChild(childModel);
-			command.setParent(parentModel);
-			int index = getHost().getChildren().indexOf(after);
-			command.setIndex(index);
-			return command;
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.LayoutEditPolicy#createChildEditPolicy(org.eclipse.gef.EditPart)
-	 */
-	protected EditPolicy createChildEditPolicy(EditPart child) {
-		BMotionStudioResizableEditPolicy policy = new BMotionStudioResizableEditPolicy();
-		policy.setResizeDirections(PositionConstants.EAST
-				| PositionConstants.WEST);
-		return policy;
-	}
-
-	@Override
-	protected Command createMoveChildCommand(EditPart child, EditPart after) {
-
-
-		BControl childModel = (BControl) child.getModel();
-		BControl parentModel = (BControl) getHost().getModel();
-
-		if ((childModel instanceof BTableColumn && parentModel instanceof BTable)
-				|| (childModel instanceof BTableCell && parentModel instanceof BTableColumn)) {
-			int oldIndex = getHost().getChildren().indexOf(child);
-			int newIndex = getHost().getChildren().indexOf(after);
-			if (newIndex > oldIndex)
-				newIndex--;
-			ReorderPartCommand command = new ReorderPartCommand(childModel,
-					parentModel, newIndex);
-			return command;
-		}
-
-		return null;
-
-	}
-
-	@Override
-	protected Command getCreateCommand(CreateRequest request) {
-		// CreateCommand command = new CreateCommand(
-		// (BControl) request.getNewObject(), (BControl) getHost()
-		// .getModel());
-		// EditPart after = getInsertionReference(request);
-		// command.setLayout(new Rectangle(0, 0, 100, 25));
-		// int index = getHost().getChildren().indexOf(after);
-		// command.setIndex(index);
-		// return command;
-		return null;
-	}
-
-	@Override
-	protected boolean isHorizontal() {
-		IFigure figure = getLayoutContainer();
-		if (figure.getLayoutManager() instanceof ToolbarLayout) {
-			return ((ToolbarLayout) figure.getLayoutManager()).isHorizontal();
-		} else if (figure.getLayoutManager() instanceof FlowLayout) {
-			return ((FlowLayout) figure.getLayoutManager()).isHorizontal();
-		}
-		return false;
-	}
-
-	@Override
-	public void showLayoutTargetFeedback(Request request) {
-		if (request instanceof CreateRequest) {
-			Object newObject = ((CreateRequest) request).getNewObject();
-			if (!(newObject instanceof BTableColumn || newObject instanceof BTableCell))
-				return;
-		}
-		super.showLayoutTargetFeedback(request);
-	}
-
-}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/ChangeAttributePolicy.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/ChangeAttributePolicy.java
index cfeb087846f7263a215af10a187f2999a7eca1d9..781627fa430f9ac8bfae681adc2f5c01ab88f7dd 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/ChangeAttributePolicy.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/ChangeAttributePolicy.java
@@ -13,7 +13,7 @@ import org.eclipse.gef.editpolicies.AbstractEditPolicy;
 
 import de.bmotionstudio.gef.editor.library.AbstractLibraryCommand;
 import de.bmotionstudio.gef.editor.library.AttributeRequest;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 
 public class ChangeAttributePolicy extends AbstractEditPolicy {
 
@@ -25,7 +25,7 @@ public class ChangeAttributePolicy extends AbstractEditPolicy {
 				&& request instanceof AttributeRequest) {
 			AttributeRequest changeAttributeReq = (AttributeRequest) request;
 			if (changeAttributeReq.getAttributeTransferObject() != null) {
-				AbstractLibraryCommand command = ((AppAbstractEditPart) getHost())
+				AbstractLibraryCommand command = ((BMSAbstractEditPart) getHost())
 						.getLibraryCommand(changeAttributeReq);
 				if (command != null) {
 					command.setEditPart(getHost());
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/CustomDirectEditPolicy.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/CustomDirectEditPolicy.java
index 0676c50ab47bd98a5fd9a44c929bf0e7de2dc97c..a25a39d8859a2d736cde7e70e2e77dd9ab4730c0 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/CustomDirectEditPolicy.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/CustomDirectEditPolicy.java
@@ -12,7 +12,7 @@ import org.eclipse.gef.requests.DirectEditRequest;
 
 import de.bmotionstudio.gef.editor.command.RenameCommand;
 import de.bmotionstudio.gef.editor.model.BControl;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 
 public class CustomDirectEditPolicy extends DirectEditPolicy {
 
@@ -21,7 +21,7 @@ public class CustomDirectEditPolicy extends DirectEditPolicy {
 	 */
 	protected Command getDirectEditCommand(DirectEditRequest edit) {
 		String labelText = (String) edit.getCellEditor().getValue();
-		AppAbstractEditPart label = (AppAbstractEditPart) getHost();
+		BMSAbstractEditPart label = (BMSAbstractEditPart) getHost();
 		RenameCommand command = new RenameCommand();
 		command.setControl((BControl) label.getModel());
 		command.setNewString(labelText);
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/SignalLayoutEditPolicy.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/SignalLayoutEditPolicy.java
new file mode 100644
index 0000000000000000000000000000000000000000..7d5ca8febe819d62b19bef3552077041fb6f2fc7
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/SignalLayoutEditPolicy.java
@@ -0,0 +1,270 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+package de.bmotionstudio.gef.editor.editpolicy;
+
+import java.util.List;
+
+import org.eclipse.draw2d.FlowLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PrecisionRectangle;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.draw2d.geometry.Translatable;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.CompoundCommand;
+import org.eclipse.gef.editpolicies.FlowLayoutEditPolicy;
+import org.eclipse.gef.requests.ChangeBoundsRequest;
+import org.eclipse.gef.requests.CreateRequest;
+
+import de.bmotionstudio.gef.editor.command.AddCommand;
+import de.bmotionstudio.gef.editor.command.BControlChangeLayoutCommand;
+import de.bmotionstudio.gef.editor.command.ReorderPartCommand;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.model.Light;
+import de.bmotionstudio.gef.editor.model.Signal;
+
+public class SignalLayoutEditPolicy extends FlowLayoutEditPolicy {
+
+	private static final Dimension PREFERRED_SIZE = new Dimension(-1, -1);
+
+	/**
+	 * Constant being used to indicate that upon creation (or during move) a
+	 * size was not specified.
+	 * 
+	 * @since 3.7
+	 */
+	protected static final Dimension UNSPECIFIED_SIZE = new Dimension();
+
+	@Override
+	protected Command createAddCommand(EditPart child, EditPart after) {
+
+		BControl childModel = (BControl) child.getModel();
+		BControl parentModel = (BControl) getHost().getModel();
+		if ((childModel instanceof Light && parentModel instanceof Signal)) {
+			AddCommand command = new AddCommand();
+			command.setChild(childModel);
+			command.setParent(parentModel);
+			int index = getHost().getChildren().indexOf(after);
+			command.setIndex(index);
+			return command;
+		}
+		return null;
+
+	}
+
+	@Override
+	public Command getCommand(Request request) {
+		if (REQ_RESIZE_CHILDREN.equals(request.getType()))
+			return getResizeChildrenCommand((ChangeBoundsRequest) request);
+		return super.getCommand(request);
+	}
+
+	protected Command getResizeChildrenCommand(ChangeBoundsRequest request) {
+		CompoundCommand resize = new CompoundCommand();
+		Command c;
+		GraphicalEditPart child;
+		List<?> children = request.getEditParts();
+		for (int i = 0; i < children.size(); i++) {
+			child = (GraphicalEditPart) children.get(i);
+			c = createChangeConstraintCommand(
+					request,
+					child,
+					translateToModelConstraint(getConstraintFor(request, child)));
+			resize.add(c);
+		}
+		return resize.unwrap();
+	}
+
+	protected Command createChangeConstraintCommand(
+			ChangeBoundsRequest request, EditPart child, Object constraint) {
+		BControlChangeLayoutCommand cmd = new BControlChangeLayoutCommand();
+		cmd.setModel(child.getModel());
+		cmd.setConstraint((Rectangle) constraint);
+		return cmd;
+	}
+
+	/**
+	 * Generates a draw2d constraint object for the given
+	 * <code>ChangeBoundsRequest</code> and child EditPart by delegating to
+	 * {@link #getConstraintFor(Request, GraphicalEditPart, Rectangle)}.
+	 * 
+	 * The rectangle being passed over to
+	 * {@link #getConstraintFor(Request, GraphicalEditPart, Rectangle)} is
+	 * calculated based on the child figure's current bounds and the
+	 * ChangeBoundsRequest's move and resize deltas. It is made layout-relative
+	 * by using {@link #translateFromAbsoluteToLayoutRelative(Translatable)}
+	 * before calling
+	 * {@link #getConstraintFor(Request, GraphicalEditPart, Rectangle)}.
+	 * 
+	 * @param request
+	 *            the ChangeBoundsRequest
+	 * @param child
+	 *            the child EditPart for which the constraint should be
+	 *            generated
+	 * @return the draw2d constraint
+	 */
+	protected Object getConstraintFor(ChangeBoundsRequest request,
+			GraphicalEditPart child) {
+		Rectangle locationAndSize = new PrecisionRectangle(child.getFigure()
+				.getBounds());
+		child.getFigure().translateToAbsolute(locationAndSize);
+		locationAndSize = request.getTransformedRectangle(locationAndSize);
+		translateFromAbsoluteToLayoutRelative(locationAndSize);
+		return getConstraintFor(request, child, locationAndSize);
+	}
+
+	/**
+	 * Responsible of generating a draw2d constraint for the given Rectangle,
+	 * which represents the already transformed (layout-relative) position and
+	 * size of the given Request.
+	 * 
+	 * By default, this method delegates to {@link #getConstraintFor(Point)} or
+	 * {@link #getConstraintFor(Rectangle)}, dependent on whether the size of
+	 * the rectangle is an {@link #UNSPECIFIED_SIZE} or not.
+	 * 
+	 * Subclasses may overwrite this method in case they need the request or the
+	 * edit part (which will of course not be set during creation) to calculate
+	 * a layout constraint for the request.
+	 * 
+	 * @param rectangle
+	 *            the Rectangle relative to the {@link #getLayoutOrigin() layout
+	 *            origin}
+	 * @return the constraint
+	 * @since 3.7
+	 */
+	protected Object getConstraintFor(Request request, GraphicalEditPart child,
+			Rectangle rectangle) {
+		if (UNSPECIFIED_SIZE.equals(rectangle.getSize())) {
+			return getConstraintFor(rectangle.getLocation());
+		}
+		return getConstraintFor(rectangle);
+	}
+
+	/**
+	 * Generates a draw2d constraint for the given <code>CreateRequest</code> by
+	 * delegating to
+	 * {@link #getConstraintFor(Request, GraphicalEditPart, Rectangle)}.
+	 * 
+	 * If the CreateRequest has a size, is used during size-on-drop creation, a
+	 * Rectangle of the request's location and size is passed with the
+	 * delegation. Otherwise, a rectangle with the request's location and an
+	 * empty size (0,0) is passed over.
+	 * <P>
+	 * The CreateRequest's location is relative to the Viewer. The location is
+	 * made layout-relative by using
+	 * {@link #translateFromAbsoluteToLayoutRelative(Translatable)} before
+	 * calling {@link #getConstraintFor(Request, GraphicalEditPart, Rectangle)}.
+	 * 
+	 * @param request
+	 *            the CreateRequest
+	 * @return a draw2d constraint
+	 */
+	protected Object getConstraintFor(CreateRequest request) {
+		Rectangle locationAndSize = null;
+		if (request.getSize() == null || request.getSize().isEmpty()) {
+			locationAndSize = new PrecisionRectangle(request.getLocation(),
+					UNSPECIFIED_SIZE);
+		} else {
+			locationAndSize = new PrecisionRectangle(request.getLocation(),
+					request.getSize());
+		}
+		translateFromAbsoluteToLayoutRelative(locationAndSize);
+		return getConstraintFor(request, null, locationAndSize);
+	}
+
+	/**
+	 * Generates a draw2d constraint given a <code>Point</code>. This method is
+	 * called during creation, when only a mouse location is available, as well
+	 * as during move, in case no resizing is involved.
+	 * 
+	 * @param point
+	 *            the Point relative to the {@link #getLayoutOrigin() layout
+	 *            origin}
+	 * @return the constraint
+	 */
+	protected Object getConstraintFor(Point p) {
+		return new Rectangle(p, PREFERRED_SIZE);
+	}
+
+	/**
+	 * Generates a draw2d constraint given a <code>Rectangle</code>. This method
+	 * is called during most operations.
+	 * 
+	 * @param rect
+	 *            the Rectangle relative to the {@link #getLayoutOrigin() layout
+	 *            origin}
+	 * @return the constraint
+	 */
+	protected Object getConstraintFor(Rectangle r) {
+		return new Rectangle(r);
+	}
+
+	/**
+	 * Converts a constraint from the format used by LayoutManagers, to the form
+	 * stored in the model.
+	 * 
+	 * @param figureConstraint
+	 *            the draw2d constraint
+	 * @return the model constraint
+	 */
+	protected Object translateToModelConstraint(Object figureConstraint) {
+		return figureConstraint;
+	}
+
+	/**
+	 * @see org.eclipse.gef.editpolicies.LayoutEditPolicy#createChildEditPolicy(org.eclipse.gef.EditPart)
+	 */
+	protected EditPolicy createChildEditPolicy(EditPart child) {
+		BMSResizableEditPolicy policy = new BMSResizableEditPolicy();
+		policy.setResizeDirections(PositionConstants.EAST
+				| PositionConstants.WEST);
+		return policy;
+	}
+
+	@Override
+	protected Command createMoveChildCommand(EditPart child, EditPart after) {
+
+		BControl childModel = (BControl) child.getModel();
+		BControl parentModel = (BControl) getHost().getModel();
+
+		if ((childModel instanceof Light && parentModel instanceof Signal)) {
+			int oldIndex = getHost().getChildren().indexOf(child);
+			int newIndex = getHost().getChildren().indexOf(after);
+			if (newIndex > oldIndex)
+				newIndex--;
+			ReorderPartCommand command = new ReorderPartCommand(childModel,
+					parentModel, newIndex);
+			return command;
+		}
+
+		return null;
+
+	}
+
+	@Override
+	protected Command getCreateCommand(CreateRequest request) {
+		return null;
+	}
+
+	@Override
+	protected boolean isHorizontal() {
+		IFigure figure = getLayoutContainer();
+		if (figure.getLayoutManager() instanceof ToolbarLayout) {
+			return ((ToolbarLayout) figure.getLayoutManager()).isHorizontal();
+		} else if (figure.getLayoutManager() instanceof FlowLayout) {
+			return ((FlowLayout) figure.getLayoutManager()).isHorizontal();
+		}
+		return false;
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/TableLayoutEditPolicy.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/TableLayoutEditPolicy.java
new file mode 100644
index 0000000000000000000000000000000000000000..d15decd9868483af831862757a055012ea5a8a02
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/TableLayoutEditPolicy.java
@@ -0,0 +1,292 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+package de.bmotionstudio.gef.editor.editpolicy;
+
+import java.util.List;
+
+import org.eclipse.draw2d.FlowLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PrecisionRectangle;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.draw2d.geometry.Translatable;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.CompoundCommand;
+import org.eclipse.gef.editpolicies.FlowLayoutEditPolicy;
+import org.eclipse.gef.requests.ChangeBoundsRequest;
+import org.eclipse.gef.requests.CreateRequest;
+
+import de.bmotionstudio.gef.editor.command.AddCommand;
+import de.bmotionstudio.gef.editor.command.BControlChangeLayoutCommand;
+import de.bmotionstudio.gef.editor.command.ReorderPartCommand;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.model.BTable;
+import de.bmotionstudio.gef.editor.model.BTableCell;
+import de.bmotionstudio.gef.editor.model.BTableColumn;
+
+public class TableLayoutEditPolicy extends FlowLayoutEditPolicy {
+
+	private static final Dimension PREFERRED_SIZE = new Dimension(-1, -1);
+
+	/**
+	 * Constant being used to indicate that upon creation (or during move) a
+	 * size was not specified.
+	 * 
+	 * @since 3.7
+	 */
+	protected static final Dimension UNSPECIFIED_SIZE = new Dimension();
+
+	@Override
+	protected Command createAddCommand(EditPart child, EditPart after) {
+
+		BControl childModel = (BControl) child.getModel();
+		BControl parentModel = (BControl) getHost().getModel();
+		if ((childModel instanceof BTableColumn && parentModel instanceof BTable)
+				|| (childModel instanceof BTableCell
+						&& parentModel instanceof BTableColumn && childModel
+						.getParent().equals(parentModel))) {
+			AddCommand command = new AddCommand();
+			command.setChild(childModel);
+			command.setParent(parentModel);
+			int index = getHost().getChildren().indexOf(after);
+			command.setIndex(index);
+			return command;
+		}
+		return null;
+	}
+
+	@Override
+	public Command getCommand(Request request) {
+		if (REQ_RESIZE_CHILDREN.equals(request.getType()))
+			return getResizeChildrenCommand((ChangeBoundsRequest) request);
+		return super.getCommand(request);
+	}
+
+	protected Command getResizeChildrenCommand(ChangeBoundsRequest request) {
+		CompoundCommand resize = new CompoundCommand();
+		Command c;
+		GraphicalEditPart child;
+		List<?> children = request.getEditParts();
+		for (int i = 0; i < children.size(); i++) {
+			child = (GraphicalEditPart) children.get(i);
+			c = createChangeConstraintCommand(
+					request,
+					child,
+					translateToModelConstraint(getConstraintFor(request, child)));
+			resize.add(c);
+		}
+		return resize.unwrap();
+	}
+
+	protected Command createChangeConstraintCommand(
+			ChangeBoundsRequest request, EditPart child, Object constraint) {
+		BControlChangeLayoutCommand cmd = new BControlChangeLayoutCommand();
+		cmd.setModel(child.getModel());
+		cmd.setConstraint((Rectangle) constraint);
+		return cmd;
+	}
+
+	/**
+	 * Generates a draw2d constraint object for the given
+	 * <code>ChangeBoundsRequest</code> and child EditPart by delegating to
+	 * {@link #getConstraintFor(Request, GraphicalEditPart, Rectangle)}.
+	 * 
+	 * The rectangle being passed over to
+	 * {@link #getConstraintFor(Request, GraphicalEditPart, Rectangle)} is
+	 * calculated based on the child figure's current bounds and the
+	 * ChangeBoundsRequest's move and resize deltas. It is made layout-relative
+	 * by using {@link #translateFromAbsoluteToLayoutRelative(Translatable)}
+	 * before calling
+	 * {@link #getConstraintFor(Request, GraphicalEditPart, Rectangle)}.
+	 * 
+	 * @param request
+	 *            the ChangeBoundsRequest
+	 * @param child
+	 *            the child EditPart for which the constraint should be
+	 *            generated
+	 * @return the draw2d constraint
+	 */
+	protected Object getConstraintFor(ChangeBoundsRequest request,
+			GraphicalEditPart child) {
+		Rectangle locationAndSize = new PrecisionRectangle(child.getFigure()
+				.getBounds());
+		child.getFigure().translateToAbsolute(locationAndSize);
+		locationAndSize = request.getTransformedRectangle(locationAndSize);
+		translateFromAbsoluteToLayoutRelative(locationAndSize);
+		return getConstraintFor(request, child, locationAndSize);
+	}
+
+	/**
+	 * Responsible of generating a draw2d constraint for the given Rectangle,
+	 * which represents the already transformed (layout-relative) position and
+	 * size of the given Request.
+	 * 
+	 * By default, this method delegates to {@link #getConstraintFor(Point)} or
+	 * {@link #getConstraintFor(Rectangle)}, dependent on whether the size of
+	 * the rectangle is an {@link #UNSPECIFIED_SIZE} or not.
+	 * 
+	 * Subclasses may overwrite this method in case they need the request or the
+	 * edit part (which will of course not be set during creation) to calculate
+	 * a layout constraint for the request.
+	 * 
+	 * @param rectangle
+	 *            the Rectangle relative to the {@link #getLayoutOrigin() layout
+	 *            origin}
+	 * @return the constraint
+	 * @since 3.7
+	 */
+	protected Object getConstraintFor(Request request, GraphicalEditPart child,
+			Rectangle rectangle) {
+		if (UNSPECIFIED_SIZE.equals(rectangle.getSize())) {
+			return getConstraintFor(rectangle.getLocation());
+		}
+		return getConstraintFor(rectangle);
+	}
+
+	/**
+	 * Generates a draw2d constraint for the given <code>CreateRequest</code> by
+	 * delegating to
+	 * {@link #getConstraintFor(Request, GraphicalEditPart, Rectangle)}.
+	 * 
+	 * If the CreateRequest has a size, is used during size-on-drop creation, a
+	 * Rectangle of the request's location and size is passed with the
+	 * delegation. Otherwise, a rectangle with the request's location and an
+	 * empty size (0,0) is passed over.
+	 * <P>
+	 * The CreateRequest's location is relative to the Viewer. The location is
+	 * made layout-relative by using
+	 * {@link #translateFromAbsoluteToLayoutRelative(Translatable)} before
+	 * calling {@link #getConstraintFor(Request, GraphicalEditPart, Rectangle)}.
+	 * 
+	 * @param request
+	 *            the CreateRequest
+	 * @return a draw2d constraint
+	 */
+	protected Object getConstraintFor(CreateRequest request) {
+		Rectangle locationAndSize = null;
+		if (request.getSize() == null || request.getSize().isEmpty()) {
+			locationAndSize = new PrecisionRectangle(request.getLocation(),
+					UNSPECIFIED_SIZE);
+		} else {
+			locationAndSize = new PrecisionRectangle(request.getLocation(),
+					request.getSize());
+		}
+		translateFromAbsoluteToLayoutRelative(locationAndSize);
+		return getConstraintFor(request, null, locationAndSize);
+	}
+
+	/**
+	 * Generates a draw2d constraint given a <code>Point</code>. This method is
+	 * called during creation, when only a mouse location is available, as well
+	 * as during move, in case no resizing is involved.
+	 * 
+	 * @param point
+	 *            the Point relative to the {@link #getLayoutOrigin() layout
+	 *            origin}
+	 * @return the constraint
+	 */
+	protected Object getConstraintFor(Point p) {
+		return new Rectangle(p, PREFERRED_SIZE);
+	}
+
+	/**
+	 * Generates a draw2d constraint given a <code>Rectangle</code>. This method
+	 * is called during most operations.
+	 * 
+	 * @param rect
+	 *            the Rectangle relative to the {@link #getLayoutOrigin() layout
+	 *            origin}
+	 * @return the constraint
+	 */
+	protected Object getConstraintFor(Rectangle r) {
+		return new Rectangle(r);
+	}
+
+	/**
+	 * Converts a constraint from the format used by LayoutManagers, to the form
+	 * stored in the model.
+	 * 
+	 * @param figureConstraint
+	 *            the draw2d constraint
+	 * @return the model constraint
+	 */
+	protected Object translateToModelConstraint(Object figureConstraint) {
+		return figureConstraint;
+	}
+
+	/**
+	 * @see org.eclipse.gef.editpolicies.LayoutEditPolicy#createChildEditPolicy(org.eclipse.gef.EditPart)
+	 */
+	protected EditPolicy createChildEditPolicy(EditPart child) {
+		BMSResizableEditPolicy policy = new BMSResizableEditPolicy();
+		policy.setResizeDirections(PositionConstants.EAST
+				| PositionConstants.WEST);
+		return policy;
+	}
+
+	@Override
+	protected Command createMoveChildCommand(EditPart child, EditPart after) {
+
+		BControl childModel = (BControl) child.getModel();
+		BControl parentModel = (BControl) getHost().getModel();
+
+		if ((childModel instanceof BTableColumn && parentModel instanceof BTable)
+				|| (childModel instanceof BTableCell && parentModel instanceof BTableColumn)) {
+			int oldIndex = getHost().getChildren().indexOf(child);
+			int newIndex = getHost().getChildren().indexOf(after);
+			if (newIndex > oldIndex)
+				newIndex--;
+			ReorderPartCommand command = new ReorderPartCommand(childModel,
+					parentModel, newIndex);
+			return command;
+		}
+
+		return null;
+
+	}
+
+	@Override
+	protected Command getCreateCommand(CreateRequest request) {
+		// CreateCommand command = new CreateCommand(
+		// (BControl) request.getNewObject(), (BControl) getHost()
+		// .getModel());
+		// EditPart after = getInsertionReference(request);
+		// command.setLayout(new Rectangle(0, 0, 100, 25));
+		// int index = getHost().getChildren().indexOf(after);
+		// command.setIndex(index);
+		// return command;
+		return null;
+	}
+
+	@Override
+	protected boolean isHorizontal() {
+		IFigure figure = getLayoutContainer();
+		if (figure.getLayoutManager() instanceof ToolbarLayout) {
+			return ((ToolbarLayout) figure.getLayoutManager()).isHorizontal();
+		} else if (figure.getLayoutManager() instanceof FlowLayout) {
+			return ((FlowLayout) figure.getLayoutManager()).isHorizontal();
+		}
+		return false;
+	}
+
+	@Override
+	public void showLayoutTargetFeedback(Request request) {
+		if (request instanceof CreateRequest) {
+			Object newObject = ((CreateRequest) request).getNewObject();
+			if (!(newObject instanceof BTableColumn || newObject instanceof BTableCell))
+				return;
+		}
+		super.showLayoutTargetFeedback(request);
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/TrackEditPolicy.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/TrackEditPolicy.java
new file mode 100644
index 0000000000000000000000000000000000000000..9756e26f670cb2c3b8d19ee1b01f592220d83a18
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/editpolicy/TrackEditPolicy.java
@@ -0,0 +1,133 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.editpolicy;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.requests.CreateConnectionRequest;
+import org.eclipse.gef.requests.DropRequest;
+import org.eclipse.gef.requests.ReconnectRequest;
+
+import de.bmotionstudio.gef.editor.command.ConnectionCreateCommand;
+import de.bmotionstudio.gef.editor.command.ConnectionReconnectCommand;
+import de.bmotionstudio.gef.editor.model.BConnection;
+import de.bmotionstudio.gef.editor.model.Track;
+import de.bmotionstudio.gef.editor.model.TrackNode;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
+
+public class TrackEditPolicy extends BMSConnectionEditPolicy {
+
+	@Override
+	protected Command getConnectionCreateCommand(CreateConnectionRequest request) {
+
+		Command cmd = null;
+
+		Object newObject = request.getNewObject();
+		if (newObject instanceof Track) {
+
+			Object model = getHost().getModel();
+			if (model instanceof TrackNode) {
+
+				Track track = (Track) newObject;
+				TrackNode trackNode = (TrackNode) model;
+				cmd = new ConnectionCreateCommand(trackNode);
+				track.setVisualization(trackNode.getVisualization());
+				((ConnectionCreateCommand) cmd).setConnection(track);
+				request.setStartCommand(cmd);
+
+			}
+
+		} else if (newObject instanceof BConnection) {
+			cmd = super.getConnectionCreateCommand(request);
+		}
+
+		return cmd;
+
+	}
+
+	@Override
+	protected Command getConnectionCompleteCommand(
+			CreateConnectionRequest request) {
+
+		Command cmd = null;
+
+		Object newObject = request.getNewObject();
+		if (newObject instanceof Track) {
+
+			cmd = request.getStartCommand();
+			((ConnectionCreateCommand) cmd).setTarget((TrackNode) getHost()
+					.getModel());
+
+		} else if (newObject instanceof BConnection) {
+			cmd = super.getConnectionCompleteCommand(request);
+		}
+
+		return cmd;
+
+	}
+
+	@Override
+	protected Command getReconnectSourceCommand(ReconnectRequest request) {
+
+		Command cmd = null;
+
+		Object newObject = request.getConnectionEditPart().getModel();
+		if (newObject instanceof Track) {
+
+			Track track = (Track) newObject;
+			TrackNode newSource = (TrackNode) getHost().getModel();
+			cmd = new ConnectionReconnectCommand();
+			((ConnectionReconnectCommand) cmd).setNewSource(newSource);
+			((ConnectionReconnectCommand) cmd).setConnection(track);
+
+		} else if (newObject instanceof BConnection) {
+			cmd = super.getReconnectSourceCommand(request);
+		}
+
+		return cmd;
+
+	}
+
+	@Override
+	protected Command getReconnectTargetCommand(ReconnectRequest request) {
+
+		Command cmd = null;
+
+		Object newObject = request.getConnectionEditPart().getModel();
+		if (newObject instanceof Track) {
+
+			Track track = (Track) newObject;
+			TrackNode newTarget = (TrackNode) getHost().getModel();
+			cmd = new ConnectionReconnectCommand();
+			((ConnectionReconnectCommand) cmd).setNewTarget(newTarget);
+			((ConnectionReconnectCommand) cmd).setConnection(track);
+
+		} else if (newObject instanceof BConnection) {
+			cmd = super.getReconnectTargetCommand(request);
+		}
+
+		return cmd;
+
+	}
+
+	@Override
+	protected void showTargetConnectionFeedback(DropRequest request) {
+		if (getHost() instanceof BMSAbstractEditPart) {
+			BMSAbstractEditPart host = (BMSAbstractEditPart) getHost();
+			host.getFigure().setBackgroundColor(ColorConstants.lightGray);
+		}
+	}
+
+	@Override
+	protected void eraseTargetConnectionFeedback(DropRequest request) {
+		if (getHost() instanceof BMSAbstractEditPart) {
+			BMSAbstractEditPart host = (BMSAbstractEditPart) getHost();
+			host.getFigure().setBackgroundColor(ColorConstants.white);
+		}
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/eventb/EventBHelper.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/eventb/EventBHelper.java
index 8e38321cd1a05a202ef222c752bcd764c728ffc3..8714d58555e8c84e80fe64c84a628340c0ff0583 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/eventb/EventBHelper.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/eventb/EventBHelper.java
@@ -11,8 +11,9 @@ import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.core.resources.IFile;
-import org.eventb.core.IMachineRoot;
+import org.eventb.core.ISCAction;
 import org.eventb.core.ISCConstant;
+import org.eventb.core.ISCContextRoot;
 import org.eventb.core.ISCEvent;
 import org.eventb.core.ISCGuard;
 import org.eventb.core.ISCInternalContext;
@@ -20,6 +21,10 @@ import org.eventb.core.ISCInvariant;
 import org.eventb.core.ISCMachineRoot;
 import org.eventb.core.ISCParameter;
 import org.eventb.core.ISCVariable;
+import org.eventb.core.ast.FormulaFactory;
+import org.eventb.core.basis.ContextRoot;
+import org.eventb.core.basis.EventBRoot;
+import org.eventb.core.basis.MachineRoot;
 import org.rodinp.core.IRodinFile;
 import org.rodinp.core.IRodinProject;
 import org.rodinp.core.RodinCore;
@@ -29,18 +34,19 @@ import de.bmotionstudio.gef.editor.model.Visualization;
 import de.prob.logging.Logger;
 
 public final class EventBHelper {
+	
+	private static FormulaFactory formularFactory = FormulaFactory.getDefault();
 
-	public static ISCMachineRoot getCorrespondingFile(IFile file,
+	public static EventBRoot getCorrespondingFile(IFile file,
 			String machineFileName) {
 		IRodinProject rProject = RodinCore.valueOf(file.getProject());
-		ISCMachineRoot machineRoot = null;
+		EventBRoot root = null;
 		if (rProject != null) {
 			IRodinFile rFile = rProject.getRodinFile(machineFileName);
-			if (rFile != null && rFile.getRoot() instanceof IMachineRoot)
-				machineRoot = ((IMachineRoot) rFile.getRoot())
-						.getSCMachineRoot();
+			if (rFile != null && rFile.getRoot() instanceof EventBRoot)
+				root = (EventBRoot) rFile.getRoot();
 		}
-		return machineRoot;
+		return root;
 	}
 
 	public static List<MachineOperation> getOperations(
@@ -50,11 +56,15 @@ public final class EventBHelper {
 
 		if (visualization.getLanguage().equals("EventB")) {
 
-			ISCMachineRoot machineRoot = null;
-			machineRoot = getCorrespondingFile(visualization.getProjectFile(),
+			EventBRoot correspondingFile = getCorrespondingFile(
+					visualization.getProjectFile(),
 					visualization.getMachineName());
 
-			if (machineRoot != null) {
+			if (correspondingFile instanceof MachineRoot
+					&& correspondingFile.exists()) {
+
+				ISCMachineRoot machineRoot = correspondingFile
+						.getSCMachineRoot();
 
 				try {
 
@@ -72,7 +82,8 @@ public final class EventBHelper {
 							guardSet.add(guard.getPredicateString());
 
 						MachineOperation op = new MachineOperation(
-								event.getLabel(), parSet, guardSet);
+								event.getLabel(), parSet, guardSet,
+								renderEvent(event));
 						tmpSet.add(op);
 
 					}
@@ -85,10 +96,10 @@ public final class EventBHelper {
 							.unmodifiableList(new ArrayList<MachineOperation>());
 				}
 
+			} else if (visualization.getLanguage().equals("ClassicalB")) {
+				// TODO: Implement me!!!
 			}
 
-		} else if (visualization.getLanguage().equals("ClassicalB")) {
-			// TODO: Implement me!!!
 		}
 
 		return tmpSet;
@@ -98,30 +109,32 @@ public final class EventBHelper {
 	public static List<MachineContentObject> getVariables(
 			Visualization visualization) {
 
-		ISCMachineRoot machineRoot = null;
+		EventBRoot correspondingFile = getCorrespondingFile(
+				visualization.getProjectFile(), visualization.getMachineName());
 
-		machineRoot = getCorrespondingFile(visualization.getProjectFile(),
-				visualization.getMachineName());
-
-		ISCVariable[] vars = null;
 		ArrayList<MachineContentObject> tmpSet = new ArrayList<MachineContentObject>();
 
-		try {
-			vars = machineRoot.getSCVariables();
-
-			for (ISCVariable var : vars) {
+		if (correspondingFile instanceof MachineRoot
+				&& correspondingFile.exists()) {
 
-				MachineContentObject machinevar = new MachineContentObject(
-						var.getIdentifierString());
-				tmpSet.add(machinevar);
+			ISCMachineRoot machineRoot = correspondingFile.getSCMachineRoot();
 
+			try {
+				ISCVariable[] vars = machineRoot.getSCVariables();
+				for (ISCVariable var : vars) {
+					MachineContentObject machinevar = new MachineContentObject(
+							var.getIdentifierString());
+					machinevar.setType(var.getType(formularFactory));
+					tmpSet.add(machinevar);
+				}
+			} catch (RodinDBException e) {
+				String message = "Rodin DB Exception while getting variables: "
+						+ e.getLocalizedMessage();
+				Logger.notifyUser(message, e);
+				return Collections
+						.unmodifiableList(new ArrayList<MachineContentObject>());
 			}
-		} catch (RodinDBException e) {
-			String message = "Rodin DB Exception while getting variables: "
-					+ e.getLocalizedMessage();
-			Logger.notifyUser(message, e);
-			return Collections
-					.unmodifiableList(new ArrayList<MachineContentObject>());
+
 		}
 
 		return tmpSet;
@@ -131,69 +144,135 @@ public final class EventBHelper {
 	public static List<MachineContentObject> getInvariants(
 			Visualization visualization) {
 
-		ISCMachineRoot machineRoot = null;
-
-		machineRoot = getCorrespondingFile(visualization.getProjectFile(),
-				visualization.getMachineName());
+		EventBRoot correspondingFile = getCorrespondingFile(
+				visualization.getProjectFile(), visualization.getMachineName());
 
-		ISCInvariant[] invariants = null;
 		ArrayList<MachineContentObject> tmpSet = new ArrayList<MachineContentObject>();
 
-		try {
-			invariants = machineRoot.getSCInvariants();
+		if (correspondingFile instanceof MachineRoot
+				&& correspondingFile.exists()) {
 
-			for (ISCInvariant inv : invariants) {
-
-				MachineContentObject machineinv = new MachineContentObject(
-						inv.getPredicateString());
-				tmpSet.add(machineinv);
+			ISCMachineRoot machineRoot = correspondingFile.getSCMachineRoot();
 
+			try {
+				ISCInvariant[] invariants = machineRoot.getSCInvariants();
+				for (ISCInvariant inv : invariants) {
+					MachineContentObject machineinv = new MachineContentObject(
+							inv.getPredicateString());
+					tmpSet.add(machineinv);
+				}
+			} catch (RodinDBException e) {
+				String message = "Rodin DB Exception while getting invariants: "
+						+ e.getLocalizedMessage();
+				Logger.notifyUser(message, e);
+				return Collections
+						.unmodifiableList(new ArrayList<MachineContentObject>());
 			}
-		} catch (RodinDBException e) {
-			String message = "Rodin DB Exception while getting invariants: "
-					+ e.getLocalizedMessage();
-			Logger.notifyUser(message, e);
-			return Collections
-					.unmodifiableList(new ArrayList<MachineContentObject>());
+
 		}
 
 		return tmpSet;
+
 	}
 
 	public static List<MachineContentObject> getConstants(
 			Visualization visualization) {
 
-		ISCMachineRoot machineRoot = null;
-
-		machineRoot = getCorrespondingFile(visualization.getProjectFile(),
-				visualization.getMachineName());
+		EventBRoot correspondingFile = getCorrespondingFile(
+				visualization.getProjectFile(), visualization.getMachineName());
 
 		ArrayList<MachineContentObject> tmpSet = new ArrayList<MachineContentObject>();
 
-		try {
+		if (correspondingFile.exists()) {
 
-			ISCInternalContext[] seenContexts = machineRoot.getSCSeenContexts();
-			for (ISCInternalContext context : seenContexts) {
+			try {
+				if (correspondingFile instanceof MachineRoot) {
 
-				for (ISCConstant constant : context.getSCConstants()) {
+					ISCMachineRoot machineRoot = correspondingFile
+							.getSCMachineRoot();
 
-					MachineContentObject machineinv = new MachineContentObject(
-							constant.getIdentifierString());
-					tmpSet.add(machineinv);
+					ISCInternalContext[] seenContexts = machineRoot
+							.getSCSeenContexts();
+					for (ISCInternalContext context : seenContexts) {
+
+						for (ISCConstant constant : context.getSCConstants()) {
+
+							MachineContentObject machineinv = new MachineContentObject(
+									constant.getIdentifierString());
+							machineinv.setType(constant
+									.getType(formularFactory));
+							tmpSet.add(machineinv);
+
+						}
+
+					}
+
+				} else if (correspondingFile instanceof ContextRoot) {
+
+					ISCContextRoot contextRoot = correspondingFile
+							.getSCContextRoot();
+					for (ISCConstant constant : contextRoot.getSCConstants()) {
+						MachineContentObject machineinv = new MachineContentObject(
+								constant.getIdentifierString());
+						machineinv.setType(constant.getType(formularFactory));
+						tmpSet.add(machineinv);
+					}
 
 				}
 
+			} catch (RodinDBException e) {
+				String message = "Rodin DB Exception while getting constants: "
+						+ e.getLocalizedMessage();
+				Logger.notifyUser(message, e);
+				return Collections
+						.unmodifiableList(new ArrayList<MachineContentObject>());
 			}
 
-		} catch (RodinDBException e) {
-			String message = "Rodin DB Exception while getting constants: "
-					+ e.getLocalizedMessage();
-			Logger.notifyUser(message, e);
-			return Collections
-					.unmodifiableList(new ArrayList<MachineContentObject>());
 		}
 
 		return tmpSet;
+
+	}
+
+	public static String renderEvent(ISCEvent event) throws RodinDBException {
+		StringBuffer sb = new StringBuffer();
+		sb.append("event ");
+		sb.append(event.getLabel());
+		sb.append("\n");
+
+		if (event.getSCParameters().length > 0) {
+			sb.append("  any ");
+			for (ISCParameter parameter : event.getSCParameters()) {
+				sb.append(parameter.getIdentifierString());
+				sb.append(" ");
+			}
+			sb.append("\n");
+
+		}
+
+		if (event.getSCGuards().length > 0) {
+			sb.append("  where\n");
+			for (ISCGuard guard : event.getSCGuards()) {
+				sb.append("    @");
+				sb.append(guard.getLabel());
+				sb.append(" ");
+				sb.append(guard.getPredicateString());
+				sb.append("\n");
+			}
+		}
+
+		if (event.getSCActions().length > 0) {
+			sb.append("  then\n");
+			for (ISCAction action : event.getSCActions()) {
+				sb.append("    @");
+				sb.append(action.getLabel());
+				sb.append(" ");
+				sb.append(action.getAssignmentString());
+				sb.append("\n");
+			}
+		}
+		sb.append("end");
+		return sb.toString();
 	}
 
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/eventb/MachineContentObject.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/eventb/MachineContentObject.java
index d032677402fc822500ba698ee4874eb6de46e371..e96ac7b06d2282ca95ac0713d56474ccc7a31b38 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/eventb/MachineContentObject.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/eventb/MachineContentObject.java
@@ -6,12 +6,15 @@
 
 package de.bmotionstudio.gef.editor.eventb;
 
+import org.eventb.core.ast.Type;
+
 import de.bmotionstudio.gef.editor.BindingObject;
 
 
 public class MachineContentObject extends BindingObject {
 
-	private String label;
+	private String label;
+	private Type type;
 
 	public MachineContentObject(String label) {
 		this.setLabel(label);
@@ -27,6 +30,14 @@ public class MachineContentObject extends BindingObject {
 
 	public String toString() {
 		return this.label;
-	}
+	}
+
+	public Type getType() {
+		return type;
+	}
+
+	public void setType(Type type) {
+		this.type = type;
+	}
 
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/eventb/MachineOperation.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/eventb/MachineOperation.java
index ae42a58e5040685ace6296e11fea66679775eb70..92e892667da3043a9f943db1971ed37f5ae2e8e0 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/eventb/MachineOperation.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/eventb/MachineOperation.java
@@ -13,12 +13,14 @@ public class MachineOperation extends MachineContentObject {
 
 	private List<String> parameters;
 	private List<String> guards;
+	private String renderedOperation;
 
 	public MachineOperation(String label, List<String> parameters,
-			List<String> guards) {
+			List<String> guards, String renderedOperation) {
 		super(label);
 		this.parameters = parameters;
 		this.guards = guards;
+		this.renderedOperation = renderedOperation;
 	}
 
 	public MachineOperation(String label) {
@@ -41,4 +43,12 @@ public class MachineOperation extends MachineContentObject {
 		this.guards = guards;
 	}
 
+	public String getRenderedOperation() {
+		return renderedOperation;
+	}
+
+	public void setRenderedOperation(String renderedOperation) {
+		this.renderedOperation = renderedOperation;
+	}
+
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/AbstractBMotionFigure.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/AbstractBMotionFigure.java
index 7a9ea7ccf8c5887fad3db417e81377301f4b970a..479b6923fb817ab333ffdc67c08d29c8408c61bf 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/AbstractBMotionFigure.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/AbstractBMotionFigure.java
@@ -7,6 +7,11 @@
 package de.bmotionstudio.gef.editor.figure;
 
 import org.eclipse.draw2d.Clickable;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+import de.bmotionstudio.gef.editor.BMotionStudioImage;
+import de.bmotionstudio.gef.editor.EditorImageRegistry;
 
 /**
  * @author Lukas Ladenberger
@@ -14,10 +19,49 @@ import org.eclipse.draw2d.Clickable;
  */
 public class AbstractBMotionFigure extends Clickable {
 
+	protected boolean visible;
+	protected boolean isRunning;
+	public static final int HIDDEN_ALPHA_VALUE = 35;
+
+	public AbstractBMotionFigure() {
+		this.visible = true;
+		this.isRunning = false;
+	}
+
 	public void deactivateFigure() {
 	}
 
 	public void activateFigure() {
 	}
 
+	@Override
+	public void setVisible(boolean visible) {
+		if (!isRunning()) {
+			this.visible = visible;
+			repaint();
+		} else {
+			super.setVisible(visible);
+		}
+	}
+
+	@Override
+	public void paint(Graphics g) {
+		Rectangle clientArea = getClientArea();
+		if (!this.visible && !isRunning()) {
+			g.drawImage(BMotionStudioImage
+					.getImage(EditorImageRegistry.IMG_ICON_CONTROL_HIDDEN),
+					clientArea.x, clientArea.y);
+			g.setAlpha(HIDDEN_ALPHA_VALUE);
+		}
+		super.paint(g);
+	}
+
+	public boolean isRunning() {
+		return isRunning;
+	}
+
+	public void setRunning(boolean isRunning) {
+		this.isRunning = isRunning;
+	}
+
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/AbstractTableFigure.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/AbstractTableFigure.java
index 2a3cad0bf8089fb5e23c2399bdc25dfcd6cc4d67..2b3c37f793cfd3515d92b7fd6cfe2687f199f62f 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/AbstractTableFigure.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/AbstractTableFigure.java
@@ -1,3 +1,9 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
 package de.bmotionstudio.gef.editor.figure;
 
 import org.eclipse.swt.graphics.Color;
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/BMSImageFigure.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/BMSImageFigure.java
index 0507de2d6a2d36d3493cff9afabcde5f5824c1dc..091a5bacec7edea739cc5e3cc7b8881ad4f39465 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/BMSImageFigure.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/BMSImageFigure.java
@@ -12,6 +12,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.draw2d.Graphics;
 import org.eclipse.draw2d.ImageFigure;
 import org.eclipse.draw2d.StackLayout;
 import org.eclipse.draw2d.geometry.Rectangle;
@@ -24,6 +25,8 @@ public class BMSImageFigure extends AbstractBMotionFigure {
 
 	private ImageFigure imageFigure;
 
+	private int alpha;
+
 	final ImageLoader loader = new ImageLoader();
 
 	private Map<String, List<Image>> images = new HashMap<String, List<Image>>();
@@ -39,6 +42,12 @@ public class BMSImageFigure extends AbstractBMotionFigure {
 		getParent().setConstraint(imageFigure, rect);
 	}
 
+	@Override
+	public void paint(Graphics g) {
+		g.setAlpha(alpha);
+		super.paint(g);
+	}
+
 	public void setImage(String myPath) {
 
 		if (currentGIFThread != null)
@@ -139,4 +148,9 @@ public class BMSImageFigure extends AbstractBMotionFigure {
 
 	}
 
+	public void setAlpha(int alpha) {
+		this.alpha = alpha;
+		repaint();
+	}
+
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/LightFigure.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/LightFigure.java
new file mode 100644
index 0000000000000000000000000000000000000000..951bda1626da3187cc82f2e40905738ea5759c11
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/LightFigure.java
@@ -0,0 +1,54 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+package de.bmotionstudio.gef.editor.figure;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+public class LightFigure extends AbstractBMotionFigure {
+
+	private Color lightColor;
+
+	public LightFigure() {
+		setOpaque(false);
+	}
+
+	@Override
+	public void paint(Graphics g) {
+
+		Rectangle r = getClientArea();
+
+		g.setBackgroundColor(ColorConstants.lightGray);
+		g.fillRectangle(r.x - 5 + r.width / 2, r.y, 11, 14);
+
+		g.setBackgroundColor(lightColor);
+		g.fillOval(r.x - 5 + r.width / 2, r.y + 1, 11, 11);
+
+		g.setForegroundColor(ColorConstants.black);
+		g.drawOval(r.x - 5 + r.width / 2, r.y + 1, 10, 10);
+
+		super.paint(g);
+
+	}
+
+	public void setBackgroundColor(RGB rgb) {
+		if (lightColor != null)
+			lightColor.dispose();
+		lightColor = new Color(Display.getDefault(), rgb);
+		repaint();
+	}
+
+	@Override
+	public void deactivateFigure() {
+		if (lightColor != null)
+			lightColor.dispose();
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/ShapeFigure.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/ShapeFigure.java
index 6d647b3b55834a52d4ab578cbab7fe4cdd4bf469..9ddf860ff85bf9c074c77be4a97e385f98f6834b 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/ShapeFigure.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/ShapeFigure.java
@@ -83,7 +83,10 @@ public class ShapeFigure extends AbstractBMotionFigure {
 			@Override
 			protected void fillShape(Graphics g) {
 
-				g.setAlpha(alpha);
+				if (!visible && !isRunning)
+					g.setAlpha(AbstractBMotionFigure.HIDDEN_ALPHA_VALUE);
+				else
+					g.setAlpha(alpha);
 				g.setAntialias(SWT.ON);
 
 				if (fillType == FILL_TYPE_GRADIENT) { // Gradient fill type
@@ -168,7 +171,10 @@ public class ShapeFigure extends AbstractBMotionFigure {
 			@Override
 			protected void outlineShape(Graphics g) {
 
-				g.setAlpha(outlineAlpha);
+				if (!visible && !isRunning)
+					g.setAlpha(AbstractBMotionFigure.HIDDEN_ALPHA_VALUE);
+				else
+					g.setAlpha(outlineAlpha);
 				g.setAntialias(SWT.ON);
 				g.setForegroundColor(this.getForegroundColor());
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/SignalFigure.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/SignalFigure.java
new file mode 100644
index 0000000000000000000000000000000000000000..7e5752eb3dd61ce8e05543f1e93385539eccfd2c
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/SignalFigure.java
@@ -0,0 +1,131 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+package de.bmotionstudio.gef.editor.figure;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PointList;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+
+/**
+ * @author Lukas Ladenberger
+ * 
+ */
+public class SignalFigure extends AbstractBMotionFigure {
+
+	private Label lb;
+	private PointList arrow = new PointList();
+	private boolean isEast;
+	private Figure panel;
+
+	public SignalFigure() {
+
+		ToolbarLayout layout = new ToolbarLayout();
+		layout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);
+		setLayoutManager(layout);
+
+		setOpaque(true);
+
+		lb = new Label();
+
+		panel = new Figure() {
+			@Override
+			protected void paintFigure(Graphics g) {
+
+				super.paintFigure(g);
+				Rectangle r = getClientArea();
+				arrow.removeAllPoints();
+
+				g.setAlpha(0);
+				g.setBackgroundColor(ColorConstants.white);
+				g.setForegroundColor(ColorConstants.lightGray);
+				g.fillRectangle(r); // Fill background with color
+
+				// Draw track lines
+				g.setAlpha(255);
+				g.setLineWidth(1);
+
+				// Draw horizontal line
+				Point pt1 = r.getTopLeft();
+				Point pt2 = r.getTopRight();
+				pt1.y = pt1.y + 4;
+				pt2.y = pt2.y + 4;
+				g.drawLine(pt1, pt2);
+
+				g.setAlpha(255);
+				g.setBackgroundColor(ColorConstants.lightGray);
+
+				// Draw arrow
+				Point p1;
+				Point p2;
+				Point p3;
+
+				if (isEast) {
+					p1 = r.getTopRight();
+					p2 = r.getTopRight();
+					p3 = r.getTopRight();
+					p2.x = p2.x - 8;
+					p3.x = p3.x - 8;
+				} else {
+					p1 = r.getTopLeft();
+					p2 = r.getTopLeft();
+					p3 = r.getTopLeft();
+					p2.x = p2.x + 8;
+					p3.x = p3.x + 8;
+				}
+
+				p1.y = p1.y + 4;
+				p2.y = p2.y + 8;
+				p3.y = p3.y;
+
+				arrow.addPoint(p1);
+				arrow.addPoint(p2);
+				arrow.addPoint(p3);
+				g.fillPolygon(arrow);
+
+			}
+
+		};
+		panel.setPreferredSize(60, 10);
+
+		// add(node);
+		add(lb);
+		add(panel);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.bmotionstudio.gef.editor.figure.IBMotionFigure#deactivateFigure()
+	 */
+	@Override
+	public void deactivateFigure() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.bmotionstudio.gef.editor.figure.IBMotionFigure#activateFigure()
+	 */
+	@Override
+	public void activateFigure() {
+	}
+
+	public void setTrackDirection(boolean isEast) {
+		this.isEast = isEast;
+		this.panel.repaint();
+	}
+
+	public void setLabel(String lb) {
+		this.lb.setText(lb);
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/SwitchFigure.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/SwitchFigure.java
new file mode 100644
index 0000000000000000000000000000000000000000..3e2436ac384a2b478d3fe8945bb33182aa223eda
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/SwitchFigure.java
@@ -0,0 +1,44 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.figure;
+
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.XYLayout;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+public class SwitchFigure extends AbstractBMotionFigure {
+
+	Color borderColor = new Color(Display.getDefault(), new RGB(235, 235, 235));
+
+	public SwitchFigure() {
+		setLayoutManager(new XYLayout());
+		setOpaque(false);
+	}
+
+	@Override
+	protected void paintBorder(Graphics g) {
+		Rectangle r = getClientArea();
+		if (!this.visible && !isRunning())
+			g.setAlpha(255);
+		g.setForegroundColor(borderColor);
+		g.setLineStyle(SWT.LINE_DASH);
+		r.height += -1;
+		r.width += -1;
+		g.drawRectangle(r);
+		super.paintBorder(g);
+	}
+
+	@Override
+	public void deactivateFigure() {
+		borderColor.dispose();
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TableCellFigure.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TableCellFigure.java
index 09fa6fa84acfab68cb940adbfe6c51657d82c5dc..1edc01d5e70d54859a207247341e17102cd09b61 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TableCellFigure.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TableCellFigure.java
@@ -23,7 +23,8 @@ public class TableCellFigure extends AbstractTableFigure {
 	}
 
 	@Override
-	protected void paintBorder(Graphics g) {
+	public void paint(Graphics g) {
+		super.paint(g);
 		Rectangle r = getClientArea();
 		g.setBackgroundColor(backgroundColor);
 		g.fillRectangle(r.x, r.y, r.x + r.width, r.y + r.height);
@@ -32,6 +33,7 @@ public class TableCellFigure extends AbstractTableFigure {
 		Color foregroundColor = getForegroundColor();
 		if (foregroundColor != null)
 			g.setForegroundColor(foregroundColor);
+		// Bottom cell line
 		g.drawLine(r.x, r.y, r.x + r.width, r.y);
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TableColumnFigure.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TableColumnFigure.java
index e036e5d6863b911b900ce07012635ed3b6ff0715..2647b7613ea618fec08f1a22284f2dc1923053a0 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TableColumnFigure.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TableColumnFigure.java
@@ -1,3 +1,9 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
 package de.bmotionstudio.gef.editor.figure;
 
 import org.eclipse.draw2d.Graphics;
@@ -10,19 +16,21 @@ public class TableColumnFigure extends AbstractTableFigure {
 	public TableColumnFigure() {
 		ToolbarLayout toolbarLayout = new ToolbarLayout();
 		setLayoutManager(toolbarLayout);
-		setOpaque(true);
+		setOpaque(false);
 	}
 
 	@Override
-	protected void paintBorder(Graphics g) {
+	public void paint(Graphics g) {
+		super.paint(g);
 		Rectangle r = getClientArea();
 		Color foregroundColor = getForegroundColor();
 		if (foregroundColor != null)
 			g.setForegroundColor(foregroundColor);
-		g.drawLine(r.x, r.y, r.x + r.width, r.y);
-		g.drawLine(r.x, r.y, r.x, r.y + r.height - 1);
-		g.drawLine(r.x, r.y + r.height - 1, r.x + r.width, r.y + r.height - 1);
-		super.paintBorder(g);
+		// g.drawLine(r.x, r.y, r.x + r.width, r.y);
+		// Left line
+		g.drawLine(r.x, r.y, r.x, r.y + r.height - 15);
+		// Bottom line
+		g.drawLine(r.x, r.y + r.height - 15, r.x + r.width, r.y + r.height - 15);
 	}
 
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TableFigure.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TableFigure.java
index fb322781139451c5f90a087cb2513e1eabdfc9bf..1b8ee80ef674a929df769e333da7d261f9bc27cd 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TableFigure.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TableFigure.java
@@ -15,18 +15,18 @@ public class TableFigure extends AbstractTableFigure {
 	public TableFigure() {
 		ToolbarLayout toolbarLayout = new ToolbarLayout();
 		toolbarLayout.setHorizontal(true);
-		toolbarLayout.setStretchMinorAxis(false);
 		setLayoutManager(toolbarLayout);
-		setOpaque(true);
+		setOpaque(false);
 	}
 
 	@Override
-	protected void paintBorder(Graphics g) {
+	public void paint(Graphics g) {
+		super.paint(g);
 		Rectangle r = getClientArea();
 		g.setForegroundColor(getForegroundColor());
-		g.drawLine(r.x + r.width - 1, r.y, r.x + r.width - 1, r.y + r.height
-				- 1);
-		super.paintBorder(g);
+		// Right table border line
+		g.drawLine(r.x + r.width - 21, r.y, r.x + r.width - 21, r.y + r.height
+				- 15);
 	}
 
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TankFigure.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TankFigure.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f266aef27d7c9cdf5304cd6ca843060118c73de
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TankFigure.java
@@ -0,0 +1,164 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.figure;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.PaletteData;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+
+public class TankFigure extends AbstractBMotionFigure {
+
+	private Image layerImage;
+	private ImageData imageData;
+
+	private int fill_height;
+	private double positions;
+	private int show_pos;
+
+	private Color fillColor;
+
+	private Boolean showMeasure;
+
+	public TankFigure() {
+		PaletteData palette = new PaletteData(
+				new RGB[] { ColorConstants.white.getRGB() });
+		imageData = new ImageData(1, 1, 8, palette);
+		imageData.alpha = 255;
+		imageData.setPixel(0, 0, 0);
+		layerImage = new Image(null, imageData);
+	}
+
+	public void setAlpha(int alpha) {
+		imageData.alpha = alpha;
+		if (layerImage != null && !layerImage.isDisposed()) {
+			layerImage.dispose();
+		}
+		layerImage = new Image(null, imageData);
+		repaint();
+	}
+
+	@Override
+	protected void paintFigure(Graphics g) {
+
+		Rectangle rect = getClientArea();
+		g.drawImage(layerImage, new Rectangle(layerImage.getBounds()), rect);
+
+		// Set the right size and position of the y-axis
+
+		int fillPos = 0;
+
+		double one_pos = Double.valueOf(rect.height) / positions;
+
+		if (showMeasure) {
+
+			g.setForegroundColor(ColorConstants.black);
+			g.drawLine(rect.x + 5, rect.y, rect.x + 5, rect.y + rect.height);
+
+			for (int i = 0; i <= positions; i = i + show_pos) {
+
+				if (i == 0) {
+					// First position
+					// Draw label
+					g.drawText(String.valueOf((int) (positions - i)),
+							rect.x + 18, rect.y + (int) (i * one_pos) - 3);
+
+					// Draw line
+					g.drawLine(rect.x + 10, rect.y + (int) (i * one_pos),
+							rect.x, rect.y + (int) (i * one_pos));
+				} else if (i == positions) {
+					// Last position
+
+					// Draw label
+					g.drawText(String.valueOf((int) (positions - i)),
+							rect.x + 18, rect.y + (int) (i * one_pos) - 12);
+
+					// Draw line
+					g.drawLine(rect.x + 10, rect.y + (int) (i * one_pos) - 1,
+							rect.x, rect.y + (int) (i * one_pos) - 1);
+				} else {
+					// All other positions
+
+					// Draw label
+					g.drawText(String.valueOf((int) (positions - i)),
+							rect.x + 18, rect.y + (int) (i * one_pos) - 5);
+
+					// // Draw line
+					g.drawLine(rect.x + 10, rect.y + (int) (i * one_pos),
+							rect.x, rect.y + (int) (i * one_pos));
+				}
+
+			}
+
+			fillPos = 60;
+
+		}
+
+		// Set right size of the fill figure
+		g.setBackgroundColor(fillColor);
+
+		double tmp = one_pos * (positions - Double.valueOf(fill_height));
+		int f_fill_height = (int) tmp;
+
+		g.fillRectangle(rect.x + fillPos, rect.y + f_fill_height, rect.width
+				- fillPos, rect.height);
+
+		super.paintFigure(g);
+
+	}
+
+	public void setFillColor(RGB rgb) {
+		if (fillColor != null)
+			fillColor.dispose();
+		fillColor = new Color(Display.getDefault(), rgb);
+		repaint();
+	}
+
+	public void setFillHeight(Integer height) {
+		this.fill_height = height;
+		repaint();
+	}
+
+	public void setMaxPos(Integer maxPos) {
+		this.positions = maxPos;
+		repaint();
+	}
+
+	public void setInterval(Integer interval) {
+		this.show_pos = interval;
+		repaint();
+	}
+
+	public void setMeasure(Boolean bol) {
+		this.showMeasure = bol;
+		repaint();
+	}
+
+	public void setBackgroundColor(RGB rgb) {
+		imageData.palette.colors[0] = rgb;
+		if (layerImage != null && !layerImage.isDisposed()) {
+			layerImage.dispose();
+		}
+		layerImage = new Image(null, imageData);
+		repaint();
+	}
+
+	@Override
+	public void deactivateFigure() {
+		if (fillColor != null)
+			fillColor.dispose();
+		if (layerImage != null)
+			layerImage.dispose();
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TrackNodeFigure.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TrackNodeFigure.java
new file mode 100644
index 0000000000000000000000000000000000000000..9af55953bab0885dccc7ad316fdb021db135f255
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/TrackNodeFigure.java
@@ -0,0 +1,61 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.figure;
+
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.swt.graphics.Color;
+
+
+public class TrackNodeFigure extends AbstractBMotionFigure {
+
+	private Color foregroundColor;
+	private int lineWidth;
+	private int lineStyle;
+
+	public TrackNodeFigure() {
+		setOpaque(false);
+	}
+
+	@Override
+	protected void paintFigure(Graphics g) {
+
+		Rectangle r = getClientArea();
+		g.setBackgroundColor(getBackgroundColor());
+		g.fillRectangle(r);
+		g.setForegroundColor(foregroundColor);
+		g.setLineStyle(lineStyle);
+		g.setLineWidth(lineWidth);
+		g.drawLine(r.getTop().x, r.getTop().y + 5, r.getBottom().x,
+				r.getBottom().y - 5);
+		super.paintFigure(g);
+
+	}
+
+	@Override
+	public void setForegroundColor(Color fg) {
+		this.foregroundColor = fg;
+		repaint();
+	}
+
+	public void setLineWidth(int lineWidth) {
+		this.lineWidth = lineWidth;
+		repaint();
+	}
+
+	public void setLineStyle(int lineStyle) {
+		this.lineStyle = lineStyle;
+		repaint();
+	}
+
+	@Override
+	public void deactivateFigure() {
+		if (foregroundColor != null)
+			foregroundColor.dispose();
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/VisualizationFigure.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/VisualizationFigure.java
index 1e500bd187ed3d160bc07115b5fb3b22da3724f9..b2b647d2a08de4b9008f5922c86e17c3401cc102 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/VisualizationFigure.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/figure/VisualizationFigure.java
@@ -10,7 +10,6 @@ import org.eclipse.draw2d.FreeformLayer;
 import org.eclipse.draw2d.FreeformLayout;
 import org.eclipse.draw2d.LayoutAnimator;
 import org.eclipse.draw2d.LayoutListener;
-import org.eclipse.draw2d.MarginBorder;
 import org.eclipse.draw2d.geometry.Rectangle;
 
 public class VisualizationFigure extends FreeformLayer {
@@ -19,7 +18,6 @@ public class VisualizationFigure extends FreeformLayer {
 
 	public VisualizationFigure() {
 		setLayoutManager(new FreeformLayout());
-		setBorder(new MarginBorder(5));
 		addLayoutListener(layoutListener);
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/internal/BControlPropertySource.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/internal/BControlPropertySource.java
index 0dffa83af3bf68c5c5a3964c8eb79464fb1266e8..2a836bbb01b329295719dcb98442848f2bbecd5e 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/internal/BControlPropertySource.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/internal/BControlPropertySource.java
@@ -21,7 +21,7 @@ public class BControlPropertySource extends AbstractAttribute {
 	public BControlPropertySource(BControl control) {
 		super(null);
 		this.control = control;
-		this.miscAttribute = new BAttributeMisc(null);
+		this.miscAttribute = new BAttributeMisc("");
 		addChild(this.miscAttribute);
 		init();
 	}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/internal/NewBMotionProjectWizardPage.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/internal/NewBMotionProjectWizardPage.java
index 8f5a952055d138b223e112d8a46806d46d763f8d..a4c4580a0f7f2d9ab8b6d51c952866f3241b0b70 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/internal/NewBMotionProjectWizardPage.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/internal/NewBMotionProjectWizardPage.java
@@ -252,13 +252,14 @@ public class NewBMotionProjectWizardPage extends WizardPage {
 		gd.grabExcessHorizontalSpace = true;
 
 		Label label = new Label(container, SWT.NULL);
-		label.setText("&Project name:");
+		label.setText("&Project folder:");
 
 		projectRootText = new Text(container, SWT.BORDER | SWT.SINGLE);
 		projectRootText.setLayoutData(gd);
 		if (selectedProject != null) {
 			projectRootText.setText(selectedProject.getFullPath().toOSString());
 		}
+		projectRootText.setEditable(false);
 		projectRootText.addModifyListener(listener);
 
 		final Button button = new Button(container, SWT.NULL);
@@ -273,7 +274,7 @@ public class NewBMotionProjectWizardPage extends WizardPage {
 					final Object[] result = dialog.getResult();
 					if (result.length == 1) {
 						Path newPath = (Path) result[0];
-						IProject newProject = selectedProject.getWorkspace()
+						IProject newProject = ResourcesPlugin.getWorkspace()
 								.getRoot().getProject(newPath.toString());
 						selectedProject = newProject;
 						initContent();
@@ -285,7 +286,7 @@ public class NewBMotionProjectWizardPage extends WizardPage {
 		});
 
 		label = new Label(container, SWT.NULL);
-		label.setText("&BMotion Studio Visualization filename:");
+		label.setText("&Project name:");
 
 		projectText = new Text(container, SWT.BORDER | SWT.SINGLE);
 		projectText.setText(DEFAULT_PROJECT_NAME);
@@ -297,7 +298,7 @@ public class NewBMotionProjectWizardPage extends WizardPage {
 		gd.horizontalSpan = 3;
 
 		label = new Label(container, SWT.NULL);
-		label.setText("&B-Machine:");
+		label.setText("&Formal model:");
 		label.setLayoutData(gd);
 
 		gd = new GridData(GridData.FILL_VERTICAL);
@@ -312,7 +313,7 @@ public class NewBMotionProjectWizardPage extends WizardPage {
 		table.setLinesVisible(true);
 		table.setLayoutData(gd);
 
-		final String[] columnsNames = new String[] { "Machine", "Language" };
+		final String[] columnsNames = new String[] { "Model", "Language" };
 		final int[] columnWidths = new int[] { 250, 100 };
 		final int[] columnAlignments = new int[] { SWT.LEFT, SWT.LEFT };
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/library/ImportImagesAction.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/library/ImportImagesAction.java
index 9dd9d28c4289e7f411611df7b07dce6b163be33c..24be5c8565e068727a7fa00746079c6c437cd9fe 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/library/ImportImagesAction.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/library/ImportImagesAction.java
@@ -7,16 +7,20 @@
 package de.bmotionstudio.gef.editor.library;
 
 import java.io.File;
-import java.io.IOException;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.FileDialog;
 import org.eclipse.swt.widgets.MessageBox;
 
 import de.bmotionstudio.gef.editor.BMotionStudioImage;
-import de.bmotionstudio.gef.editor.util.FileUtil;
 
 public class ImportImagesAction extends AbstractLibraryAction {
 
@@ -49,52 +53,45 @@ public class ImportImagesAction extends AbstractLibraryAction {
 		// The project file
 		IFile pFile = getPage().getEditor().getVisualization().getProjectFile();
 
-		String imagePath = (pFile.getProject().getLocationURI() + "/images")
-				.replace("file:", "");
-		File imageFilePath = new File(imagePath);
-
-		// Check if images folder exists!
-		// If no such folder exists -> create
-		if (!imageFilePath.exists()) {
-			Boolean check = imageFilePath.mkdir();
-			if (check) {
-				// TODO: Do something with return value
-			}
-		}
-
-		// Iterate the selected files
-		for (String fileName : selectedFiles) {
-
-			String filePath = (pFile.getProject().getLocation() + "/images/" + fileName)
-					.replace("file:", "");
-
-			// Copy files into project sub folder project/images
-			File inputFile = new File(folderPath + File.separator + fileName);
-			File outputFile = new File(filePath);
-
-			boolean ok = false;
-
-			if (outputFile.exists()) {
-				// The file already exists; asks for confirmation
-				MessageBox mb = new MessageBox(fd.getParent(), SWT.ICON_WARNING
-						| SWT.YES | SWT.NO);
-				mb.setMessage(fileName
-						+ " already exists. Do you want to replace it?");
-				// If they click Yes, we're done and we drop out. If
-				// they click No, we redisplay the File Dialog
-				ok = mb.open() == SWT.YES;
-			} else {
-				ok = true;
-			}
-
-			if (ok) {
-				try {
-					FileUtil.copyFile(inputFile, outputFile);
-				} catch (IOException e) {
-					e.printStackTrace();
+		try {
+
+			IProject project = pFile.getProject();
+			IFolder folder = project.getFolder("images");
+			NullProgressMonitor monitor = new NullProgressMonitor();
+
+			if (!folder.exists())
+				folder.create(true, true, monitor);
+
+			// Iterate the selected files
+			for (String fileName : selectedFiles) {
+
+				File inputFile = new File(folderPath + File.separator
+						+ fileName);
+				IFile newFile = folder.getFile(fileName);
+				FileInputStream fileInputStream = new FileInputStream(inputFile);
+				
+				if (!newFile.exists()) {
+					newFile.create(fileInputStream, true,
+							monitor);
+				} else {
+					// The file already exists; asks for confirmation
+					MessageBox mb = new MessageBox(fd.getParent(),
+							SWT.ICON_WARNING | SWT.YES | SWT.NO);
+					mb.setMessage(fileName
+							+ " already exists. Do you want to replace it?");
+					// If they click Yes, we're done and we drop out. If
+					// they click No, we redisplay the File Dialog
+					if (mb.open() == SWT.YES)
+						newFile.setContents(fileInputStream, true, false,
+								monitor);
 				}
+
 			}
 
+		} catch (CoreException e1) {
+			e1.printStackTrace();
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
 		}
 
 		getPage().refresh();
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/library/LibraryImageObject.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/library/LibraryImageObject.java
index eed6dc2930f259b9b10c54af1d912bc7257371f0..3931e467070b0f1b4d637a63591fdddbc2741e5a 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/library/LibraryImageObject.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/library/LibraryImageObject.java
@@ -6,14 +6,13 @@
 
 package de.bmotionstudio.gef.editor.library;
 
-import java.io.File;
-
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Display;
 
-import de.bmotionstudio.gef.editor.util.FileUtil;
-
 public class LibraryImageObject extends LibraryObject {
 
 	public LibraryImageObject(String name, String type, Image typeImage) {
@@ -22,10 +21,19 @@ public class LibraryImageObject extends LibraryObject {
 
 	@Override
 	public void delete(LibraryPage page) {
-		String myPath = (page.getEditor().getVisualization().getProjectFile()
-				.getProject().getLocation()
-				+ "/images/" + getName()).replace("file:", "");
-		FileUtil.deleteFile(new File(myPath));
+
+		try {
+			IFolder imageFolder = page.getEditor().getVisualization()
+					.getProjectFile().getProject().getFolder("images");
+			if (imageFolder.exists()) {
+				IFile file = imageFolder.getFile(getName());
+				if (file.exists())
+					file.delete(true, new NullProgressMonitor());
+			}
+		} catch (CoreException e) {
+			e.printStackTrace();
+		}
+
 	}
 
 	@Override
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BButton.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BButton.java
index 4e504fe9f8b582312cfad166c773d3062fcec261..64dd3ec4e5451d88a678378f2c8f1cab84dc2c77 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BButton.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BButton.java
@@ -8,11 +8,13 @@ package de.bmotionstudio.gef.editor.model;
 
 import org.eclipse.swt.graphics.RGB;
 
-import de.bmotionstudio.gef.editor.AttributeConstants;
 import de.bmotionstudio.gef.editor.attribute.BAttributeBackgroundColor;
 import de.bmotionstudio.gef.editor.attribute.BAttributeEnabled;
+import de.bmotionstudio.gef.editor.attribute.BAttributeHeight;
+import de.bmotionstudio.gef.editor.attribute.BAttributeSize;
 import de.bmotionstudio.gef.editor.attribute.BAttributeText;
 import de.bmotionstudio.gef.editor.attribute.BAttributeTextColor;
+import de.bmotionstudio.gef.editor.attribute.BAttributeWidth;
 
 /**
  * @author Lukas Ladenberger
@@ -35,12 +37,20 @@ public class BButton extends BControl {
 
 	@Override
 	protected void initAttributes() {
+
 		initAttribute(new BAttributeText(DEFAULT_TEXT));
 		initAttribute(new BAttributeBackgroundColor(new RGB(192, 192, 192)));
 		initAttribute(new BAttributeTextColor(new RGB(0, 0, 0)));
 		initAttribute(new BAttributeEnabled(true));
-		getAttribute(AttributeConstants.ATTRIBUTE_HEIGHT).setValue(25);
-		getAttribute(AttributeConstants.ATTRIBUTE_WIDTH).setValue(100);
+
+		BAttributeHeight aHeight = new BAttributeHeight(25);
+		aHeight.setGroup(BAttributeSize.ID);
+		initAttribute(aHeight);
+
+		BAttributeWidth aWidth = new BAttributeWidth(100);
+		aWidth.setGroup(BAttributeSize.ID);
+		initAttribute(aWidth);
+
 	}
 
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BCheckbox.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BCheckbox.java
index 32b0235053ac80f1e731fd4c3a05c022bb29aeb2..96950332d7be34480035dff478e53e6fcada563c 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BCheckbox.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BCheckbox.java
@@ -12,6 +12,8 @@ import de.bmotionstudio.gef.editor.AttributeConstants;
 import de.bmotionstudio.gef.editor.attribute.BAttributeChecked;
 import de.bmotionstudio.gef.editor.attribute.BAttributeEnabled;
 import de.bmotionstudio.gef.editor.attribute.BAttributeFalseValue;
+import de.bmotionstudio.gef.editor.attribute.BAttributeHeight;
+import de.bmotionstudio.gef.editor.attribute.BAttributeSize;
 import de.bmotionstudio.gef.editor.attribute.BAttributeText;
 import de.bmotionstudio.gef.editor.attribute.BAttributeTextColor;
 import de.bmotionstudio.gef.editor.attribute.BAttributeTrueValue;
@@ -37,14 +39,20 @@ public class BCheckbox extends BControl {
 
 	@Override
 	protected void initAttributes() {
+
 		initAttribute(new BAttributeText(DEFAULT_TEXT));
 		initAttribute(new BAttributeTextColor(new RGB(0, 0, 0)));
-		initAttribute(new BAttributeChecked(true));
 		initAttribute(new BAttributeEnabled(true));
+		initAttribute(new BAttributeChecked(true));
 		initAttribute(new BAttributeTrueValue(""));
 		initAttribute(new BAttributeFalseValue(""));
-		getAttribute(AttributeConstants.ATTRIBUTE_HEIGHT).setValue(21);
-		getAttribute(AttributeConstants.ATTRIBUTE_HEIGHT).setEditable(false);
+
+		BAttributeHeight aHeight = new BAttributeHeight(21);
+		aHeight.setGroup(BAttributeSize.ID);
+		aHeight.setShow(false);
+		aHeight.setEditable(false);
+		initAttribute(aHeight);
+
 	}
 
 	@Override
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BComposite.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BComposite.java
index bd27178b389ce230c92a0be75cc1d86651f0d9fd..52d060b4781b977535ead1436f069d5df9b0b666 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BComposite.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BComposite.java
@@ -30,8 +30,10 @@ public class BComposite extends BControl {
 
 	@Override
 	protected void initAttributes() {
+
 		initAttribute(new BAttributeBackgroundColor(new RGB(192, 192, 192)));
 		initAttribute(new BAttributeImage(null));
+
 	}
 
 	@Override
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BConnection.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BConnection.java
index 7bc29f41187bf6c9727fdae329b3c39956eebf2a..6b36f515876e6917ee508f1bd5edf5a1b5cb5681 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BConnection.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BConnection.java
@@ -8,6 +8,7 @@ package de.bmotionstudio.gef.editor.model;
 
 import org.eclipse.swt.graphics.RGB;
 
+import de.bmotionstudio.gef.editor.attribute.AbstractAttribute;
 import de.bmotionstudio.gef.editor.attribute.BAttributeConnection;
 import de.bmotionstudio.gef.editor.attribute.BAttributeConnectionSourceDecoration;
 import de.bmotionstudio.gef.editor.attribute.BAttributeConnectionTargetDecoration;
@@ -15,18 +16,17 @@ import de.bmotionstudio.gef.editor.attribute.BAttributeForegroundColor;
 import de.bmotionstudio.gef.editor.attribute.BAttributeLabel;
 import de.bmotionstudio.gef.editor.attribute.BAttributeLineStyle;
 import de.bmotionstudio.gef.editor.attribute.BAttributeLineWidth;
-import de.bmotionstudio.gef.editor.internal.BControlPropertySource;
 
 public class BConnection extends BControl {
 
 	public static String TYPE = "de.bmotionstudio.gef.editor.connection";
 
 	/** True, if the connection is attached to its endpoints. */
-	private boolean isConnected;
+	protected boolean isConnected;
 	/** Connection's source endpoint. */
-	private BControl source;
+	protected BControl source;
 	/** Connection's target endpoint. */
-	private BControl target;
+	protected BControl target;
 
 	/**
 	 * Create a (solid) connection between two distinct shapes.
@@ -121,21 +121,39 @@ public class BConnection extends BControl {
 
 	@Override
 	protected void initAttributes() {
-		BAttributeConnection bAttributeConnection = new BAttributeConnection(
-				null);
-		initAttribute(bAttributeConnection, BControlPropertySource.ROOT);
-		initAttribute(new BAttributeLineWidth(1), bAttributeConnection);
-		initAttribute(new BAttributeLineStyle(
-				BAttributeLineStyle.SOLID_CONNECTION), bAttributeConnection);
-		initAttribute(new BAttributeForegroundColor(new RGB(0, 0, 0)),
-				bAttributeConnection);
-		initAttribute(new BAttributeConnectionSourceDecoration(
-				BAttributeConnectionSourceDecoration.DECORATION_NONE),
-				bAttributeConnection);
-		initAttribute(new BAttributeConnectionTargetDecoration(
-				BAttributeConnectionTargetDecoration.DECORATION_NONE),
-				bAttributeConnection);
-		initAttribute(new BAttributeLabel("Label..."), bAttributeConnection);
+
+		BAttributeConnection aConnection = new BAttributeConnection(null);
+		aConnection.setGroup(AbstractAttribute.ROOT);
+		initAttribute(aConnection);
+
+		BAttributeLineWidth aLineWidth = new BAttributeLineWidth(1);
+		aLineWidth.setGroup(aConnection);
+		initAttribute(aLineWidth);
+
+		BAttributeLineStyle aLineStyle = new BAttributeLineStyle(
+				BAttributeLineStyle.SOLID_CONNECTION);
+		aLineStyle.setGroup(aConnection);
+		initAttribute(aLineStyle);
+
+		BAttributeForegroundColor aForegroundColor = new BAttributeForegroundColor(
+				new RGB(0, 0, 0));
+		aForegroundColor.setGroup(aConnection);
+		initAttribute(aForegroundColor);
+
+		BAttributeConnectionSourceDecoration aSourceDeco = new BAttributeConnectionSourceDecoration(
+				BAttributeConnectionSourceDecoration.DECORATION_NONE);
+		aSourceDeco.setGroup(aConnection);
+		initAttribute(aSourceDeco);
+
+		BAttributeConnectionTargetDecoration aTargetDeco = new BAttributeConnectionTargetDecoration(
+				BAttributeConnectionSourceDecoration.DECORATION_NONE);
+		aTargetDeco.setGroup(aConnection);
+		initAttribute(aTargetDeco);
+
+		BAttributeLabel aLabel = new BAttributeLabel("Label ...");
+		aLabel.setGroup(aConnection);
+		initAttribute(aLabel);
+
 	}
 
 }
\ No newline at end of file
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BControl.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BControl.java
index 0af0557d5e5d946e0e4a40d39b66a0dbc0f764d6..8013e19f754309e18837ec7c09f438c3eddba668 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BControl.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BControl.java
@@ -21,6 +21,7 @@ import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.draw2d.geometry.Dimension;
 import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.ui.actions.Clipboard;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.ui.views.properties.IPropertySource;
 
@@ -33,11 +34,13 @@ import de.bmotionstudio.gef.editor.attribute.BAttributeCoordinates;
 import de.bmotionstudio.gef.editor.attribute.BAttributeCustom;
 import de.bmotionstudio.gef.editor.attribute.BAttributeHeight;
 import de.bmotionstudio.gef.editor.attribute.BAttributeID;
+import de.bmotionstudio.gef.editor.attribute.BAttributeMisc;
 import de.bmotionstudio.gef.editor.attribute.BAttributeSize;
 import de.bmotionstudio.gef.editor.attribute.BAttributeVisible;
 import de.bmotionstudio.gef.editor.attribute.BAttributeWidth;
 import de.bmotionstudio.gef.editor.attribute.BAttributeX;
 import de.bmotionstudio.gef.editor.attribute.BAttributeY;
+import de.bmotionstudio.gef.editor.command.CopyPasteHelper;
 import de.bmotionstudio.gef.editor.internal.BControlPropertySource;
 import de.bmotionstudio.gef.editor.observer.IObserverListener;
 import de.bmotionstudio.gef.editor.observer.Observer;
@@ -84,6 +87,8 @@ public abstract class BControl implements IAdaptable, Cloneable {
 	private transient PropertyChangeSupport listeners;
 
 	private transient ArrayList<IObserverListener> observerListener;
+	
+	private transient boolean newControl;
 
 	private BMotionGuide verticalGuide, horizontalGuide;
 
@@ -102,6 +107,14 @@ public abstract class BControl implements IAdaptable, Cloneable {
 	/** Property ID to use when the list of incoming connections is modified. */
 	public static final String TARGET_CONNECTIONS_PROP = "BMS.TargetConn";
 
+	public static final String[] standardAttributes = {
+			AttributeConstants.ATTRIBUTE_X,
+			AttributeConstants.ATTRIBUTE_Y, AttributeConstants.ATTRIBUTE_WIDTH,
+			AttributeConstants.ATTRIBUTE_HEIGHT,
+			AttributeConstants.ATTRIBUTE_ID,
+			AttributeConstants.ATTRIBUTE_CUSTOM,
+			AttributeConstants.ATTRIBUTE_VISIBLE };
+
 	public BControl(Visualization visualization) {
 		this.visualization = visualization;
 		this.children = new BControlList();
@@ -112,6 +125,7 @@ public abstract class BControl implements IAdaptable, Cloneable {
 		this.observerListener = new ArrayList<IObserverListener>();
 		this.sourceConnections = new ArrayList<BConnection>();
 		this.targetConnections = new ArrayList<BConnection>();
+		this.newControl = true;
 		init();
 	}
 
@@ -119,6 +133,7 @@ public abstract class BControl implements IAdaptable, Cloneable {
 		// Populate parent
 		for (BControl child : getChildrenArray())
 			child.setParent(this);
+		this.newControl = false;
 		init();
 		return this;
 	}
@@ -172,7 +187,17 @@ public abstract class BControl implements IAdaptable, Cloneable {
 
 	private void init() {
 
-		// Init ID
+		// Init standard control attributes
+		initStandardAttributes();
+
+		// Init custom control attributes
+		initAttributes();
+
+	}
+
+	private void initStandardAttributes() {
+
+		// Init unique ID
 		String ID;
 		if (this instanceof Visualization)
 			ID = "visualization";
@@ -180,25 +205,48 @@ public abstract class BControl implements IAdaptable, Cloneable {
 			ID = UUID.randomUUID().toString();
 		else
 			ID = (visualization.getMaxIDString(type));
-		initAttribute(new BAttributeID(ID), AbstractAttribute.ROOT);
-
-		// Init location and dimension attributes
-		BAttributeCoordinates coordinatesAtr = new BAttributeCoordinates(null);
-		initAttribute(coordinatesAtr, AbstractAttribute.ROOT);
-		initAttribute(new BAttributeX(100), coordinatesAtr);
-		initAttribute(new BAttributeY(100), coordinatesAtr);
 
-		BAttributeSize sizeAtr = new BAttributeSize(null);
-		initAttribute(sizeAtr, AbstractAttribute.ROOT);
-		initAttribute(new BAttributeWidth(100), sizeAtr);
-		initAttribute(new BAttributeHeight(100), sizeAtr);
+		BAttributeID aID = new BAttributeID(ID);
+		aID.setGroup(AbstractAttribute.ROOT);
+		initAttribute(aID);
+
+		BAttributeMisc aMisc = new BAttributeMisc("");
+		aMisc.setGroup(AbstractAttribute.ROOT);
+		initAttribute(aMisc);
+		
+		// Init location and size attributes
+		BAttributeCoordinates aCoordinates = new BAttributeCoordinates(null);
+		aCoordinates.setGroup(AbstractAttribute.ROOT);
+		initAttribute(aCoordinates);
+		
+		BAttributeX aX = new BAttributeX(100);
+		aX.setGroup(aCoordinates);
+		initAttribute(aX);
+		
+		BAttributeY aY = new BAttributeY(100);
+		aY.setGroup(aCoordinates);
+		initAttribute(aY);
+		
+		BAttributeSize aSize = new BAttributeSize(null);
+		aSize.setGroup(AbstractAttribute.ROOT);
+		initAttribute(aSize);
+		
+		BAttributeWidth aWidth = new BAttributeWidth(100);
+		aWidth.setGroup(aSize);
+		initAttribute(aWidth);
+
+		BAttributeHeight aHeight = new BAttributeHeight(100);
+		aHeight.setGroup(aSize);
+		initAttribute(aHeight);
 
 		// Init visible and this attribute
-		initAttribute(new BAttributeVisible(true), AbstractAttribute.ROOT);
-		initAttribute(new BAttributeCustom(""), AbstractAttribute.ROOT);
+		BAttributeVisible aVisible = new BAttributeVisible(true);
+		aVisible.setGroup(AbstractAttribute.ROOT);
+		initAttribute(aVisible);
 
-		// Init custom control attributes
-		initAttributes();
+		BAttributeCustom aCustom = new BAttributeCustom("");
+		aCustom.setGroup(AbstractAttribute.ROOT);
+		initAttribute(aCustom);
 
 	}
 
@@ -433,6 +481,10 @@ public abstract class BControl implements IAdaptable, Cloneable {
 		}
 	}
 
+	public void removeObserver(Observer observer) {
+		removeObserver(observer.getID());
+	}
+
 	public void removeObserver(String observerID) {
 		if (hasObserver(observerID))
 			observers.get(observerID).beforeDelete(this);
@@ -595,38 +647,48 @@ public abstract class BControl implements IAdaptable, Cloneable {
 
 		BControl clonedControl = (BControl) super.clone();
 
-		clonedControl.setParent(getParent());
+		clonedControl.listeners = new PropertyChangeSupport(clonedControl);
+		clonedControl.observerListener = new ArrayList<IObserverListener>();
+		clonedControl.sourceConnections = new ArrayList<BConnection>();
+		clonedControl.targetConnections = new ArrayList<BConnection>();
 
-		String newID = clonedControl.getID();
+		clonedControl.setParent(getParent());
 
+		// Clone attributes
 		Map<String, AbstractAttribute> newProperties = new HashMap<String, AbstractAttribute>();
 		for (Entry<String, AbstractAttribute> e : getAttributes().entrySet()) {
 			AbstractAttribute idAtr = e.getValue().clone();
 			newProperties.put(e.getKey(), idAtr);
 		}
-
 		clonedControl.setAttributes(newProperties);
-		clonedControl.setAttributeValue(AttributeConstants.ATTRIBUTE_ID, newID);
+		clonedControl.setAttributeValue(AttributeConstants.ATTRIBUTE_ID,
+				getVisualization().getMaxIDString(type));
 
+		// Clone children
 		clonedControl.setChildrenArray(new BControlList());
 		Iterator<BControl> it = getChildrenArray().iterator();
 		while (it.hasNext()) {
-			clonedControl.addChild(((BControl) it.next()).clone());
+			BControl next = (BControl) it.next();
+			BControl childClone = next.clone();
+			CopyPasteHelper cHelper = (CopyPasteHelper) Clipboard.getDefault()
+					.getContents();
+			if (cHelper != null)
+				cHelper.getAlreadyClonedMap().put(next, childClone);
+			clonedControl.addChild(childClone);
 		}
 
+		// Clone observer
 		clonedControl.setObserverMap(new HashMap<String, Observer>());
 		for (Observer observer : observers.values()) {
 			clonedControl.addObserver(observer.clone());
 		}
 
+		// Clone events
 		clonedControl.setEventMap(new HashMap<String, SchedulerEvent>());
 		for (Map.Entry<String, SchedulerEvent> e : events.entrySet()) {
 			clonedControl.addEvent(e.getKey(), e.getValue().clone());
 		}
 
-		clonedControl.listeners = new PropertyChangeSupport(clonedControl);
-		clonedControl.observerListener = new ArrayList<IObserverListener>();
-
 		return clonedControl;
 
 	}
@@ -739,23 +801,18 @@ public abstract class BControl implements IAdaptable, Cloneable {
 	public abstract String getType();
 
 	protected void initAttribute(AbstractAttribute atr) {
-		AbstractAttribute matr = getAttributes().get(atr.getID());
-		if (matr != null) {
-			matr.setEditable(atr.isEditable());
-			matr.setGroup(atr.getGroup());
-			matr.setShow(atr.show());
-		} else {
-			getAttributes().put(atr.getID(), atr);
+
+		AbstractAttribute oldAtr = getAttribute(atr.getID());
+
+		// If a new control is created via the editor (not from the saved file)
+		// set the saved value of the file
+		if (oldAtr != null && !newControl) {
+			atr.setValue(oldAtr.getValue());
+			atr.setDefaultValue(oldAtr.getDefaultValue());
 		}
-	}
 
-	protected void initAttribute(AbstractAttribute atr, AbstractAttribute group) {
-		initAttribute(atr, group.getClass().getName());
-	}
+		getAttributes().put(atr.getID(), atr);
 
-	protected void initAttribute(AbstractAttribute atr, String group) {
-		atr.setGroup(group);
-		initAttribute(atr);
 	}
 
 	public boolean canHaveChildren() {
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BImage.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BImage.java
index 56bfeb04b8aaed27b1f8b8973aebc1d2a99e4468..e85ed92ffdd7485541c99f7d367e74e779b5a974 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BImage.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BImage.java
@@ -6,6 +6,7 @@
 
 package de.bmotionstudio.gef.editor.model;
 
+import de.bmotionstudio.gef.editor.attribute.BAttributeAlpha;
 import de.bmotionstudio.gef.editor.attribute.BAttributeImage;
 
 /**
@@ -28,6 +29,7 @@ public class BImage extends BControl {
 	@Override
 	protected void initAttributes() {
 		initAttribute(new BAttributeImage(null));
+		initAttribute(new BAttributeAlpha(255));
 	}
 
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BRadioButton.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BRadioButton.java
index a05d99e1161b2e256d6e214ab911cd01dbb3a40f..ea370fbfd120477d521b6dba181cd4bbab4b9537 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BRadioButton.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BRadioButton.java
@@ -15,6 +15,8 @@ import de.bmotionstudio.gef.editor.ButtonGroupHelper;
 import de.bmotionstudio.gef.editor.attribute.BAttributeButtonGroup;
 import de.bmotionstudio.gef.editor.attribute.BAttributeChecked;
 import de.bmotionstudio.gef.editor.attribute.BAttributeEnabled;
+import de.bmotionstudio.gef.editor.attribute.BAttributeHeight;
+import de.bmotionstudio.gef.editor.attribute.BAttributeSize;
 import de.bmotionstudio.gef.editor.attribute.BAttributeText;
 import de.bmotionstudio.gef.editor.attribute.BAttributeTextColor;
 import de.bmotionstudio.gef.editor.attribute.BAttributeValue;
@@ -45,14 +47,20 @@ public class BRadioButton extends BControl {
 
 	@Override
 	protected void initAttributes() {
+
 		initAttribute(new BAttributeText(DEFAULT_TEXT));
 		initAttribute(new BAttributeTextColor(new RGB(0, 0, 0)));
+		initAttribute(new BAttributeEnabled(true));
 		initAttribute(new BAttributeChecked(true));
 		initAttribute(new BAttributeValue(""));
 		initAttribute(new BAttributeButtonGroup(""));
-		initAttribute(new BAttributeEnabled(true));
-		getAttribute(AttributeConstants.ATTRIBUTE_HEIGHT).setValue(21);
-		getAttribute(AttributeConstants.ATTRIBUTE_HEIGHT).setEditable(false);
+
+		BAttributeHeight aHeight = new BAttributeHeight(21);
+		aHeight.setGroup(BAttributeSize.ID);
+		aHeight.setShow(false);
+		aHeight.setEditable(false);
+		initAttribute(aHeight);
+
 	}
 
 	@Override
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BShape.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BShape.java
index 41acfd9a9e617e68f29573b442f1dc28934534ea..3e2bdb233831215341b2be3ff2777f63be9860e4 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BShape.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BShape.java
@@ -45,6 +45,7 @@ public class BShape extends BControl {
 
 	@Override
 	protected void initAttributes() {
+
 		initAttribute(new BAttributeBackgroundColor(new RGB(255, 0, 0)));
 		initAttribute(new BAttributeForegroundColor(new RGB(0, 0, 0)));
 		initAttribute(new BAttributeImage(null));
@@ -55,6 +56,7 @@ public class BShape extends BControl {
 				BAttributeOrientation.HORIZONTAL));
 		initAttribute(new BAttributeDirection(BAttributeDirection.NORTH));
 		initAttribute(new BAttributeFillType(BAttributeFillType.FILLED));
+
 	}
 
 	@Override
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTable.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTable.java
index dbb450c311d872077d1542c36331160fd9fd099a..3d455a431397f3e97c7419db64581cde7a84c7df 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTable.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTable.java
@@ -1,12 +1,21 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
 package de.bmotionstudio.gef.editor.model;
 
 import org.eclipse.draw2d.ColorConstants;
 import org.eclipse.draw2d.geometry.Rectangle;
 
-import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.attribute.AbstractAttribute;
 import de.bmotionstudio.gef.editor.attribute.BAttributeColumns;
 import de.bmotionstudio.gef.editor.attribute.BAttributeForegroundColor;
+import de.bmotionstudio.gef.editor.attribute.BAttributeHeight;
 import de.bmotionstudio.gef.editor.attribute.BAttributeRows;
+import de.bmotionstudio.gef.editor.attribute.BAttributeSize;
+import de.bmotionstudio.gef.editor.attribute.BAttributeWidth;
 import de.bmotionstudio.gef.editor.command.CreateCommand;
 
 public class BTable extends BControl {
@@ -17,8 +26,8 @@ public class BTable extends BControl {
 
 		super(visualization);
 
-		int numberOfColumns = 2;
-		int numberOfRows = 2;
+		int numberOfColumns = 1;
+		int numberOfRows = 1;
 
 		CreateCommand cmd;
 		for (int i = 0; i < numberOfColumns; i++) {
@@ -43,17 +52,30 @@ public class BTable extends BControl {
 
 	@Override
 	protected void initAttributes() {
+
+		BAttributeSize aSize = new BAttributeSize(null);
+		aSize.setGroup(AbstractAttribute.ROOT);
+		aSize.setShow(false);
+		aSize.setEditable(false);
+		initAttribute(aSize);
+
+		BAttributeHeight aHeight = new BAttributeHeight(0);
+		aHeight.setGroup(BAttributeSize.ID);
+		aHeight.setShow(false);
+		aHeight.setEditable(false);
+		initAttribute(aHeight);
+
+		BAttributeWidth aWidth = new BAttributeWidth(0);
+		aWidth.setGroup(BAttributeSize.ID);
+		aWidth.setShow(false);
+		aWidth.setEditable(false);
+		initAttribute(aWidth);
+
 		initAttribute(new BAttributeForegroundColor(
 				ColorConstants.black.getRGB()));
-		initAttribute(new BAttributeColumns(2));
-		initAttribute(new BAttributeRows(2));
-		getAttributes().get(AttributeConstants.ATTRIBUTE_SIZE).setShow(false);
-		getAttributes().get(AttributeConstants.ATTRIBUTE_COORDINATES).setShow(
-				false);
-		getAttributes().get(AttributeConstants.ATTRIBUTE_HEIGHT).setEditable(
-				false);
-		getAttributes().get(AttributeConstants.ATTRIBUTE_WIDTH).setEditable(
-				false);
+		initAttribute(new BAttributeColumns(1));
+		initAttribute(new BAttributeRows(1));
+
 	}
 
 	@Override
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTableCell.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTableCell.java
index 587e2cdf6281cc14a709f88dd0bd30aa713dae02..63f1f89b39bbc7af07ed9e5cde9d6afb449efcf4 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTableCell.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTableCell.java
@@ -1,12 +1,20 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
 package de.bmotionstudio.gef.editor.model;
 
 import org.eclipse.draw2d.ColorConstants;
 
-import de.bmotionstudio.gef.editor.AttributeConstants;
 import de.bmotionstudio.gef.editor.attribute.BAttributeBackgroundColor;
 import de.bmotionstudio.gef.editor.attribute.BAttributeForegroundColor;
+import de.bmotionstudio.gef.editor.attribute.BAttributeHeight;
+import de.bmotionstudio.gef.editor.attribute.BAttributeSize;
 import de.bmotionstudio.gef.editor.attribute.BAttributeText;
 import de.bmotionstudio.gef.editor.attribute.BAttributeTextColor;
+import de.bmotionstudio.gef.editor.attribute.BAttributeVisible;
 
 public class BTableCell extends BControl {
 
@@ -21,21 +29,26 @@ public class BTableCell extends BControl {
 
 		initAttribute(new BAttributeBackgroundColor(
 				ColorConstants.white.getRGB()));
-		BAttributeForegroundColor bAttributeForegroundColor = new BAttributeForegroundColor(
+
+		BAttributeForegroundColor aForegroundColor = new BAttributeForegroundColor(
 				ColorConstants.black.getRGB());
-		bAttributeForegroundColor.setShow(false);
-		initAttribute(bAttributeForegroundColor);
+		aForegroundColor.setEditable(true);
+		aForegroundColor.setShow(false);
+		initAttribute(aForegroundColor);
+
 		initAttribute(new BAttributeTextColor(ColorConstants.black.getRGB()));
 		initAttribute(new BAttributeText(""));
-		setAttributeValue(AttributeConstants.ATTRIBUTE_HEIGHT, 20);
-		setAttributeValue(AttributeConstants.ATTRIBUTE_WIDTH, 50);
-		getAttributes().get(AttributeConstants.ATTRIBUTE_HEIGHT).setEditable(
-				false);
-		getAttributes().get(AttributeConstants.ATTRIBUTE_WIDTH).setEditable(
-				false);
-		getAttributes().get(AttributeConstants.ATTRIBUTE_SIZE).setShow(false);
-		getAttributes().get(AttributeConstants.ATTRIBUTE_COORDINATES).setShow(
-				false);
+
+		BAttributeHeight aHeight = new BAttributeHeight(20);
+		aHeight.setGroup(BAttributeSize.ID);
+		aHeight.setShow(false);
+		aHeight.setEditable(false);
+		initAttribute(aHeight);
+
+		BAttributeVisible aVisible = new BAttributeVisible(true);
+		aVisible.setShow(false);
+		aVisible.setEditable(false);
+		initAttribute(aVisible);
 
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTableColumn.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTableColumn.java
index fc64b9ed8123ebd1dfd0499dafd92857e872eb06..5db1448a0d9c2c30b718496c4c7e6607fcd94f74 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTableColumn.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTableColumn.java
@@ -1,9 +1,17 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
 package de.bmotionstudio.gef.editor.model;
 
 import org.eclipse.draw2d.ColorConstants;
 
-import de.bmotionstudio.gef.editor.AttributeConstants;
 import de.bmotionstudio.gef.editor.attribute.BAttributeForegroundColor;
+import de.bmotionstudio.gef.editor.attribute.BAttributeHeight;
+import de.bmotionstudio.gef.editor.attribute.BAttributeSize;
+import de.bmotionstudio.gef.editor.attribute.BAttributeVisible;
 
 public class BTableColumn extends BControl {
 
@@ -16,26 +24,22 @@ public class BTableColumn extends BControl {
 	@Override
 	protected void initAttributes() {
 
-		// initAttribute(new BAttributeBackgroundColor(
-		// ColorConstants.white.getRGB()));
-		BAttributeForegroundColor bAttributeForegroundColor = new BAttributeForegroundColor(
+		BAttributeForegroundColor aForegroundColor = new BAttributeForegroundColor(
 				ColorConstants.black.getRGB());
-		bAttributeForegroundColor.setShow(false);
-		initAttribute(bAttributeForegroundColor);
-		// initAttribute(new
-		// BAttributeTextColor(ColorConstants.black.getRGB()));
-		getAttributes().get(AttributeConstants.ATTRIBUTE_HEIGHT).setEditable(
-				false);
-		getAttributes().get(AttributeConstants.ATTRIBUTE_HEIGHT).setShow(false);
-		getAttributes().get(AttributeConstants.ATTRIBUTE_COORDINATES).setShow(
-				false);
-
-		// Background Color
-		// Font
-		// Foreground Color
-
-		// Width
-		// Height (not editable) --> determined by number of cells
+		aForegroundColor.setEditable(true);
+		aForegroundColor.setShow(false);
+		initAttribute(aForegroundColor);
+
+		BAttributeHeight aHeight = new BAttributeHeight(0);
+		aHeight.setGroup(BAttributeSize.ID);
+		aHeight.setShow(false);
+		aHeight.setEditable(false);
+		initAttribute(aHeight);
+
+		BAttributeVisible aVisible = new BAttributeVisible(true);
+		aVisible.setShow(false);
+		aVisible.setEditable(false);
+		initAttribute(aVisible);
 
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BText.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BText.java
index 0e713693b0ddcd75bf44869b9842317d47a6eeba..6a2ad36c36265fab3fb457a4d6419c58b3c66514 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BText.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BText.java
@@ -6,7 +6,7 @@
 
 package de.bmotionstudio.gef.editor.model;
 
-import org.eclipse.swt.graphics.RGB;
+import org.eclipse.draw2d.ColorConstants;
 
 import de.bmotionstudio.gef.editor.attribute.BAttributeBackgroundColor;
 import de.bmotionstudio.gef.editor.attribute.BAttributeBackgroundVisible;
@@ -35,12 +35,15 @@ public class BText extends BControl {
 
 	@Override
 	protected void initAttributes() {
+
 		initAttribute(new BAttributeText(DEFAULT_TEXT));
-		initAttribute(new BAttributeBackgroundColor(new RGB(255, 255, 255)));
-		initAttribute(new BAttributeTextColor(new RGB(0, 0, 0)));
+		initAttribute(new BAttributeTextColor(ColorConstants.black.getRGB()));
+		initAttribute(new BAttributeBackgroundColor(
+				ColorConstants.white.getRGB()));
 		initAttribute(new BAttributeBackgroundVisible(true));
 		initAttribute(new BAttributeFont(
 				"1||9.75|0|WINDOWS|1|-13|0|0|0|400|0|0|0|0|0|0|0|0|"));
+
 	}
 
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTextfield.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTextfield.java
index e0d323c5ce2005008306e42cbca002899cd7bf8b..aafd035e5c872cc4929ebe3b8535110b1bde9f23 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTextfield.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/BTextfield.java
@@ -7,6 +7,8 @@
 package de.bmotionstudio.gef.editor.model;
 
 import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.attribute.BAttributeHeight;
+import de.bmotionstudio.gef.editor.attribute.BAttributeSize;
 import de.bmotionstudio.gef.editor.attribute.BAttributeText;
 
 /**
@@ -30,8 +32,15 @@ public class BTextfield extends BControl {
 
 	@Override
 	protected void initAttributes() {
+
 		initAttribute(new BAttributeText(DEFAULT_TEXT));
-		getAttribute(AttributeConstants.ATTRIBUTE_HEIGHT).setValue(21);
+
+		BAttributeHeight aHeight = new BAttributeHeight(21);
+		aHeight.setGroup(BAttributeSize.ID);
+		aHeight.setShow(false);
+		aHeight.setEditable(false);
+		initAttribute(aHeight);
+
 	}
 
 	@Override
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Light.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Light.java
new file mode 100644
index 0000000000000000000000000000000000000000..89ef5f398c7a6f7654fe688fb9aa062f955b95f4
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Light.java
@@ -0,0 +1,62 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+package de.bmotionstudio.gef.editor.model;
+
+import org.eclipse.draw2d.ColorConstants;
+
+import de.bmotionstudio.gef.editor.attribute.AbstractAttribute;
+import de.bmotionstudio.gef.editor.attribute.BAttributeBackgroundColor;
+import de.bmotionstudio.gef.editor.attribute.BAttributeCoordinates;
+import de.bmotionstudio.gef.editor.attribute.BAttributeHeight;
+import de.bmotionstudio.gef.editor.attribute.BAttributeSize;
+import de.bmotionstudio.gef.editor.attribute.BAttributeWidth;
+
+public class Light extends BControl {
+
+	public static transient String TYPE = "de.bmotionstudio.gef.editor.light";
+
+	public Light(Visualization visualization) {
+		super(visualization);
+	}
+
+	@Override
+	protected void initAttributes() {
+
+		BAttributeCoordinates aCoordinates = new BAttributeCoordinates(null);
+		aCoordinates.setGroup(AbstractAttribute.ROOT);
+		aCoordinates.setShow(false);
+		aCoordinates.setEditable(false);
+		initAttribute(aCoordinates);
+
+		BAttributeSize aSize = new BAttributeSize(null);
+		aSize.setGroup(AbstractAttribute.ROOT);
+		aSize.setShow(false);
+		aSize.setEditable(false);
+		initAttribute(aSize);
+
+		BAttributeHeight aHeight = new BAttributeHeight(12);
+		aHeight.setGroup(BAttributeSize.ID);
+		aHeight.setShow(false);
+		aHeight.setEditable(false);
+		initAttribute(aHeight);
+
+		BAttributeWidth aWidth = new BAttributeWidth(12);
+		aWidth.setGroup(BAttributeSize.ID);
+		aWidth.setShow(false);
+		aWidth.setEditable(false);
+		initAttribute(aWidth);
+
+		initAttribute(new BAttributeBackgroundColor(
+				ColorConstants.lightGray.getRGB()));
+
+	}
+
+	@Override
+	public String getType() {
+		return TYPE;
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/ObserverRootVirtualTreeNode.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/ObserverRootVirtualTreeNode.java
new file mode 100644
index 0000000000000000000000000000000000000000..8562f648692ec3d27aa319bf66ce9aed15adb9cb
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/ObserverRootVirtualTreeNode.java
@@ -0,0 +1,31 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.model;
+
+import java.util.Collection;
+
+import de.bmotionstudio.gef.editor.observer.Observer;
+
+public class ObserverRootVirtualTreeNode {
+
+	private Collection<Observer> observer;
+	private BControl control;
+
+	public ObserverRootVirtualTreeNode(BControl control) {
+		this.observer = control.getObservers().values();
+		this.control = control;
+	}
+
+	public Collection<Observer> getObserver() {
+		return observer;
+	}
+
+	public BControl getControl() {
+		return control;
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Signal.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Signal.java
new file mode 100644
index 0000000000000000000000000000000000000000..3d45a52eacd06f0667f37debc2041937a18e4e37
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Signal.java
@@ -0,0 +1,68 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+package de.bmotionstudio.gef.editor.model;
+
+import org.eclipse.draw2d.geometry.Rectangle;
+
+import de.bmotionstudio.gef.editor.attribute.AttributeLights;
+import de.bmotionstudio.gef.editor.attribute.AttributeTrackDirection;
+import de.bmotionstudio.gef.editor.attribute.BAttributeHeight;
+import de.bmotionstudio.gef.editor.attribute.BAttributeLabel;
+import de.bmotionstudio.gef.editor.attribute.BAttributeSize;
+import de.bmotionstudio.gef.editor.command.CreateCommand;
+
+/**
+ * @author Lukas Ladenberger
+ * 
+ */
+public class Signal extends BControl {
+
+	public static transient String TYPE = "de.bmotionstudio.gef.editor.signal";
+
+	public Signal(Visualization visualization) {
+
+		super(visualization);
+
+		int numberOfLights = 2;
+
+		CreateCommand cmd;
+		for (int i = 0; i < numberOfLights; i++) {
+			Light light = new Light(visualization);
+			cmd = new CreateCommand(light, this);
+			cmd.setLayout(new Rectangle(0, 0, 12, 12));
+			cmd.execute();
+		}
+
+	}
+
+	@Override
+	public String getType() {
+		return TYPE;
+	}
+
+	@Override
+	protected void initAttributes() {
+
+		BAttributeHeight aHeight = new BAttributeHeight(48);
+		aHeight.setGroup(BAttributeSize.ID);
+		aHeight.setShow(false);
+		aHeight.setEditable(false);
+		initAttribute(aHeight);
+
+		initAttribute(new AttributeTrackDirection(AttributeTrackDirection.RIGHT));
+		initAttribute(new AttributeLights(2));
+
+		BAttributeLabel aLabel = new BAttributeLabel("Signal");
+		initAttribute(aLabel);
+
+	}
+
+	@Override
+	public boolean canHaveChildren() {
+		return true;
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Switch.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Switch.java
new file mode 100644
index 0000000000000000000000000000000000000000..1fa35bd1b7bbd5ba1112618bef532c4bd8e207d8
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Switch.java
@@ -0,0 +1,178 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.geometry.Rectangle;
+
+import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.attribute.AbstractAttribute;
+import de.bmotionstudio.gef.editor.attribute.AttributeSwitchDirection;
+import de.bmotionstudio.gef.editor.attribute.AttributeSwitchPosition;
+import de.bmotionstudio.gef.editor.attribute.BAttributeHeight;
+import de.bmotionstudio.gef.editor.attribute.BAttributeSize;
+import de.bmotionstudio.gef.editor.attribute.BAttributeWidth;
+import de.bmotionstudio.gef.editor.command.ConnectionCreateCommand;
+import de.bmotionstudio.gef.editor.command.CreateCommand;
+
+public class Switch extends BControl {
+
+	public static transient String TYPE = "de.bmotionstudio.gef.editor.switch";
+
+	private transient Track track1;
+
+	private transient Track track2;
+
+	public Switch(Visualization visualization) {
+
+		super(visualization);
+
+		// Build up switch
+		TrackNode tracknode1 = new TrackNode(getVisualization());
+		CreateCommand cmd = new CreateCommand(tracknode1, this);
+		cmd.setLayout(new Rectangle(5, 0, 50, 20));
+		cmd.execute();
+
+		TrackNode tracknode2 = new TrackNode(getVisualization());
+		cmd = new CreateCommand(tracknode2, this);
+		cmd.setLayout(new Rectangle(70, 0, 50, 20));
+		cmd.execute();
+
+		TrackNode tracknode3 = new TrackNode(getVisualization());
+		cmd = new CreateCommand(tracknode3, this);
+		cmd.setLayout(new Rectangle(70, 70, 50, 20));
+		cmd.execute();
+
+		ConnectionCreateCommand trackCreateCmd = new ConnectionCreateCommand(
+				tracknode1);
+		trackCreateCmd.setTarget(tracknode2);
+		track1 = new Track(getVisualization());
+		trackCreateCmd.setConnection(track1);
+		trackCreateCmd.execute();
+
+		trackCreateCmd = new ConnectionCreateCommand(tracknode1);
+		trackCreateCmd.setTarget(tracknode3);
+		track2 = new Track(getVisualization());
+		trackCreateCmd.setConnection(track2);
+		trackCreateCmd.execute();
+
+		track1.setAttributeValue(AttributeConstants.ATTRIBUTE_LABEL, "");
+		track2.setAttributeValue(AttributeConstants.ATTRIBUTE_LABEL, "");
+
+		track1.setAttributeValue(AttributeConstants.ATTRIBUTE_CUSTOM, "LEFT");
+		AbstractAttribute a1 = track1
+				.getAttribute(AttributeConstants.ATTRIBUTE_CUSTOM);
+		a1.setEditable(false);
+		a1.setShow(false);
+
+		track2.setAttributeValue(AttributeConstants.ATTRIBUTE_CUSTOM, "RIGHT");
+		AbstractAttribute a2 = track2.getAttribute(AttributeConstants.ATTRIBUTE_CUSTOM);
+		a2.setEditable(false);
+		a2.setShow(false);
+
+		tracknode1.setAttributeValue(AttributeConstants.ATTRIBUTE_CUSTOM, "1");
+		tracknode1.getAttribute(AttributeConstants.ATTRIBUTE_CUSTOM)
+				.setEditable(false);
+		tracknode1.getAttribute(AttributeConstants.ATTRIBUTE_CUSTOM).setShow(
+				false);
+		tracknode1.getAttribute(AttributeConstants.ATTRIBUTE_COORDINATES)
+				.setShow(false);
+
+		tracknode2.setAttributeValue(AttributeConstants.ATTRIBUTE_CUSTOM, "2");
+		tracknode2.getAttribute(AttributeConstants.ATTRIBUTE_CUSTOM)
+				.setEditable(false);
+		tracknode2.getAttribute(AttributeConstants.ATTRIBUTE_CUSTOM).setShow(
+				false);
+		tracknode2.getAttribute(AttributeConstants.ATTRIBUTE_COORDINATES)
+				.setShow(false);
+
+		tracknode3.setAttributeValue(AttributeConstants.ATTRIBUTE_CUSTOM, "3");
+		tracknode3.getAttribute(AttributeConstants.ATTRIBUTE_CUSTOM)
+				.setEditable(false);
+		tracknode3.getAttribute(AttributeConstants.ATTRIBUTE_CUSTOM).setShow(
+				false);
+		tracknode3.getAttribute(AttributeConstants.ATTRIBUTE_COORDINATES)
+				.setShow(false);
+
+	}
+
+	@Override
+	protected void initAttributes() {
+
+		BAttributeHeight aHeight = new BAttributeHeight(50);
+		aHeight.setGroup(BAttributeSize.ID);
+		initAttribute(aHeight);
+
+		BAttributeWidth aWidth = new BAttributeWidth(100);
+		aWidth.setGroup(BAttributeSize.ID);
+		initAttribute(aWidth);
+
+		initAttribute(new AttributeSwitchDirection(
+				AttributeSwitchDirection.RIGHT_SOUTH));
+		initAttribute(new AttributeSwitchPosition(
+				AttributeSwitchPosition.UNKNOWN));
+
+	}
+
+	// We have to set the two tracks of the switch, since their are set to
+	// transient
+	protected Object readResolve() {
+
+		super.readResolve();
+
+		for (BControl control : getChildrenArray()) {
+
+			List<Track> tracks = new ArrayList<Track>();
+			for (BConnection c : ((TrackNode) control).getSourceConnections()) {
+				if (c instanceof Track)
+					tracks.add((Track) c);
+			}
+			for (BConnection c : ((TrackNode) control).getTargetConnections()) {
+				if (c instanceof Track)
+					tracks.add((Track) c);
+			}
+			for (Track n : tracks) {
+				AbstractAttribute a2 = n
+						.getAttribute(AttributeConstants.ATTRIBUTE_CUSTOM);
+				if (a2.getValue().equals("LEFT")) {
+					a2.setEditable(false);
+					a2.setShow(false);
+					track1 = n;
+				} else if (a2.getValue().equals("RIGHT")) {
+					track2 = n;
+					a2.setEditable(false);
+					a2.setShow(false);
+				}
+			}
+
+		}
+
+		return this;
+
+	}
+
+	@Override
+	public String getType() {
+		return TYPE;
+	}
+
+	@Override
+	public boolean canHaveChildren() {
+		return true;
+	}
+
+	public Track getTrack1() {
+		return track1;
+	}
+
+	public Track getTrack2() {
+		return track2;
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Tank.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Tank.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b6215e913f60487831895b846c286c449e81945
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Tank.java
@@ -0,0 +1,46 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.model;
+
+import org.eclipse.draw2d.ColorConstants;
+
+import de.bmotionstudio.gef.editor.attribute.AttributeFillColor;
+import de.bmotionstudio.gef.editor.attribute.AttributeFillHeight;
+import de.bmotionstudio.gef.editor.attribute.AttributeMeasureInterval;
+import de.bmotionstudio.gef.editor.attribute.AttributeMeasureMaxPos;
+import de.bmotionstudio.gef.editor.attribute.AttributeShowMeasure;
+import de.bmotionstudio.gef.editor.attribute.BAttributeAlpha;
+import de.bmotionstudio.gef.editor.attribute.BAttributeBackgroundColor;
+
+public class Tank extends BControl {
+
+	public static transient String TYPE = "de.bmotionstudio.gef.editor.tank";
+
+	public Tank(Visualization visualization) {
+		super(visualization);
+	}
+
+	@Override
+	public String getType() {
+		return TYPE;
+	}
+
+	@Override
+	protected void initAttributes() {
+
+		initAttribute(new BAttributeBackgroundColor(
+				ColorConstants.black.getRGB()));
+		initAttribute(new AttributeShowMeasure(true));
+		initAttribute(new AttributeMeasureInterval(25));
+		initAttribute(new AttributeMeasureMaxPos(100));
+		initAttribute(new AttributeFillColor(ColorConstants.blue.getRGB()));
+		initAttribute(new AttributeFillHeight(75));
+		initAttribute(new BAttributeAlpha(0));
+
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Track.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Track.java
new file mode 100644
index 0000000000000000000000000000000000000000..e56e990bc9e7900a35a4558e6febcebb7c1c95ff
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Track.java
@@ -0,0 +1,74 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.model;
+
+import org.eclipse.swt.graphics.RGB;
+
+import de.bmotionstudio.gef.editor.attribute.AbstractAttribute;
+import de.bmotionstudio.gef.editor.attribute.BAttributeConnection;
+import de.bmotionstudio.gef.editor.attribute.BAttributeConnectionSourceDecoration;
+import de.bmotionstudio.gef.editor.attribute.BAttributeConnectionTargetDecoration;
+import de.bmotionstudio.gef.editor.attribute.BAttributeForegroundColor;
+import de.bmotionstudio.gef.editor.attribute.BAttributeLabel;
+import de.bmotionstudio.gef.editor.attribute.BAttributeLineStyle;
+import de.bmotionstudio.gef.editor.attribute.BAttributeLineWidth;
+
+/**
+ * @author Lukas Ladenberger
+ * 
+ */
+public class Track extends BConnection {
+
+	public static transient String TYPE = "de.bmotionstudio.gef.editor.track";
+
+	public Track(Visualization visualization) {
+		super(visualization);
+	}
+
+	@Override
+	public String getType() {
+		return TYPE;
+	}
+
+	@Override
+	protected void initAttributes() {
+
+		BAttributeConnection aConnection = new BAttributeConnection(null);
+		aConnection.setGroup(AbstractAttribute.ROOT);
+		initAttribute(aConnection);
+
+		BAttributeLineWidth aLineWidth = new BAttributeLineWidth(1);
+		aLineWidth.setGroup(aConnection);
+		initAttribute(aLineWidth);
+
+		BAttributeLineStyle aLineStyle = new BAttributeLineStyle(
+				BAttributeLineStyle.SOLID_CONNECTION);
+		aLineStyle.setGroup(aConnection);
+		initAttribute(aLineStyle);
+
+		BAttributeForegroundColor aForegroundColor = new BAttributeForegroundColor(
+				new RGB(0, 0, 0));
+		aForegroundColor.setGroup(aConnection);
+		initAttribute(aForegroundColor);
+
+		BAttributeConnectionSourceDecoration aSourceDeco = new BAttributeConnectionSourceDecoration(
+				BAttributeConnectionSourceDecoration.DECORATION_NONE);
+		aSourceDeco.setGroup(aConnection);
+		initAttribute(aSourceDeco);
+
+		BAttributeConnectionTargetDecoration aTargetDeco = new BAttributeConnectionTargetDecoration(
+				BAttributeConnectionSourceDecoration.DECORATION_NONE);
+		aTargetDeco.setGroup(aConnection);
+		initAttribute(aTargetDeco);
+
+		BAttributeLabel aLabel = new BAttributeLabel("Label ...");
+		aLabel.setGroup(aConnection);
+		initAttribute(aLabel);
+
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/TrackNode.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/TrackNode.java
new file mode 100644
index 0000000000000000000000000000000000000000..a71845d78b125d52c9e08169cb6919385fc0412b
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/TrackNode.java
@@ -0,0 +1,65 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.model;
+
+import org.eclipse.draw2d.ColorConstants;
+
+import de.bmotionstudio.gef.editor.attribute.AbstractAttribute;
+import de.bmotionstudio.gef.editor.attribute.BAttributeForegroundColor;
+import de.bmotionstudio.gef.editor.attribute.BAttributeHeight;
+import de.bmotionstudio.gef.editor.attribute.BAttributeLineStyle;
+import de.bmotionstudio.gef.editor.attribute.BAttributeLineWidth;
+import de.bmotionstudio.gef.editor.attribute.BAttributeSize;
+import de.bmotionstudio.gef.editor.attribute.BAttributeWidth;
+
+/**
+ * @author Lukas Ladenberger
+ * 
+ */
+public class TrackNode extends BControl {
+
+	public static transient String TYPE = "de.bmotionstudio.gef.editor.tracknode";
+
+	public TrackNode(Visualization visualization) {
+		super(visualization);
+	}
+
+	@Override
+	public String getType() {
+		return TYPE;
+	}
+
+	@Override
+	protected void initAttributes() {
+
+		BAttributeSize aSize = new BAttributeSize(null);
+		aSize.setGroup(AbstractAttribute.ROOT);
+		aSize.setShow(false);
+		aSize.setEditable(false);
+		initAttribute(aSize);
+
+		BAttributeHeight aHeight = new BAttributeHeight(20);
+		aHeight.setGroup(BAttributeSize.ID);
+		aHeight.setShow(false);
+		aHeight.setEditable(false);
+		initAttribute(aHeight);
+
+		BAttributeWidth aWidth = new BAttributeWidth(20);
+		aWidth.setGroup(BAttributeSize.ID);
+		aWidth.setShow(false);
+		aWidth.setEditable(false);
+		initAttribute(aWidth);
+
+		initAttribute(new BAttributeForegroundColor(
+				ColorConstants.black.getRGB()));
+		initAttribute(new BAttributeLineStyle(
+				BAttributeLineStyle.SOLID_CONNECTION));
+		initAttribute(new BAttributeLineWidth(1));
+
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Visualization.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Visualization.java
index 45a5666c3bf9502579b59251d27dc7f70e8df858..1de47b1b81c7c6e2a4d2a4ebfe2ce9a0a621f517 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Visualization.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/model/Visualization.java
@@ -14,7 +14,6 @@ import org.eclipse.draw2d.PositionConstants;
 
 import de.be4.classicalb.core.parser.exceptions.BException;
 import de.bmotionstudio.gef.editor.Animation;
-import de.bmotionstudio.gef.editor.AttributeConstants;
 import de.bmotionstudio.gef.editor.ButtonGroupHelper;
 import de.bmotionstudio.gef.editor.IAddErrorListener;
 import de.bmotionstudio.gef.editor.scheduler.PredicateOperation;
@@ -25,7 +24,7 @@ import de.prob.exceptions.ProBException;
 
 public class Visualization extends BControl {
 
-	public static transient String TYPE = "de.bmotionstudio.gef.editor.text";
+	public static transient String TYPE = "de.bmotionstudio.gef.editor.visualization";
 
 	protected String bmachine, language, version;
 
@@ -62,6 +61,7 @@ public class Visualization extends BControl {
 		this.version = version;
 		this.errorListener = new ArrayList<IAddErrorListener>();
 		this.isRunning = false;
+		this.snapToGeometry = true;
 		createRulers();
 		ButtonGroupHelper.reset();
 	}
@@ -185,13 +185,18 @@ public class Visualization extends BControl {
 
 	private List<String> getAllBControlNames(List<BControl> children) {
 		List<String> list = new ArrayList<String>();
-		for (BControl bcontrol : children) {
-			list.add(bcontrol
-					.getAttributeValue(AttributeConstants.ATTRIBUTE_ID)
-					.toString());
-			if (bcontrol.getChildrenArray().size() > 0) {
-				list.addAll(getAllBControlNames(bcontrol.getChildrenArray()));
-			}
+		for (BControl control : children) {
+			list.add(control.getID());
+			// Check children
+			List<BControl> subchildren = control.getChildrenArray();
+			if (children.size() > 0)
+				list.addAll(getAllBControlNames(subchildren));
+			// Check connections
+			List<BControl> connections = new ArrayList<BControl>();
+			connections.addAll(control.getSourceConnections());
+			connections.addAll(control.getTargetConnections());
+			if (connections.size() > 0)
+				list.addAll(getAllBControlNames(connections));
 		}
 		return list;
 	}
@@ -226,13 +231,21 @@ public class Visualization extends BControl {
 	}
 
 	private BControl getBControl(String ID, List<BControl> children) {
-		for (BControl bcontrol : children) {
-			if (bcontrol.getID().equals(ID)) {
-				return bcontrol;
+		for (BControl control : children) {
+			if (control.getID().equals(ID)) {
+				return control;
+			}
+			for (BConnection c : control.getSourceConnections()) {
+				if (c.getIcon().equals(ID))
+					return c;
+			}
+			for (BConnection c : control.getTargetConnections()) {
+				if (c.getIcon().equals(ID))
+					return c;
 			}
-			if (bcontrol.getChildrenArray().size() > 0) {
+			if (control.getChildrenArray().size() > 0) {
 				BControl childControl = getBControl(ID,
-						bcontrol.getChildrenArray());
+						control.getChildrenArray());
 				if (childControl != null)
 					return childControl;
 			}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/ColumnObserver.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/ColumnObserver.java
index 5b02178d00847f836dd6c3ea5b56c99c6d8054fb..04309d362c320e767f78cd5de856cdfd7495d5b8 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/ColumnObserver.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/ColumnObserver.java
@@ -1,17 +1,38 @@
 package de.bmotionstudio.gef.editor.observer;
 
+import java.util.LinkedList;
+import java.util.List;
+
 import de.bmotionstudio.gef.editor.Animation;
 import de.bmotionstudio.gef.editor.AttributeConstants;
 import de.bmotionstudio.gef.editor.attribute.AbstractAttribute;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.observer.wizard.WizardColumnObserver;
 import de.bmotionstudio.gef.editor.util.BMSUtil;
+import de.prob.unicode.UnicodeTranslator;
 
 public class ColumnObserver extends Observer {
 
 	private String expression;
 	private String predicate;
 
+	public static List<String> split(String input, char tempReplacement) {
+		while (input.matches(".*\"[^\\{\\}]+,[^\\{\\}]+.*")) {
+			input = input.replaceAll("(\"[^\\{\\}]+),([^\\{\\}]+)", "$1"
+					+ tempReplacement + "$2");
+		}
+		while (input.matches(".*\\{[^\\}]+,[^\\}]+\\}.*")) {
+			input = input.replaceAll("(\\{[^\\}]+),([^\\}]+\\})", "$1"
+					+ tempReplacement + "$2");
+		}
+		String[] split = input.split(",");
+		List<String> output = new LinkedList<String>();
+		for (String s : split) {
+			output.add(s.replaceAll(tempReplacement + "", ",").trim());
+		}
+		return output;
+	}
+
 	@Override
 	public void check(Animation animation, BControl control) {
 
@@ -25,24 +46,29 @@ public class ColumnObserver extends Observer {
 
 			String fEval = BMSUtil.parseExpression(expression, control,
 					animation);
-			fEval = fEval.replace("}", "").replace("{", "");
-			String[] splitArray = fEval.split(",");
+			fEval = UnicodeTranslator.toAscii(fEval);
+			fEval = fEval.replaceAll("^\\{", "");
+			fEval = fEval.replaceAll("\\}$", "");
+			List<String> output = split(fEval, '#');
 
 			AbstractAttribute attributeRows = control.getParent().getAttribute(
 					AttributeConstants.ATTRIBUTE_ROWS);
 
-			Integer defaultRows = Integer.valueOf(attributeRows
-					.getInitValue().toString());
+			Integer defaultRows = Integer.valueOf(attributeRows.getInitValue()
+					.toString());
 
 			control.getParent().setAttributeValue(
 					AttributeConstants.ATTRIBUTE_ROWS,
-					defaultRows + splitArray.length, true, false);
+					defaultRows + output.size(), true, false);
 
-			for (int i = defaultRows; i < splitArray.length + defaultRows; i++) {
+			for (int i = defaultRows; i < output.size() + defaultRows; i++) {
+				String val = output.get(i - defaultRows);
+				if (val != null && val.length() > 0)
+					val = UnicodeTranslator.toUnicode(val);
 				control.getChildrenArray()
 						.get(i)
 						.setAttributeValue(AttributeConstants.ATTRIBUTE_TEXT,
-								splitArray[i - defaultRows]);
+								val);
 			}
 
 		}
@@ -70,4 +96,4 @@ public class ColumnObserver extends Observer {
 		return new WizardColumnObserver(control, this);
 	}
 
-}
+}
\ No newline at end of file
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/TableObserver.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/TableObserver.java
new file mode 100644
index 0000000000000000000000000000000000000000..9ad72ca8e76de21b1fe7c98f8f5e1c0029210c71
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/TableObserver.java
@@ -0,0 +1,175 @@
+package de.bmotionstudio.gef.editor.observer;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import de.bmotionstudio.gef.editor.Animation;
+import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.attribute.AbstractAttribute;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.observer.wizard.WizardTableObserver;
+import de.bmotionstudio.gef.editor.util.BMSUtil;
+import de.prob.unicode.UnicodeTranslator;
+
+public class TableObserver extends Observer {
+
+	private String expression;
+	private String predicate;
+	private boolean overrideCells;
+	private boolean keepHeader;
+
+	public static List<String> split(String input, char tempReplacement) {
+		while (input.matches(".*\\{[^\\}]+,[^\\}]+\\}.*")) {
+			input = input.replaceAll("(\\{[^\\}]+),([^\\}]+\\})", "$1"
+					+ tempReplacement + "$2");
+		}
+		List<String> output = new LinkedList<String>();
+		if (input.length() > 0) {
+			String[] split = input.split(",");
+			for (String s : split) {
+				output.add(s.replaceAll(tempReplacement + "", ",").trim());
+			}
+		}
+		return output;
+	}
+
+	public static List<String> split2(String input, char tempReplacement) {
+		while (input.matches(".*\\([^\\)]+\\|->[^\\)]+\\).*")) {
+			input = input.replaceAll("(\\([^\\)]+)\\|->([^\\)]+\\))", "$1"
+					+ tempReplacement + "$2");
+		}
+		List<String> output = new LinkedList<String>();
+		if (input.length() > 0) {
+			String[] split = input.split("\\|->");
+			for (String s : split) {
+				output.add(s.replaceAll(tempReplacement + "", "\\|->").trim());
+			}
+		}
+		return output;
+	}
+
+
+	@Override
+	public void check(Animation animation, BControl control) {
+
+		// First evaluate predicate (predicate field)
+		String bolValue = "true";
+		if (predicate != null && predicate.length() > 0) {
+			bolValue = BMSUtil.parsePredicate(predicate, control, animation);
+		}
+
+		if (Boolean.valueOf(bolValue)) {
+
+			String fEval = BMSUtil.parseExpression(expression, control,
+					animation);
+
+			fEval = UnicodeTranslator.toAscii(fEval);
+			fEval = fEval.replaceAll("^\\{", "");
+			fEval = fEval.replaceAll("\\}$", "");
+
+			String input = fEval;
+			List<String> rows = split(input, '#');
+
+			Integer numberOfOldRows = 0;
+			Integer numberOfOldColumns = 0;
+
+			if (!overrideCells) {
+				AbstractAttribute attributeRows = control
+						.getAttribute(AttributeConstants.ATTRIBUTE_ROWS);
+				numberOfOldRows = Integer.valueOf(attributeRows.getInitValue()
+						.toString());
+				AbstractAttribute attributeColumns = control
+						.getAttribute(AttributeConstants.ATTRIBUTE_COLUMNS);
+				numberOfOldColumns = Integer.valueOf(attributeColumns
+						.getInitValue().toString());
+			} else if (keepHeader) {
+				numberOfOldRows = 1;
+			}
+
+			int numberOfNewRows = rows.size();
+
+			// Set the correct number of rows
+			control.setAttributeValue(AttributeConstants.ATTRIBUTE_ROWS,
+					numberOfNewRows + numberOfOldRows, true, false);
+
+			boolean setColumns = false;
+
+			// Set content and the correct number of columns
+			for (int i = numberOfOldRows; i < numberOfNewRows + numberOfOldRows; i++) {
+
+				String content = rows.get(i - numberOfOldRows);
+
+				if (content != null && content.length() > 0)
+					content = UnicodeTranslator.toAscii(content);
+
+				content = content.replaceAll("^\\(", "");
+				content = content.replaceAll("\\)$", "");
+
+				List<String> columns = split2(content, '#');
+				int numberOfNewColumns = columns.size();
+
+				// Set only one time the number of columns!
+				if (!setColumns) {
+					int ncolumns = numberOfNewColumns;
+					if (numberOfOldColumns > numberOfNewColumns)
+						ncolumns = numberOfOldColumns;
+					control.setAttributeValue(
+							AttributeConstants.ATTRIBUTE_COLUMNS, ncolumns,
+							true, false);
+					setColumns = true;
+				}
+
+				for (int z = 0; z < numberOfNewColumns; z++) {
+					String val = columns.get(z);
+					BControl column = control.getChildrenArray().get(z);
+					BControl cell = column.getChildrenArray().get(i);
+					if (val != null && val.length() > 0)
+						val = UnicodeTranslator.toUnicode(val);
+					cell.setAttributeValue(AttributeConstants.ATTRIBUTE_TEXT,
+							val);
+				}
+
+			}
+
+		}
+
+	}
+
+	public void setExpression(String expression) {
+		this.expression = expression;
+	}
+
+	public String getExpression() {
+		return expression;
+	}
+
+	public String getPredicate() {
+		return predicate;
+	}
+
+	public void setPredicate(String predicate) {
+		this.predicate = predicate;
+	}
+
+	@Override
+	public ObserverWizard getWizard(BControl control) {
+		return new WizardTableObserver(control, this);
+	}
+
+	public boolean isOverrideCells() {
+		return overrideCells;
+	}
+
+	public void setOverrideCells(boolean overrideCells) {
+		this.overrideCells = overrideCells;
+	}
+
+	public boolean isKeepHeader() {
+		return keepHeader;
+	}
+
+	public void setKeepHeader(boolean keepHeader) {
+		this.keepHeader = keepHeader;
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/AbstractObserverWizardPage.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/AbstractObserverWizardPage.java
new file mode 100644
index 0000000000000000000000000000000000000000..2450ad1a6a17dcc9def5a1c29a412d5a6b689dca
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/AbstractObserverWizardPage.java
@@ -0,0 +1,30 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.observer.wizard;
+
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.PlatformUI;
+
+import de.bmotionstudio.gef.editor.observer.Observer;
+
+public class AbstractObserverWizardPage extends WizardPage {
+
+	private Observer observer;
+
+	protected AbstractObserverWizardPage(String pageName, Observer observer) {
+		super(pageName);
+		this.observer = observer;
+	}
+
+	@Override
+	public void createControl(Composite parent) {
+		PlatformUI.getWorkbench().getHelpSystem()
+				.setHelp(parent, observer.getClass().getName());
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverCSwitchCoordinates.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverCSwitchCoordinates.java
index 38305895ce7b0dc8bf14daf12637378cd77d9eb9..3a5b8b09e05c56eb8d139898c317cb86ac5caddb 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverCSwitchCoordinates.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverCSwitchCoordinates.java
@@ -21,7 +21,6 @@ import org.eclipse.jface.viewers.ITableLabelProvider;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
@@ -55,16 +54,19 @@ public class WizardObserverCSwitchCoordinates extends ObserverWizard {
 
 	private String lastChangedControlID;
 
-	private class ObserverCSwitchCoordinatesPage extends WizardPage {
+	private class ObserverCSwitchCoordinatesPage extends
+			AbstractObserverWizardPage {
 
 		private TableViewer tableViewer;
 
 		protected ObserverCSwitchCoordinatesPage(final String pageName) {
-			super(pageName);
+			super(pageName, getObserver());
 		}
 
 		public void createControl(Composite parent) {
 
+			super.createControl(parent);
+
 			DataBindingContext dbc = new DataBindingContext();
 
 			Composite container = new Composite(parent, SWT.NONE);
@@ -84,22 +86,25 @@ public class WizardObserverCSwitchCoordinates extends ObserverWizard {
 							if (firstElement instanceof ObserverEvalObject) {
 								restorePreview();
 								ObserverEvalObject observerEvalObject = (ObserverEvalObject) firstElement;
-								BControl control = getBControl();
-								ToggleObjectCoordinates toggleObjectCoordinates = (ToggleObjectCoordinates) observerEvalObject;
-								String attributeX = AttributeConstants.ATTRIBUTE_X;
-								String attributeY = AttributeConstants.ATTRIBUTE_Y;
-								String x = toggleObjectCoordinates.getX();
-								String y = toggleObjectCoordinates.getY();
-								String controlID = toggleObjectCoordinates
-										.getBcontrol();
-								BControl bControl = control.getChild(controlID);
-								if (bControl != null) {
-									bControl.setAttributeValue(attributeX, x,
-											true, false);
-									bControl.setAttributeValue(attributeY, y,
-											true, false);
+								if (!observerEvalObject.isExpressionMode()) {
+									BControl control = getBControl();
+									ToggleObjectCoordinates toggleObjectCoordinates = (ToggleObjectCoordinates) observerEvalObject;
+									String attributeX = AttributeConstants.ATTRIBUTE_X;
+									String attributeY = AttributeConstants.ATTRIBUTE_Y;
+									String x = toggleObjectCoordinates.getX();
+									String y = toggleObjectCoordinates.getY();
+									String controlID = toggleObjectCoordinates
+											.getBcontrol();
+									BControl bControl = control
+											.getChild(controlID);
+									if (bControl != null) {
+										bControl.setAttributeValue(attributeX,
+												x, true, false);
+										bControl.setAttributeValue(attributeY,
+												y, true, false);
+									}
+									lastChangedControlID = controlID;
 								}
-								lastChangedControlID = controlID;
 							}
 						}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverListenOperationByPredicate.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverListenOperationByPredicate.java
index e5bf19cf76510f3bfe7df16a056fc6c5a3239c65..856cd5a2e88267505c1a347a7bea6059713752a7 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverListenOperationByPredicate.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverListenOperationByPredicate.java
@@ -30,7 +30,6 @@ import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CCombo;
 import org.eclipse.swt.events.FocusEvent;
@@ -68,16 +67,19 @@ public class WizardObserverListenOperationByPredicate extends ObserverWizard {
 
 	private String lastChangedAttributeID;
 
-	private class ObserverListenOperationByPredicatePage extends WizardPage {
+	private class ObserverListenOperationByPredicatePage extends
+			AbstractObserverWizardPage {
 
 		private TableViewer tableViewer;
 
 		protected ObserverListenOperationByPredicatePage(final String pageName) {
-			super(pageName);
+			super(pageName, getObserver());
 		}
 
 		public void createControl(final Composite parent) {
 
+			super.createControl(parent);
+
 			DataBindingContext dbc = new DataBindingContext();
 
 			Composite container = new Composite(parent, SWT.NONE);
@@ -105,13 +107,17 @@ public class WizardObserverListenOperationByPredicate extends ObserverWizard {
 									control.restoreDefaultValue(lastChangedAttributeID);
 
 								PredicateOperation obj = (PredicateOperation) observerEvalObject;
-								String attribute = obj
-										.getAttribute();
-								Object value = obj.getValue();
-								control.setAttributeValue(attribute, value,
-										true, false);
 
-								lastChangedAttributeID = attribute;
+								if (!obj.isExpressionMode()) {
+
+									String attribute = obj.getAttribute();
+									Object value = obj.getValue();
+									control.setAttributeValue(attribute, value,
+											true, false);
+
+									lastChangedAttributeID = attribute;
+
+								}
 
 							}
 						}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSetAttribute.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSetAttribute.java
index fae15b93d5eb8f872d7481ec19c451c0a67c2588..8817a572855ba8271c20bf61bd52d3ada2bcc0f4 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSetAttribute.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSetAttribute.java
@@ -29,7 +29,6 @@ import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CCombo;
 import org.eclipse.swt.events.FocusEvent;
@@ -68,18 +67,20 @@ public class WizardObserverSetAttribute extends ObserverWizard {
 
 	private String lastChangedAttributeID;
 
-	private class WizardSetAttributePage extends WizardPage {
+	private class WizardSetAttributePage extends AbstractObserverWizardPage {
 
 		private WritableList input;
 
 		private TableViewer tableViewer;
 
 		protected WizardSetAttributePage(final String pageName) {
-			super(pageName);
+			super(pageName, getObserver());
 		}
 
 		public void createControl(Composite parent) {
 
+			super.createControl(parent);
+
 			DataBindingContext dbc = new DataBindingContext();
 
 			GridLayout gl = new GridLayout(1, true);
@@ -112,13 +113,18 @@ public class WizardObserverSetAttribute extends ObserverWizard {
 									control.restoreDefaultValue(lastChangedAttributeID);
 
 								SetAttributeObject setAttributeObj = (SetAttributeObject) observerEvalObject;
-								String attribute = setAttributeObj
-										.getAttribute();
-								Object value = setAttributeObj.getValue();
-								control.setAttributeValue(attribute, value,
-										true, false);
 
-								lastChangedAttributeID = attribute;
+								if (!setAttributeObj.isExpressionMode()) {
+
+									String attribute = setAttributeObj
+											.getAttribute();
+									Object value = setAttributeObj.getValue();
+									control.setAttributeValue(attribute, value,
+											true, false);
+
+									lastChangedAttributeID = attribute;
+
+								}
 
 							}
 						}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSimpleValueDisplay.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSimpleValueDisplay.java
index f8a7040057b65872931d09c65190837f27bd4c36..1f9a6b76e83c627a1de6fc7c4efc9159d53e4d58 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSimpleValueDisplay.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSimpleValueDisplay.java
@@ -10,7 +10,6 @@ import org.eclipse.core.databinding.DataBindingContext;
 import org.eclipse.core.databinding.beans.BeansObservables;
 import org.eclipse.jface.databinding.swt.SWTObservables;
 import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.graphics.FontData;
@@ -29,7 +28,8 @@ import de.bmotionstudio.gef.editor.observer.SimpleValueDisplay;
 
 public class WizardObserverSimpleValueDisplay extends ObserverWizard {
 
-	private class ObserverSimpleValueDisplayPage extends WizardPage {
+	private class ObserverSimpleValueDisplayPage extends
+			AbstractObserverWizardPage {
 
 		private Text txtReplacementString;
 		private Text txtExpression;
@@ -40,11 +40,13 @@ public class WizardObserverSimpleValueDisplay extends ObserverWizard {
 		}
 
 		protected ObserverSimpleValueDisplayPage(final String pageName) {
-			super(pageName);
+			super(pageName, getObserver());
 		}
 
 		public void createControl(final Composite parent) {
 
+			super.createControl(parent);
+
 			final DataBindingContext dbc = new DataBindingContext();
 
 			Composite container = new Composite(parent, SWT.NONE);
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSwitchCoordinates.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSwitchCoordinates.java
index b0082eefde87049d99f7c320587a2c3916b47636..14cd883a29fec574490b3605aa5ae24d8c572e5d 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSwitchCoordinates.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSwitchCoordinates.java
@@ -22,7 +22,6 @@ import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
@@ -54,16 +53,19 @@ import de.bmotionstudio.gef.editor.util.BMotionWizardUtil;
 
 public class WizardObserverSwitchCoordinates extends ObserverWizard {
 
-	private class ObserverToggleCoordinatesPage extends WizardPage {
+	private class ObserverToggleCoordinatesPage extends
+			AbstractObserverWizardPage {
 
 		private TableViewer tableViewer;
 
 		protected ObserverToggleCoordinatesPage(final String pageName) {
-			super(pageName);
+			super(pageName, getObserver());
 		}
 
 		public void createControl(Composite parent) {
 
+			super.createControl(parent);
+
 			DataBindingContext dbc = new DataBindingContext();
 
 			Composite container = new Composite(parent, SWT.NONE);
@@ -83,16 +85,18 @@ public class WizardObserverSwitchCoordinates extends ObserverWizard {
 							Object firstElement = selection.getFirstElement();
 							if (firstElement instanceof ObserverEvalObject) {
 								ObserverEvalObject observerEvalObject = (ObserverEvalObject) firstElement;
-								BControl control = getBControl();
-								ToggleObjectCoordinates toggleObjectCoordinates = (ToggleObjectCoordinates) observerEvalObject;
-								String attributeX = AttributeConstants.ATTRIBUTE_X;
-								String attributeY = AttributeConstants.ATTRIBUTE_Y;
-								String x = toggleObjectCoordinates.getX();
-								String y = toggleObjectCoordinates.getY();
-								control.setAttributeValue(attributeX, x, true,
-										false);
-								control.setAttributeValue(attributeY, y, true,
-										false);
+								if (!observerEvalObject.isExpressionMode()) {
+									BControl control = getBControl();
+									ToggleObjectCoordinates toggleObjectCoordinates = (ToggleObjectCoordinates) observerEvalObject;
+									String attributeX = AttributeConstants.ATTRIBUTE_X;
+									String attributeY = AttributeConstants.ATTRIBUTE_Y;
+									String x = toggleObjectCoordinates.getX();
+									String y = toggleObjectCoordinates.getY();
+									control.setAttributeValue(attributeX, x,
+											true, false);
+									control.setAttributeValue(attributeY, y,
+											true, false);
+								}
 							}
 						}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSwitchImage.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSwitchImage.java
index b9e689f1bb1cbeb0da42dc59d61602594492e33a..40c1dd154d70fe6e4f9a2bfd24ecfa17a58b5c58 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSwitchImage.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardObserverSwitchImage.java
@@ -22,7 +22,6 @@ import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
@@ -56,16 +55,18 @@ import de.bmotionstudio.gef.editor.util.BMotionWizardUtil;
 
 public class WizardObserverSwitchImage extends ObserverWizard {
 
-	private class ObserverSwitchImagePage extends WizardPage {
+	private class ObserverSwitchImagePage extends AbstractObserverWizardPage {
 
 		private TableViewer tableViewer;
 
 		protected ObserverSwitchImagePage(final String pageName) {
-			super(pageName);
+			super(pageName, getObserver());
 		}
 
 		public void createControl(final Composite parent) {
 
+			super.createControl(parent);
+
 			DataBindingContext dbc = new DataBindingContext();
 
 			Composite container = new Composite(parent, SWT.NONE);
@@ -84,12 +85,14 @@ public class WizardObserverSwitchImage extends ObserverWizard {
 							Object firstElement = selection.getFirstElement();
 							if (firstElement instanceof ObserverEvalObject) {
 								ObserverEvalObject observerEvalObject = (ObserverEvalObject) firstElement;
-								BControl control = getBControl();
-								ToggleObjectImage toggleObjImage = (ToggleObjectImage) observerEvalObject;
-								String attribute = AttributeConstants.ATTRIBUTE_IMAGE;
-								String image = toggleObjImage.getImage();
-								control.setAttributeValue(attribute, image,
-										true, false);
+								if (!observerEvalObject.isExpressionMode()) {
+									BControl control = getBControl();
+									ToggleObjectImage toggleObjImage = (ToggleObjectImage) observerEvalObject;
+									String attribute = AttributeConstants.ATTRIBUTE_IMAGE;
+									String image = toggleObjImage.getImage();
+									control.setAttributeValue(attribute, image,
+											true, false);
+								}
 							}
 						}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardTableObserver.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardTableObserver.java
new file mode 100644
index 0000000000000000000000000000000000000000..e816e1d3ee2c517bca6e12dd054b201e29cea5e2
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/observer/wizard/WizardTableObserver.java
@@ -0,0 +1,210 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.observer.wizard;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.databinding.beans.BeansObservables;
+import org.eclipse.jface.databinding.swt.SWTObservables;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Text;
+import org.eventb.core.ast.PowerSetType;
+
+import de.bmotionstudio.gef.editor.eventb.EventBHelper;
+import de.bmotionstudio.gef.editor.eventb.MachineContentObject;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.observer.Observer;
+import de.bmotionstudio.gef.editor.observer.ObserverWizard;
+import de.bmotionstudio.gef.editor.observer.TableObserver;
+
+public class WizardTableObserver extends ObserverWizard {
+
+	private class TableObserverPage extends WizardPage {
+
+		private Text txtExpression;
+		private Text txtPredicate;
+		private Button cbOverrideCells;
+		private Button cbKeepHeader;
+
+		public Text getTxtExpression() {
+			return txtExpression;
+		}
+
+		protected TableObserverPage(final String pageName) {
+			super(pageName);
+		}
+
+		public void createControl(final Composite parent) {
+
+			final DataBindingContext dbc = new DataBindingContext();
+
+			parent.setLayout(new GridLayout(1, true));
+
+			Group group = new Group(parent, SWT.None);
+			group.setText("General settings");
+			RowLayout rowLayout = new RowLayout();
+			rowLayout.marginLeft = 10;
+			rowLayout.marginTop = 10;
+			rowLayout.marginBottom = 10;
+			group.setLayout(rowLayout);
+			group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+			cbOverrideCells = new Button(group, SWT.CHECK);
+			cbOverrideCells.setText("Override cells");
+
+			cbKeepHeader = new Button(group, SWT.CHECK);
+			cbKeepHeader.setText("Keep header");
+
+			Group container = new Group(parent, SWT.None);
+			container.setText("Formal model");
+			container.setLayout(new GridLayout(2, false));
+			container.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+			Composite conLeft = new Composite(container, SWT.NONE);
+			conLeft.setLayoutData(new GridData(GridData.FILL_BOTH));
+			conLeft.setLayout(new GridLayout(2, false));
+
+			Label lb = new Label(conLeft, SWT.NONE);
+			lb.setText("Predicate:");
+
+			txtPredicate = new Text(conLeft, SWT.BORDER);
+			txtPredicate.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			txtPredicate.setFont(new Font(Display.getDefault(), new FontData(
+					"Arial", 10, SWT.NONE)));
+
+			lb = new Label(conLeft, SWT.NONE);
+			lb.setText("Expression:");
+			lb.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+
+			txtExpression = new Text(conLeft, SWT.BORDER | SWT.MULTI
+					| SWT.WRAP);
+			txtExpression.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+			Composite conRight = new Composite(container, SWT.NONE);
+
+			GridData gData = new GridData(GridData.FILL_VERTICAL);
+			gData.widthHint = 125;
+
+			conRight.setLayoutData(gData);
+			conRight.setLayout(new GridLayout(1, false));
+
+			lb = new Label(conRight, SWT.WRAP);
+			lb.setText("Power sets:");
+			lb.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+
+			ArrayList<String> relationList = new ArrayList<String>();
+			
+			java.util.List<MachineContentObject> constants = EventBHelper
+					.getConstants(getBControl().getVisualization());
+			for (MachineContentObject mobj : constants) {
+				if (mobj.getType() instanceof PowerSetType) {
+					relationList.add(mobj.getLabel());
+				}
+			}
+
+			java.util.List<MachineContentObject> variables = EventBHelper
+					.getVariables(getBControl().getVisualization());
+			for (MachineContentObject mobj : variables) {
+				if (mobj.getType() instanceof PowerSetType) {
+					relationList.add(mobj.getLabel());
+				}
+			}
+
+			final List list = new List(conRight, SWT.SINGLE | SWT.BORDER
+					| SWT.V_SCROLL);
+			list.setLayoutData(new GridData(GridData.FILL_BOTH));
+			list.setItems(relationList.toArray(new String[relationList.size()]));
+
+			list.addMouseListener(new MouseAdapter() {
+				public void mouseDoubleClick(MouseEvent e) {
+					String[] selection = list.getSelection();
+					if (selection.length > 0)
+						txtExpression.setText(txtExpression.getText() + " "
+								+ selection[0]);
+				}
+			});
+			initBindings(dbc);
+
+			setControl(conLeft);
+
+		}
+
+		private void initBindings(DataBindingContext dbc) {
+
+			dbc.bindValue(SWTObservables.observeText(txtPredicate, SWT.Modify),
+					BeansObservables.observeValue(
+							(TableObserver) getObserver(), "predicate"));
+
+			dbc.bindValue(
+					SWTObservables.observeText(txtExpression, SWT.Modify),
+					BeansObservables.observeValue(
+							(TableObserver) getObserver(), "expression"));
+
+			dbc.bindValue(SWTObservables.observeSelection(cbOverrideCells),
+					BeansObservables.observeValue(
+							(TableObserver) getObserver(), "overrideCells"));
+
+			dbc.bindValue(SWTObservables.observeSelection(cbKeepHeader),
+					BeansObservables.observeValue(
+							(TableObserver) getObserver(), "keepHeader"));
+
+		}
+
+	}
+
+	public WizardTableObserver(BControl bcontrol,
+			Observer bobserver) {
+		super(bcontrol, bobserver);
+		addPage(new TableObserverPage("TableObserverPage"));
+	}
+
+	@Override
+	protected Boolean prepareToFinish() {
+
+		TableObserverPage page = (TableObserverPage) getPage("TableObserverPage");
+
+		String errorStr = "";
+
+		if (page.getTxtExpression().getText().length() == 0)
+			errorStr += "Please enter an expression.\n";
+
+		if (page.getErrorMessage() != null)
+			errorStr += "Please check the syntax/parser error.\n";
+
+		if (errorStr.length() > 0) {
+			MessageDialog.openError(Display.getDefault().getActiveShell(),
+					"An Error occured", errorStr);
+			return false;
+		}
+
+		return true;
+
+	}
+
+	@Override
+	public Point getSize() {
+		return new Point(600, 500);
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/AppAbstractTreeEditPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/AppAbstractTreeEditPart.java
deleted file mode 100644
index 598d5f6bef4f92f5d7c2d4c703bf311331ed999d..0000000000000000000000000000000000000000
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/AppAbstractTreeEditPart.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/** 
- * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
- * Heinrich Heine Universitaet Duesseldorf
- * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
- * */
-
-package de.bmotionstudio.gef.editor.part;
-
-import java.beans.PropertyChangeListener;
-
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.editparts.AbstractTreeEditPart;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-import de.bmotionstudio.gef.editor.editpolicy.AppDeletePolicy;
-import de.bmotionstudio.gef.editor.model.BControl;
-
-public abstract class AppAbstractTreeEditPart extends AbstractTreeEditPart
-		implements PropertyChangeListener {
-
-	public void activate() {
-		if (!isActive()) {
-			super.activate();
-			((BControl) getModel()).addPropertyChangeListener(this);
-		}
-	}
-
-	public void deactivate() {
-		if (isActive()) {
-			super.deactivate();
-			((BControl) getModel()).removePropertyChangeListener(this);
-		}
-	}
-
-	@Override
-	public void performRequest(Request req) {
-		if (req.getType().equals(RequestConstants.REQ_OPEN)) {
-			try {
-				IWorkbenchPage page = PlatformUI.getWorkbench()
-						.getActiveWorkbenchWindow().getActivePage();
-				page.showView(IPageLayout.ID_PROP_SHEET);
-			} catch (PartInitException e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-	@Override
-	protected void createEditPolicies() {
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, new AppDeletePolicy());
-	}
-
-}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/AppTreeEditPartFactory.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/AppTreeEditPartFactory.java
deleted file mode 100644
index 42aa2bc89431930956047e78a6a921b167517199..0000000000000000000000000000000000000000
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/AppTreeEditPartFactory.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/** 
- * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
- * Heinrich Heine Universitaet Duesseldorf
- * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
- * */
-
-package de.bmotionstudio.gef.editor.part;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-
-import de.bmotionstudio.gef.editor.model.BControl;
-
-public class AppTreeEditPartFactory implements EditPartFactory {
-
-	public EditPart createEditPart(EditPart context, Object model) {
-		BControlTreeEditPart part = null;
-		if (model instanceof BControl) {
-			part = new BControlTreeEditPart();
-			if (part != null)
-				part.setModel(model);
-		}
-		return part;
-	}
-
-}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BButtonPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BButtonPart.java
index 9b8a4ab84fba92da177f7b4fec5002e82b208c26..781ad5c6f40714bbc812c41b98dfe55be6453682 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BButtonPart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BButtonPart.java
@@ -17,14 +17,14 @@ import org.eclipse.swt.graphics.RGB;
 import de.bmotionstudio.gef.editor.AttributeConstants;
 import de.bmotionstudio.gef.editor.edit.TextCellEditorLocator;
 import de.bmotionstudio.gef.editor.edit.TextEditManager;
-import de.bmotionstudio.gef.editor.editpolicy.AppDeletePolicy;
-import de.bmotionstudio.gef.editor.editpolicy.BMotionNodeEditPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSConnectionEditPolicy;
 import de.bmotionstudio.gef.editor.editpolicy.CustomDirectEditPolicy;
 import de.bmotionstudio.gef.editor.editpolicy.RenamePolicy;
 import de.bmotionstudio.gef.editor.figure.ButtonFigure;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class BButtonPart extends AppAbstractEditPart {
+public class BButtonPart extends BMSAbstractEditPart {
 
 	@Override
 	public void refreshEditFigure(IFigure figure, BControl model,
@@ -71,12 +71,12 @@ public class BButtonPart extends AppAbstractEditPart {
 
 	@Override
 	protected void prepareEditPolicies() {
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, new AppDeletePolicy());
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
 		installEditPolicy(EditPolicy.NODE_ROLE, new RenamePolicy());
 		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
 				new CustomDirectEditPolicy());
 		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new BMotionNodeEditPolicy());
+				new BMSConnectionEditPolicy());
 	}
 
 	@Override
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BCheckboxPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BCheckboxPart.java
index 21ca996cdbc9996cdb904bd4c51f51bc2ce956bf..61425dc3229c4d23b027f618197cfe1cc4c36270 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BCheckboxPart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BCheckboxPart.java
@@ -23,15 +23,15 @@ import de.bmotionstudio.gef.editor.BMotionStudioImage;
 import de.bmotionstudio.gef.editor.EditorImageRegistry;
 import de.bmotionstudio.gef.editor.edit.TextCellEditorLocator;
 import de.bmotionstudio.gef.editor.edit.TextEditManager;
-import de.bmotionstudio.gef.editor.editpolicy.AppDeletePolicy;
-import de.bmotionstudio.gef.editor.editpolicy.BMotionNodeEditPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSConnectionEditPolicy;
 import de.bmotionstudio.gef.editor.editpolicy.CustomDirectEditPolicy;
 import de.bmotionstudio.gef.editor.editpolicy.RenamePolicy;
 import de.bmotionstudio.gef.editor.figure.AbstractBMotionFigure;
 import de.bmotionstudio.gef.editor.figure.CheckboxFigure;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class BCheckboxPart extends AppAbstractEditPart {
+public class BCheckboxPart extends BMSAbstractEditPart {
 
 	private ChangeListener changeListener = new ChangeListener() {
 		@Override
@@ -125,12 +125,12 @@ public class BCheckboxPart extends AppAbstractEditPart {
 
 	@Override
 	protected void prepareEditPolicies() {
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, new AppDeletePolicy());
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
 		installEditPolicy(EditPolicy.NODE_ROLE, new RenamePolicy());
 		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
 				new CustomDirectEditPolicy());
 		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new BMotionNodeEditPolicy());
+				new BMSConnectionEditPolicy());
 	}
 
 	@Override
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BCompositePart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BCompositePart.java
index 1e363ea954bbba36b1c44bdcbfcda3c26a06294d..54578cb3d311cd23a44cc49fd043fe89501c30fd 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BCompositePart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BCompositePart.java
@@ -26,9 +26,9 @@ import org.eclipse.swt.graphics.RGB;
 import org.eclipse.swt.widgets.Display;
 
 import de.bmotionstudio.gef.editor.AttributeConstants;
-import de.bmotionstudio.gef.editor.editpolicy.AppDeletePolicy;
-import de.bmotionstudio.gef.editor.editpolicy.AppEditLayoutPolicy;
-import de.bmotionstudio.gef.editor.editpolicy.BMotionNodeEditPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSEditLayoutPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSConnectionEditPolicy;
 import de.bmotionstudio.gef.editor.editpolicy.ChangeAttributePolicy;
 import de.bmotionstudio.gef.editor.figure.CompositeFigure;
 import de.bmotionstudio.gef.editor.library.AbstractLibraryCommand;
@@ -37,7 +37,7 @@ import de.bmotionstudio.gef.editor.library.LibraryImageCommand;
 import de.bmotionstudio.gef.editor.library.LibraryVariableCommand;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class BCompositePart extends AppAbstractEditPart {
+public class BCompositePart extends BMSAbstractEditPart {
 
 	@Override
 	protected IFigure createEditFigure() {
@@ -130,12 +130,12 @@ public class BCompositePart extends AppAbstractEditPart {
 
 	@Override
 	protected void prepareEditPolicies() {
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, new AppDeletePolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, new AppEditLayoutPolicy());
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
+		installEditPolicy(EditPolicy.LAYOUT_ROLE, new BMSEditLayoutPolicy());
 		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
 		installEditPolicy(EditPolicy.CONTAINER_ROLE, new SnapFeedbackPolicy());
 		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new BMotionNodeEditPolicy());
+				new BMSConnectionEditPolicy());
 		installEditPolicy(ChangeAttributePolicy.CHANGE_ATTRIBUTE_POLICY,
 				new ChangeAttributePolicy());
 	}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BConnectionEditPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BConnectionEditPart.java
index f8cea36545181980c4cc64e3c6beb9fb98cee255..3f09133d67eda64a8a70af64ed9d537c35c79cd0 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BConnectionEditPart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BConnectionEditPart.java
@@ -13,6 +13,7 @@ import java.util.List;
 import org.eclipse.draw2d.ChopboxAnchor;
 import org.eclipse.draw2d.Connection;
 import org.eclipse.draw2d.ConnectionAnchor;
+import org.eclipse.draw2d.Graphics;
 import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.Label;
 import org.eclipse.draw2d.MidpointLocator;
@@ -21,6 +22,7 @@ import org.eclipse.draw2d.PolylineConnection;
 import org.eclipse.draw2d.PositionConstants;
 import org.eclipse.draw2d.XYAnchor;
 import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
 import org.eclipse.gef.AccessibleAnchorProvider;
 import org.eclipse.gef.ConnectionEditPart;
 import org.eclipse.gef.DragTracker;
@@ -42,20 +44,23 @@ import org.eclipse.swt.graphics.RGB;
 import org.eclipse.swt.widgets.Display;
 
 import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.BMotionStudioImage;
+import de.bmotionstudio.gef.editor.EditorImageRegistry;
 import de.bmotionstudio.gef.editor.attribute.BAttributeConnectionSourceDecoration;
 import de.bmotionstudio.gef.editor.command.ConnectionDeleteCommand;
+import de.bmotionstudio.gef.editor.figure.AbstractBMotionFigure;
 import de.bmotionstudio.gef.editor.model.BConnection;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class BConnectionEditPart extends AppAbstractEditPart implements
+public class BConnectionEditPart extends BMSAbstractEditPart implements
 		ConnectionEditPart, LayerConstants {
 
 	protected Color foregroundColor;
 	private Label conLabel;
 
-	private static final ConnectionAnchor DEFAULT_SOURCE_ANCHOR = new XYAnchor(
+	public static final ConnectionAnchor DEFAULT_SOURCE_ANCHOR = new XYAnchor(
 			new Point(10, 10));
-	private static final ConnectionAnchor DEFAULT_TARGET_ANCHOR = new XYAnchor(
+	public static final ConnectionAnchor DEFAULT_TARGET_ANCHOR = new XYAnchor(
 			new Point(100, 100));
 
 	/*
@@ -89,7 +94,34 @@ public class BConnectionEditPart extends AppAbstractEditPart implements
 
 	@Override
 	protected IFigure createEditFigure() {
-		PolylineConnection connection = new PolylineConnection();
+		PolylineConnection connection = new PolylineConnection() {
+
+			private boolean visible;
+
+			@Override
+			public void paint(Graphics g) {
+				if (!visible && !isRunning()) {
+					Rectangle clientArea = getClientArea();
+					g.drawImage(
+							BMotionStudioImage
+									.getImage(EditorImageRegistry.IMG_ICON_CONTROL_HIDDEN),
+							clientArea.x, clientArea.y);
+					g.setAlpha(AbstractBMotionFigure.HIDDEN_ALPHA_VALUE);
+				}
+				super.paint(g);
+			}
+
+			@Override
+			public void setVisible(boolean visible) {
+				if (!isRunning()) {
+					this.visible = visible;
+					repaint();
+				} else {
+					super.setVisible(visible);
+				}
+			}
+
+		};
 		conLabel = new Label();
 		MidpointLocator locator = new MidpointLocator(connection, 0);
 		locator.setRelativePosition(PositionConstants.NORTH);
@@ -112,6 +144,10 @@ public class BConnectionEditPart extends AppAbstractEditPart implements
 			((PolylineConnection) getFigure()).setLineStyle((Integer
 					.valueOf(value.toString()) + 1));
 
+		if (aID.equals(AttributeConstants.ATTRIBUTE_VISIBLE))
+			((PolylineConnection) getFigure()).setVisible(Boolean.valueOf(value
+					.toString()));
+
 		if (aID.equals(AttributeConstants.ATTRIBUTE_FOREGROUND_COLOR)) {
 			if (foregroundColor != null)
 				foregroundColor.dispose();
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BControlTreeEditPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BControlTreeEditPart.java
index 74522c772573b325aa2e4779a577f256327334f1..6adcbe067053f1a1f209c8e7887019dec0cbef8f 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BControlTreeEditPart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BControlTreeEditPart.java
@@ -7,39 +7,31 @@
 package de.bmotionstudio.gef.editor.part;
 
 import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
+
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
 
 import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.BMotionStudioImage;
+import de.bmotionstudio.gef.editor.EditorImageRegistry;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
 import de.bmotionstudio.gef.editor.model.BConnection;
 import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.model.ObserverRootVirtualTreeNode;
 import de.bmotionstudio.gef.editor.model.Visualization;
+import de.bmotionstudio.gef.editor.observer.IObserverListener;
+import de.bmotionstudio.gef.editor.observer.Observer;
 
-public class BControlTreeEditPart extends AppAbstractTreeEditPart {
-
-	@Override
-	protected List<BControl> getModelChildren() {
-		Set<BControl> toShowElements = new HashSet<BControl>();
-		for (BControl control : ((BControl) getModel()).getChildrenArray()) {
-			if (control.showInOutlineView())
-				toShowElements.add(control);
-			List<BConnection> sourceConnections = control
-					.getSourceConnections();
-			for (BConnection con : sourceConnections) {
-				if (con.showInOutlineView())
-					toShowElements.add(con);
-			}
-			List<BConnection> targetConnections = control
-					.getTargetConnections();
-			for (BConnection con : targetConnections) {
-				if (con.showInOutlineView())
-					toShowElements.add(con);
-			}
-		}
-		return new ArrayList<BControl>(toShowElements);
-	}
+public class BControlTreeEditPart extends BMSAbstractTreeEditPart implements
+		PropertyChangeListener, IObserverListener {
 
 	public void propertyChange(final PropertyChangeEvent evt) {
 		if (evt.getPropertyName().equals(BControl.PROPERTY_ADD)
@@ -49,14 +41,105 @@ public class BControlTreeEditPart extends AppAbstractTreeEditPart {
 		refreshVisuals();
 	}
 
+	@Override
+	protected void createEditPolicies() {
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
+	}
+
+	@Override
+	protected List<Object> getModelChildren() {
+
+		List<Object> toShowElements = new ArrayList<Object>();
+
+		if (getModel() instanceof BControl) {
+
+			BControl c = (BControl) getModel();
+
+			for (BControl control : c.getChildrenArray()) {
+				if (control.showInOutlineView())
+					toShowElements.add(control);
+				List<BConnection> sourceConnections = control
+						.getSourceConnections();
+				for (BConnection con : sourceConnections) {
+					if (con.showInOutlineView()
+							&& !toShowElements.contains(con))
+						toShowElements.add(con);
+				}
+				List<BConnection> targetConnections = control
+						.getTargetConnections();
+				for (BConnection con : targetConnections) {
+					if (con.showInOutlineView()
+							&& !toShowElements.contains(con))
+						toShowElements.add(con);
+				}
+			}
+
+			if (!(getModel() instanceof Visualization))
+				toShowElements.add(new ObserverRootVirtualTreeNode(c));
+
+		}
+
+		return toShowElements;
+
+	}
+
+	public void activate() {
+		if (!isActive()) {
+			super.activate();
+			((BControl) getModel()).addPropertyChangeListener(this);
+			((BControl) getModel()).addObserverListener(this);
+		}
+	}
+
+	public void deactivate() {
+		if (isActive()) {
+			super.deactivate();
+			((BControl) getModel()).removePropertyChangeListener(this);
+			((BControl) getModel()).removeObserverListener(this);
+		}
+	}
+
 	@Override
 	public void refreshVisuals() {
-		BControl bcontrol = (BControl) getModel();
-		if (!(bcontrol instanceof Visualization)) {
-			setWidgetText(bcontrol.getAttributeValue(
-					AttributeConstants.ATTRIBUTE_ID).toString());
-			setWidgetImage(bcontrol.getIcon());
+
+		Object model = getModel();
+
+		if (model instanceof BControl) {
+			BControl bcontrol = (BControl) model;
+			if (!(bcontrol instanceof Visualization)) {
+				setWidgetText(bcontrol.getAttributeValue(
+						AttributeConstants.ATTRIBUTE_ID).toString());
+				setWidgetImage(bcontrol.getIcon());
+			}
+		} else if (model instanceof Observer) {
+			setWidgetText(((Observer) model).getName());
+			setWidgetImage(BMotionStudioImage
+					.getImage(EditorImageRegistry.IMG_ICON_OBSERVER));
+		}
+
+	}
+
+	@Override
+	public void performRequest(Request req) {
+		if (req.getType().equals(RequestConstants.REQ_OPEN)) {
+			try {
+				IWorkbenchPage page = PlatformUI.getWorkbench()
+						.getActiveWorkbenchWindow().getActivePage();
+				page.showView(IPageLayout.ID_PROP_SHEET);
+			} catch (PartInitException e) {
+				e.printStackTrace();
+			}
 		}
 	}
 
+	@Override
+	public void addedObserver(BControl control, Observer observer) {
+		refreshChildren();
+	}
+
+	@Override
+	public void removedObserver(BControl control) {
+		refreshChildren();
+	}
+
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BImagePart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BImagePart.java
index 33d5600a776b099eb7f9d4a10d607fbcce9fccc9..d1e12738ca1ab603449c3f0cbe70d18b44d2c51f 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BImagePart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BImagePart.java
@@ -13,8 +13,8 @@ import org.eclipse.draw2d.IFigure;
 import org.eclipse.gef.EditPolicy;
 
 import de.bmotionstudio.gef.editor.AttributeConstants;
-import de.bmotionstudio.gef.editor.editpolicy.AppDeletePolicy;
-import de.bmotionstudio.gef.editor.editpolicy.BMotionNodeEditPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSConnectionEditPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
 import de.bmotionstudio.gef.editor.editpolicy.ChangeAttributePolicy;
 import de.bmotionstudio.gef.editor.figure.BMSImageFigure;
 import de.bmotionstudio.gef.editor.library.AbstractLibraryCommand;
@@ -22,7 +22,7 @@ import de.bmotionstudio.gef.editor.library.AttributeRequest;
 import de.bmotionstudio.gef.editor.library.LibraryImageCommand;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class BImagePart extends AppAbstractEditPart {
+public class BImagePart extends BMSAbstractEditPart {
 
 	@Override
 	public void refreshEditFigure(IFigure figure, BControl model,
@@ -47,6 +47,10 @@ public class BImagePart extends AppAbstractEditPart {
 			((BMSImageFigure) figure).setVisible(Boolean.valueOf(value
 					.toString()));
 
+		if (aID.equals(AttributeConstants.ATTRIBUTE_ALPHA))
+			((BMSImageFigure) figure)
+					.setAlpha(Integer.valueOf(value.toString()));
+
 	}
 
 	@Override
@@ -67,9 +71,9 @@ public class BImagePart extends AppAbstractEditPart {
 
 	@Override
 	protected void prepareEditPolicies() {
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, new AppDeletePolicy());
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
 		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new BMotionNodeEditPolicy());
+				new BMSConnectionEditPolicy());
 		installEditPolicy(ChangeAttributePolicy.CHANGE_ATTRIBUTE_POLICY,
 				new ChangeAttributePolicy());
 	}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/AppAbstractEditPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSAbstractEditPart.java
similarity index 90%
rename from de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/AppAbstractEditPart.java
rename to de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSAbstractEditPart.java
index 91a5bc5ac8126ea58d40898cac1c77e759e5f432..90de631cfaa0f809698aefb6057e6922cfab1b02 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/AppAbstractEditPart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSAbstractEditPart.java
@@ -23,6 +23,7 @@ import org.eclipse.draw2d.ConnectionAnchor;
 import org.eclipse.draw2d.Figure;
 import org.eclipse.draw2d.FlowLayout;
 import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Rectangle;
 import org.eclipse.gef.ConnectionEditPart;
 import org.eclipse.gef.NodeEditPart;
 import org.eclipse.gef.Request;
@@ -41,13 +42,12 @@ import de.bmotionstudio.gef.editor.attribute.AbstractAttribute;
 import de.bmotionstudio.gef.editor.figure.AbstractBMotionFigure;
 import de.bmotionstudio.gef.editor.library.AbstractLibraryCommand;
 import de.bmotionstudio.gef.editor.library.AttributeRequest;
-import de.bmotionstudio.gef.editor.model.BConnection;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.Visualization;
 import de.bmotionstudio.gef.editor.observer.IObserverListener;
 import de.bmotionstudio.gef.editor.observer.Observer;
 
-public abstract class AppAbstractEditPart extends AbstractGraphicalEditPart
+public abstract class BMSAbstractEditPart extends AbstractGraphicalEditPart
 		implements PropertyChangeListener, IObserverListener, IAdaptable,
 		NodeEditPart {
 
@@ -130,9 +130,12 @@ public abstract class AppAbstractEditPart extends AbstractGraphicalEditPart
 		IFigure toolTipFigure = getToolTip();
 		if (toolTipFigure != null)
 			figure.setToolTip(toolTipFigure);
-		if (!isRunning()) {
-			if (figure instanceof AbstractBMotionFigure) {
-				((AbstractBMotionFigure) figure).setEnabled(false);
+		if (figure instanceof AbstractBMotionFigure) {
+			AbstractBMotionFigure bmsFigure = (AbstractBMotionFigure) figure;
+			Boolean isRunning = isRunning();
+			bmsFigure.setRunning(isRunning);
+			if (!isRunning) {
+				bmsFigure.setEnabled(false);
 			}
 		}
 		return figure;
@@ -171,10 +174,10 @@ public abstract class AppAbstractEditPart extends AbstractGraphicalEditPart
 
 	protected void refreshEditLayout(IFigure figure, BControl control) {
 		if (!(control instanceof Visualization)) {
-			if (getFigure().getParent() != null)
-				getFigure().getParent().setConstraint((IFigure) figure,
-						control.getLayout());
-			getFigure().setPreferredSize(control.getDimension());
+			figure.setPreferredSize(control.getDimension());
+			if (figure.getParent() != null)
+				figure.getParent().setConstraint(figure,
+						new Rectangle(control.getLayout()));
 		}
 	}
 
@@ -279,7 +282,7 @@ public abstract class AppAbstractEditPart extends AbstractGraphicalEditPart
 	 * org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelSourceConnections
 	 * ()
 	 */
-	protected List<BConnection> getModelSourceConnections() {
+	protected List<?> getModelSourceConnections() {
 		return getCastedModel().getSourceConnections();
 	}
 
@@ -290,7 +293,7 @@ public abstract class AppAbstractEditPart extends AbstractGraphicalEditPart
 	 * org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelTargetConnections
 	 * ()
 	 */
-	protected List<BConnection> getModelTargetConnections() {
+	protected List<?> getModelTargetConnections() {
 		return getCastedModel().getTargetConnections();
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSAbstractTreeEditPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSAbstractTreeEditPart.java
new file mode 100644
index 0000000000000000000000000000000000000000..8c74cbf3ba53659ffa08ebc02633c9b672dfffe2
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSAbstractTreeEditPart.java
@@ -0,0 +1,15 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.part;
+
+import org.eclipse.gef.editparts.AbstractTreeEditPart;
+
+public abstract class BMSAbstractTreeEditPart extends AbstractTreeEditPart {
+
+
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/AppEditPartFactory.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSEditPartFactory.java
similarity index 92%
rename from de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/AppEditPartFactory.java
rename to de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSEditPartFactory.java
index ed44ebee49f3f665eec1254841f206e51380b760..6c8852b5ac991853484358e154e17f135006c0c0 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/AppEditPartFactory.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSEditPartFactory.java
@@ -17,7 +17,7 @@ import de.bmotionstudio.gef.editor.IBControlService;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.Visualization;
 
-public class AppEditPartFactory implements EditPartFactory {
+public class BMSEditPartFactory implements EditPartFactory {
 
 	@Override
 	public EditPart createEditPart(EditPart context, Object model) {
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSTreeEditPartFactory.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSTreeEditPartFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..7744514400fbe32a45c0e522d0a84166d8804f3b
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BMSTreeEditPartFactory.java
@@ -0,0 +1,59 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.part;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartFactory;
+
+import de.bmotionstudio.gef.editor.BMotionEditorPlugin;
+import de.bmotionstudio.gef.editor.IBControlService;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.model.ObserverRootVirtualTreeNode;
+import de.bmotionstudio.gef.editor.model.Visualization;
+import de.bmotionstudio.gef.editor.observer.Observer;
+
+public class BMSTreeEditPartFactory implements EditPartFactory {
+
+	public EditPart createEditPart(EditPart context, Object model) {
+
+		BMSAbstractTreeEditPart part = null;
+
+		if (model instanceof Visualization) {
+			part = new BControlTreeEditPart();
+		}
+		else if (model instanceof BControl) {
+
+			BControl control = (BControl) model;
+
+			try {
+				IConfigurationElement configElement = BMotionEditorPlugin
+						.getControlServices().get(control.getType());
+				if (configElement != null) {
+					IBControlService service = (IBControlService) configElement
+							.createExecutableExtension("service");
+					part = service.createTreeEditPart();
+				}
+			} catch (CoreException e) {
+				e.printStackTrace();
+			}
+
+		} else if (model instanceof Observer) {
+			part = new ObserverTreeEditPart();
+		} else if (model instanceof ObserverRootVirtualTreeNode) {
+			part = new ObserverRootTreeEditpart();
+		}
+
+		if (part != null)
+			part.setModel(model);
+
+		return part;
+
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BRadioButtonPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BRadioButtonPart.java
index f4ad340be62284ad1c6ce9d3a390393c3160e08a..9b0867db7d9d9cea4b5a4dc2a575e1311030b165 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BRadioButtonPart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BRadioButtonPart.java
@@ -24,15 +24,15 @@ import de.bmotionstudio.gef.editor.ButtonGroupHelper;
 import de.bmotionstudio.gef.editor.ImageRegistry;
 import de.bmotionstudio.gef.editor.edit.TextCellEditorLocator;
 import de.bmotionstudio.gef.editor.edit.TextEditManager;
-import de.bmotionstudio.gef.editor.editpolicy.AppDeletePolicy;
-import de.bmotionstudio.gef.editor.editpolicy.BMotionNodeEditPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSConnectionEditPolicy;
 import de.bmotionstudio.gef.editor.editpolicy.CustomDirectEditPolicy;
 import de.bmotionstudio.gef.editor.editpolicy.RenamePolicy;
 import de.bmotionstudio.gef.editor.figure.AbstractBMotionFigure;
 import de.bmotionstudio.gef.editor.figure.RadioButtonFigure;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class BRadioButtonPart extends AppAbstractEditPart {
+public class BRadioButtonPart extends BMSAbstractEditPart {
 
 	private ChangeListener changeListener = new ChangeListener() {
 		@Override
@@ -142,12 +142,12 @@ public class BRadioButtonPart extends AppAbstractEditPart {
 
 	@Override
 	protected void prepareEditPolicies() {
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, new AppDeletePolicy());
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
 		installEditPolicy(EditPolicy.NODE_ROLE, new RenamePolicy());
 		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
 				new CustomDirectEditPolicy());
 		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new BMotionNodeEditPolicy());
+				new BMSConnectionEditPolicy());
 	}
 
 	@Override
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BShapePart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BShapePart.java
index 1ffe72f87ae2e019e9b5e5fb9265e615c88b5596..5e97a73882713c938828717c9839f98b1d6b968c 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BShapePart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BShapePart.java
@@ -17,12 +17,12 @@ import org.eclipse.swt.graphics.RGB;
 import org.eclipse.swt.widgets.Display;
 
 import de.bmotionstudio.gef.editor.AttributeConstants;
-import de.bmotionstudio.gef.editor.editpolicy.AppDeletePolicy;
-import de.bmotionstudio.gef.editor.editpolicy.BMotionNodeEditPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSConnectionEditPolicy;
 import de.bmotionstudio.gef.editor.figure.ShapeFigure;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class BShapePart extends AppAbstractEditPart {
+public class BShapePart extends BMSAbstractEditPart {
 
 	@Override
 	public void refreshEditFigure(IFigure figure, BControl model,
@@ -117,9 +117,9 @@ public class BShapePart extends AppAbstractEditPart {
 
 	@Override
 	protected void prepareEditPolicies() {
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, new AppDeletePolicy());
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
 		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new BMotionNodeEditPolicy());
+				new BMSConnectionEditPolicy());
 	}
 
 	@Override
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTableCellPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTableCellPart.java
index dba8ecf10865c8195fb1d48a36b55ac813c4d0e2..d094275b012e0631d61d65d6e2ebd7d05fd5ff8e 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTableCellPart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTableCellPart.java
@@ -1,3 +1,9 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
 package de.bmotionstudio.gef.editor.part;
 
 import java.beans.PropertyChangeEvent;
@@ -16,7 +22,7 @@ import de.bmotionstudio.gef.editor.editpolicy.RenamePolicy;
 import de.bmotionstudio.gef.editor.figure.TableCellFigure;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class BTableCellPart extends AppAbstractEditPart {
+public class BTableCellPart extends BMSAbstractEditPart {
 
 	@Override
 	protected IFigure createEditFigure() {
@@ -30,6 +36,7 @@ public class BTableCellPart extends AppAbstractEditPart {
 		installEditPolicy(EditPolicy.NODE_ROLE, new RenamePolicy());
 	}
 
+
 	@Override
 	protected void prepareRunPolicies() {
 	}
@@ -41,27 +48,35 @@ public class BTableCellPart extends AppAbstractEditPart {
 		Object value = evt.getNewValue();
 		String aID = evt.getPropertyName();
 
-		if (aID.equals(AttributeConstants.ATTRIBUTE_TEXT)) {
+		if (aID.equals(AttributeConstants.ATTRIBUTE_TEXT))
 			((TableCellFigure) figure).setText(value.toString());
-		}
 
-		if (aID.equals(AttributeConstants.ATTRIBUTE_BACKGROUND_COLOR)) {
+		if (aID.equals(AttributeConstants.ATTRIBUTE_BACKGROUND_COLOR))
 			((TableCellFigure) figure).setBackgroundColor((RGB) value);
-		}
 
-		if (aID.equals(AttributeConstants.ATTRIBUTE_TEXT_COLOR)) {
+		if (aID.equals(AttributeConstants.ATTRIBUTE_TEXT_COLOR))
 			((TableCellFigure) figure).setTextColor((RGB) value);
-		}
 
-		if (aID.equals(AttributeConstants.ATTRIBUTE_FOREGROUND_COLOR)) {
+		if (aID.equals(AttributeConstants.ATTRIBUTE_FOREGROUND_COLOR))
 			((TableCellFigure) figure).setForegroundColor((RGB) value);
-		}
 
 		if (aID.equals(AttributeConstants.ATTRIBUTE_FONT))
 			((TableCellFigure) figure).setFont((value.toString()));
 
 	}
 
+	@Override
+	protected void refreshEditLayout(IFigure figure, BControl control) {
+
+		// Set size of parent column
+		int width = control.getDimension().width;
+		control.getParent().setAttributeValue(
+				AttributeConstants.ATTRIBUTE_WIDTH, width);
+
+		super.refreshEditLayout(figure, control);
+
+	}
+
 	private void performDirectEdit() {
 		new TextEditManager(this, new TextCellEditorLocator(
 				(IFigure) getFigure())).show();
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTableColumnPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTableColumnPart.java
index 49cfccce4221d7aea645ef752e40062d925e844c..d30f65629c49f9bba80a8c2798159b4d82b57b54 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTableColumnPart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTableColumnPart.java
@@ -1,31 +1,47 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
 package de.bmotionstudio.gef.editor.part;
 
 import java.beans.PropertyChangeEvent;
 import java.util.List;
 
 import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
 import org.eclipse.gef.EditPolicy;
 import org.eclipse.swt.graphics.RGB;
 
 import de.bmotionstudio.gef.editor.AttributeConstants;
-import de.bmotionstudio.gef.editor.editpolicy.BMotionNodeEditPolicy;
-import de.bmotionstudio.gef.editor.editpolicy.BMotionStudioFlowEditPolicy;
+import de.bmotionstudio.gef.editor.BMotionStudioImage;
+import de.bmotionstudio.gef.editor.EditorImageRegistry;
+import de.bmotionstudio.gef.editor.editpolicy.BMSConnectionEditPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.TableLayoutEditPolicy;
 import de.bmotionstudio.gef.editor.figure.TableColumnFigure;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class BTableColumnPart extends AppAbstractEditPart {
+public class BTableColumnPart extends BMSAbstractEditPart {
 
 	@Override
 	protected IFigure createEditFigure() {
-		return new TableColumnFigure();
+		TableColumnFigure tableColumnFigure = new TableColumnFigure();
+		Label figure = new Label();
+		tableColumnFigure.add(figure);
+		if (!isRunning()) {
+			figure.setIcon(BMotionStudioImage
+					.getImage(EditorImageRegistry.IMG_ICON_TR_UP));
+		}
+		return tableColumnFigure;
 	}
 
 	@Override
 	protected void prepareEditPolicies() {
 		installEditPolicy(EditPolicy.LAYOUT_ROLE,
-				new BMotionStudioFlowEditPolicy());
+				new TableLayoutEditPolicy());
 		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new BMotionNodeEditPolicy());
+				new BMSConnectionEditPolicy());
 	}
 
 	@Override
@@ -39,40 +55,36 @@ public class BTableColumnPart extends AppAbstractEditPart {
 		Object value = evt.getNewValue();
 		String aID = evt.getPropertyName();
 
-		// if (aID.equals(AttributeConstants.ATTRIBUTE_BACKGROUND_COLOR)) {
-		// for (BControl cell : model.getChildrenArray())
-		// cell.setAttributeValue(
-		// AttributeConstants.ATTRIBUTE_BACKGROUND_COLOR, value);
-		// }
-		//
 		if (aID.equals(AttributeConstants.ATTRIBUTE_FOREGROUND_COLOR)) {
 			((TableColumnFigure) figure).setForegroundColor((RGB) value);
 			for (BControl cell : model.getChildrenArray())
 				cell.setAttributeValue(
 						AttributeConstants.ATTRIBUTE_FOREGROUND_COLOR, value);
 		}
-		//
-		// if (aID.equals(AttributeConstants.ATTRIBUTE_TEXT_COLOR)) {
-		// for (BControl cell : model.getChildrenArray())
-		// cell.setAttributeValue(AttributeConstants.ATTRIBUTE_TEXT_COLOR,
-		// value);
-		// }
-		//
-		// if (aID.equals(AttributeConstants.ATTRIBUTE_FONT)) {
-		// for (BControl cell : model.getChildrenArray())
-		// cell.setAttributeValue(AttributeConstants.ATTRIBUTE_FONT, value);
-		// }
 
 	}
 
 	@Override
 	protected void refreshEditLayout(IFigure figure, BControl control) {
-		if (getParent() instanceof AppAbstractEditPart) {
-			AppAbstractEditPart tablePart = (AppAbstractEditPart) getParent();
+
+		int width = control.getDimension().width;
+
+		// Change width of all cells
+		List<BControl> cells = control.getChildrenArray();
+		for (BControl cell : cells) {
+			cell.setAttributeValue(AttributeConstants.ATTRIBUTE_WIDTH, width,
+					true, true);
+		}
+
+		// Notify parent table about change
+		if (getParent() instanceof BMSAbstractEditPart) {
+			BMSAbstractEditPart tablePart = (BMSAbstractEditPart) getParent();
 			tablePart.refreshEditLayout(tablePart.getFigure(),
 					control.getParent());
 		}
+
 		super.refreshEditLayout(figure, control);
+
 	}
 
 	@Override
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTablePart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTablePart.java
index 78d6bc0d12c7319ffd0c67d1dfdebe50b1fb0fa1..6fdf6a7eea57c54761f442b1cbf0db185bc3067c 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTablePart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTablePart.java
@@ -4,34 +4,44 @@ import java.beans.PropertyChangeEvent;
 import java.util.List;
 
 import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
 import org.eclipse.draw2d.geometry.Rectangle;
 import org.eclipse.gef.EditPolicy;
 import org.eclipse.swt.graphics.RGB;
 
 import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.BMotionStudioImage;
+import de.bmotionstudio.gef.editor.EditorImageRegistry;
 import de.bmotionstudio.gef.editor.command.CreateCommand;
-import de.bmotionstudio.gef.editor.editpolicy.AppDeletePolicy;
-import de.bmotionstudio.gef.editor.editpolicy.BMotionNodeEditPolicy;
-import de.bmotionstudio.gef.editor.editpolicy.BMotionStudioFlowEditPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSConnectionEditPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
+import de.bmotionstudio.gef.editor.editpolicy.TableLayoutEditPolicy;
 import de.bmotionstudio.gef.editor.figure.TableFigure;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.BTableCell;
 import de.bmotionstudio.gef.editor.model.BTableColumn;
 
-public class BTablePart extends AppAbstractEditPart {
+public class BTablePart extends BMSAbstractEditPart {
 
 	@Override
 	protected IFigure createEditFigure() {
-		return new TableFigure();
+		TableFigure tableFigure = new TableFigure();
+		Label figure = new Label();
+		tableFigure.add(figure);
+		if (!isRunning()) {
+			figure.setIcon(BMotionStudioImage
+					.getImage(EditorImageRegistry.IMG_ICON_TR_LEFT));
+		}
+		return tableFigure;
 	}
 
 	@Override
 	protected void prepareEditPolicies() {
 		installEditPolicy(EditPolicy.LAYOUT_ROLE,
-				new BMotionStudioFlowEditPolicy());
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, new AppDeletePolicy());
+				new TableLayoutEditPolicy());
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
 		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new BMotionNodeEditPolicy());
+				new BMSConnectionEditPolicy());
 	}
 
 	@Override
@@ -54,7 +64,9 @@ public class BTablePart extends AppAbstractEditPart {
 		figure.getParent().setConstraint(
 				figure,
 				new Rectangle(control.getLocation().x, control.getLocation().y,
-						width + 1, (rows * 20) + 1));
+						width + 21, (rows * 20) + 15));
+
+		// super.refreshEditLayout(figure, control);
 
 	}
 
@@ -66,6 +78,10 @@ public class BTablePart extends AppAbstractEditPart {
 		Object oldValue = evt.getOldValue();
 		String aID = evt.getPropertyName();
 
+		if (aID.equals(AttributeConstants.ATTRIBUTE_VISIBLE))
+			((TableFigure) figure)
+					.setVisible(Boolean.valueOf(value.toString()));
+
 		if (aID.equals(AttributeConstants.ATTRIBUTE_FOREGROUND_COLOR)) {
 			((TableFigure) figure).setForegroundColor((RGB) value);
 			for (BControl child : model.getChildrenArray())
@@ -93,7 +109,7 @@ public class BTablePart extends AppAbstractEditPart {
 				BTableColumn bTableColumn = new BTableColumn(
 						model.getVisualization());
 				CreateCommand cmd = new CreateCommand(bTableColumn, model);
-				cmd.setLayout(new Rectangle(0, 0, 50, 25));
+				// cmd.setLayout(new Rectangle(0, 0, 50, 40));
 				cmd.execute();
 				Integer numberOfRows = Integer.valueOf(model.getAttributeValue(
 						AttributeConstants.ATTRIBUTE_ROWS).toString());
@@ -125,22 +141,18 @@ public class BTablePart extends AppAbstractEditPart {
 	}
 
 	private void refreshRows(BControl column, int numberOfRows) {
-
 		Integer numberOfCurrentRows = column.getChildrenArray().size();
-
 		if (numberOfRows < numberOfCurrentRows) {
 			for (int i = numberOfCurrentRows - 1; i >= numberOfRows; i--) {
 				column.removeChild(i);
 			}
 		}
-
 		for (int i = numberOfCurrentRows; i < numberOfRows; i++) {
 			CreateCommand cmd = new CreateCommand(new BTableCell(
 					column.getVisualization()), column);
-			cmd.setLayout(new Rectangle(0, 0, 50, 20));
+			cmd.setLayout(new Rectangle(0, 0, column.getDimension().width, 20));
 			cmd.execute();
 		}
-
 	}
 
 	@Override
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTextPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTextPart.java
index 5de397b03f7d9a59b8da669bc3a0256c769d3ef6..a59b89627e53a5def9f9eea44af649a8624450ba 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTextPart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTextPart.java
@@ -18,8 +18,8 @@ import org.eclipse.swt.widgets.Display;
 import de.bmotionstudio.gef.editor.AttributeConstants;
 import de.bmotionstudio.gef.editor.edit.TextCellEditorLocator;
 import de.bmotionstudio.gef.editor.edit.TextEditManager;
-import de.bmotionstudio.gef.editor.editpolicy.AppDeletePolicy;
-import de.bmotionstudio.gef.editor.editpolicy.BMotionNodeEditPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSConnectionEditPolicy;
 import de.bmotionstudio.gef.editor.editpolicy.ChangeAttributePolicy;
 import de.bmotionstudio.gef.editor.editpolicy.CustomDirectEditPolicy;
 import de.bmotionstudio.gef.editor.editpolicy.RenamePolicy;
@@ -29,7 +29,7 @@ import de.bmotionstudio.gef.editor.library.AttributeRequest;
 import de.bmotionstudio.gef.editor.library.LibraryVariableCommand;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class BTextPart extends AppAbstractEditPart {
+public class BTextPart extends BMSAbstractEditPart {
 
 	@Override
 	public void refreshEditFigure(IFigure figure, BControl model,
@@ -97,12 +97,12 @@ public class BTextPart extends AppAbstractEditPart {
 
 	@Override
 	protected void prepareEditPolicies() {
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, new AppDeletePolicy());
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
 		installEditPolicy(EditPolicy.NODE_ROLE, new RenamePolicy());
 		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
 				new CustomDirectEditPolicy());
 		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new BMotionNodeEditPolicy());
+				new BMSConnectionEditPolicy());
 		installEditPolicy(ChangeAttributePolicy.CHANGE_ATTRIBUTE_POLICY,
 				new ChangeAttributePolicy());
 	}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTextfieldPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTextfieldPart.java
index 424e6da84bae178d6f899f815bec15bea6d630fe..4fd7368bc17af1fe9cb6057adfd98725c9a4acf8 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTextfieldPart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/BTextfieldPart.java
@@ -19,15 +19,15 @@ import org.eclipse.gef.RequestConstants;
 import de.bmotionstudio.gef.editor.AttributeConstants;
 import de.bmotionstudio.gef.editor.edit.TextCellEditorLocator;
 import de.bmotionstudio.gef.editor.edit.TextEditManager;
-import de.bmotionstudio.gef.editor.editpolicy.AppDeletePolicy;
-import de.bmotionstudio.gef.editor.editpolicy.BMotionNodeEditPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSConnectionEditPolicy;
 import de.bmotionstudio.gef.editor.editpolicy.CustomDirectEditPolicy;
 import de.bmotionstudio.gef.editor.editpolicy.RenamePolicy;
 import de.bmotionstudio.gef.editor.figure.AbstractBMotionFigure;
 import de.bmotionstudio.gef.editor.figure.TextfieldFigure;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class BTextfieldPart extends AppAbstractEditPart {
+public class BTextfieldPart extends BMSAbstractEditPart {
 
 	private TextEditManager textEditManager;
 
@@ -111,12 +111,12 @@ public class BTextfieldPart extends AppAbstractEditPart {
 
 	@Override
 	protected void prepareEditPolicies() {
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, new AppDeletePolicy());
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
 		installEditPolicy(EditPolicy.NODE_ROLE, new RenamePolicy());
 		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
 				new CustomDirectEditPolicy());
 		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new BMotionNodeEditPolicy());
+				new BMSConnectionEditPolicy());
 	}
 
 	@Override
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/LightPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/LightPart.java
new file mode 100644
index 0000000000000000000000000000000000000000..4cc06fcd35e328729d3e80993d3dba88bc258127
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/LightPart.java
@@ -0,0 +1,48 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+package de.bmotionstudio.gef.editor.part;
+
+import java.beans.PropertyChangeEvent;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.swt.graphics.RGB;
+
+import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.figure.LightFigure;
+import de.bmotionstudio.gef.editor.model.BControl;
+
+public class LightPart extends BMSAbstractEditPart {
+
+	@Override
+	protected IFigure createEditFigure() {
+		return new LightFigure();
+	}
+
+	@Override
+	public void refreshEditFigure(IFigure figure, BControl model,
+			PropertyChangeEvent evt) {
+
+		Object value = evt.getNewValue();
+		String aID = evt.getPropertyName();
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_BACKGROUND_COLOR))
+			((LightFigure) figure).setBackgroundColor((RGB) value);
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_VISIBLE))
+			((LightFigure) figure)
+					.setVisible(Boolean.valueOf(value.toString()));
+
+	}
+
+	@Override
+	protected void prepareEditPolicies() {
+	}
+
+	@Override
+	protected void prepareRunPolicies() {
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/ObserverRootTreeEditpart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/ObserverRootTreeEditpart.java
new file mode 100644
index 0000000000000000000000000000000000000000..fd70efd9d5462ae343e734f5806cd167851ff937
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/ObserverRootTreeEditpart.java
@@ -0,0 +1,61 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.part;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import de.bmotionstudio.gef.editor.BMotionStudioImage;
+import de.bmotionstudio.gef.editor.EditorImageRegistry;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.model.ObserverRootVirtualTreeNode;
+import de.bmotionstudio.gef.editor.observer.IObserverListener;
+import de.bmotionstudio.gef.editor.observer.Observer;
+
+public class ObserverRootTreeEditpart extends BMSAbstractTreeEditPart implements
+		IObserverListener {
+
+	public void activate() {
+		if (!isActive()) {
+			super.activate();
+			((ObserverRootVirtualTreeNode) getModel()).getControl()
+					.addObserverListener(this);
+		}
+	}
+
+	public void deactivate() {
+		if (isActive()) {
+			super.deactivate();
+			((ObserverRootVirtualTreeNode) getModel()).getControl()
+					.removeObserverListener(this);
+		}
+	}
+
+	@Override
+	protected List<Object> getModelChildren() {
+		ObserverRootVirtualTreeNode model = (ObserverRootVirtualTreeNode) getModel();
+		return new ArrayList<Object>(model.getObserver());
+	}
+
+	@Override
+	public void refreshVisuals() {
+		setWidgetText("Observer");
+		setWidgetImage(BMotionStudioImage
+				.getImage(EditorImageRegistry.IMG_ICON_OBSERVER));
+	}
+
+	@Override
+	public void addedObserver(BControl control, Observer observer) {
+		refreshChildren();
+	}
+
+	@Override
+	public void removedObserver(BControl control) {
+		refreshChildren();
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/ObserverTreeEditPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/ObserverTreeEditPart.java
new file mode 100644
index 0000000000000000000000000000000000000000..1c4105be5172b24af2e1e3e0ec455b900d152696
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/ObserverTreeEditPart.java
@@ -0,0 +1,23 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.part;
+
+import de.bmotionstudio.gef.editor.BMotionStudioImage;
+import de.bmotionstudio.gef.editor.EditorImageRegistry;
+import de.bmotionstudio.gef.editor.observer.Observer;
+
+public class ObserverTreeEditPart extends BMSAbstractTreeEditPart {
+
+	@Override
+	public void refreshVisuals() {
+		Observer o = (Observer) getModel();
+		setWidgetText(o.getName());
+		setWidgetImage(BMotionStudioImage
+				.getImage(EditorImageRegistry.IMG_ICON_OBSERVER));
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/SignalPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/SignalPart.java
new file mode 100644
index 0000000000000000000000000000000000000000..0a0560acabb64bd8b8e7130e6055082731fd930f
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/SignalPart.java
@@ -0,0 +1,115 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+package de.bmotionstudio.gef.editor.part;
+
+import java.beans.PropertyChangeEvent;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPolicy;
+
+import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.command.CreateCommand;
+import de.bmotionstudio.gef.editor.editpolicy.BMSConnectionEditPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
+import de.bmotionstudio.gef.editor.editpolicy.SignalLayoutEditPolicy;
+import de.bmotionstudio.gef.editor.figure.SignalFigure;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.model.Light;
+
+public class SignalPart extends BMSAbstractEditPart {
+
+	@Override
+	protected IFigure createEditFigure() {
+		return new SignalFigure();
+	}
+
+	@Override
+	protected void refreshEditLayout(IFigure figure, BControl control) {
+
+		int lights = Integer.valueOf(control.getAttributeValue(
+				AttributeConstants.ATTRIBUTE_LIGHTS).toString());
+
+		// Set the correct size of the table
+		figure.getParent().setConstraint(
+				figure,
+				new Rectangle(control.getLocation().x, control.getLocation().y,
+						control.getDimension().width, lights * 12 + 30));
+
+	}
+
+	@Override
+	public void refreshEditFigure(IFigure figure, BControl model,
+			PropertyChangeEvent evt) {
+
+		Object value = evt.getNewValue();
+		Object oldValue = evt.getOldValue();
+		String aID = evt.getPropertyName();
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_LIGHTS)) {
+
+			if (oldValue == null || value.equals(oldValue))
+				return;
+
+			// Create lights
+			Integer numberOfLights = Integer.valueOf(value.toString());
+			Integer numberOfCurrentLights = Integer
+					.valueOf(oldValue.toString());
+
+			if (numberOfLights < numberOfCurrentLights) {
+				for (int i = numberOfCurrentLights - 1; i >= numberOfLights; i--) {
+					model.removeChild(i);
+				}
+			}
+
+			for (int i = numberOfCurrentLights; i < numberOfLights; i++) {
+				Light light = new Light(model.getVisualization());
+				CreateCommand cmd = new CreateCommand(light, model);
+				cmd.execute();
+			}
+
+			refreshEditLayout(figure, model);
+
+		}
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_LABEL)) {
+			((SignalFigure) getFigure()).setLabel(value.toString());
+		}
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_TRACK_DIRECTION)) {
+			int direction = Integer.valueOf(value.toString());
+			if (direction == 1) {
+				((SignalFigure) getFigure()).setTrackDirection(false);
+			} else {
+				((SignalFigure) getFigure()).setTrackDirection(true);
+			}
+		}
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_VISIBLE))
+			((SignalFigure) figure)
+					.setVisible(Boolean.valueOf(value.toString()));
+
+	}
+
+	@Override
+	protected void prepareEditPolicies() {
+		installEditPolicy(EditPolicy.LAYOUT_ROLE, new SignalLayoutEditPolicy());
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
+		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
+				new BMSConnectionEditPolicy());
+	}
+
+	@Override
+	protected void prepareRunPolicies() {
+	}
+
+	@Override
+	public List<BControl> getModelChildren() {
+		return ((BControl) getModel()).getChildrenArray();
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/SwitchPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/SwitchPart.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9473deecd38bc09de24e1bd525567323d31795e
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/SwitchPart.java
@@ -0,0 +1,163 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+package de.bmotionstudio.gef.editor.part;
+
+import java.beans.PropertyChangeEvent;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.gef.EditPolicy;
+
+import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.attribute.AttributeSwitchDirection;
+import de.bmotionstudio.gef.editor.attribute.AttributeSwitchPosition;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
+import de.bmotionstudio.gef.editor.figure.SwitchFigure;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.model.Switch;
+import de.bmotionstudio.gef.editor.model.Track;
+
+public class SwitchPart extends BMSAbstractEditPart {
+
+	@Override
+	protected IFigure createEditFigure() {
+		return new SwitchFigure();
+	}
+
+	@Override
+	public void refreshEditFigure(IFigure figure, BControl model,
+			PropertyChangeEvent evt) {
+
+		Object value = evt.getNewValue();
+		String aID = evt.getPropertyName();
+		Switch sw = (Switch) model;
+		
+		Track track1 = sw.getTrack1();
+		Track track2 = sw.getTrack2();
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_SWITCH_POSITION)) {
+			if (track1 != null && track2 != null) {
+				track1.setAttributeValue(AttributeConstants.ATTRIBUTE_VISIBLE,
+						true);
+				track2.setAttributeValue(AttributeConstants.ATTRIBUTE_VISIBLE,
+						true);
+				if (value.equals(AttributeSwitchPosition.LEFT)) {
+					track1.setAttributeValue(
+							AttributeConstants.ATTRIBUTE_VISIBLE, false);
+				} else if (value.equals(AttributeSwitchPosition.RIGHT)) {
+					track2.setAttributeValue(
+							AttributeConstants.ATTRIBUTE_VISIBLE, false);
+				}
+			}
+		}
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_SWITCH_DIRECTION))
+			refreshEditLayout(figure, model);
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_VISIBLE)) {
+			if (track1 != null && track2 != null) {
+				Boolean visible = Boolean.valueOf(value.toString());
+				((SwitchFigure) figure).setVisible(visible);
+				track1.setAttributeValue(
+						AttributeConstants.ATTRIBUTE_VISIBLE, visible);
+				track2.setAttributeValue(
+						AttributeConstants.ATTRIBUTE_VISIBLE, visible);
+			}
+		}
+
+	}
+
+	@Override
+	protected void prepareEditPolicies() {
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
+	}
+
+	@Override
+	protected void prepareRunPolicies() {
+	}
+
+	@Override
+	public List<BControl> getModelChildren() {
+		return ((BControl) getModel()).getChildrenArray();
+	}
+
+	@Override
+	protected void refreshEditLayout(IFigure figure, BControl control) {
+
+		int width = control.getDimension().width;
+		int height = control.getDimension().height;
+
+		List<BControl> trackNodes = control.getChildrenArray();
+
+		int dir = Integer.valueOf(((BControl) getModel()).getAttributeValue(
+				AttributeConstants.ATTRIBUTE_SWITCH_DIRECTION).toString());
+
+		Point pt = new Point();
+
+		for (BControl trackNode : trackNodes) {
+
+			switch (Integer.valueOf(trackNode.getAttributeValue(
+					AttributeConstants.ATTRIBUTE_CUSTOM).toString())) {
+			case 1: // top left (1)
+				if (dir == AttributeSwitchDirection.RIGHT_SOUTH) {
+					pt.y = 0;
+					pt.x = 5;
+				} else if (dir == AttributeSwitchDirection.LEFT_SOUTH) {
+					pt.y = 0;
+					pt.x = width - 25;
+				} else if (dir == AttributeSwitchDirection.RIGHT_NORTH) {
+					pt.y = height - 20;
+					pt.x = 5;
+				} else if (dir == AttributeSwitchDirection.LEFT_NORTH) {
+					pt.y = height - 20;
+					pt.x = width - 25;
+				}
+				break;
+			case 2: // top right (2)
+				if (dir == AttributeSwitchDirection.RIGHT_SOUTH) {
+					pt.y = 0;
+					pt.x = width - 25;
+				} else if (dir == AttributeSwitchDirection.LEFT_SOUTH) {
+					pt.y = 0;
+					pt.x = 5;
+				} else if (dir == AttributeSwitchDirection.RIGHT_NORTH) {
+					pt.y = 0;
+					pt.x = width - 25;
+				} else if (dir == AttributeSwitchDirection.LEFT_NORTH) {
+					pt.y = 0;
+					pt.x = 5;
+				}
+				break;
+			case 3: // left right (3)
+				if (dir == AttributeSwitchDirection.RIGHT_SOUTH) {
+					pt.y = height - 20;
+					pt.x = width - 25;
+				} else if (dir == AttributeSwitchDirection.LEFT_SOUTH) {
+					pt.y = height - 20;
+					pt.x = 5;
+				} else if (dir == AttributeSwitchDirection.RIGHT_NORTH) {
+					pt.y = height - 20;
+					pt.x = width - 25;
+				} else if (dir == AttributeSwitchDirection.LEFT_NORTH) {
+					pt.y = height - 20;
+					pt.x = 5;
+				}
+				break;
+			default:
+				break;
+			}
+
+			trackNode.setAttributeValue(AttributeConstants.ATTRIBUTE_X, pt.x);
+			trackNode.setAttributeValue(AttributeConstants.ATTRIBUTE_Y, pt.y);
+
+		}
+
+		super.refreshEditLayout(figure, control);
+
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/TankPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/TankPart.java
new file mode 100644
index 0000000000000000000000000000000000000000..6dba32eb15b1fe97cafa0e19c17bc34787dacfff
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/TankPart.java
@@ -0,0 +1,77 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.part;
+
+import java.beans.PropertyChangeEvent;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.swt.graphics.RGB;
+
+import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.editpolicy.BMSConnectionEditPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
+import de.bmotionstudio.gef.editor.figure.TankFigure;
+import de.bmotionstudio.gef.editor.model.BControl;
+
+public class TankPart extends BMSAbstractEditPart {
+
+	@Override
+	protected IFigure createEditFigure() {
+		return new TankFigure();
+	}
+
+	@Override
+	public void refreshEditFigure(IFigure figure, BControl model,
+			PropertyChangeEvent evt) {
+
+		Object value = evt.getNewValue();
+		String aID = evt.getPropertyName();
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_VISIBLE))
+			((TankFigure) figure).setVisible(Boolean.valueOf(value.toString()));
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_ALPHA))
+			((TankFigure) figure).setAlpha(Integer.valueOf(value.toString()));
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_FILL_COLOR))
+			((TankFigure) figure).setFillColor((RGB) value);
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_FILL_HEIGHT))
+			((TankFigure) figure).setFillHeight(Integer.valueOf(value
+					.toString()));
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_MEASURE_MAXPOS))
+			((TankFigure) figure).setMaxPos(Integer.valueOf(model
+					.getAttributeValue(
+							AttributeConstants.ATTRIBUTE_MEASURE_MAXPOS)
+					.toString()));
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_MEASURE_INTERVAL))
+			((TankFigure) figure)
+					.setInterval(Integer.valueOf(value.toString()));
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_SHOWS_MEASURE))
+			((TankFigure) figure).setMeasure(Boolean.valueOf(value.toString()));
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_BACKGROUND_COLOR))
+			((TankFigure) figure).setBackgroundColor((RGB) value);
+
+	}
+
+	@Override
+	protected void prepareEditPolicies() {
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
+		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
+				new BMSConnectionEditPolicy());
+	}
+
+	@Override
+	protected void prepareRunPolicies() {
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/TrackNodePart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/TrackNodePart.java
new file mode 100644
index 0000000000000000000000000000000000000000..061329b32eb959dbdeb7f19bb6e33b25535b0397
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/TrackNodePart.java
@@ -0,0 +1,67 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.part;
+
+import java.beans.PropertyChangeEvent;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+import de.bmotionstudio.gef.editor.AttributeConstants;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
+import de.bmotionstudio.gef.editor.editpolicy.TrackEditPolicy;
+import de.bmotionstudio.gef.editor.figure.TrackNodeFigure;
+import de.bmotionstudio.gef.editor.model.BControl;
+
+public class TrackNodePart extends BMSAbstractEditPart {
+
+	protected Color foregroundColor;
+
+	@Override
+	protected IFigure createEditFigure() {
+		return new TrackNodeFigure();
+	}
+
+	@Override
+	public void refreshEditFigure(IFigure figure, BControl model,
+			PropertyChangeEvent evt) {
+
+		Object value = evt.getNewValue();
+		String aID = evt.getPropertyName();
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_LINEWIDTH))
+			((TrackNodeFigure) getFigure()).setLineWidth(Integer
+					.valueOf(value.toString()));
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_LINESTYLE))
+			((TrackNodeFigure) getFigure()).setLineStyle((Integer
+					.valueOf(value.toString()) + 1));
+
+		if (aID.equals(AttributeConstants.ATTRIBUTE_FOREGROUND_COLOR)) {
+			if (foregroundColor != null)
+				foregroundColor.dispose();
+			foregroundColor = new Color(Display.getDefault(), (RGB) value);
+			((TrackNodeFigure) getFigure())
+					.setForegroundColor(foregroundColor);
+		}
+
+	}
+
+	@Override
+	protected void prepareEditPolicies() {
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
+		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new TrackEditPolicy());
+	}
+
+	@Override
+	protected void prepareRunPolicies() {
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/TrackPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/TrackPart.java
new file mode 100644
index 0000000000000000000000000000000000000000..270aa4896010e43ea47791db5781ebbcc4fc6ffc
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/TrackPart.java
@@ -0,0 +1,94 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.part;
+
+import org.eclipse.draw2d.ChopboxAnchor;
+import org.eclipse.draw2d.ConnectionAnchor;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.ConnectionEditPolicy;
+import org.eclipse.gef.editpolicies.ConnectionEndpointEditPolicy;
+import org.eclipse.gef.requests.GroupRequest;
+
+import de.bmotionstudio.gef.editor.command.ConnectionDeleteCommand;
+import de.bmotionstudio.gef.editor.model.Track;
+
+public class TrackPart extends BConnectionEditPart {
+
+	@Override
+	protected void prepareEditPolicies() {
+		// Selection handle edit policy.
+		// Makes the connection show a feedback, when selected by the user.
+		installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE,
+				new ConnectionEndpointEditPolicy()); // Allows the removal of
+														// the connection model
+														// element
+		installEditPolicy(EditPolicy.CONNECTION_ROLE,
+				new ConnectionEditPolicy() {
+					protected Command getDeleteCommand(GroupRequest request) {
+						return new ConnectionDeleteCommand((Track) getModel());
+					}
+				});
+	}
+
+	@Override
+	protected ConnectionAnchor getSourceConnectionAnchor() {
+		if (getSource() != null) {
+			IFigure f = ((GraphicalEditPart) getSource()).getFigure();
+			return new ChopboxAnchor(f) {
+				@Override
+				public Point getLocation(Point reference) {
+					Rectangle r = Rectangle.SINGLETON;
+					r.setBounds(getBox());
+					r.translate(-1, -1);
+					r.resize(1, 1);
+					getOwner().translateToAbsolute(r);
+					float centerX = r.x + 0.5f * r.width;
+					float centerY = r.y + 0.5f * r.height;
+					if (r.isEmpty()
+							|| (reference.x == (int) centerX && reference.y == (int) centerY))
+						return new Point((int) centerX, (int) centerY); // This
+																		// avoids
+																		// divide-by-zero
+					return new Point(Math.round(centerX), Math.round(centerY));
+				}
+			};
+		}
+		return DEFAULT_SOURCE_ANCHOR;
+	}
+
+	@Override
+	protected ConnectionAnchor getTargetConnectionAnchor() {
+		if (getTarget() != null) {
+			IFigure f = ((GraphicalEditPart) getTarget()).getFigure();
+			return new ChopboxAnchor(f) {
+				@Override
+				public Point getLocation(Point reference) {
+					Rectangle r = Rectangle.SINGLETON;
+					r.setBounds(getBox());
+					r.translate(-1, -1);
+					r.resize(1, 1);
+					getOwner().translateToAbsolute(r);
+					float centerX = r.x + 0.5f * r.width;
+					float centerY = r.y + 0.5f * r.height;
+					if (r.isEmpty()
+							|| (reference.x == (int) centerX && reference.y == (int) centerY))
+						return new Point((int) centerX, (int) centerY); // This
+																		// avoids
+																		// divide-by-zero
+					return new Point(Math.round(centerX), Math.round(centerY));
+				}
+			};
+		}
+		return DEFAULT_TARGET_ANCHOR;
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/UnknownPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/UnknownPart.java
index 5b18e42c3141e42b02b961b8e7180e199242df9d..9742455691d3b9f7ce60162437c6c1f067d09235 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/UnknownPart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/UnknownPart.java
@@ -13,7 +13,7 @@ import org.eclipse.draw2d.IFigure;
 import de.bmotionstudio.gef.editor.figure.UnknownBControl;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class UnknownPart extends AppAbstractEditPart {
+public class UnknownPart extends BMSAbstractEditPart {
 
 	public static String ID = "de.bmotionstudio.gef.editor.unknown";
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/VisualizationPart.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/VisualizationPart.java
index ffa7230bbf89cbb2e068be3fe99a9102ae33f935..2ecbed079706725e80ce8962d1dd1915cecdb5ee 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/VisualizationPart.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/part/VisualizationPart.java
@@ -24,8 +24,8 @@ import org.eclipse.swt.graphics.RGB;
 import org.eclipse.swt.widgets.Display;
 
 import de.bmotionstudio.gef.editor.AttributeConstants;
-import de.bmotionstudio.gef.editor.editpolicy.AppDeletePolicy;
-import de.bmotionstudio.gef.editor.editpolicy.AppEditLayoutPolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSDeletePolicy;
+import de.bmotionstudio.gef.editor.editpolicy.BMSEditLayoutPolicy;
 import de.bmotionstudio.gef.editor.editpolicy.ChangeAttributePolicy;
 import de.bmotionstudio.gef.editor.figure.VisualizationFigure;
 import de.bmotionstudio.gef.editor.library.AbstractLibraryCommand;
@@ -34,7 +34,7 @@ import de.bmotionstudio.gef.editor.library.LibraryImageCommand;
 import de.bmotionstudio.gef.editor.library.LibraryVariableCommand;
 import de.bmotionstudio.gef.editor.model.BControl;
 
-public class VisualizationPart extends AppAbstractEditPart {
+public class VisualizationPart extends BMSAbstractEditPart {
 
 	public static String ID = "de.bmotionstudio.gef.editor.visualization";
 
@@ -50,8 +50,8 @@ public class VisualizationPart extends AppAbstractEditPart {
 
 	@Override
 	protected void prepareEditPolicies() {
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, new AppDeletePolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, new AppEditLayoutPolicy());
+		installEditPolicy(EditPolicy.COMPONENT_ROLE, new BMSDeletePolicy());
+		installEditPolicy(EditPolicy.LAYOUT_ROLE, new BMSEditLayoutPolicy());
 		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, null);
 		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
 		installEditPolicy(EditPolicy.CONTAINER_ROLE, new SnapFeedbackPolicy());
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/scheduler/wizard/SchedulerObjectDialog.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/scheduler/wizard/SchedulerObjectDialog.java
index af904c2fb0b042b4581c3df6c17ace2d41fa8111..58f0627cfc3d636fd2c249d7b8908947a499e153 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/scheduler/wizard/SchedulerObjectDialog.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/scheduler/wizard/SchedulerObjectDialog.java
@@ -98,13 +98,6 @@ public class SchedulerObjectDialog extends Dialog {
 		column.getColumn().setWidth(100);
 		column.setEditingSupport(new RandomModeEditingSupport(tableViewer));
 
-		// column = new TableViewerColumn(tableViewer, SWT.NONE);
-		// column.getColumn().setText("Callback");
-		// column.getColumn().setWidth(100);
-		// column
-		// .setEditingSupport(new ObserverCallbackEditingSupport(
-		// tableViewer));
-
 		ObservableListContentProvider contentProvider = new ObservableListContentProvider();
 		tableViewer.setContentProvider(contentProvider);
 		tableViewer.setLabelProvider(new ObservableMapLabelProvider(
@@ -112,15 +105,6 @@ public class SchedulerObjectDialog extends Dialog {
 						contentProvider.getKnownElements(), new String[] {
 								"command", "parameter", "maxrandom" })) {
 
-			@Override
-			public String getColumnText(final Object element,
-					final int columnIndex) {
-				// if (columnIndex == 2) {
-				// return "Edit";
-				// }
-				return super.getColumnText(element, columnIndex);
-			}
-
 			@Override
 			public Image getColumnImage(final Object element,
 					final int columnIndex) {
@@ -195,57 +179,6 @@ public class SchedulerObjectDialog extends Dialog {
 		return animationScriptObject;
 	}
 
-	// private class ObserverCallbackEditingSupport extends EditingSupport {
-	//
-	// public ObserverCallbackEditingSupport(ColumnViewer viewer) {
-	// super(viewer);
-	// }
-	//
-	// @Override
-	// protected boolean canEdit(Object element) {
-	// return true;
-	// }
-	//
-	// @Override
-	// protected CellEditor getCellEditor(Object element) {
-	// return new ObserverCallbackCellEditor((Composite) getViewer()
-	// .getControl(), (AnimationScriptStep) element);
-	// }
-	//
-	// @Override
-	// protected Object getValue(Object element) {
-	// return "Edit";
-	// }
-	//
-	// @Override
-	// protected void setValue(Object element, Object value) {
-	// }
-	//
-	// }
-
-	// private class ObserverCallbackCellEditor extends DialogCellEditor {
-	//
-	// private final AnimationScriptStep step;
-	//
-	// public ObserverCallbackCellEditor(final Composite parent,
-	// final AnimationScriptStep step) {
-	// super(parent);
-	// this.step = step;
-	// }
-	//
-	// @Override
-	// protected Object openDialogBox(final Control cellEditorWindow) {
-	// ObserverCallBackDialog dialog = new ObserverCallBackDialog(
-	// PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-	// .getShell(), step, control);
-	// if (dialog.open() == Dialog.OK) {
-	// return getValue();
-	// }
-	// return null;
-	// }
-	//
-	// }
-
 	private static class RandomModeEditingSupport extends EditingSupport {
 
 		private CellEditor cellEditor;
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/scheduler/wizard/WizardExecuteOperationByPredicate.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/scheduler/wizard/WizardExecuteOperationByPredicate.java
index b30b1e9da463f67e424610302dd529e9e330a08c..384a7fe54ab554bddc519823dcba7b5386ee0728 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/scheduler/wizard/WizardExecuteOperationByPredicate.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/scheduler/wizard/WizardExecuteOperationByPredicate.java
@@ -13,15 +13,18 @@ import org.eclipse.core.databinding.observable.map.IObservableMap;
 import org.eclipse.core.databinding.observable.value.IObservableValue;
 import org.eclipse.core.databinding.observable.value.IValueChangeListener;
 import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
+import org.eclipse.draw2d.ColorConstants;
 import org.eclipse.jface.databinding.swt.SWTObservables;
 import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
 import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
 import org.eclipse.jface.databinding.viewers.ViewersObservables;
 import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.jface.viewers.ComboViewer;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.events.VerifyEvent;
@@ -37,6 +40,7 @@ import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
 
+import de.bmotionstudio.gef.editor.BMotionStudioSWTConstants;
 import de.bmotionstudio.gef.editor.eventb.EventBHelper;
 import de.bmotionstudio.gef.editor.eventb.MachineContentObject;
 import de.bmotionstudio.gef.editor.eventb.MachineOperation;
@@ -59,10 +63,12 @@ public class WizardExecuteOperationByPredicate extends SchedulerWizard {
 
 		private Composite container;
 
-		private Composite guardContainer;
+		private Label renderedOpLabel;
 
 		private Button checkboxRandomMode;
 
+		private ScrolledComposite c1;
+
 		public ComboViewer getCbOperation() {
 			return cbOperation;
 		}
@@ -144,7 +150,7 @@ public class WizardExecuteOperationByPredicate extends SchedulerWizard {
 					.getSelection();
 
 			if (!structuredSelection.isEmpty()) {
-				createGuardContainer((MachineOperation) structuredSelection
+				createRenderedOperationContainer((MachineOperation) structuredSelection
 						.getFirstElement());
 			}
 
@@ -196,7 +202,7 @@ public class WizardExecuteOperationByPredicate extends SchedulerWizard {
 			observeSelection.addValueChangeListener(new IValueChangeListener() {
 				public void handleValueChange(ValueChangeEvent event) {
 					Object sel = event.getObservableValue().getValue();
-					createGuardContainer((MachineOperation) sel);
+					createRenderedOperationContainer((MachineOperation) sel);
 				}
 			});
 
@@ -212,47 +218,38 @@ public class WizardExecuteOperationByPredicate extends SchedulerWizard {
 
 		}
 
-		private void createGuardContainer(MachineOperation op) {
-
-			if (guardContainer != null)
-				guardContainer.dispose();
-
-			final StringBuilder allGuardString = new StringBuilder();
-
-			if (op != null) {
-
-				GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-				gd.horizontalSpan = 2;
+		private void createRenderedOperationContainer(MachineOperation op) {
 
-				GridLayout gl = new GridLayout(2, false);
+			if (c1 != null)
+				c1.dispose();
 
-				guardContainer = new Composite(container, SWT.NONE);
-				guardContainer.setLayoutData(gd);
-				guardContainer.setLayout(gl);
+			GridLayout gl = new GridLayout(1, true);
+			gl.marginLeft = 5;
+			gl.marginTop = 5;
 
-				for (String guard : op.getGuards()) {
-
-					if (allGuardString.length() == 0)
-						allGuardString.append(guard);
-					else
-						allGuardString.append(" & " + guard);
+			GridData gd = new GridData(GridData.FILL_BOTH);
+			gd.horizontalSpan = 2;
+			
+			c1 = new ScrolledComposite(container, SWT.BORDER | SWT.H_SCROLL
+					| SWT.V_SCROLL);
+			c1.setBackground(ColorConstants.red);
+			c1.setLayoutData(gd);
 
-					Label lb = new Label(guardContainer, SWT.NONE);
-					lb.setText("Guard: ");
-					lb.setLayoutData(new GridData(100, 15));
+			Composite cp = new Composite(c1, SWT.NONE);
+			cp.setLayout(gl);
 
-					final Text txt = new Text(guardContainer, SWT.BORDER
-							| SWT.READ_ONLY);
-					txt.setText(guard);
-					txt.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-					// txt.setFont(JFaceResources.getFontRegistry().get(
-					// BMotionStudioConstants.RODIN_FONT_KEY));
+			renderedOpLabel = new Label(cp, SWT.NONE);
+			renderedOpLabel.setLayoutData(gd);
+			renderedOpLabel.setText(op.getRenderedOperation());
+			renderedOpLabel.setFont(JFaceResources.getFontRegistry().get(
+					BMotionStudioSWTConstants.RODIN_FONT_KEY));
 
-				}
+			c1.setContent(cp);
+			c1.setExpandHorizontal(true);
+			c1.setExpandVertical(true);
+			c1.setMinSize(cp.computeSize(SWT.DEFAULT, SWT.DEFAULT));
 
-				container.layout();
-
-			}
+			container.layout();
 
 		}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/scheduler/wizard/WizardExecuteScheduler.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/scheduler/wizard/WizardExecuteScheduler.java
index 87d3d3f1dee27138e2b14e6ee586fb386e5576a7..81680ee37abd5991ef459a9c46da00c079364d65 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/scheduler/wizard/WizardExecuteScheduler.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/scheduler/wizard/WizardExecuteScheduler.java
@@ -196,6 +196,7 @@ public class WizardExecuteScheduler extends SchedulerWizard {
 	private class AnimationScriptDialogCellEditor extends DialogCellEditor {
 
 		private AnimationScriptObject animObj;
+		private AnimationScriptObject clonedObj;
 
 		public AnimationScriptDialogCellEditor(Composite parent,
 				AnimationScriptObject animObj) {
@@ -205,13 +206,27 @@ public class WizardExecuteScheduler extends SchedulerWizard {
 
 		@Override
 		protected Object openDialogBox(Control cellEditorWindow) {
-			SchedulerObjectDialog dialog = new SchedulerObjectDialog(
-					PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-							.getShell(), getBControl(), animObj);
-			if (dialog.open() == Dialog.OK) {
+
+			SchedulerObjectDialog dialog = new SchedulerObjectDialog(PlatformUI
+					.getWorkbench().getActiveWorkbenchWindow().getShell(),
+					getBControl(), animObj);
+
+			try {
+				clonedObj = animObj.clone();
+			} catch (CloneNotSupportedException e) {
+				// TODO return some error?!
 				return getValue();
 			}
-			return null;
+
+			int status = dialog.open();
+			if (status == Dialog.OK) {
+				return animObj;
+			}
+
+			animObj.setSteps(clonedObj.getSteps());
+
+			return getValue();
+
 		}
 
 	}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BButtonService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BButtonService.java
index e53c63a05dc0f372ca7e1194cdf167cf63de45eb..e0b5b38b09a6429c1c2a66bdc71929c3d3a8abcd 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BButtonService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BButtonService.java
@@ -11,7 +11,7 @@ import de.bmotionstudio.gef.editor.IBControlService;
 import de.bmotionstudio.gef.editor.model.BButton;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.BButtonPart;
 
 /**
@@ -39,7 +39,7 @@ public class BButtonService extends AbstractBControlService implements
 	 * @see de.bmotionstudio.gef.editor.IBControlService#createEditPart()
 	 */
 	@Override
-	public AppAbstractEditPart createEditPart() {
+	public BMSAbstractEditPart createEditPart() {
 		return new BButtonPart();
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BCheckboxService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BCheckboxService.java
index 7172275ab638423a14842f84b49ef5d6d0119822..dcaebcef01eac35993dd90a28542946e5bb9325e 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BCheckboxService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BCheckboxService.java
@@ -11,7 +11,7 @@ import de.bmotionstudio.gef.editor.IBControlService;
 import de.bmotionstudio.gef.editor.model.BCheckbox;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.BCheckboxPart;
 
 /**
@@ -39,7 +39,7 @@ public class BCheckboxService extends AbstractBControlService implements
 	 * @see de.bmotionstudio.gef.editor.IBControlService#createEditPart()
 	 */
 	@Override
-	public AppAbstractEditPart createEditPart() {
+	public BMSAbstractEditPart createEditPart() {
 		return new BCheckboxPart();
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BCompositeService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BCompositeService.java
index 863246a333f93ee035c93db0d7b9a7d92b247f23..4a11b1d1c33fbcdecb4d0a06c05ca1115270a412 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BCompositeService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BCompositeService.java
@@ -11,7 +11,7 @@ import de.bmotionstudio.gef.editor.IBControlService;
 import de.bmotionstudio.gef.editor.model.BComposite;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.BCompositePart;
 
 /**
@@ -39,7 +39,7 @@ public class BCompositeService extends AbstractBControlService implements
 	 * @see de.bmotionstudio.gef.editor.IBControlService#createEditPart()
 	 */
 	@Override
-	public AppAbstractEditPart createEditPart() {
+	public BMSAbstractEditPart createEditPart() {
 		return new BCompositePart();
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BConnectionService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BConnectionService.java
index 6d88ddebb508cdb3ccbcf52694e68b9c3ace855d..8c2c8e97317f5a65067764c37f9c72ec8b9e4cda 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BConnectionService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BConnectionService.java
@@ -17,7 +17,7 @@ import de.bmotionstudio.gef.editor.IBControlService;
 import de.bmotionstudio.gef.editor.model.BConnection;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.BConnectionEditPart;
 
 /**
@@ -47,7 +47,7 @@ public class BConnectionService extends AbstractBControlService implements
 	}
 
 	@Override
-	public AppAbstractEditPart createEditPart() {
+	public BMSAbstractEditPart createEditPart() {
 		return new BConnectionEditPart();
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BEllipseService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BEllipseService.java
index 40de317b91f70560053cf0bc8bb4a292974d6bb8..ffaf7f7dceeebc27954799e4b6fbf7961a9171ee 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BEllipseService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BEllipseService.java
@@ -7,7 +7,7 @@ import de.bmotionstudio.gef.editor.attribute.BAttributeShape;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.BShape;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.BShapePart;
 
 public class BEllipseService extends AbstractBControlService implements
@@ -26,7 +26,7 @@ public class BEllipseService extends AbstractBControlService implements
 	}
 
 	@Override
-	public AppAbstractEditPart createEditPart() {
+	public BMSAbstractEditPart createEditPart() {
 		return new BShapePart();
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BImageService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BImageService.java
index 22886fb67758dde65a147b9148d93b48e373301e..e70769ac275e2571a66cce4bc76a5518011b1c5d 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BImageService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BImageService.java
@@ -11,7 +11,7 @@ import de.bmotionstudio.gef.editor.IBControlService;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.BImage;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.BImagePart;
 
 /**
@@ -39,7 +39,7 @@ public class BImageService extends AbstractBControlService implements
 	 * @see de.bmotionstudio.gef.editor.IBControlService#createEditPart()
 	 */
 	@Override
-	public AppAbstractEditPart createEditPart() {
+	public BMSAbstractEditPart createEditPart() {
 		return new BImagePart();
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BRadioButtonService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BRadioButtonService.java
index 58d463b8fe2b51f4902841013c619dab5a90e754..ae4b4250f88f47e70170eaef67dfd984d425af36 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BRadioButtonService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BRadioButtonService.java
@@ -11,7 +11,7 @@ import de.bmotionstudio.gef.editor.IBControlService;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.BRadioButton;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.BRadioButtonPart;
 
 /**
@@ -39,7 +39,7 @@ public class BRadioButtonService extends AbstractBControlService implements
 	 * @see de.bmotionstudio.gef.editor.IBControlService#createEditPart()
 	 */
 	@Override
-	public AppAbstractEditPart createEditPart() {
+	public BMSAbstractEditPart createEditPart() {
 		return new BRadioButtonPart();
 	}
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BRectangleService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BRectangleService.java
index 4f74a1bab73bda064da23af7bf5914915a4347f0..f29b430d7c111916fc541e1f804fab319b757262 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BRectangleService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BRectangleService.java
@@ -11,7 +11,7 @@ import de.bmotionstudio.gef.editor.IBControlService;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.BShape;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.BShapePart;
 
 /**
@@ -39,7 +39,7 @@ public class BRectangleService extends AbstractBControlService implements
 	 * @see de.bmotionstudio.gef.editor.IBControlService#createEditPart()
 	 */
 	@Override
-	public AppAbstractEditPart createEditPart() {
+	public BMSAbstractEditPart createEditPart() {
 		return new BShapePart();
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTableCellService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTableCellService.java
index 36bd5c52047bc58d165b7e74a0290abb8fac9b9a..38c27cbaf1e5a37e64e8d174a8a24c9964117e09 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTableCellService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTableCellService.java
@@ -5,7 +5,9 @@ import de.bmotionstudio.gef.editor.IBControlService;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.BTableCell;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BControlTreeEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractTreeEditPart;
 import de.bmotionstudio.gef.editor.part.BTableCellPart;
 
 public class BTableCellService extends AbstractBControlService implements
@@ -17,7 +19,7 @@ public class BTableCellService extends AbstractBControlService implements
 	}
 
 	@Override
-	public AppAbstractEditPart createEditPart() {
+	public BMSAbstractEditPart createEditPart() {
 		return new BTableCellPart();
 	}
 
@@ -26,4 +28,13 @@ public class BTableCellService extends AbstractBControlService implements
 		return false;
 	}
 
+	@Override
+	public BMSAbstractTreeEditPart createTreeEditPart() {
+		return new BControlTreeEditPart() {
+			@Override
+			protected void createEditPolicies() {
+			}
+		};
+	}
+
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTableColumnService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTableColumnService.java
index ea26c6326c5b225dd9ee8293d681bef037cba479..6290adc316a60ca35f9cff2883b2bfb4947d6b43 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTableColumnService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTableColumnService.java
@@ -5,7 +5,9 @@ import de.bmotionstudio.gef.editor.IBControlService;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.BTableColumn;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BControlTreeEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractTreeEditPart;
 import de.bmotionstudio.gef.editor.part.BTableColumnPart;
 
 public class BTableColumnService extends AbstractBControlService implements
@@ -17,7 +19,7 @@ public class BTableColumnService extends AbstractBControlService implements
 	}
 
 	@Override
-	public AppAbstractEditPart createEditPart() {
+	public BMSAbstractEditPart createEditPart() {
 		return new BTableColumnPart();
 	}
 
@@ -26,4 +28,13 @@ public class BTableColumnService extends AbstractBControlService implements
 		return false;
 	}
 
+	@Override
+	public BMSAbstractTreeEditPart createTreeEditPart() {
+		return new BControlTreeEditPart() {
+			@Override
+			protected void createEditPolicies() {
+			}
+		};
+	}
+
 }
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTableService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTableService.java
index da6182eb66ce3f9ab851be83e7a5da67531a01bd..67da1a6148b0f376502b36e0047ce42a98a36e70 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTableService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTableService.java
@@ -5,7 +5,7 @@ import de.bmotionstudio.gef.editor.IBControlService;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.BTable;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.BTablePart;
 
 public class BTableService extends AbstractBControlService implements
@@ -17,7 +17,7 @@ public class BTableService extends AbstractBControlService implements
 	}
 
 	@Override
-	public AppAbstractEditPart createEditPart() {
+	public BMSAbstractEditPart createEditPart() {
 		return new BTablePart();
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTextService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTextService.java
index 4eb9bc34fedd686cb9f948559c1f141fe7c5bd7e..77fcbaa39c22f72ab5fc3b3e70c13bbe32709245 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTextService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTextService.java
@@ -11,7 +11,7 @@ import de.bmotionstudio.gef.editor.IBControlService;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.BText;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.BTextPart;
 
 /**
@@ -39,7 +39,7 @@ public class BTextService extends AbstractBControlService implements
 	 * @see de.bmotionstudio.gef.editor.IBControlService#createEditPart()
 	 */
 	@Override
-	public AppAbstractEditPart createEditPart() {
+	public BMSAbstractEditPart createEditPart() {
 		return new BTextPart();
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTextfieldService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTextfieldService.java
index 1512b76a57cb7d9c82cad81d94f02cf59964597f..694879b12b6db775ff764b93e24d10bdd8fe06a2 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTextfieldService.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/BTextfieldService.java
@@ -11,7 +11,7 @@ import de.bmotionstudio.gef.editor.IBControlService;
 import de.bmotionstudio.gef.editor.model.BControl;
 import de.bmotionstudio.gef.editor.model.BTextfield;
 import de.bmotionstudio.gef.editor.model.Visualization;
-import de.bmotionstudio.gef.editor.part.AppAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
 import de.bmotionstudio.gef.editor.part.BTextfieldPart;
 
 /**
@@ -39,7 +39,7 @@ public class BTextfieldService extends AbstractBControlService implements
 	 * @see de.bmotionstudio.gef.editor.IBControlService#createEditPart()
 	 */
 	@Override
-	public AppAbstractEditPart createEditPart() {
+	public BMSAbstractEditPart createEditPart() {
 		return new BTextfieldPart();
 	}
 
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/LightService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/LightService.java
new file mode 100644
index 0000000000000000000000000000000000000000..84b8215550198df61c4f29f869381d83c2c34829
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/LightService.java
@@ -0,0 +1,29 @@
+package de.bmotionstudio.gef.editor.service;
+
+import de.bmotionstudio.gef.editor.AbstractBControlService;
+import de.bmotionstudio.gef.editor.IBControlService;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.model.Light;
+import de.bmotionstudio.gef.editor.model.Visualization;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.LightPart;
+
+public class LightService extends AbstractBControlService implements
+		IBControlService {
+
+	@Override
+	public BControl createControl(Visualization visualization) {
+		return new Light(visualization);
+	}
+
+	@Override
+	public BMSAbstractEditPart createEditPart() {
+		return new LightPart();
+	}
+
+	@Override
+	public boolean showInPalette() {
+		return false;
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/SignalService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/SignalService.java
new file mode 100644
index 0000000000000000000000000000000000000000..fd0c914a64001a7efa025c7575b4ebb135b3e5af
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/SignalService.java
@@ -0,0 +1,45 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+package de.bmotionstudio.gef.editor.service;
+
+import de.bmotionstudio.gef.editor.AbstractBControlService;
+import de.bmotionstudio.gef.editor.IBControlService;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.model.Signal;
+import de.bmotionstudio.gef.editor.model.Visualization;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.SignalPart;
+
+/**
+ * @author Lukas Ladenberger
+ * 
+ */
+public class SignalService extends AbstractBControlService implements
+		IBControlService {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * de.bmotionstudio.gef.editor.IBControlService#createControl(de.bmotionstudio
+	 * .gef.editor.model.Visualization)
+	 */
+	@Override
+	public BControl createControl(Visualization visualization) {
+		return new Signal(visualization);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.bmotionstudio.gef.editor.IBControlService#createEditPart()
+	 */
+	@Override
+	public BMSAbstractEditPart createEditPart() {
+		return new SignalPart();
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/SwitchService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/SwitchService.java
new file mode 100644
index 0000000000000000000000000000000000000000..a4b441ea9c245575cb08e9a7e005f49bc3042016
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/SwitchService.java
@@ -0,0 +1,30 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.service;
+
+import de.bmotionstudio.gef.editor.AbstractBControlService;
+import de.bmotionstudio.gef.editor.IBControlService;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.model.Switch;
+import de.bmotionstudio.gef.editor.model.Visualization;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.SwitchPart;
+
+public class SwitchService extends AbstractBControlService implements
+		IBControlService {
+
+	@Override
+	public BControl createControl(Visualization visualization) {
+		return new Switch(visualization);
+	}
+
+	@Override
+	public BMSAbstractEditPart createEditPart() {
+		return new SwitchPart();
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/TankService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/TankService.java
new file mode 100644
index 0000000000000000000000000000000000000000..cc28f1eee33f501553c80c75fb73f39038c9c9c4
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/TankService.java
@@ -0,0 +1,30 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.service;
+
+import de.bmotionstudio.gef.editor.AbstractBControlService;
+import de.bmotionstudio.gef.editor.IBControlService;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.model.Tank;
+import de.bmotionstudio.gef.editor.model.Visualization;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.TankPart;
+
+public class TankService extends AbstractBControlService implements
+		IBControlService {
+
+	@Override
+	public BControl createControl(Visualization visualization) {
+		return new Tank(visualization);
+	}
+
+	@Override
+	public BMSAbstractEditPart createEditPart() {
+		return new TankPart();
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/TrackNodeService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/TrackNodeService.java
new file mode 100644
index 0000000000000000000000000000000000000000..d3b12c90a0e77b55080a024aa620e74293abdc7e
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/TrackNodeService.java
@@ -0,0 +1,35 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.service;
+
+import de.bmotionstudio.gef.editor.AbstractBControlService;
+import de.bmotionstudio.gef.editor.IBControlService;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.model.TrackNode;
+import de.bmotionstudio.gef.editor.model.Visualization;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.TrackNodePart;
+
+public class TrackNodeService extends AbstractBControlService implements
+		IBControlService {
+
+	@Override
+	public BControl createControl(Visualization visualization) {
+		return new TrackNode(visualization);
+	}
+
+	@Override
+	public BMSAbstractEditPart createEditPart() {
+		return new TrackNodePart();
+	}
+
+	@Override
+	public boolean showInPalette() {
+		return true;
+	}
+
+}
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/TrackService.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/TrackService.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b90a844cd2925a2ae1411f24bed3edd59c72812
--- /dev/null
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/service/TrackService.java
@@ -0,0 +1,54 @@
+/** 
+ * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, 
+ * Heinrich Heine Universitaet Duesseldorf
+ * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) 
+ * */
+
+package de.bmotionstudio.gef.editor.service;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.gef.palette.ConnectionCreationToolEntry;
+import org.eclipse.gef.palette.ToolEntry;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+import de.bmotionstudio.gef.editor.AbstractBControlService;
+import de.bmotionstudio.gef.editor.BControlCreationFactory;
+import de.bmotionstudio.gef.editor.IBControlService;
+import de.bmotionstudio.gef.editor.model.BControl;
+import de.bmotionstudio.gef.editor.model.Track;
+import de.bmotionstudio.gef.editor.model.Visualization;
+import de.bmotionstudio.gef.editor.part.BMSAbstractEditPart;
+import de.bmotionstudio.gef.editor.part.TrackPart;
+
+/**
+ * @author Lukas Ladenberger
+ * 
+ */
+public class TrackService extends AbstractBControlService implements
+		IBControlService {
+
+	@Override
+	public ToolEntry createToolEntry(Visualization visualization,
+			IConfigurationElement configurationElement) {
+		String sourcePluginID = configurationElement.getContributor().getName();
+		String name = configurationElement.getAttribute("name");
+		String icon = configurationElement.getAttribute("icon");
+		return new ConnectionCreationToolEntry(name, "Create " + name,
+				new BControlCreationFactory(Track.TYPE, visualization),
+				AbstractUIPlugin
+						.imageDescriptorFromPlugin(sourcePluginID, icon),
+				AbstractUIPlugin
+						.imageDescriptorFromPlugin(sourcePluginID, icon));
+	}
+
+	@Override
+	public BControl createControl(Visualization visualization) {
+		return new Track(visualization);
+	}
+
+	@Override
+	public BMSAbstractEditPart createEditPart() {
+		return new TrackPart();
+	}
+
+}
diff --git a/de.bmotionstudio.help/.classpath b/de.bmotionstudio.help/.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..d340cf91de61e0d4f233094a17166bcf96660af6
--- /dev/null
+++ b/de.bmotionstudio.help/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry exported="true" kind="lib" path="lib/org.eclipse.mylyn.wikitext.core_1.7.0.I20120513-1032.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/org.eclipse.mylyn.wikitext.mediawiki.core_1.7.0.I20120513-1032.jar"/>
+	<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/de.bmotionstudio.help/.gitignore b/de.bmotionstudio.help/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..035de1b11b9c848db744ce94f72e26bdcbcfacb6
--- /dev/null
+++ b/de.bmotionstudio.help/.gitignore
@@ -0,0 +1,5 @@
+User-Guide-Glossary-toc.xml
+User-Guide-Reference-toc.xml
+User-Guide-Tutorial-toc.xml
+tmp/
+User_Guide/
\ No newline at end of file
diff --git a/de.bmotionstudio.help/.project b/de.bmotionstudio.help/.project
new file mode 100644
index 0000000000000000000000000000000000000000..9162b9f5bf81284341c67694c5e5e63d6b534265
--- /dev/null
+++ b/de.bmotionstudio.help/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>de.bmotionstudio.help</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/de.bmotionstudio.help/.settings/org.eclipse.jdt.core.prefs b/de.bmotionstudio.help/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..f84eafc964bdfb1f40a434083bdd428ec56ec668
--- /dev/null
+++ b/de.bmotionstudio.help/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#Fri Aug 31 09:17:40 CEST 2012
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/de.bmotionstudio.help/META-INF/MANIFEST.MF b/de.bmotionstudio.help/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..2a3c26e48a13dd905f4cf8073d66bcae49f1d6c3
--- /dev/null
+++ b/de.bmotionstudio.help/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: BMotion Studio Help
+Bundle-SymbolicName: de.bmotionstudio.help;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Require-Bundle: org.eclipse.help;bundle-version="3.5.100"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-Vendor: HHU Düsseldorf STUPS Group
+Eclipse-RegisterBuddy: de.bmotionstudio.gef.editor
+Bundle-ClassPath: lib/org.eclipse.mylyn.wikitext.core_1.7.0.I20120513-1032.jar,
+ lib/org.eclipse.mylyn.wikitext.mediawiki.core_1.7.0.I20120513-1032.jar,
+ .
diff --git a/de.bmotionstudio.help/about.html b/de.bmotionstudio.help/about.html
new file mode 100644
index 0000000000000000000000000000000000000000..b8193ece10e08aa3ee2d279b713d12e7705a8c0e
--- /dev/null
+++ b/de.bmotionstudio.help/about.html
@@ -0,0 +1,28 @@
+<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+		<title>About</title>
+	</head>
+	<body>
+
+<h2>About This Content</h2>
+ 
+<p>June 25, 2008</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/de.bmotionstudio.help/build.properties b/de.bmotionstudio.help/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..210faf9f1459a73fe8487a779fe2d74e65cc57d4
--- /dev/null
+++ b/de.bmotionstudio.help/build.properties
@@ -0,0 +1,11 @@
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               toc.xml,\
+               User-Guide-Tutorial-toc.xml,\
+               User-Guide-Reference-toc.xml,\
+               images/,\
+               User_Guide/,\
+               about.html,\
+               doc/,\
+               contextDefinitionFile.xml
diff --git a/de.bmotionstudio.help/contextDefinitionFile.xml b/de.bmotionstudio.help/contextDefinitionFile.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6fa0faade9b6af80bf0f3f232539b266ae76e886
--- /dev/null
+++ b/de.bmotionstudio.help/contextDefinitionFile.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<contexts>
+  <context id="SwitchChildCoordinates">
+    <topic href="User_Guide/Reference/Observer.html#Switch_Child_Coordinates" label="Switch Child Coordinates Observer" />
+  </context>
+   <context id="SwitchCoordinates">
+      <topic href="User_Guide/Reference/Observer.html#Switch_Coordinates" label="Switch Coordinates Observer"/>
+   </context>
+   <context id="SetAttribute">
+      <topic href="User_Guide/Reference/Observer.html#Set_Attribute" label="Set Attribute Observer"/>
+   </context>
+   <context id="SimpleValueDisplay">
+      <topic href="User_Guide/Reference/Observer.html#Simple_Value_Display" label="Simple Value Display Observer"/>
+   </context>
+   <context id="SwitchImage">
+      <topic href="User_Guide/Reference/Observer.html#Switch_Image" label="Switch Image Observer"/>
+   </context>
+   <context id="ListenOperationByPredicate">
+      <topic href="User_Guide/Reference/Observer.html#Listen_Operation" label="Listen Operation Observer"/>
+   </context>
+</contexts> 
diff --git a/de.bmotionstudio.help/customBuild.xml b/de.bmotionstudio.help/customBuild.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9885823bf43374c91fed743860767d28de87d6c7
--- /dev/null
+++ b/de.bmotionstudio.help/customBuild.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?><!--
+   Copyright (c) 2011 Formal Mind GmbH and University of Dusseldorf.
+   All rights reserved. This program and the accompanying materials
+   are made available under the terms of the Eclipse Public License v1.0
+   which accompanies this distribution, and is available at
+   http://www.eclipse.org/legal/epl-v10.html
+ 
+   Contributors:
+       Lukas Ladenberger - initial API and implementation
+ -->
+
+<project name="org.eclipse.mylyn.wikitext.example" default="all">
+    <description>
+    	Generate Eclipse help content for the BMotion Studio user guide
+    </description>
+
+	<property name="help.doc.url.base" value="http://www.stups.uni-duesseldorf.de/bmotionstudio"/>
+	<property name="wiki.url.base" value="${help.doc.url.base}"/>
+	<property name="imageFolder" value="images"/>
+
+	<path id="wikitext.tasks.classpath">
+		<fileset dir="lib">
+			<include name="org.eclipse.mylyn.wikitext.*core*.jar"/>
+		</fileset>
+	</path>
+
+	<taskdef classpathref="wikitext.tasks.classpath" resource="org/eclipse/mylyn/internal/wikitext/mediawiki/core/tasks/tasks.properties"/>
+	<taskdef classpathref="wikitext.tasks.classpath" resource="org/eclipse/mylyn/wikitext/core/util/anttask/tasks.properties"/>
+
+	<target name="init">
+		<mkdir dir="tmp"/>
+	</target>
+
+	<target name="clean" depends="init">
+		<delete includeemptydirs="true" failonerror="false">
+			<fileset dir="tmp"/>
+		</delete>
+	</target>
+
+	<target name="all" depends="generate-help, test"/>
+	
+    <target name="generate-help" depends="init" description="Generate Eclipse help content for the BMotion Studio user guide">
+    	<mediawiki-to-eclipse-help
+    	    		wikiBaseUrl="${help.doc.url.base}"
+    				validate="true"
+    				failonvalidationerror="true"
+    				prependImagePrefix="${imageFolder}"
+    				formatoutput="true"
+    				defaultAbsoluteLinkTarget="bms_external"
+    	    		dest="${basedir}"
+    	    		title="BMotion Studio User Guide"
+    	    		generateUnifiedToc="false">
+    	    		<path name="User_Guide/Tutorial" title="BMotion Studio Tutorial" generateToc="true"/>
+    	    		<path name="User_Guide/Reference" title="BMotion Studio Reference" generateToc="true"/>
+    	    		<pageAppendum>
+= Updating This Document =
+
+This document is maintained in a collaborative wiki.  If you wish to update or modify this document please visit http://www.stups.uni-duesseldorf.de/bmotionstudio.
+    	  			</pageAppendum>
+    	</mediawiki-to-eclipse-help>
+    	
+    </target>
+
+	<target name="test" depends="init" description="verify that all of the HTML files are well-formed XML">
+		<echo level="info">
+Validating help content XML and HTML files: The Eclipse help system expects well-formed XML
+
+If validation fails it is because either:
+
+* the userguide source code is poorly formed, or
+* the WikiText MediaWiki parser has a bug
+
+Problems with userguide source are usually caused by improper use of HTML markup in the MediaWiki source,
+or inadvertently starting a line with a space character (in MediaWiki this starts a preformatted block)
+		</echo>
+
+	    <!-- 
+		Don't bother with DTD validation: we only care if the files are well-formed.
+		We therefore provide an empty DTD
+		--> 
+		<mkdir dir="tmp"/>
+		<echo file="tmp/__empty.dtd" message=""/>
+		<xmlvalidate lenient="true">
+			<fileset dir=".">
+				<include name="**/*.xml"/>
+			</fileset>
+			<fileset dir=".">
+				<include name="**/*.html"/>
+			</fileset>
+			<fileset dir=".">
+				<include name="*toc.xml"/>
+			</fileset>
+			<dtd publicid="-//W3C//DTD XHTML 1.0 Transitional//EN" location="${basedir}/tmp/__empty.dtd"/>
+		</xmlvalidate>
+		
+	</target>
+</project>
diff --git a/de.bmotionstudio.help/doc/notices.html b/de.bmotionstudio.help/doc/notices.html
new file mode 100644
index 0000000000000000000000000000000000000000..cdbda6cc94e4cb5f3a5efabf6ce1f0cb5e1d426b
--- /dev/null
+++ b/de.bmotionstudio.help/doc/notices.html
@@ -0,0 +1,17 @@
+<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+		<title>Legal Notices</title>
+	</head>
+	<body>
+<h3>
+<a NAME="Notices"></a>Notices</h3>
+<p>
+The material in this guide is Copyright (c) 2012 HHU STUPS Group and others.
+</p>
+<p>
+<a href="../about.html">Terms and conditions regarding the use of this guide.</a>
+</p>
+</body>
+</html>
diff --git a/de.bmotionstudio.help/images/home.gif b/de.bmotionstudio.help/images/home.gif
new file mode 100644
index 0000000000000000000000000000000000000000..4472e8ce5b377934abe5910749b8c58591947424
Binary files /dev/null and b/de.bmotionstudio.help/images/home.gif differ
diff --git a/de.bmotionstudio.help/images/next.gif b/de.bmotionstudio.help/images/next.gif
new file mode 100644
index 0000000000000000000000000000000000000000..e2f8c3e1feeb0541239db4061812008af2225105
Binary files /dev/null and b/de.bmotionstudio.help/images/next.gif differ
diff --git a/de.bmotionstudio.help/images/prev.gif b/de.bmotionstudio.help/images/prev.gif
new file mode 100644
index 0000000000000000000000000000000000000000..4fb41501036b940c99c8a839d7459c88eb98385c
Binary files /dev/null and b/de.bmotionstudio.help/images/prev.gif differ
diff --git a/de.bmotionstudio.help/lib/org.eclipse.mylyn.wikitext.core_1.7.0.I20120513-1032.jar b/de.bmotionstudio.help/lib/org.eclipse.mylyn.wikitext.core_1.7.0.I20120513-1032.jar
new file mode 100644
index 0000000000000000000000000000000000000000..d70798e0076e5b0df6e268b2ce97d4bccfad72fa
Binary files /dev/null and b/de.bmotionstudio.help/lib/org.eclipse.mylyn.wikitext.core_1.7.0.I20120513-1032.jar differ
diff --git a/de.bmotionstudio.help/lib/org.eclipse.mylyn.wikitext.mediawiki.core_1.7.0.I20120513-1032.jar b/de.bmotionstudio.help/lib/org.eclipse.mylyn.wikitext.mediawiki.core_1.7.0.I20120513-1032.jar
new file mode 100644
index 0000000000000000000000000000000000000000..4a060b5670b93729693955f4debbceecba8ebc69
Binary files /dev/null and b/de.bmotionstudio.help/lib/org.eclipse.mylyn.wikitext.mediawiki.core_1.7.0.I20120513-1032.jar differ
diff --git a/de.bmotionstudio.help/plugin.xml b/de.bmotionstudio.help/plugin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..edb7436b8b6783656d3430b8a0710c5924357088
--- /dev/null
+++ b/de.bmotionstudio.help/plugin.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         point="org.eclipse.help.toc">
+      <toc
+            category="BMS"
+            file="toc.xml"
+            primary="true">
+      </toc>
+      <toc
+            category="BMS"
+            file="User-Guide-Tutorial-toc.xml"
+            primary="false">
+      </toc>
+      <toc
+            category="BMS"
+            file="User-Guide-Reference-toc.xml"
+            primary="false">
+      </toc>
+   </extension>
+   <extension
+         point="org.eclipse.help.contexts">
+      <contexts
+            file="contextDefinitionFile.xml"
+            plugin="de.bmotionstudio.gef.editor.observer">
+      </contexts>
+   </extension>
+
+</plugin>
diff --git a/de.bmotionstudio.help/toc.xml b/de.bmotionstudio.help/toc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..95c83a4d527e1dc8ca8d580b90d1b90e59b2b42c
--- /dev/null
+++ b/de.bmotionstudio.help/toc.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+<toc label="BMotion Studio User Guide">
+   <anchor id="before-reference"/>
+  <topic label="Tutorial">
+     <anchor id="before-tutorial-content"/>
+     <link toc="User-Guide-Tutorial-toc.xml"/>
+     <anchor id="after-tutorial-content"/>
+     <anchor id="additions-tutorial"/>
+  </topic>
+   <topic label="Reference">
+  	<anchor id="before-reference-content"/>
+    <link toc="User-Guide-Reference-toc.xml"/>
+    <anchor id="after-reference-content"/>
+    <anchor id="additions-reference" />
+  </topic>
+   <anchor id="after-reference"/>
+   <anchor id="additions"/>
+ 	<topic href="doc/notices.html" label="Legal" />
+</toc>
+
diff --git a/de.bmotionstudio.rodin/META-INF/MANIFEST.MF b/de.bmotionstudio.rodin/META-INF/MANIFEST.MF
index 3347d0705525e9327f7402141c5aed8d346f69db..360c3fa5618b3b8a8c13988958c0d325bcd4d256 100644
--- a/de.bmotionstudio.rodin/META-INF/MANIFEST.MF
+++ b/de.bmotionstudio.rodin/META-INF/MANIFEST.MF
@@ -2,8 +2,8 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: BMotion Studio Rodin Integration
 Bundle-SymbolicName: de.bmotionstudio.rodin;singleton:=true
-Bundle-Version: 1.0.3.qualifier
-Fragment-Host: de.bmotionstudio.gef.editor;bundle-version="5.2.1"
+Bundle-Version: 1.1.0.qualifier
+Fragment-Host: de.bmotionstudio.gef.editor;bundle-version="[5.4.0,5.5.0)"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-Vendor: HHU Düsseldorf STUPS Group
 Require-Bundle: org.eclipse.ui.navigator;bundle-version="3.5.0"
diff --git a/de.prob.core/.classpath b/de.prob.core/.classpath
index 9b292107a7a905968274c717bb253ca02e3913f2..bb1ae0592818db067d6599e1a8f034a51349b613 100644
--- a/de.prob.core/.classpath
+++ b/de.prob.core/.classpath
@@ -1,5 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/commons-codec-1.6.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/xmlpull-1.1.3.1.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/xpp3_min-1.1.4c.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/xstream-1.4.3.jar"/>
 	<classpathentry exported="true" kind="lib" path="lib/dependencies/answerparser-2.4.8-SNAPSHOT.jar"/>
 	<classpathentry exported="true" kind="lib" path="lib/dependencies/bparser-2.4.8-SNAPSHOT.jar"/>
 	<classpathentry exported="true" kind="lib" path="lib/dependencies/cliparser-2.4.8-SNAPSHOT.jar"/>
diff --git a/de.prob.core/META-INF/MANIFEST.MF b/de.prob.core/META-INF/MANIFEST.MF
index 6a32a3132ab653879abc7ac6275c5fed636406a5..19b5b62d17480bed9c3f25d0175bd4f9c014e861 100644
--- a/de.prob.core/META-INF/MANIFEST.MF
+++ b/de.prob.core/META-INF/MANIFEST.MF
@@ -2,16 +2,35 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: ProB Animator Core
 Bundle-SymbolicName: de.prob.core;singleton:=true
-Bundle-Version: 9.2.2.qualifier
+Bundle-Version: 9.3.0.qualifier
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
  org.rodinp.core;bundle-version="[1.3.1,1.7.0)",
- org.eventb.core;bundle-version="[2.1.0,2.6.0)",
- org.eventb.emf.core;bundle-version="2.2.4",
- org.eventb.emf.persistence;bundle-version="2.4.0"
+ org.eventb.core;bundle-version="[2.1.0,2.6.0)"
 Bundle-ActivationPolicy: lazy
 Eclipse-BundleShape: dir
 Bundle-Vendor: HHU Düsseldorf STUPS Group
-Export-Package: de.be4.classicalb.core.parser,
+Export-Package: com.thoughtworks.xstream,
+ com.thoughtworks.xstream.annotations,
+ com.thoughtworks.xstream.converters,
+ com.thoughtworks.xstream.converters.basic,
+ com.thoughtworks.xstream.converters.collections,
+ com.thoughtworks.xstream.converters.enums,
+ com.thoughtworks.xstream.converters.extended,
+ com.thoughtworks.xstream.converters.javabean,
+ com.thoughtworks.xstream.converters.reflection,
+ com.thoughtworks.xstream.core,
+ com.thoughtworks.xstream.core.util,
+ com.thoughtworks.xstream.io,
+ com.thoughtworks.xstream.io.binary,
+ com.thoughtworks.xstream.io.copy,
+ com.thoughtworks.xstream.io.json,
+ com.thoughtworks.xstream.io.naming,
+ com.thoughtworks.xstream.io.path,
+ com.thoughtworks.xstream.io.xml,
+ com.thoughtworks.xstream.io.xml.xppdom,
+ com.thoughtworks.xstream.mapper,
+ com.thoughtworks.xstream.persistence,
+ de.be4.classicalb.core.parser,
  de.be4.classicalb.core.parser.analysis,
  de.be4.classicalb.core.parser.analysis.checking,
  de.be4.classicalb.core.parser.analysis.pragma,
@@ -40,6 +59,7 @@ Export-Package: de.be4.classicalb.core.parser,
  de.be4.ltl.core.parser.node,
  de.be4.ltl.core.parser.parser,
  de.hhu.stups.sablecc.patch,
+ de.prob.animator.domainobjects,
  de.prob.cli,
  de.prob.cli.clipatterns,
  de.prob.cliparser,
@@ -62,9 +82,10 @@ Export-Package: de.be4.classicalb.core.parser,
  de.prob.eventb.translator,
  de.prob.eventb.translator.flow,
  de.prob.eventb.translator.internal,
- de.prob.eventb.translator2,
  de.prob.exceptions,
  de.prob.logging,
+ de.prob.model.eventb,
+ de.prob.model.representation,
  de.prob.parser,
  de.prob.parserbase,
  de.prob.prolog.match,
@@ -102,4 +123,8 @@ Bundle-ClassPath: .,
  lib/dependencies/ltlparser-2.4.8-SNAPSHOT.jar,
  lib/dependencies/parserbase-2.4.8-SNAPSHOT.jar,
  lib/dependencies/prologlib-2.4.8-SNAPSHOT.jar,
- lib/dependencies/unicode-2.4.8-SNAPSHOT.jar
+ lib/dependencies/unicode-2.4.8-SNAPSHOT.jar,
+ lib/dependencies/commons-codec-1.6.jar,
+ lib/dependencies/xmlpull-1.1.3.1.jar,
+ lib/dependencies/xpp3_min-1.1.4c.jar,
+ lib/dependencies/xstream-1.4.3.jar
diff --git a/de.prob.core/build.gradle b/de.prob.core/build.gradle
index 0060cb63a4b4e9bbe1f29423d733d0a2427b4672..82ad7bd0a0355e26c646e7ab8a31e8f5fb3d5234 100644
--- a/de.prob.core/build.gradle
+++ b/de.prob.core/build.gradle
@@ -1,12 +1,5 @@
 apply plugin: 'java'
 
-repositories {
-	maven {
-	  name "cobra"
-	  url "http://cobra.cs.uni-duesseldorf.de/artifactory/repo"
-	}
-}
-
 
 def parser_version = '2.4.8-SNAPSHOT'
 
@@ -21,4 +14,5 @@ dependencies {
  compile 'jgrapht:jgrapht:0.8.3'
  compile 'commons-lang:commons-lang:2.6'
  compile 'commons-codec:commons-codec:1.6'
+ compile 'com.thoughtworks.xstream:xstream:1.4.3'
 }
\ No newline at end of file
diff --git a/de.prob.core/build.properties b/de.prob.core/build.properties
index 0a0b45bd564599a42834dd45e0bf74c1ad95c26b..1a6cddddba5661de2f965051163daed933d90407 100644
--- a/de.prob.core/build.properties
+++ b/de.prob.core/build.properties
@@ -4,6 +4,10 @@ bin.includes = META-INF/,\
                plugin.xml,\
                .,\
                prob/,\
-               lib/
+               lib/,\
+               lib/dependencies/commons-codec-1.6.jar,\
+               lib/dependencies/xmlpull-1.1.3.1.jar,\
+               lib/dependencies/xpp3_min-1.1.4c.jar,\
+               lib/dependencies/xstream-1.4.3.jar
              
 
diff --git a/de.prob.core/prob_target.target b/de.prob.core/prob_target.target
index ca09102f4cfa71d2e0890c1c81d8c16e77d027d3..24f85841a5e6d301b9de4502a08e94175bf68ca4 100644
--- a/de.prob.core/prob_target.target
+++ b/de.prob.core/prob_target.target
@@ -1,35 +1,25 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?pde version="3.6"?>
-
-<target name="prob_target" sequenceNumber="18">
-<locations>
-<location includeAllPlatforms="false" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eclipse.equinox.p2.extras.feature.feature.group" version="1.0.1.v20110906-1605-7A4FD4DiVOMap8cHSc6vPuny4gqO"/>
-<unit id="org.eclipse.help.feature.group" version="1.3.0.v20110530-0844-7i7uFFmFFl8nvqbDpEqTvx"/>
-<unit id="org.eclipse.platform.feature.group" version="3.7.2.v20120207-1839-9gF7UHPDFxGjd-PqDr2jX_4yKaumkoHTz04_q-q"/>
-<unit id="org.eclipse.equinox.executable.feature.group" version="3.5.1.v20111216-1653-7P7NFUIFIbaUcU77s0KQWHw5HZTZ"/>
-<unit id="org.eclipse.rcp.feature.group" version="3.7.2.v20120120-1424-9DB5FmnFq5JCf1UA38R-kz0S0272"/>
-<unit id="org.eclipse.emf.edit.feature.group" version="2.7.2.v20120130-0943"/>
-<unit id="org.eclipse.equinox.p2.core.feature.feature.group" version="1.0.1.v20110906-1605-8290FZ9FVKHVRKtmx3fpNuo02129"/>
-<unit id="org.eclipse.equinox.p2.user.ui.feature.group" version="2.1.2.R37x_v20110815-1155-6-Bk8pYWZz0qUTX5I15GZWwbXkrl"/>
-<unit id="org.eclipse.equinox.p2.rcp.feature.feature.group" version="1.0.1.v20110906-1605-782EqBqNKGVkiV-PUsgz-uny4gqO"/>
-<unit id="org.eventb.ide.feature.group" version="2.5.0.r14636"/>
-<unit id="fr.systerel.editor.feature.group" version="0.6.2.r14636"/>
-<unit id="org.rodinp.feature.group" version="1.6.0.r14636"/>
-<unit id="org.rodinp.platform.product" version="2.5.0.r14636"/>
-<unit id="org.rodinp.platform.feature.group" version="2.5.0.r14636"/>
-<unit id="org.rodinp.platform.product.root.feature.feature.group" version="2.5.0.r14636"/>
-<repository location="http://rodin-b-sharp.sourceforge.net/core-updates"/>
-</location>
-<location includeAllPlatforms="false" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eclipse.gef.feature.group" version="3.7.2.v20110927-2020-777D381B4Bz0755B465D34242"/>
-<unit id="org.eclipse.gef.sdk.feature.group" version="3.7.2.v20110927-2020-7G7W77A5WNgIRPdWXDIbNTSQPdQL"/>
-<repository location="http://download.eclipse.org/releases/indigo/"/>
-</location>
-<location includeAllPlatforms="false" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="ac.soton.eventb.emf.core.extension.feature.feature.group" version="1.3.0.201206030057"/>
-<unit id="org.eventb.emf.feature.feature.group" version="3.7.0.201204300914"/>
-<repository location="http://rodin-b-sharp.sourceforge.net/updates"/>
-</location>
-</locations>
-</target>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde version="3.8"?><target name="prob_target" sequenceNumber="18">
+<locations>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+<unit id="org.eventb.ide.feature.group" version="2.7.0.r15250"/>
+<unit id="fr.systerel.editor.feature.group" version="0.6.4.r15250"/>
+<unit id="org.rodinp.feature.group" version="1.6.0.r15250"/>
+<unit id="org.rodinp.platform.product" version="2.7.0.r15250"/>
+<unit id="org.rodinp.platform.feature.group" version="2.7.0.r15250"/>
+<unit id="org.rodinp.platform.product.root.feature.feature.group" version="2.7.0.r15250"/>
+<repository location="http://rodin-b-sharp.sourceforge.net/core-updates"/>
+</location>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+<unit id="org.eclipse.emf.sdk.feature.group" version="2.7.2.v20120130-0943"/>
+<unit id="org.eclipse.equinox.sdk.feature.group" version="3.7.1.R37x_v20110907-7M7W8i8eNV4WsRkue-4Vq4J6pCyW"/>
+<unit id="org.eclipse.gef.sdk.feature.group" version="3.7.2.v20110927-2020-7G7W77A5WNgIRPdWXDIbNTSQPdQL"/>
+<repository location="http://download.eclipse.org/releases/indigo/"/>
+</location>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+<unit id="ac.soton.eventb.emf.core.extension.feature.feature.group" version="1.3.0.201206030057"/>
+<unit id="org.eventb.emf.feature.feature.group" version="3.7.0.201204300914"/>
+<repository location="http://rodin-b-sharp.sourceforge.net/updates"/>
+</location>
+</locations>
+</target>
diff --git a/de.prob.core/src/de/prob/animator/domainobjects/EvalElementType.java b/de.prob.core/src/de/prob/animator/domainobjects/EvalElementType.java
new file mode 100644
index 0000000000000000000000000000000000000000..95ff5f1c565a45e6fb653173cec26c0fce64c756
--- /dev/null
+++ b/de.prob.core/src/de/prob/animator/domainobjects/EvalElementType.java
@@ -0,0 +1,11 @@
+package de.prob.animator.domainobjects;
+
+public enum EvalElementType {
+	PREDICATE, EXPRESSION;
+
+	@Override
+	public String toString() {
+		return "#" + super.toString();
+	}
+
+}
diff --git a/de.prob.core/src/de/prob/animator/domainobjects/IEvalElement.java b/de.prob.core/src/de/prob/animator/domainobjects/IEvalElement.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6fd3f173ba64ae683f5e37d33ced493d3969fb7
--- /dev/null
+++ b/de.prob.core/src/de/prob/animator/domainobjects/IEvalElement.java
@@ -0,0 +1,11 @@
+package de.prob.animator.domainobjects;
+
+import de.prob.prolog.output.IPrologTermOutput;
+
+public interface IEvalElement {
+	public abstract String getCode();
+
+	public abstract void printProlog(IPrologTermOutput pout);
+
+	public abstract String getKind();
+}
diff --git a/de.prob.core/src/de/prob/core/Animator.java b/de.prob.core/src/de/prob/core/Animator.java
index d2dd609caaf34354117bf0cf0de778a5e2c5d5c4..e78a5611b36a4821ca7e01fd01fdc0075bfba21c 100644
--- a/de.prob.core/src/de/prob/core/Animator.java
+++ b/de.prob.core/src/de/prob/core/Animator.java
@@ -24,6 +24,7 @@ import de.prob.core.internal.ServerTraceConnection;
 import de.prob.core.internal.TraceConnectionProvider;
 import de.prob.exceptions.ProBException;
 
+
 /**
  * Animator is a singleton Proxy used to communicate with ProB. The method
  * {@link Animator#getAnimator()} returns the current instance, that can be used
@@ -337,4 +338,6 @@ public final class Animator {
 	public  void sendUserInterruptSignal() {
 		if (implementation != null) implementation.sendUserInterruptSignal();
 	}
+	
+
 }
diff --git a/de.prob.core/src/de/prob/core/langdep/EventBAnimatorPart.java b/de.prob.core/src/de/prob/core/langdep/EventBAnimatorPart.java
index 6a91648f7f008b0cdc7d4c651554e0f9fcba1314..c19e65af4bc6ee1b3faba6410831d3cee874c8c2 100644
--- a/de.prob.core/src/de/prob/core/langdep/EventBAnimatorPart.java
+++ b/de.prob.core/src/de/prob/core/langdep/EventBAnimatorPart.java
@@ -10,8 +10,10 @@ import java.util.List;
 import java.util.Set;
 
 import org.apache.commons.lang.ObjectUtils;
+import org.eventb.core.IContextRoot;
 import org.eventb.core.IEventBRoot;
 import org.eventb.core.IMachineRoot;
+import org.eventb.core.ISCContextRoot;
 import org.eventb.core.ISCEvent;
 import org.eventb.core.ISCIdentifierElement;
 import org.eventb.core.ISCMachineRoot;
@@ -60,8 +62,7 @@ public class EventBAnimatorPart implements LanguageDependendAnimationPart {
 	public void parseExpression(final IPrologTermOutput pto,
 			final String expression1, final boolean wrap)
 			throws ProBParseException {
-		final String expression = FormulaTranslator.translate(
-				expression1);
+		final String expression = FormulaTranslator.translate(expression1);
 		final FormulaFactory ff = FormulaFactory.getDefault();
 		final IParseResult parseResult = ff.parseExpression(expression,
 				LanguageVersion.LATEST, null);
@@ -77,8 +78,7 @@ public class EventBAnimatorPart implements LanguageDependendAnimationPart {
 	public void parsePredicate(final IPrologTermOutput pto,
 			final String predicate1, final boolean wrap)
 			throws ProBParseException {
-		final String predicate = FormulaTranslator.translate(
-				predicate1);
+		final String predicate = FormulaTranslator.translate(predicate1);
 		final FormulaFactory ff = FormulaFactory.getDefault();
 		final IParseResult parseResult = ff.parsePredicate(predicate,
 				LanguageVersion.LATEST, null);
@@ -127,9 +127,18 @@ public class EventBAnimatorPart implements LanguageDependendAnimationPart {
 
 	private ITypeEnvironment getTypeEnvironment(final FormulaFactory ff)
 			throws ProBParseException {
-		final ITypeEnvironment typeEnv;
+		ITypeEnvironment typeEnv = null;
+
 		try {
-			typeEnv = root.getSCMachineRoot().getTypeEnvironment(ff);
+			if (root instanceof IMachineRoot)
+				typeEnv = root.getSCMachineRoot().getTypeEnvironment(ff);
+			if (root instanceof ISCMachineRoot)
+				typeEnv = root.getSCMachineRoot().getTypeEnvironment(ff);
+			if (root instanceof IContextRoot)
+				typeEnv = root.getSCContextRoot().getTypeEnvironment(ff);
+			if (root instanceof ISCContextRoot)
+				typeEnv = root.getSCContextRoot().getTypeEnvironment(ff);
+
 		} catch (RodinDBException e) {
 			throw rodin2parseException(e);
 		}
@@ -190,8 +199,7 @@ public class EventBAnimatorPart implements LanguageDependendAnimationPart {
 
 	private Predicate parseTransPredicate(final String predicateString,
 			final ISCEvent event) throws ProBParseException {
-		final String utf8String = FormulaTranslator.translate(
-				predicateString);
+		final String utf8String = FormulaTranslator.translate(predicateString);
 		final FormulaFactory ff = FormulaFactory.getDefault();
 		final IParseResult parseResult = ff.parsePredicate(utf8String,
 				LanguageVersion.LATEST, null);
diff --git a/de.prob.core/src/de/prob/eventb/translator2/EMFEventBTranslator.java b/de.prob.core/src/de/prob/eventb/translator2/EMFEventBTranslator.java
deleted file mode 100644
index 828469e7652b0f8453cf1c43a1404e66ee8cd8c1..0000000000000000000000000000000000000000
--- a/de.prob.core/src/de/prob/eventb/translator2/EMFEventBTranslator.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package de.prob.eventb.translator2;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eventb.core.IEventBRoot;
-import org.eventb.emf.core.EventBNamedCommentedComponentElement;
-import org.eventb.emf.core.Project;
-import org.eventb.emf.core.context.CarrierSet;
-import org.eventb.emf.core.context.Context;
-import org.eventb.emf.core.machine.Machine;
-import org.eventb.emf.persistence.ProjectResource;
-import org.rodinp.core.IRodinProject;
-
-import de.be4.classicalb.core.parser.node.ADeferredSetSet;
-import de.be4.classicalb.core.parser.node.PSet;
-import de.be4.classicalb.core.parser.node.TIdentifierLiteral;
-import de.prob.prolog.output.IPrologTermOutput;
-
-public class EMFEventBTranslator {
-	private final Project project;
-
-	public EMFEventBTranslator(IEventBRoot main) {
-		IRodinProject rodinProject = main.getRodinProject();
-		ProjectResource resource = new ProjectResource(rodinProject);
-		try {
-			resource.load(null);
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		project = (Project) resource.getContents().get(0);
-	}
-
-	public void print(IPrologTermOutput pto) {
-		for (EventBNamedCommentedComponentElement e : project.getComponents()) {
-			if (e instanceof Context) {
-				printContext(pto, (Context) e);
-			} else {
-				printMachine(pto, (Machine) e);
-			}
-		}
-	}
-
-	public void printContext(IPrologTermOutput pto, Context c) {
-		EList<CarrierSet> sets = c.getSets();
-		final List<PSet> setList = new ArrayList<PSet>(sets.size());
-		for (CarrierSet s : sets) {
-			final ADeferredSetSet deferredSet = new ADeferredSetSet(
-					Arrays.asList(new TIdentifierLiteral[] { new TIdentifierLiteral(
-							s.getName()) }));
-			setList.add(deferredSet);
-		}
-
-	}
-
-	public void printMachine(IPrologTermOutput pto, Machine m) {
-
-	}
-
-}
diff --git a/de.prob.core/src/de/prob/model/eventb/Action.java b/de.prob.core/src/de/prob/model/eventb/Action.java
new file mode 100644
index 0000000000000000000000000000000000000000..6eb7c43c99c049fc6328e4e4645e712c2b5efcbe
--- /dev/null
+++ b/de.prob.core/src/de/prob/model/eventb/Action.java
@@ -0,0 +1,36 @@
+package de.prob.model.eventb;
+
+import java.util.Collections;
+import java.util.List;
+
+import de.prob.model.representation.IEntity;
+
+public class Action implements IEntity {
+
+	private final String code;
+	private final String name;
+
+	public Action(String code, String name) {
+		this.code = code;
+		this.name = name;
+	}
+
+	@Override
+	public List<IEntity> getChildren() {
+		return Collections.emptyList();
+	}
+
+	@Override
+	public boolean hasChildren() {
+		return false;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+}
diff --git a/de.prob.core/src/de/prob/model/eventb/EBContext.java b/de.prob.core/src/de/prob/model/eventb/EBContext.java
new file mode 100644
index 0000000000000000000000000000000000000000..9cb041b0e403f340bfd0840b877eb3dc2092a71a
--- /dev/null
+++ b/de.prob.core/src/de/prob/model/eventb/EBContext.java
@@ -0,0 +1,33 @@
+package de.prob.model.eventb;
+
+import java.util.Arrays;
+
+import de.prob.model.representation.IEntity;
+import de.prob.model.representation.Label;
+
+public class EBContext extends Label {
+
+	public Label sets = new Label("Sets");
+	public Label constants = new Label("Constants");
+	public Label axioms = new Label("Axioms");
+
+	public EBContext(final String name) {
+		super(name);
+
+		children.addAll(Arrays
+				.asList(new IEntity[] { sets, constants, axioms }));
+	}
+
+	public void addSet(final String set) {
+		sets.addChild(new EventB(set));
+	}
+
+	public void addConstant(final String constant) {
+		constants.addChild(new EventB(constant));
+	}
+
+	public void addAxiom(final String axiom, String aname) {
+		axioms.addChild(new EventB(axiom,aname));
+	}
+
+}
diff --git a/de.prob.core/src/de/prob/model/eventb/EBEvent.java b/de.prob.core/src/de/prob/model/eventb/EBEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..12139186dd80a9ee2e47659b24156232fe98effb
--- /dev/null
+++ b/de.prob.core/src/de/prob/model/eventb/EBEvent.java
@@ -0,0 +1,46 @@
+package de.prob.model.eventb;
+
+import java.util.Arrays;
+
+import de.prob.model.representation.IEntity;
+import de.prob.model.representation.Label;
+
+public class EBEvent extends Label {
+
+	final public Label refines = new Label("REFINES");
+	final public Label parameters = new Label("ANY");
+	final public Label guards = new Label("WHERE");
+	final public Label witnesses = new Label("WITH");
+	final public Label actions = new Label("THEN");
+
+	public EBEvent(final String name) {
+		super(name);
+		children.addAll(Arrays.asList(new IEntity[] { refines, parameters,
+				guards }));
+	}
+
+	@Override
+	public String toString() {
+		return name;
+	}
+
+	public void addRefinement(final String refinementName) {
+		refines.addChild(new Label(refinementName));
+	}
+
+	public void addParameter(final String parameter) {
+		parameters.addChild(new EventB(parameter));
+	}
+
+	public void addGuard(final String guard, String gname) {
+		guards.addChild(new EventB(guard,gname));
+	}
+
+	public void addWitness(final String witness,String wname) {
+		witnesses.addChild(new EventB(witness,wname));
+	}
+
+	public void addAction(final String action, String aname) {
+		actions.addChild(new Action(action, aname));
+	}
+}
diff --git a/de.prob.core/src/de/prob/model/eventb/EBMachine.java b/de.prob.core/src/de/prob/model/eventb/EBMachine.java
new file mode 100644
index 0000000000000000000000000000000000000000..08bbcfd6dee64c10e0d8cf52a8538755b74eb9b8
--- /dev/null
+++ b/de.prob.core/src/de/prob/model/eventb/EBMachine.java
@@ -0,0 +1,36 @@
+package de.prob.model.eventb;
+
+import java.util.Arrays;
+
+import de.prob.model.representation.IEntity;
+import de.prob.model.representation.Label;
+
+public class EBMachine extends Label {
+
+	final public Label variables = new Label("Variables");
+	final public Label invariants = new Label("Invariants");
+	final public Label variant = new Label("Variant");
+	final public Label events = new Label("Events");
+
+	public EBMachine(final String name) {
+		super(name);
+		children.addAll(Arrays.asList(new IEntity[] { variables, invariants,
+				variant, events }));
+	}
+
+	public void addVariable(final String variable) {
+		variables.addChild(new EventB(variable));
+	}
+
+	public void addInvariant(final String invariant, String iname) {
+		invariants.addChild(new EventB(invariant, iname));
+	}
+
+	public void addVariant(final String variant) {
+		this.variant.addChild(new EventB(variant));
+	}
+
+	public void addEvent(final EBEvent event) {
+		events.addChild(event);
+	}
+}
diff --git a/de.prob.core/src/de/prob/model/eventb/EventB.java b/de.prob.core/src/de/prob/model/eventb/EventB.java
new file mode 100644
index 0000000000000000000000000000000000000000..c3f7ae108bcbbab9ba1e927b5be15d23c333b7e1
--- /dev/null
+++ b/de.prob.core/src/de/prob/model/eventb/EventB.java
@@ -0,0 +1,132 @@
+package de.prob.model.eventb;
+
+import static de.prob.animator.domainobjects.EvalElementType.EXPRESSION;
+import static de.prob.animator.domainobjects.EvalElementType.PREDICATE;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eventb.core.ast.ASTProblem;
+import org.eventb.core.ast.Expression;
+import org.eventb.core.ast.FormulaFactory;
+import org.eventb.core.ast.IParseResult;
+import org.eventb.core.ast.LanguageVersion;
+import org.eventb.core.ast.Predicate;
+
+import de.prob.animator.domainobjects.IEvalElement;
+import de.prob.eventb.translator.ExpressionVisitor;
+import de.prob.eventb.translator.PredicateVisitor;
+import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog;
+import de.be4.classicalb.core.parser.node.Node;
+import de.prob.model.representation.FormulaUUID;
+import de.prob.model.representation.IEntity;
+import de.prob.prolog.output.IPrologTermOutput;
+import de.prob.unicode.UnicodeTranslator;
+
+public class EventB implements IEvalElement, IEntity {
+
+	public FormulaUUID uuid = new FormulaUUID();
+
+	private final String code;
+	private String kind;
+	private Node ast = null;
+
+	private final String name;
+
+	public EventB(final String code, String name) {
+		this.code = code;
+		this.name = name;
+	}
+
+	public EventB(String code) {
+		this(code, "");
+	}
+
+	private void ensureParsed() {
+		final String unicode = UnicodeTranslator.toUnicode(code);
+		kind = PREDICATE.toString();
+		IParseResult parseResult = FormulaFactory.getDefault().parsePredicate(
+				unicode, LanguageVersion.LATEST, null);
+
+		if (!parseResult.hasProblem()) {
+			ast = preparePredicateAst(parseResult);
+
+		} else {
+			kind = EXPRESSION.toString();
+			parseResult = FormulaFactory.getDefault().parseExpression(unicode,
+					LanguageVersion.LATEST, null);
+			ast = prepareExpressionAst(parseResult);
+		}
+		if (parseResult.hasProblem()) {
+			throwException(code, parseResult);
+		}
+	}
+
+	private Node prepareExpressionAst(final IParseResult parseResult) {
+		final Expression expr = parseResult.getParsedExpression();
+		final ExpressionVisitor visitor = new ExpressionVisitor(
+				new LinkedList<String>());
+		expr.accept(visitor);
+		final Node expression = visitor.getExpression();
+		return expression;
+	}
+
+	private Node preparePredicateAst(final IParseResult parseResult) {
+		final Predicate parsedPredicate = parseResult.getParsedPredicate();
+		final PredicateVisitor visitor = new PredicateVisitor();
+		parsedPredicate.accept(visitor);
+		return visitor.getPredicate();
+	}
+
+	private void throwException(final String code,
+			final IParseResult parseResult) {
+		final List<ASTProblem> problems = parseResult.getProblems();
+		final ArrayList<String> msgs = new ArrayList<String>();
+		for (final ASTProblem astProblem : problems) {
+			msgs.add(astProblem.getMessage().toString());
+		}
+		StringBuilder sb = new StringBuilder();
+		for (String string : msgs) {
+			sb.append(string + "\n");
+		}
+		final String error = sb.toString();
+		throw new RuntimeException("Cannot parse " + code + ":\n " + error); // FIXME
+	}
+
+	@Override
+	public String getCode() {
+		return code;
+	}
+
+	@Override
+	public void printProlog(final IPrologTermOutput pout) {
+		if (ast == null) {
+			ensureParsed();
+		}
+
+		assert ast != null;
+		final ASTProlog prolog = new ASTProlog(pout, null);
+		ast.apply(prolog);
+	}
+
+	@Override
+	public String getKind() {
+		return kind;
+	}
+
+	@Override
+	public List<IEntity> getChildren() {
+		return new ArrayList<IEntity>();
+	}
+
+	@Override
+	public boolean hasChildren() {
+		return false;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+}
diff --git a/de.prob.core/src/de/prob/model/eventb/Model.java b/de.prob.core/src/de/prob/model/eventb/Model.java
new file mode 100644
index 0000000000000000000000000000000000000000..f835034bddb9f8f27e5ba758f2a4f20e58f45013
--- /dev/null
+++ b/de.prob.core/src/de/prob/model/eventb/Model.java
@@ -0,0 +1,22 @@
+package de.prob.model.eventb;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import de.prob.model.representation.Label;
+import de.prob.model.representation.RefType.ERefType;
+
+public class Model {
+
+	public final String serialization_version = "1";
+	public final String name;
+	public final List<Relationship> relationships = new ArrayList<Relationship>();
+
+	public Model(String name) {
+		this.name = name;
+	}
+
+	public void addRelationship(final Label from, final Label to, ERefType type) {
+		relationships.add(new Relationship(from, to,type));
+	}
+}
diff --git a/de.prob.core/src/de/prob/model/eventb/Relationship.java b/de.prob.core/src/de/prob/model/eventb/Relationship.java
new file mode 100644
index 0000000000000000000000000000000000000000..09b5a098ce8b29279fd1077257ae02726c28e566
--- /dev/null
+++ b/de.prob.core/src/de/prob/model/eventb/Relationship.java
@@ -0,0 +1,17 @@
+package de.prob.model.eventb;
+
+import de.prob.model.representation.Label;
+import de.prob.model.representation.RefType.ERefType;
+
+public class Relationship {
+
+	public final Label from;
+	public final Label to;
+	public final ERefType type;
+
+	public Relationship(Label from, Label to, ERefType type) {
+		this.from = from;
+		this.to = to;
+		this.type = type;
+	}
+}
diff --git a/de.prob.core/src/de/prob/model/representation/FormulaUUID.java b/de.prob.core/src/de/prob/model/representation/FormulaUUID.java
new file mode 100644
index 0000000000000000000000000000000000000000..d84d6c7f28c2e427f674ea6a367dda9f9beb7056
--- /dev/null
+++ b/de.prob.core/src/de/prob/model/representation/FormulaUUID.java
@@ -0,0 +1,6 @@
+package de.prob.model.representation;
+
+public class FormulaUUID {
+	static int count = 0;
+	public final String uuid = "Formula_" + (++count);
+}
diff --git a/de.prob.core/src/de/prob/model/representation/IEntity.java b/de.prob.core/src/de/prob/model/representation/IEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..3510e37438070920160fdbb9b10f6be26f898edc
--- /dev/null
+++ b/de.prob.core/src/de/prob/model/representation/IEntity.java
@@ -0,0 +1,9 @@
+package de.prob.model.representation;
+
+import java.util.List;
+
+public interface IEntity {
+	public List<IEntity> getChildren();
+
+	public boolean hasChildren();
+}
diff --git a/de.prob.core/src/de/prob/model/representation/Label.java b/de.prob.core/src/de/prob/model/representation/Label.java
new file mode 100644
index 0000000000000000000000000000000000000000..88cb1ed729d911c29346db006d7bef0fc132433c
--- /dev/null
+++ b/de.prob.core/src/de/prob/model/representation/Label.java
@@ -0,0 +1,48 @@
+package de.prob.model.representation;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class Label implements IEntity {
+
+	public List<IEntity> children = new ArrayList<IEntity>();
+	protected String name;
+	private boolean locked = false;
+
+	public Label(final String name) {
+		this.name = name;
+	}
+
+	public void addChild(final IEntity child) {
+		if (!locked) {
+			children.add(child);
+		}
+	}
+
+	@Override
+	public List<IEntity> getChildren() {
+		if (locked) {
+			return Collections.unmodifiableList(children);
+		}
+		return children;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void lock() {
+		locked = true;
+		for (final IEntity child : children) {
+			if (child instanceof Label) {
+				((Label) child).lock();
+			}
+		}
+	}
+
+	@Override
+	public boolean hasChildren() {
+		return !children.isEmpty();
+	}
+}
diff --git a/de.prob.core/src/de/prob/model/representation/RefType.java b/de.prob.core/src/de/prob/model/representation/RefType.java
new file mode 100644
index 0000000000000000000000000000000000000000..192a8a4aafe21eb232ada4f0045f5b0c4e6e2b1d
--- /dev/null
+++ b/de.prob.core/src/de/prob/model/representation/RefType.java
@@ -0,0 +1,28 @@
+package de.prob.model.representation;
+
+public class RefType {
+	private final ERefType relationship;
+
+	/*
+	 * RefType is used for both ClassicalBModels and EventBModels
+	 * 
+	 * ClassicalB: SEES, USES, REFINES, INCLUDES, IMPORTS EventB: SEES, REFINES,
+	 * EXTENDS
+	 */
+	public enum ERefType {
+		SEES, USES, REFINES, INCLUDES, IMPORTS, EXTENDS
+	}
+
+	public RefType(final ERefType relationship) {
+		this.relationship = relationship;
+	}
+
+	@Override
+	public String toString() {
+		return relationship.toString();
+	}
+
+	public ERefType getRelationship() {
+		return relationship;
+	}
+}
diff --git a/de.prob.plugin/META-INF/MANIFEST.MF b/de.prob.plugin/META-INF/MANIFEST.MF
index 24202af6eb41c3f85b4e1d5345dda77b95a4de61..35b77a2148d75ceb3a3c4b74cc62234c662a31f3 100644
--- a/de.prob.plugin/META-INF/MANIFEST.MF
+++ b/de.prob.plugin/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: ProB Rodin2 UI Bindings
 Bundle-SymbolicName: de.prob.plugin;singleton:=true
-Bundle-Version: 2.1.3.qualifier
-Fragment-Host: de.prob.ui;bundle-version="[7.2.0,7.3.0)"
+Bundle-Version: 2.2.0.qualifier
+Fragment-Host: de.prob.ui;bundle-version="[7.3.0,7.4.0)"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-Vendor: HHU Düsseldorf STUPS Group
diff --git a/de.prob.releng/settings.gradle b/de.prob.releng/settings.gradle
deleted file mode 100644
index 6adc11aac0a469b88119640e8fc4859ad0e48fa3..0000000000000000000000000000000000000000
--- a/de.prob.releng/settings.gradle
+++ /dev/null
@@ -1 +0,0 @@
-include 'de.prob.core', 'de.bmotionstudio.gef.editor' ,'de.bmotionstudio.rodin', 'de.prob.plugin', 'de.prob.ui', 'de.prob2.feature'
\ No newline at end of file
diff --git a/de.prob.ui/META-INF/MANIFEST.MF b/de.prob.ui/META-INF/MANIFEST.MF
index 0ab9a6cf07669d654268e69b8f68c9b0964f3c49..0292f6b17151194d687a1bdffa1d3ffd3a2a4e35 100644
--- a/de.prob.ui/META-INF/MANIFEST.MF
+++ b/de.prob.ui/META-INF/MANIFEST.MF
@@ -2,17 +2,15 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: ProB Ui Plug-in
 Bundle-SymbolicName: de.prob.ui;singleton:=true
-Bundle-Version: 7.2.2.qualifier
+Bundle-Version: 7.3.0.qualifier
 Require-Bundle: org.eclipse.ui;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.ui.ide;bundle-version="[3.5.0,4.0.0)",
- de.prob.core;bundle-version="[9.2.0,9.3.0)",
+ de.prob.core;bundle-version="[9.3.0,9.4.0)",
  org.eventb.core;bundle-version="[2.1.0,2.6.0)",
  org.eclipse.core.expressions;bundle-version="[3.4.101,4.0.0)",
- org.eclipse.gef;bundle-version="[3.5.0,4.0.0)",
- org.eventb.emf.core;bundle-version="2.2.4",
- org.eventb.emf.persistence;bundle-version="2.4.0"
+ org.eclipse.gef;bundle-version="[3.5.0,4.0.0)"
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: HHU Düsseldorf STUPS Group
 Bundle-Activator: de.prob.ui.ProbUiPlugin
diff --git a/de.prob.ui/plugin.xml b/de.prob.ui/plugin.xml
index d1b07bd82110aa5b4467bc12b6c9d1cb75165606..a8edde201a3de97737dd4a38086703bde5240114 100644
--- a/de.prob.ui/plugin.xml
+++ b/de.prob.ui/plugin.xml
@@ -284,6 +284,12 @@
          <state class="org.eclipse.jface.commands.ToggleState"
             id="de.prob.ui.stateview.duplicateFilterState" />
       </command>
+      <command
+            id="de.prob.ui.history.toggleShowParameters"
+            name="Show event parameters">
+         <state class="org.eclipse.jface.commands.ToggleState"
+            id="de.prob.ui.history.showParametersState" />
+      </command>
       <command
             id="de.prob.ui.show_parameter_dialog"
             name="Show Parameter Dialog">
@@ -608,6 +614,20 @@
             </with>
          </enabledWhen>
       </handler>
+      <handler
+            commandId="de.prob.ui.history.toggleShowParameters">
+         <class
+               class="de.prob.ui.historyview.ToggleShowParametersHandler">
+         </class>
+         <enabledWhen>
+            <with
+                  variable="de.prob.core.model_loaded">
+               <equals
+                     value="enabled">
+               </equals>
+            </with>
+         </enabledWhen>
+      </handler>
       <handler
             commandId="de.prob.ui.show_parameter_dialog">
          <class
@@ -707,7 +727,7 @@
       <handler
             commandId="de.prob.ui.newcore.export">
          <class
-               class="de.prob.ui.eventb.ExportNewCoreHandler">
+               class="de.prob.ui.eventb.ExportClassicHandler">
          </class>
          <enabledWhen>
             <with
@@ -790,6 +810,15 @@
                style="push">
          </command>
       </menuContribution>
+      <menuContribution
+            locationURI="toolbar:de.prob.ui.HistoryView">
+         <command
+               commandId="de.prob.ui.history.toggleShowParameters"
+               icon="icons/filter_ps.gif"
+               label="Show Parameters"
+               style="toggle">
+         </command>
+      </menuContribution>
       
       <menuContribution
       locationURI="toolbar:de.prob.ui.OperationView">
diff --git a/de.prob.ui/src/de/prob/ui/eventb/ExportNewCoreHandler.java b/de.prob.ui/src/de/prob/ui/eventb/ExportNewCoreHandler.java
index 79af767fe8c25b3e2ebca407f41d4d0d67f11c77..2b2f7f8492fa31ad6c2bc83f345f2bcfbc7767b7 100644
--- a/de.prob.ui/src/de/prob/ui/eventb/ExportNewCoreHandler.java
+++ b/de.prob.ui/src/de/prob/ui/eventb/ExportNewCoreHandler.java
@@ -4,21 +4,14 @@ import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.io.Writer;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
 
-import org.apache.commons.codec.binary.Base64;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.commands.IHandler;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
@@ -28,11 +21,8 @@ import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.handlers.HandlerUtil;
 import org.eventb.core.IEventBRoot;
 import org.eventb.core.IMachineRoot;
-import org.eventb.emf.core.Project;
-import org.eventb.emf.persistence.ProjectResource;
 import org.osgi.service.prefs.BackingStoreException;
 import org.osgi.service.prefs.Preferences;
-import org.rodinp.core.IRodinProject;
 
 import de.prob.core.translator.TranslationFailedException;
 import de.prob.eventb.translator.TranslatorFactory;
@@ -101,15 +91,6 @@ public class ExportNewCoreHandler extends AbstractHandler implements IHandler {
 			final IEventBRoot root) {
 		final boolean isSafeToWrite = isSafeToWrite(filename);
 
-		IRodinProject rodinProject = root.getRodinProject();
-		ProjectResource resource = new ProjectResource(rodinProject);
-		try {
-			resource.load(null);
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		Project project = (Project) resource.getContents().get(0);
-
 		if (isSafeToWrite) {
 			Writer fw = null;
 			try {
@@ -117,9 +98,6 @@ public class ExportNewCoreHandler extends AbstractHandler implements IHandler {
 				TranslatorFactory.translate(root, new PrintWriter(fw));
 				fw.append('\n');
 
-				fw.append("emf_model('" + root.getComponentName() + "',\""
-						+ serialize(project) + "\").");
-
 			} catch (TranslationFailedException e) {
 				e.notifyUserOnce();
 			} catch (IOException e) {
@@ -135,23 +113,25 @@ public class ExportNewCoreHandler extends AbstractHandler implements IHandler {
 		}
 	}
 
-	private static String serialize(Project project) {
-
-		StringWriter sw = new StringWriter();
-		Map<Object, Object> options = new HashMap<Object, Object>();
-		options.put(XMLResource.OPTION_ROOT_OBJECTS,
-				Collections.singletonList(project));
-		options.put(XMLResource.OPTION_FORMATTED, false);
-		XMLResourceImpl ri = new XMLResourceImpl();
-		try {
-			ri.save(sw, options);
-		} catch (IOException e1) {
-			e1.printStackTrace();
-		}
-
-		String xml = Base64.encodeBase64String(sw.toString().getBytes());
-		return xml;
-	}
+	// private static String serialize(Project project, String maincomponent) {
+	// NewCoreModelTranslation translation = new NewCoreModelTranslation();
+	// Model model = translation.translate(project, maincomponent);
+	// // XStream xstream = new XStream(new JettisonMappedXmlDriver());
+	// XStream xstream = new XStream();
+	// String xml = xstream.toXML(model);
+	// ByteArrayOutputStream out = new ByteArrayOutputStream();
+	// GZIPOutputStream gzip;
+	// byte[] bytes;
+	// try {
+	// gzip = new GZIPOutputStream(out);
+	// gzip.write(xml.getBytes());
+	// gzip.close();
+	// bytes = out.toByteArray();
+	// } catch (IOException e) {
+	// bytes = xml.getBytes();
+	// }
+	// return Base64.encodeBase64String(bytes);
+	// }
 
 	private static boolean isSafeToWrite(final String filename) {
 		if (new File(filename).exists()) {
diff --git a/de.prob.ui/src/de/prob/ui/historyview/HistoryEventLabelProvider.java b/de.prob.ui/src/de/prob/ui/historyview/HistoryEventLabelProvider.java
index f407ed98c034bc03d58546d176b7347400f68b28..8f3a80100bec876443f07a8ad0c8866b5066b8a8 100644
--- a/de.prob.ui/src/de/prob/ui/historyview/HistoryEventLabelProvider.java
+++ b/de.prob.ui/src/de/prob/ui/historyview/HistoryEventLabelProvider.java
@@ -1,5 +1,6 @@
 package de.prob.ui.historyview;
 
+import java.util.Collection;
 import java.util.List;
 
 import de.prob.core.domainobjects.Operation;
@@ -27,10 +28,16 @@ class HistoryEventLabelProvider extends HistoryLabelProvider {
 		if (operation != null) {
 			List<EventStackElement> stack = operation.getEventStack();
 			if (stack != null) {
-				result = eventStackPosition < stack.size() ? stack.get(
-						eventStackPosition).getEventName() : null;
+				if (eventStackPosition < stack.size()) {
+					EventStackElement stackElem = stack.get(eventStackPosition);
+					result = printEventWithParameters(stackElem.getEventName(),
+							stackElem.getParameters());
+				} else {
+					result = null;
+				}
 			} else {
-				result = eventStackPosition == 0 ? operation.getName() : null;
+				result = eventStackPosition == 0 ? printEventWithParameters(
+						operation.getName(), operation.getArguments()) : null;
 			}
 		} else {
 			result = eventStackPosition == 0 ? HistoryViewStrings.uninitialisedState
@@ -39,4 +46,27 @@ class HistoryEventLabelProvider extends HistoryLabelProvider {
 		return result == null ? "" : result;
 	}
 
+	private String printEventWithParameters(final String name,
+			final Collection<String> parameters) {
+		final String result;
+		if (!showParameters || parameters.isEmpty()) {
+			result = name;
+		} else {
+			StringBuilder sb = new StringBuilder();
+			sb.append(name);
+			sb.append('(');
+			boolean isFirst = true;
+			for (final String param : parameters) {
+				if (!isFirst) {
+					sb.append(',');
+				}
+				sb.append(param);
+				isFirst = false;
+			}
+			sb.append(')');
+			result = sb.toString();
+		}
+		return result;
+	}
+
 }
\ No newline at end of file
diff --git a/de.prob.ui/src/de/prob/ui/historyview/HistoryLabelProvider.java b/de.prob.ui/src/de/prob/ui/historyview/HistoryLabelProvider.java
index 950d972b0f8b6b732e0bf5c5f2033f0d18e4263b..818e3e2bea695445c1ac6f19f0e9c0bd8abc3e79 100644
--- a/de.prob.ui/src/de/prob/ui/historyview/HistoryLabelProvider.java
+++ b/de.prob.ui/src/de/prob/ui/historyview/HistoryLabelProvider.java
@@ -24,6 +24,8 @@ public abstract class HistoryLabelProvider extends CellLabelProvider {
 	final Font bold = JFaceResources.getFontRegistry().getBold(
 			JFaceResources.BANNER_FONT);
 
+	protected boolean showParameters;
+
 	@Override
 	public void update(final ViewerCell cell) {
 		final Object element = cell.getElement();
@@ -51,4 +53,8 @@ public abstract class HistoryLabelProvider extends CellLabelProvider {
 	protected Color getForeground(final HistViewItem item) {
 		return null;
 	}
+
+	public void setShowParameters(final boolean show) {
+		showParameters = show;
+	}
 }
diff --git a/de.prob.ui/src/de/prob/ui/historyview/HistoryView.java b/de.prob.ui/src/de/prob/ui/historyview/HistoryView.java
index 1b07a0246949381fe9abf814674c00133517f4d5..b6dd099a042da661381d6295ff864e791e9fccd5 100644
--- a/de.prob.ui/src/de/prob/ui/historyview/HistoryView.java
+++ b/de.prob.ui/src/de/prob/ui/historyview/HistoryView.java
@@ -3,6 +3,7 @@
  */
 package de.prob.ui.historyview;
 
+import java.util.ArrayList;
 import java.util.Collection;
 
 import org.apache.commons.lang.ArrayUtils;
@@ -54,6 +55,7 @@ public class HistoryView extends StateBasedViewPart {
 	public static final String VIEW_ID = "de.prob.ui.HistoryView";
 
 	private TableViewer tableViewer;
+	private Collection<HistoryLabelProvider> labelProviders;
 
 	@Override
 	protected Control createStatePartControl(final Composite parent) {
@@ -164,21 +166,23 @@ public class HistoryView extends StateBasedViewPart {
 
 	private void createColumns(final Composite composite) {
 		final Animator animator = Animator.getAnimator();
-		MachineDescription machineDescription = animator.getMachineDescription();
+		MachineDescription machineDescription = animator
+				.getMachineDescription();
 		String[] models = new String[0];
 		if (machineDescription != null) {
-			models = machineDescription
-					.getModelNames().toArray(new String[0]);
+			models = machineDescription.getModelNames().toArray(new String[0]);
 			ArrayUtils.reverse(models);
 		}
 		final TableColumnLayout layout = new TableColumnLayout();
 		composite.setLayout(layout);
+		labelProviders = new ArrayList<HistoryLabelProvider>();
 		if (models.length > 0) {
 			int pos = 0;
 			for (final String model : models) {
 				final boolean isFirst = pos == 0;
-				createColumn(layout, model, new HistoryEventLabelProvider(pos),
-						isFirst);
+				final HistoryEventLabelProvider labelProvider = new HistoryEventLabelProvider(
+						pos);
+				createColumn(layout, model, labelProvider, isFirst);
 				pos++;
 			}
 		} else {
@@ -200,6 +204,7 @@ public class HistoryView extends StateBasedViewPart {
 		final ColumnWeightData weightData = setMinimumSize ? new ColumnWeightData(
 				1, 100) : new ColumnWeightData(1);
 		layout.setColumnData(column, weightData);
+		labelProviders.add(labelProvider);
 	}
 
 	@Override
@@ -320,4 +325,19 @@ public class HistoryView extends StateBasedViewPart {
 		}
 	}
 
+	public void setShowParameters(boolean show) {
+		if (labelProviders != null) {
+			for (HistoryLabelProvider provider : labelProviders) {
+				provider.setShowParameters(show);
+			}
+		}
+		final Runnable runnable = new Runnable() {
+			@Override
+			public void run() {
+				tableViewer.refresh();
+			}
+		};
+		Display.getDefault().asyncExec(runnable);
+	}
+
 }
diff --git a/de.prob.ui/src/de/prob/ui/historyview/ToggleShowParametersHandler.java b/de.prob.ui/src/de/prob/ui/historyview/ToggleShowParametersHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..b907bac3bdeb47b30fb724d337fd6db154bf6d33
--- /dev/null
+++ b/de.prob.ui/src/de/prob/ui/historyview/ToggleShowParametersHandler.java
@@ -0,0 +1,79 @@
+/**
+ * 
+ */
+package de.prob.ui.historyview;
+
+import java.util.Map;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.core.commands.State;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.menus.UIElement;
+import org.eclipse.ui.services.IServiceLocator;
+
+import de.prob.ui.stateview.StateViewPart;
+
+/**
+ * @author plagge
+ * 
+ */
+public class ToggleShowParametersHandler extends AbstractHandler implements
+		IHandler, IElementUpdater {
+	private static final String COMMAND_ID = "de.prob.ui.history.toggleShowParameters";
+	private static final String STATE_ID = "de.prob.ui.history.showParametersState";
+
+	@Override
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		final State state = event.getCommand().getState(STATE_ID);
+		if (state != null) {
+			final boolean newFilterValue = toggleState(state);
+			setShowParameters(newFilterValue);
+		} else
+			throw new ExecutionException("Command state " + STATE_ID
+					+ " not found");
+		return null;
+	}
+
+	private boolean toggleState(final State state) {
+		final Boolean show = (Boolean) state.getValue();
+		state.setValue(!show);
+		return !show;
+	}
+
+	private void setShowParameters(final boolean show)
+			throws ExecutionException {
+		final IWorkbenchPage page = PlatformUI.getWorkbench()
+				.getActiveWorkbenchWindow().getActivePage();
+		final HistoryView view = (HistoryView) page
+				.findView(HistoryView.VIEW_ID);
+		if (view != null) {
+			view.setShowParameters(show);
+		} else
+			throw new ExecutionException("View " + StateViewPart.STATE_VIEW_ID
+					+ " not found");
+	}
+
+	@Override
+	public void updateElement(UIElement element,
+			@SuppressWarnings("rawtypes") Map parameters) {
+		final State state = getCurrentState(element.getServiceLocator());
+		final Boolean filterSet = (Boolean) state.getValue();
+		element.setChecked(filterSet);
+	}
+
+	private static State getCurrentState(final IServiceLocator locator) {
+		final ICommandService service = (ICommandService) locator
+				.getService(ICommandService.class);
+		final Command command = service.getCommand(COMMAND_ID);
+		final State state = command.getState(STATE_ID);
+		return state;
+	}
+
+}
diff --git a/de.prob.ui/src/de/prob/ui/ltl/CounterExampleTab.java b/de.prob.ui/src/de/prob/ui/ltl/CounterExampleTab.java
index f3170291f8de5203287d1e9fc52cafee06d9bd99..038ed22b66e301b266b548f92473c374914099e8 100644
--- a/de.prob.ui/src/de/prob/ui/ltl/CounterExampleTab.java
+++ b/de.prob.ui/src/de/prob/ui/ltl/CounterExampleTab.java
@@ -275,19 +275,15 @@ public class CounterExampleTab {
 
 	public void zoomIn() {
 		final ZoomManager zoomManager = rootEditPart.getZoomManager();
-		if (zoomManager != null) {
-			if (zoomManager != null && zoomManager.canZoomIn()) {
-				zoomManager.setZoom(zoomManager.getNextZoomLevel());
-			}
+		if (zoomManager != null && zoomManager.canZoomIn()) {
+			zoomManager.setZoom(zoomManager.getNextZoomLevel());
 		}
 	}
 
 	public void zoomOut() {
 		final ZoomManager zoomManager = rootEditPart.getZoomManager();
-		if (zoomManager != null) {
-			if (zoomManager != null && zoomManager.canZoomOut()) {
-				zoomManager.setZoom(zoomManager.getPreviousZoomLevel());
-			}
+		if (zoomManager != null && zoomManager.canZoomOut()) {
+			zoomManager.setZoom(zoomManager.getPreviousZoomLevel());
 		}
 	}
 
diff --git a/de.prob.ui/src/de/prob/ui/ltl/LtlCheckingDialog.java b/de.prob.ui/src/de/prob/ui/ltl/LtlCheckingDialog.java
index d8abf60cbb848ab0759118ed6a1639b476b2675e..0860779f1f4078267f51ca61d5bd48cf6cd19233 100644
--- a/de.prob.ui/src/de/prob/ui/ltl/LtlCheckingDialog.java
+++ b/de.prob.ui/src/de/prob/ui/ltl/LtlCheckingDialog.java
@@ -413,7 +413,7 @@ public final class LtlCheckingDialog extends TrayDialog {
 					Logger.notifyUser("Command exception", e);
 				} finally {
 					try {
-						reader.close();
+						if (reader != null) reader.close();
 					} catch (IOException e) {
 						Logger.notifyUser("Unexpected IO exception", e);
 					}
diff --git a/de.prob2.feature/feature.xml b/de.prob2.feature/feature.xml
index d316717eac4e0ba62c0180d4b1f92ec26b6d53ba..23cc601c78975e5722e4c177c12239d4cc50c08e 100644
--- a/de.prob2.feature/feature.xml
+++ b/de.prob2.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="de.prob2.feature"
       label="ProB for Rodin2"
-      version="2.3.2.qualifier"
+      version="2.3.3.qualifier"
       provider-name="HHU Düsseldorf STUPS Group">
 
    <description url="http://www.stups.uni-duesseldorf.de/ProB">
@@ -228,20 +228,19 @@ litigation.
       <import plugin="org.eclipse.ui.ide" version="3.5.0" match="compatible"/>
       <import plugin="org.eclipse.ui.views" version="3.5.0" match="compatible"/>
       <import plugin="org.eclipse.core.runtime" version="3.5.0" match="compatible"/>
-      <import plugin="org.eclipse.jface" version="3.5.0" match="compatible"/>
       <import plugin="org.eclipse.core.databinding" version="1.2.0" match="compatible"/>
       <import plugin="org.eclipse.jface.databinding" version="1.2.1" match="compatible"/>
       <import plugin="org.eclipse.core.databinding.beans" version="1.1.1" match="compatible"/>
       <import plugin="org.eclipse.gef" version="3.7.0" match="compatible"/>
-      <import plugin="de.prob.core" version="9.2.0" match="equivalent"/>
       <import plugin="org.eventb.core" version="2.1.0"/>
       <import plugin="org.rodinp.core" version="1.3.1"/>
-      <import plugin="de.prob.ui" version="7.2.0" match="equivalent"/>
       <import plugin="org.eclipse.core.resources" version="3.5.0" match="compatible"/>
       <import plugin="org.eclipse.core.expressions" version="3.4.101" match="compatible"/>
       <import plugin="org.eclipse.gef" version="3.5.0" match="compatible"/>
       <import plugin="org.eclipse.ui.navigator" version="3.5.0" match="greaterOrEqual"/>
-      <import plugin="de.bmotionstudio.gef.editor" version="5.2.1" match="greaterOrEqual"/>
+      <import plugin="de.prob.core" version="9.3.0" match="equivalent"/>
+      <import plugin="de.prob.ui" version="7.3.0" match="equivalent"/>
+      <import plugin="de.bmotionstudio.gef.editor" version="5.4.0" match="equivalent"/>
    </requires>
 
    <plugin
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..bb2187c38344f1fac923b7dee971552ee4cdd523
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,2 @@
+
+include 'de.prob.core', 'de.bmotionstudio.gef.editor' ,'de.bmotionstudio.rodin', 'de.bmotionstudio.help' , 'de.prob.plugin', 'de.prob.ui', 'de.prob2.feature'
diff --git a/de.prob.releng/tycho_build.gradle b/tycho_build.gradle
similarity index 50%
rename from de.prob.releng/tycho_build.gradle
rename to tycho_build.gradle
index 25a3644e6f169ad9d90a7c823f30081f0b6fabe8..6ecc2f2214b82fd47e6a3cbd62cdc5b634b9009c 100644
--- a/de.prob.releng/tycho_build.gradle
+++ b/tycho_build.gradle
@@ -1,3 +1,15 @@
+/*
+	Build Script can be executed via 'gradle install'
+	Build Script Dependencies can be downloaded via 'gradle collectDepenencies'
+	Executing the Build Script and download Dependencies can be executed via 'gradle completeInstall'
+ 	For a complete classPath Refresh please execute 'gradle deleteFromClassPath setClassPath'	
+	Pom Generation can be executed via gradle deploy
+	
+	If you have a product definition please add a buildProduct = true to your main build.gradle script
+
+*/
+
+
 apply plugin: 'base'
 
 import groovy.io.FileType
@@ -7,7 +19,7 @@ tychoVersion = "0.14.1"
 try{
 	workspacePath = workspacePath
 }catch(MissingPropertyException e){
-	workspacePath = "../"
+	workspacePath = ""
 }
 
 
@@ -74,6 +86,14 @@ try{
 	parentID = groupID+".parent"
 }
 
+Boolean noDescriptions = false					// in case of using own CategoryDescription Map
+
+try{
+	categoryDescriptions = categoryDescriptions
+}catch(MissingPropertyException e){
+	categoryDescriptions = [ [:],[:] ]		// label and descriptions of the features
+	noDescriptions = true
+}							// 	categoryDescriptions	=	[["feature": "labelName","feature2": "label"],["feature": "featureDescription","feature2": "feature2Description"]]		// label and descriptions of the features
 
 try{
 	targetRepositories = targetRepositories
@@ -81,6 +101,13 @@ try{
 	targetRepositories = ["http://download.eclipse.org/releases/indigo/"]
 }
 
+try{
+	buildProduct = buildProduct
+	
+}catch(MissingPropertyException e){
+	buildProduct = false
+}
+
 
 
 def projects(int i){
@@ -120,8 +147,147 @@ def groupId(){
 *	This Group ID will be used in every sub project
 */
 
+def addLibToCP(def project, def libPar){
+	
+	def filePar = new File(workspacePath+project+"/.classpath")
+	boolean notYetAdded = true	
+	filePar.eachLine{ line ->
+		def pattern = ".*${dependencyFolder}${libPar}.*"
+		if(line ==~ /${pattern}/){
+			notYetAdded = false
+		}
+		
+	}
+	if(notYetAdded){
+		File newCP = new File(workspacePath+project+'/.cp') 
+		filePar.eachLine{ line ->
+
+			 if(line ==~ /.*<\/classpath>.*/){
+				
+				String entry = '\t<classpathentry exported="true" kind="lib" path="'+dependencyFolder+libPar+'"/>'+'\n</classpath>\n'
+				line = line.replaceAll(/<\/classpath>/, entry)
+				println project + " : "+ libPar +" added to classpath"
+				newCP << line
+			}else{
+				newCP << line+"\n"
+			}
+		}
+		filePar.delete()
+		newCP.renameTo(workspacePath+project+'/.classpath')
+	}else{
+		println project + " : "+ libPar +" classpath entry already present"
+	}
+	
+}
+// Add certain Jar to Library
+
+
+def deleteLibFromCP(def project){
+	
+	def filePar = new File(workspacePath+project+"/.classpath")
+	boolean deleteCP = false
+	def newCP = new File(workspacePath+project+'/cp')
+	def pattern = ".*${dependencyFolder}[^<].*/>"
+
+	filePar.eachLine{ line ->
+	
+		if(line ==~ /\n(\ |\t)*/) line = line.replaceAll(/\n(\ |\t)*/, '')		// delete empty lines
+		if(line ==~ /${pattern}/){
+			deleteCP = true 
+			def pattern2 =  '(\\ |\\t)*<classpathentry exported="true" kind="lib" path="'+dependencyFolder+"[^<].*"+'"/>(\\ |\\t)*'
+			line = line.replaceAll(/${pattern2}/, '')
+			newCP << line
+		}else{
+			newCP << line+"\n"
+		}
+	}
+	if(!deleteCP){
+		println project + " : no dependencies from "+ dependencyFolder+" found in classpath file! "
+		newCP.delete()
+	}else{
+		filePar.delete()
+		newCP.renameTo(workspacePath+project+'/.classpath')	
+		println workspacePath+project+'/.classpath' +"!"
+	}
+}
+// deletes whole DependenciesLibrary Folder
+
 
+def addRunTimeLib( String libPar, String projectPar){
+	
+	def mf = new File(projectPar+"/META-INF/MANIFEST.MF")
+	def newMf = new File(projectPar+"/MF")
+	newMf.delete()
+	mf.eachLine{ line ->
+		if(line ==~ /.*Bundle-ClassPath:.*\.jar.*/){
+
+			libsInLine = line.replaceAll(/[\ \t]*Bundle-ClassPath:[\ \t]*/, '')
+			line = line.replaceFirst(/[^\ \t]*\.jar[\ \,]*/, dependencyFolder+libPar+",\n "+libsInLine)		// /[^\ \t]*.\.jar[\ \,]*/
+		}else{
+			if(line ==~ /.*Bundle-ClassPath: \.[\ \t]*/){
+				line = line+",\n "+dependencyFolder+libPar
+			}else{
+				if( line ==~ /.*Bundle-ClassPath: \.\,[\ \t]*/ ){
+					line = line+"\n "+dependencyFolder+libPar+","
+				}
+			}
+		}
+		
+		newMf << line+"\n"
+	}
+	mf.delete()
+	newMf.renameTo(projectPar+"/META-INF/MANIFEST.MF")
+	
+	
+} // Adds a Library to the current Bundle-ClassPath of the Manifest file
+
+
+def createRunTimeLib(String libPar, String projectPar){
+	def mf = new File(projectPar+"/META-INF/MANIFEST.MF")
+	mf << "Bundle-ClassPath: lib/dependencies/"+libPar
+} // Creates a Bundle-ClassPath Section in the Manifest file
 
+def boolean checkForRunTimeLibs(String projectPar){
+	boolean returnBool = false
+	def mf = new File(projectPar+"/META-INF/MANIFEST.MF")
+		mf.eachLine{ line ->
+			if(line ==~ /.*Bundle-ClassPath:.*/){
+				returnBool = true
+			}
+		}
+		return returnBool
+} // checks for a Bundle-ClassPath section in the Manifest file
+
+
+def boolean checkRunTimeLib(String libPar, String projectPar){								// checks if lib is in RunTimeLibrary present and 
+	def mf = new File(projectPar+"/META-INF/MANIFEST.MF")									// changes reference if necessary
+	def newMf = new File(projectPar+"/MF")
+	newMf.delete()
+	boolean returnBool = false
+	boolean changed = false
+		mf.eachLine{ line ->
+			if(line ==~ /.*${libPar}.*/){
+				if( !( line ==~ /.*(\ |\t)*${dependencyFolder}${libPar}(\ |\t)*.*/ ) ){			//if lib is already referenced
+					line = line.replaceFirst( /[^\ \t]*${libPar}/, dependencyFolder+libPar ) 		// reference lib from dependencyFolder	
+					changed = true
+					println line
+					println "yolo  ${libPar}\n"
+				}
+				returnBool = true
+			}
+			
+			newMf << line+"\n"
+		}
+		if(changed){
+			mf.delete()
+			newMf.renameTo(projectPar+"/META-INF/MANIFEST.MF")
+		}else{
+			newMf.delete()
+		}
+		return returnBool
+	
+}// checks if lib is already present in Manifest file
+// if lib is present but is referenced from another folder than dependencyFolder the library from dependencyFolder will be referenced
 
 /////////////////////////////////////////////////////////////////////////////////////////
 //		--	!!! 				DEFINING SUB PROJECTS 							!!!	-- //
@@ -131,19 +297,89 @@ subprojects {
 	
 	apply plugin: 'base'
 	apply plugin: 'java'
+//	apply plugin: 'eclipse'
 	
 	task deleteArtifacts(type: Delete) {
   		delete 'target','pom.xml'
 	}
 	
 	/////				Copy Dependencies into subprojects DependencyFolder 				///// 
-	task collectDependencies(type: Copy){
+	task collectDependencies(type: Copy) {
 
 		   	from configurations.compile
 	   	
-			into "../"+workspacePath+project.name+"/${dependencyFolder}" 					
+			into "${dependencyFolder}" 	
 			
 	}
+	
+	task setClassPath(dependsOn: 'collectDependencies')<<{
+		
+		description = "\tAdds all your Dependencies from your local lib folder in each project to it's classpath"
+		//if(project.name ==~ /birkhoff.bundle.*/){
+		def dependencyList = []
+		try{
+			def dir = new File(workspacePath+project.name+"/"+dependencyFolder).eachFile() { file->  		
+			    if( !(file.getName() ==~/.*\.txt/) ){
+					dependencyList << file.getName()  
+				}
+			}
+	
+			if(features.every{ it != project.name }){	
+				boolean BundleClassPathPresent = checkForRunTimeLibs(project.name)
+				for(int icp = 0; icp < dependencyList.size; icp++){
+					addLibToCP(project.name, dependencyList[icp])	//Adds Lib to .classPath file
+					
+					if(!BundleClassPathPresent){					// Adds Lib to Manifest File
+						createRunTimeLib(dependencyList[icp], project.name)
+						BundleClassPathPresent = true
+					}else{
+						if(!checkRunTimeLib(dependencyList[icp], project.name)){		// if library not present add it to RunTimeLibrary
+							addRunTimeLib( dependencyList[icp], project.name)
+						}
+					}
+				}
+				/*dependencyList.each{ dep->
+					println project.name+": "+ dep	// could still be usefull for debugging, that's why it's not deleted
+				}*/	
+			}
+			def warningReadMe = new File(workspacePath+project.name+"/"+dependencyFolder+"_README.txt")
+			warningReadMe.delete()
+			warningReadMe << "Do Not Remove any Jars/Libraries in this Folder!\nThis folder contains all of your dependencies defined in your gradle script.\n"
+			warningReadMe << "Removing or renaming any of these files will result in an Error in your .classpath file\n"
+			warningReadMe << "If any error concerning missing dependencies should occur please run 'gradle deleteFromClassPath setClassPath' in your workspace folder from your shell."
+			
+			
+		}catch(Exception e){
+			println project.name+" has no dependencies in '${dependencyFolder}' defined: Classpath will not be changed"
+		}
+	//}// if projectAbfrage
+		
+	}// setClassPath
+	
+	
+	task deleteFromClassPath()<<{		
+		
+		description = "\tDeletes all your Dependencies located in your local lib folder from each project's classpath"
+		
+		try{
+			
+			boolean depsDelete = false
+			def depsFolder = new File(workspacePath+project.name+'/'+dependencyFolder)
+			if(depsFolder.exists()) depsDelete = true
+			depsFolder.deleteDir()
+
+			if(features.every{ it != project.name } && depsDelete){	
+				deleteLibFromCP(project.name)
+			}
+	
+		}catch(Exception e){
+			println project.name+" has no dependencies in '${dependencyFolder}' defined: Classpath will not be changed"
+		}
+			
+	}
+	
+	/////---- 			For a complete classPath Refresh please execute 'gradle deleteFromClassPath setClassPath'				----///////
+
 	////////////////////////////////////////////////////////////////////////////////////////////	
 	
 	task deploy() <<{
@@ -157,12 +393,12 @@ subprojects {
 		*	
 		*	Version Numbers of the projects are collected via 
 		*	regular expressions in the Manifest.MF File.  
-		*	Versionnumber of the projects are equal to their
+		*	versionnumber of the projects are equal to their
 		*	Bundle-Version Number
 		*/
 		
 		
-		if(features.every{ it != project.name }){			// Generating Poms for sub projects except features
+		if(features.every{ it != project.name }){		// Generating Poms for sub projects except features
 			content = new File(workspacePath+"${project.name}/META-INF/MANIFEST.MF").getText("UTF-8") 
 
 	 		printFileLine = { 
@@ -190,7 +426,6 @@ subprojects {
 	
 			content.eachLine( printFileLine )
 	
-	
 			println artifactId
 			println "\t"+versionNumber
 	
@@ -210,7 +445,7 @@ subprojects {
 				*	old pom.xml files are deleted and replaced by new auto generated Tycho pom.xml files
 				*/
 			}
-		}else{	// if subprojects aren't a feature
+		}else{	//  end  of { if subprojects aren't a feature } Block
 	
 //		--		Features 					--			//
 	
@@ -226,8 +461,7 @@ subprojects {
 
 				def f = new File(workspacePath+artifactId+'/pom.xml') 
 				f.delete()
-				f << feature(artifactId, versionNumber)
-							
+				f << feature(artifactId, versionNumber)				
 			}
 		}
 	}//deploy
@@ -266,11 +500,8 @@ task createParent() << {
 task createRepository() << {
 
 	//			------------	 	define Repository			---------		//
-			
-			
+						
 	new File(workspacePath+"${repositoryName}").mkdir() 
-	
-	descriptions = [ [:],[:] ]		// label and descriptions of the features
 				
 	String versionNumber 	=	'1.0.0.qualifier'
 	String artifactId		=	repositoryName
@@ -286,17 +517,21 @@ task createRepository() << {
 		featureVersionNumber  = parsedXml.attribute("version")
 		featureArtifactId  = parsedXml.attribute("id")
 		
-		
-		descriptions[0].put( features[i], parsedXml.attribute("label") )
-		descriptions[1].put( features[i], parsedXml.description.text() )
-		
+		if(noDescriptions){
+			categoryDescriptions[0].put( features[i], parsedXml.attribute("label") )
+			categoryDescriptions[1].put( features[i], parsedXml.description.text() )
+		}
 		f << categoryFeatures(featureArtifactId.replace(workspacePath,''), featureVersionNumber)
 	}// for
 			
-	for(int i = 0; i < features.size(); i++){
-						
-		f << categoryDescription(features[i], descriptions[0][features[i]] ,descriptions[1][features[i]] )
-		//							featureName,	label,		description
+	for( int i = 0; i < features.size(); i++ ){
+	
+		if(noDescriptions){
+			f << categoryDescription(features[i], categoryDescriptions[0][features[i]] ,categoryDescriptions[1][features[i]] )
+			//						featureName,			label,							description
+		}else{
+			f << categoryDescription(features[i], categoryDescriptions[features[i]][0] ,categoryDescriptions[features[i]][1])
+		}
 	}//for
 				
 	f << categoryEnd()
@@ -453,9 +688,48 @@ def reposi() { """
     <artifactId>${repositoryName}</artifactId>
     <version>1.0.0.qualifier</version>
     <packaging>eclipse-repository</packaging>
-  </project>
+	
+	${reposiBuildStep()} 
+</project>
 """}
 
+def String reposiBuildStep(){
+	
+	if( buildProduct != false ){
+		return	"""
+		    <build>
+		  <plugins>
+		    <plugin>
+		      <groupId>org.eclipse.tycho</groupId>
+		      <artifactId>tycho-p2-director-plugin</artifactId>
+		      <version>\${tycho-version}</version>
+		      <executions>
+		        <execution>
+		          <!-- (optional) install the product for all configured os/ws/arch environments using p2 director -->
+		          <id>materialize-products</id>
+		          <goals>
+		            <goal>materialize-products</goal>
+		          </goals>
+		        </execution>
+
+			 		<execution>
+			            <!-- (optional) create product zips (one per os/ws/arch) -->
+			            <id>archive-products</id>
+			            <goals>
+			              <goal>archive-products</goal>
+			            </goals>
+			          </execution>
+
+				</executions>
+		    </plugin>
+		  </plugins>
+		</build>
+		"""
+	}else{
+		return "\n"
+	}
+}
+
 
 // creates a category in 
 def categoryHead() { """<?xml version="1.0" encoding="UTF-8"?>
@@ -503,7 +777,87 @@ def feature(artifactId, versionNumber) { """
 // end of feature pom
 
 
+// 						-------- 					In case you want to generate the product definition  					 ------ 			//
+/*
 
-//	Build Script can be executed via gradle install
-//	Pom Generation can be executed via gradle deploy
+def productXML(){
+"""
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product name="${groupID}.product" uid="${groupID}" id="${groupID}.product" application="${product}" version="1.0.0.qualifier" useFeatures="true" includeLaunchers="true">
 
+   <configIni use="default">
+   </configIni>
+
+   <launcherArgs>
+      <programArgs>-consoleLog</programArgs>
+      <vmArgs>-Xdock:icon=../Resources/Eclipse.icns -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts -Xdock:icon=../Resources/Eclipse.icns -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts -Xms40m -Xmx512m -Xdock:icon=../Resources/Eclipse.icns -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgs>
+      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgsMac>
+   </launcherArgs>
+
+   <plugins>
+     
+   </plugins>
+	<features>
+"""+listProductFeature()+"""
+   	<feature id="org.eclipse.rcp" version="3.7.2.v20120120-1424-9DB5FmnFq5JCf1UA38R-kz0S0272"/>
+	</features>  
+   <configurations>
+      <plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="0" />
+      <plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
+      <plugin id="org.eclipse.osgi" autoStart="true" startLevel="-1" />
+   </configurations>
+
+</product>
+
+
+"""
+
+/*
+"""
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product name="de.prob.product" uid="de.prob" id="de.prob.standalone.product" application="de.prob.standalone.application" version="1.0.0.qualifier" useFeatures="true" includeLaunchers="true">
+
+   <configIni use="default">
+   </configIni>
+
+   <launcherArgs>
+      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgsMac>
+   </launcherArgs>
+
+   <plugins>
+   </plugins>
+
+
+</product>
+
+
+"""*/
+
+/*
+
+     <feature id="birkhoff.feature" version="1.0.0.qualifier"/>
+    
+
+*/	
+/*
+}
+
+def String listProductFeatures(){
+	String returnString = ""
+	for(int i = 0; i < features.size(); i++){
+		
+		returnString +=  '\n\t\t<feature id="${features[i]}" version="1.0.0.qualifier"/>'
+		
+	}
+	return returnString
+	
+}
+*/
+
+//	Build Script can be executed via gradle install
+// 	For a complete classPath Refresh please execute 'gradle deleteFromClassPath setClassPath'	
+//	Pom Generation can be executed via gradle deploy
\ No newline at end of file