diff --git a/de.prob.core.tests/.classpath b/de.prob.core.tests/.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..396533344bbc5e009e1e5b52e3264c4be92efb17
--- /dev/null
+++ b/de.prob.core.tests/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/de.prob.core.tests/.project b/de.prob.core.tests/.project
new file mode 100644
index 0000000000000000000000000000000000000000..d35196a0d758c01def2ade464d2ae32be3d75326
--- /dev/null
+++ b/de.prob.core.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>de.prob.core.tests</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.prob.core.tests/.settings/org.eclipse.jdt.core.prefs b/de.prob.core.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..c537b63063ce6052bdc49c5fd0745b078f162c90
--- /dev/null
+++ b/de.prob.core.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+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.prob.core.tests/META-INF/MANIFEST.MF b/de.prob.core.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..48c8af92e80d72d2f92ee77f4e39571ac9caa7de
--- /dev/null
+++ b/de.prob.core.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Tests
+Bundle-SymbolicName: de.prob.core.tests
+Bundle-Version: 1.0.0.qualifier
+Fragment-Host: de.prob.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.junit;bundle-version="4.8.2"
diff --git a/de.prob.core.tests/build.properties b/de.prob.core.tests/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..34d2e4d2dad529ceaeb953bfcdb63c51d69ffed2
--- /dev/null
+++ b/de.prob.core.tests/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleAllUnitTests.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleAllUnitTests.java
similarity index 91%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleAllUnitTests.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleAllUnitTests.java
index 4799156dde7779b824f5cd04ae3f02dea53a3978..09ed7bc345fb64743bd228f85b7986c5edb14fcf 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleAllUnitTests.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleAllUnitTests.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleAndUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleAndUnitTest.java
similarity index 97%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleAndUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleAndUnitTest.java
index c6c14c77fd74ea1b60f2f99f400f6233f3bd7810..d389f63aed1a40610e3264fd08a357d073c5d371 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleAndUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleAndUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 import static org.junit.Assert.assertTrue;
 
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleFinallyUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleFinallyUnitTest.java
similarity index 96%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleFinallyUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleFinallyUnitTest.java
index 6306b0992bc67ca3a0427f9845926790a4eb36df..1ddcd43cb25762df80a63a25af810d54b99c6c20 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleFinallyUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleFinallyUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 import static org.junit.Assert.assertTrue;
 
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleGloballyUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleGloballyUnitTest.java
similarity index 96%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleGloballyUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleGloballyUnitTest.java
index 5688ff428550e28d7fe2f2c0eb1a22c868451b28..f772c06a1f6790453536355706ecadb6850c05e7 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleGloballyUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleGloballyUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 import static org.junit.Assert.assertTrue;
 
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleHistoryUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleHistoryUnitTest.java
similarity index 97%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleHistoryUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleHistoryUnitTest.java
index 132509c5281e0c2614d1c5e48c037693a453d438..51e89995d8ca4f09bb0ca2979714eab55263e686 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleHistoryUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleHistoryUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 import static org.junit.Assert.assertTrue;
 
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleImplyUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleImplyUnitTest.java
similarity index 97%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleImplyUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleImplyUnitTest.java
index 7c557d58feeffe92ada8e4f782ff499544a263b3..c130d52f3a8689feb434abdc222cef59779c6082 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleImplyUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleImplyUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 import static org.junit.Assert.assertTrue;
 
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleNextUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleNextUnitTest.java
similarity index 94%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleNextUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleNextUnitTest.java
index 95bb621017d47dbcd3d9e2e56ca17e1bcadfe9d8..d6dd660ce65667d5637e11a56d7367e7f5129fda 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleNextUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleNextUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 import org.junit.Test;
 
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleNotUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleNotUnitTest.java
similarity index 93%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleNotUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleNotUnitTest.java
index 8eeb19f6093b901aea5a63b98946846d1388245b..3566fac5615f9dcb2de1423a62c4b33289acbae1 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleNotUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleNotUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 import org.junit.Test;
 
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleOnceUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleOnceUnitTest.java
similarity index 95%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleOnceUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleOnceUnitTest.java
index 33229e73fe06c46044480552116c416c70b6fd73..4457b80bfb84040bfc7d30f5353c64ff0b1bdc8f 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleOnceUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleOnceUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 import org.junit.Test;
 
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleOrUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleOrUnitTest.java
similarity index 97%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleOrUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleOrUnitTest.java
index ba5f5ad113bfca8d2d8cb427a6d5152e571b429f..ccff698093a9695ddea8b19a642e368ea36f5c7c 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleOrUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleOrUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 import static org.junit.Assert.assertTrue;
 
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleReleaseUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleReleaseUnitTest.java
similarity index 97%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleReleaseUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleReleaseUnitTest.java
index c9160c73629adef9122bcccdcca0fda064a94e53..afedebfc3311bcdc8ba91a139707e630da408017 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleReleaseUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleReleaseUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 import org.junit.Test;
 
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleSinceUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleSinceUnitTest.java
similarity index 97%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleSinceUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleSinceUnitTest.java
index 967f926419d1ce9f784d37d9830cc00394ecfa26..3752a020179ea16948f81656545498e2d357b5fb 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleSinceUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleSinceUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 
 /**
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleTriggerUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleTriggerUnitTest.java
similarity index 97%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleTriggerUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleTriggerUnitTest.java
index 45bc1d3d5c0258adbbfb1d2d38e29e6870a231cc..519401e2b72f949ad35134a629b5f6e925396f25 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleTriggerUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleTriggerUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 
 /**
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleUntilUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleUntilUnitTest.java
similarity index 97%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleUntilUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleUntilUnitTest.java
index f94c169e5c6fd88020decff033c4368f33660e9f..d70463239614775f0c0374cb2146817afb7ab427 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleUntilUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleUntilUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 
 /**
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleWeakUntilUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleWeakUntilUnitTest.java
similarity index 97%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleWeakUntilUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleWeakUntilUnitTest.java
index db33abab5280f1fe13d283aec6c4e1a095dd5086..b7c91884b1a8ced635146f4c1ffaff25b7020aed 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleWeakUntilUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleWeakUntilUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 
 /**
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleYesterdayUnitTest.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleYesterdayUnitTest.java
similarity index 94%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleYesterdayUnitTest.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleYesterdayUnitTest.java
index b7b7e2548bc1d2494bea2ebd6251a825db651e77..798865d4e40d7572e136e825159d395913c56750 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/CounterExampleYesterdayUnitTest.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/CounterExampleYesterdayUnitTest.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 import org.junit.Test;
 
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/LtlTestDescription.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/LtlTestDescription.java
similarity index 98%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/LtlTestDescription.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/LtlTestDescription.java
index 20b7f4000b856cb5646c96f32811ff325979e105..7b3aeaec5ea8aa687a4332b5f4f81c6165779cb8 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/LtlTestDescription.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/LtlTestDescription.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/TestCounterExample.java b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/TestCounterExample.java
similarity index 92%
rename from de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/TestCounterExample.java
rename to de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/TestCounterExample.java
index 2c075e9da5fee99d9da865c7a3e9a77ed735eb16..f7de3916d871628e21273554b9d53d2a33329c97 100644
--- a/de.prob.core/test/de/prob/core/domainobjects/ltl/unittests/TestCounterExample.java
+++ b/de.prob.core.tests/src/de/prob/core/domainobjects/ltl/tests/TestCounterExample.java
@@ -1,4 +1,4 @@
-package de.prob.core.domainobjects.ltl.unittests;
+package de.prob.core.domainobjects.ltl.tests;
 
 import de.prob.core.command.LtlCheckingCommand.PathType;
 import de.prob.core.domainobjects.ltl.CounterExample;
diff --git a/de.prob.core/.classpath b/de.prob.core/.classpath
index b5efa8550ac9c4daefb09ca828889085b018d941..21c83eda765b2559c5b944a30062af3fb6955a1f 100644
--- a/de.prob.core/.classpath
+++ b/de.prob.core/.classpath
@@ -1,23 +1,21 @@
 <?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/commons-lang-2.6.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/dependencies/jgrapht-0.8.3.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/dependencies/jsr305-1.3.9.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 kind="src" path="test"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry exported="true" kind="lib" path="lib/dependencies/parserbase-2.4.12-SNAPSHOT.jar"/>
 	<classpathentry exported="true" kind="lib" path="lib/dependencies/answerparser-2.4.12-SNAPSHOT.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/bparser-2.4.12-SNAPSHOT.jar"/>
 	<classpathentry exported="true" kind="lib" path="lib/dependencies/cliparser-2.4.12-SNAPSHOT.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/commons-codec-1.6.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/commons-lang-2.6.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/jgrapht-0.8.3.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/jsr305-1.3.9.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/ltlparser-2.4.12-SNAPSHOT.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/parserbase-2.4.12-SNAPSHOT.jar"/>
 	<classpathentry exported="true" kind="lib" path="lib/dependencies/prologlib-2.4.12-SNAPSHOT.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/dependencies/bparser-2.4.12-SNAPSHOT.jar"/>
 	<classpathentry exported="true" kind="lib" path="lib/dependencies/unicode-2.4.12-SNAPSHOT.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/dependencies/ltlparser-2.4.12-SNAPSHOT.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 kind="output" path="bin"/>
 </classpath>
diff --git a/de.prob.core/src/de/prob/core/command/ActivateUnitPluginCommand.java b/de.prob.core/src/de/prob/core/command/ActivateUnitPluginCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..5071e60e1f179908b6a1d438c12b818c408407ac
--- /dev/null
+++ b/de.prob.core/src/de/prob/core/command/ActivateUnitPluginCommand.java
@@ -0,0 +1,57 @@
+/**
+ * (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.prob.core.command;
+
+import de.prob.core.Animator;
+import de.prob.exceptions.ProBException;
+import de.prob.parser.ISimplifiedROMap;
+import de.prob.prolog.output.IPrologTermOutput;
+import de.prob.prolog.term.PrologTerm;
+
+public class ActivateUnitPluginCommand implements IComposableCommand {
+
+	private static final ActivateCmd ACTIVATE_CMD = new ActivateCmd();
+	private final GetPrologRandomSeed getRandomSeed;
+	private final ComposedCommand cmd;
+
+	public ActivateUnitPluginCommand() {
+		this.getRandomSeed = new GetPrologRandomSeed();
+		this.cmd = new ComposedCommand(getRandomSeed, ACTIVATE_CMD);
+	}
+
+	public static void activateUnitPlugin(final Animator animator)
+			throws ProBException {
+		animator.execute(new ActivateUnitPluginCommand());
+	}
+
+	public void processResult(
+			final ISimplifiedROMap<String, PrologTerm> bindings)
+			throws CommandException {
+		cmd.processResult(bindings);
+		final Animator animator = Animator.getAnimator();
+		animator.setRandomSeed(getRandomSeed.getSeed());
+	}
+
+	public void writeCommand(final IPrologTermOutput pto)
+			throws CommandException {
+		cmd.writeCommand(pto);
+	}
+
+	private final static class ActivateCmd implements IComposableCommand {
+		public void processResult(
+				final ISimplifiedROMap<String, PrologTerm> bindings)
+				throws CommandException {
+		}
+
+		public void writeCommand(final IPrologTermOutput pto) {
+			pto.openTerm("activate_plugin");
+			pto.printAtom("units");
+			pto.closeTerm();
+		}
+	}
+
+}
diff --git a/de.prob.core/src/de/prob/core/command/GetPluginResultCommand.java b/de.prob.core/src/de/prob/core/command/GetPluginResultCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb99459f5a1e7b6264873bd541f0e8d7f81a06c0
--- /dev/null
+++ b/de.prob.core/src/de/prob/core/command/GetPluginResultCommand.java
@@ -0,0 +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.prob.core.command;
+
+import de.prob.parser.BindingGenerator;
+import de.prob.parser.ISimplifiedROMap;
+import de.prob.parser.ResultParserException;
+import de.prob.prolog.output.IPrologTermOutput;
+import de.prob.prolog.term.ListPrologTerm;
+import de.prob.prolog.term.PrologTerm;
+
+public final class GetPluginResultCommand implements IComposableCommand {
+
+	private final String resultID;
+	private ListPrologTerm result;
+
+	public GetPluginResultCommand(final String resultID) {
+		this.resultID = resultID;
+	}
+
+	public ListPrologTerm getResult() {
+		return result;
+	}
+
+	public void processResult(
+			final ISimplifiedROMap<String, PrologTerm> bindings)
+			throws CommandException {
+		try {
+			result = BindingGenerator.getList(bindings, "Bindings");
+		} catch (ResultParserException e) {
+			CommandException commandException = new CommandException(
+					e.getLocalizedMessage(), e);
+			commandException.notifyUserOnce();
+			throw commandException;
+		}
+	}
+
+	public void writeCommand(final IPrologTermOutput pto) {
+		pto.openTerm("get_plugin_output").printAtomOrNumber(resultID)
+				.printVariable("Bindings").closeTerm();
+	}
+
+}
diff --git a/de.prob.core/src/de/prob/core/command/LoadEventBModelCommand.java b/de.prob.core/src/de/prob/core/command/LoadEventBModelCommand.java
index 316d436cfb029a75fd3232548ee3415f178854a1..78335f27dbe8219e1129b5286e771ac514283b15 100644
--- a/de.prob.core/src/de/prob/core/command/LoadEventBModelCommand.java
+++ b/de.prob.core/src/de/prob/core/command/LoadEventBModelCommand.java
@@ -19,17 +19,15 @@ import org.rodinp.core.RodinDBException;
 
 import de.prob.core.Animator;
 import de.prob.core.LanguageDependendAnimationPart;
+import de.prob.core.command.internal.InternalLoadCommand;
 import de.prob.core.domainobjects.MachineDescription;
 import de.prob.core.domainobjects.Operation;
 import de.prob.core.domainobjects.ProBPreference;
 import de.prob.core.domainobjects.State;
 import de.prob.core.langdep.EventBAnimatorPart;
-import de.prob.core.translator.TranslationFailedException;
-import de.prob.eventb.translator.TranslatorFactory;
 import de.prob.exceptions.ProBException;
 import de.prob.logging.Logger;
 import de.prob.parser.ISimplifiedROMap;
-import de.prob.prolog.output.IPrologTermOutput;
 import de.prob.prolog.output.StructuredPrologOutput;
 import de.prob.prolog.term.PrologTerm;
 
@@ -162,32 +160,4 @@ public final class LoadEventBModelCommand {
 			animator.announceReset();
 		}
 	}
-
-	private static class InternalLoadCommand implements IComposableCommand {
-		private final IEventBRoot model;
-
-		public InternalLoadCommand(final IEventBRoot model) {
-			this.model = model;
-		}
-
-		@Override
-		public void writeCommand(final IPrologTermOutput pto)
-				throws CommandException {
-			try {
-				TranslatorFactory.translate(model, pto);
-			} catch (TranslationFailedException e) {
-				throw new CommandException(
-						"Translation from Event-B to ProB's internal representation failed",
-						e);
-			}
-		}
-
-		@Override
-		public void processResult(
-				final ISimplifiedROMap<String, PrologTerm> bindings)
-				throws CommandException {
-			// there are no results to process
-		}
-
-	}
 }
diff --git a/de.prob.core/src/de/prob/core/command/internal/InternalLoadCommand.java b/de.prob.core/src/de/prob/core/command/internal/InternalLoadCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..2a3eaf98d4fd0b82a4a4718c0878d2366bf08e67
--- /dev/null
+++ b/de.prob.core/src/de/prob/core/command/internal/InternalLoadCommand.java
@@ -0,0 +1,39 @@
+package de.prob.core.command.internal;
+
+import org.eventb.core.IEventBRoot;
+
+import de.prob.core.command.CommandException;
+import de.prob.core.command.IComposableCommand;
+import de.prob.core.translator.TranslationFailedException;
+import de.prob.eventb.translator.TranslatorFactory;
+import de.prob.parser.ISimplifiedROMap;
+import de.prob.prolog.output.IPrologTermOutput;
+import de.prob.prolog.term.PrologTerm;
+
+public final class InternalLoadCommand implements IComposableCommand {
+	private final IEventBRoot model;
+
+	public InternalLoadCommand(final IEventBRoot model) {
+		this.model = model;
+	}
+
+	@Override
+	public void writeCommand(final IPrologTermOutput pto)
+			throws CommandException {
+		try {
+			TranslatorFactory.translate(model, pto);
+		} catch (TranslationFailedException e) {
+			throw new CommandException(
+					"Translation from Event-B to ProB's internal representation failed",
+					e);
+		}
+	}
+
+	@Override
+	public void processResult(
+			final ISimplifiedROMap<String, PrologTerm> bindings)
+			throws CommandException {
+		// there are no results to process
+	}
+
+}
\ No newline at end of file
diff --git a/de.prob.core/src/de/prob/core/translator/pragmas/IPragma.java b/de.prob.core/src/de/prob/core/translator/pragmas/IPragma.java
new file mode 100644
index 0000000000000000000000000000000000000000..aa8994a965629cc4da6ca5c395c7a05cfcb83512
--- /dev/null
+++ b/de.prob.core/src/de/prob/core/translator/pragmas/IPragma.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.prob.core.translator.pragmas;
+
+import de.prob.prolog.output.IPrologTermOutput;
+
+public interface IPragma {
+
+	void output(IPrologTermOutput pout);
+
+}
diff --git a/de.prob.core/src/de/prob/core/translator/pragmas/UnitPragma.java b/de.prob.core/src/de/prob/core/translator/pragmas/UnitPragma.java
new file mode 100644
index 0000000000000000000000000000000000000000..a1b5fd09d13a81b4e05149e7ca95aae0a2c76acd
--- /dev/null
+++ b/de.prob.core/src/de/prob/core/translator/pragmas/UnitPragma.java
@@ -0,0 +1,34 @@
+/**
+ * (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.prob.core.translator.pragmas;
+
+import de.prob.prolog.output.IPrologTermOutput;
+
+public class UnitPragma implements IPragma {
+	private String definedIn;
+	private String attachedTo;
+	private String content;
+
+	public UnitPragma(String definedIn, String attachedTo, String content) {
+		this.definedIn = definedIn;
+		this.attachedTo = attachedTo;
+		this.content = content;
+	}
+
+	@Override
+	public void output(IPrologTermOutput pout) {
+		pout.openTerm("pragma");
+		pout.printAtom("unit");
+		pout.printAtom(definedIn);
+		pout.printAtom(attachedTo);
+		pout.openList();
+		pout.printAtom(content);
+		pout.closeList();
+		pout.closeTerm();
+	}
+
+}
diff --git a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java
index ad5b33afb304accdbaa9f275db0e8a47d91b6707..43de100ee05eb13e7ff3db895e4fa38b11d5ee8b 100644
--- a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java
+++ b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java
@@ -15,6 +15,7 @@ import java.util.Map;
 
 import org.eclipse.core.runtime.Assert;
 import org.eventb.core.IContextRoot;
+import org.eventb.core.IEventBRoot;
 import org.eventb.core.IExtendsContext;
 import org.eventb.core.ILabeledElement;
 import org.eventb.core.IPOSequent;
@@ -28,13 +29,15 @@ import org.eventb.core.ISCContext;
 import org.eventb.core.ISCContextRoot;
 import org.eventb.core.ISCExtendsContext;
 import org.eventb.core.ISCInternalContext;
-import org.eventb.core.ISCMachineRoot;
 import org.eventb.core.ast.FormulaFactory;
 import org.eventb.core.ast.ITypeEnvironment;
 import org.eventb.core.seqprover.IConfidence;
+import org.rodinp.core.IAttributeType;
+import org.rodinp.core.IInternalElement;
 import org.rodinp.core.IRodinElement;
 import org.rodinp.core.IRodinFile;
 import org.rodinp.core.IRodinProject;
+import org.rodinp.core.RodinCore;
 import org.rodinp.core.RodinDBException;
 
 import de.be4.classicalb.core.parser.analysis.pragma.internal.ClassifiedPragma;
@@ -53,6 +56,8 @@ import de.be4.classicalb.core.parser.node.PSet;
 import de.be4.classicalb.core.parser.node.TIdentifierLiteral;
 import de.hhu.stups.sablecc.patch.SourcePosition;
 import de.prob.core.translator.TranslationFailedException;
+import de.prob.core.translator.pragmas.IPragma;
+import de.prob.core.translator.pragmas.UnitPragma;
 import de.prob.eventb.translator.internal.EProofStatus;
 import de.prob.eventb.translator.internal.ProofObligation;
 import de.prob.eventb.translator.internal.SequentSource;
@@ -65,18 +70,72 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 	private final Map<String, ISCContext> depContext = new HashMap<String, ISCContext>();
 	private final List<ProofObligation> proofs = new ArrayList<ProofObligation>();
 	private final List<ClassifiedPragma> proofspragmas = new ArrayList<ClassifiedPragma>();
+	private final List<IPragma> pragmas = new ArrayList<IPragma>();
 
-	public static ContextTranslator create(final ISCContext context)
+	private final IEventBRoot root;
+	private final FormulaFactory ff;
+	private final ITypeEnvironment te;
+
+	public static ContextTranslator create(final ISCContextRoot context)
 			throws TranslationFailedException {
-		ContextTranslator contextTranslator = new ContextTranslator(context);
 		try {
-			contextTranslator.translate();
+			assertConsistentModel(context);
+			final FormulaFactory ff = context.getFormulaFactory();
+			final ITypeEnvironment te = context.getTypeEnvironment(ff);
+			final ContextTranslator translator = new ContextTranslator(context,
+					ff, te, context);
+			translator.translate();
+			return translator;
 		} catch (RodinDBException e) {
-			final String message = "A Rodin exception occured during translation process. Possible cause: building aborted or still in progress. Please wait until building has finished before starting ProB. If this does not help, perform a clean and start ProB after building has finished. Original Exception: ";
-			throw new TranslationFailedException(context.getComponentName(),
-					message + e.getLocalizedMessage());
+			throw createTranslationFailedException(context, e);
+		}
+	}
+
+	public static ContextTranslator create(final ISCInternalContext context,
+			final FormulaFactory ff, final ITypeEnvironment te)
+			throws TranslationFailedException {
+		final IEventBRoot root = getRootContext(context);
+		final ContextTranslator translator = new ContextTranslator(context, ff,
+				te, root);
+		try {
+			assertConsistentModel(context.getRoot());
+			translator.translate();
+		} catch (RodinDBException e) {
+			throw createTranslationFailedException(context, e);
+		}
+		return translator;
+	}
+
+	private static IEventBRoot getRootContext(ISCInternalContext context) {
+		try {
+			String elementName = context.getElementName();
+			IRodinProject rodinProject = context.getRodinProject();
+			IRodinFile rodinFile = rodinProject.getRodinFile(elementName
+					+ ".bcc");
+			if (rodinFile.exists()) {
+				final IInternalElement element = rodinFile.getRoot();
+				if (element instanceof IEventBRoot) {
+					return (IEventBRoot) element;
+				}
+			}
+		} catch (Exception e) {
+			// We do not guarantee to include proof infos. If something goes
+			// wrong, we ignore the Proof info.
 		}
-		return contextTranslator;
+		return null;
+	}
+
+	private static TranslationFailedException createTranslationFailedException(
+			final ISCContext context, RodinDBException e)
+			throws TranslationFailedException {
+		final String message = "A Rodin exception occured during translation process. Possible cause: building aborted or still in progress. Please wait until building has finished before starting ProB. If this does not help, perform a clean and start ProB after building has finished. Original Exception: ";
+		return new TranslationFailedException(context.getComponentName(),
+				message + e.getLocalizedMessage());
+	}
+
+	private static boolean assertConsistentModel(IInternalElement machine_root)
+			throws RodinDBException {
+		return Assert.isTrue(machine_root.getRodinFile().isConsistent());
 	}
 
 	/**
@@ -86,46 +145,56 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 	 * contains errors)
 	 * 
 	 * @param context
+	 *            The context to translate
+	 * @param ff
+	 *            The FormulaFactory needed to extract the predicates
+	 * @param te
+	 *            The TypeEnvironment needed to extract the predicates
+	 * @param root
+	 *            the root to access the proofs
 	 * @throws TranslationFailedException
-	 * @throws RodinDBException
 	 */
-	private ContextTranslator(final ISCContext context)
-			throws TranslationFailedException {
+	private ContextTranslator(final ISCContext context,
+			final FormulaFactory ff, final ITypeEnvironment te,
+			final IEventBRoot root) throws TranslationFailedException {
 		this.context = context;
+		this.ff = ff;
+		this.te = te;
+		this.root = root;
 	}
 
 	private void translate() throws RodinDBException {
-		if (context instanceof ISCContextRoot) {
-			ISCContextRoot context_root = (ISCContextRoot) context;
-			Assert.isTrue(context_root.getRodinFile().isConsistent());
-		} else if (context instanceof ISCInternalContext) {
-			ISCInternalContext context_internal = (ISCInternalContext) context;
-
-			try {
-
-				String elementName = context_internal.getElementName();
-				IRodinProject rodinProject = context_internal.getRodinProject();
-				IRodinFile rodinFile = rodinProject.getRodinFile(elementName
-						+ ".bcc");
-				if (rodinFile.exists()) {
-					ISCContextRoot root = (ISCContextRoot) rodinFile.getRoot();
-					collectProofInfo(root);
+		translateContext();
+		collectProofInfo();
+		collectPragmas();
+	}
+
+	private void collectPragmas() throws RodinDBException {
+		// unit pragma, attached to constants
+		final IAttributeType.String UNITATTRIBUTE = RodinCore
+				.getStringAttrType("de.prob.units.unitPragmaAttribute");
+
+		final ISCConstant[] constants = context.getSCConstants();
+
+		for (final ISCConstant constant : constants) {
+			if (constant.hasAttribute(UNITATTRIBUTE)) {
+				String content = constant.getAttributeValue(UNITATTRIBUTE);
+
+				if (!content.isEmpty()) {
+					pragmas.add(new UnitPragma(getResource(), constant
+							.getIdentifierString(), content));
 				}
-			} catch (Exception e) {
-				// We do not guarantee to include proof infos. If something goes
-				// wrong, we ignore the Proof info.
 			}
-
-			ISCMachineRoot machine_root = (ISCMachineRoot) context_internal
-					.getRoot();
-			Assert.isTrue(machine_root.getRodinFile().isConsistent());
 		}
-		translateContext();
+	}
 
+	private void collectProofInfo() throws RodinDBException {
+		if (root != null) {
+			collectProofInfo(root);
+		}
 	}
 
-	private void collectProofInfo(ISCContextRoot origin)
-			throws RodinDBException {
+	private void collectProofInfo(IEventBRoot origin) throws RodinDBException {
 
 		IPSRoot proofStatus = origin.getPSRoot();
 		IPSStatus[] statuses = proofStatus.getStatuses();
@@ -305,20 +374,17 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 		final List<PPredicate> list = new ArrayList<PPredicate>(
 				predicates.length);
 		for (final ISCAxiom element : predicates) {
-			if (element.isTheorem() != theorems) {
-				continue;
+			if (element.isTheorem() == theorems) {
+				final PredicateVisitor visitor = new PredicateVisitor(
+						new LinkedList<String>());
+				element.getPredicate(ff, te).accept(visitor);
+				final PPredicate predicate = visitor.getPredicate();
+				list.add(predicate);
+				labelMapping.put(predicate, element);
+				proofspragmas.add(new ClassifiedPragma("discharged", predicate,
+						Arrays.asList(new String[0]), Arrays
+								.asList(new String[0]), NO_POS, NO_POS));
 			}
-			final PredicateVisitor visitor = new PredicateVisitor(
-					new LinkedList<String>());
-			final FormulaFactory ff = FormulaFactory.getDefault();
-			final ITypeEnvironment te = ff.makeTypeEnvironment();
-			element.getPredicate(ff, te).accept(visitor);
-			final PPredicate predicate = visitor.getPredicate();
-			list.add(predicate);
-			labelMapping.put(predicate, element);
-			proofspragmas.add(new ClassifiedPragma("discharged", predicate,
-					Arrays.asList(new String[0]), Arrays.asList(new String[0]),
-					NO_POS, NO_POS));
 		}
 		return list;
 	}
@@ -327,6 +393,10 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 		return proofs;
 	}
 
+	public List<IPragma> getPragmas() {
+		return pragmas;
+	}
+
 	public List<ClassifiedPragma> getProofspragmas() {
 		return proofspragmas;
 	}
diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/EventBContextTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/EventBContextTranslator.java
index ae640ff98a9c1d84b2014b850b42db0f3c2058f3..075270d4ae253ae3aef71dafd9d877e1ee61a433 100644
--- a/de.prob.core/src/de/prob/eventb/translator/internal/EventBContextTranslator.java
+++ b/de.prob.core/src/de/prob/eventb/translator/internal/EventBContextTranslator.java
@@ -51,13 +51,15 @@ public final class EventBContextTranslator extends EventBTranslator {
 
 	private void constructTranslation(final IPrologTermOutput pto)
 			throws TranslationFailedException {
-		List<ContextTranslator> translators = new ArrayList<ContextTranslator>();
-//		translators.add(ContextTranslator.create(context));
+		List<ContextTranslator> contextTranslators = new ArrayList<ContextTranslator>();
+
+		// translators.add(ContextTranslator.create(context));
 		if (context instanceof ISCContextRoot) {
 			ISCContextRoot root = (ISCContextRoot) context;
-			collectContexts(translators, new ArrayList<String>(), root);
+			collectContexts(contextTranslators, new ArrayList<String>(), root);
 		}
-		printProlog(new ArrayList<ModelTranslator>(), translators, pto);
+
+		printProlog(new ArrayList<ModelTranslator>(), contextTranslators, pto);
 	}
 
 	private void collectContexts(final List<ContextTranslator> translatorMap,
diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java
index b6ee12f4e13e3fbabecdd6b9ea25020a3f8b907f..845e660ebefc838aed2ec001cf513234c114e16e 100644
--- a/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java
+++ b/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java
@@ -11,6 +11,8 @@ import java.util.List;
 
 import org.eventb.core.ISCInternalContext;
 import org.eventb.core.ISCMachineRoot;
+import org.eventb.core.ast.FormulaFactory;
+import org.eventb.core.ast.ITypeEnvironment;
 import org.rodinp.core.IRodinFile;
 import org.rodinp.core.RodinDBException;
 
@@ -102,12 +104,14 @@ public final class EventBMachineTranslator extends EventBTranslator {
 			throws TranslationFailedException {
 		final List<ContextTranslator> translators = new ArrayList<ContextTranslator>();
 		final List<String> processed = new ArrayList<String>();
-		for (ISCMachineRoot m : models) {
-			ISCInternalContext[] seenContexts;
+
+		for (final ISCMachineRoot m : models) {
 			try {
-				seenContexts = m.getSCSeenContexts();
-				for (ISCInternalContext seenContext : seenContexts) {
-					collectContexts(translators, processed, seenContext);
+				final FormulaFactory ff = m.getFormulaFactory();
+				final ITypeEnvironment te = m.getTypeEnvironment(ff);
+				final ISCInternalContext[] seenContexts = m.getSCSeenContexts();
+				for (final ISCInternalContext seenContext : seenContexts) {
+					collectContexts(translators, processed, seenContext, ff, te);
 				}
 			} catch (RodinDBException e) {
 				throw new TranslationFailedException(e);
@@ -117,12 +121,13 @@ public final class EventBMachineTranslator extends EventBTranslator {
 	}
 
 	private void collectContexts(final List<ContextTranslator> translatorMap,
-			final List<String> processed, final ISCInternalContext context)
+			final List<String> processed, final ISCInternalContext context,
+			final FormulaFactory ff, final ITypeEnvironment te)
 			throws TranslationFailedException {
 		String name = context.getElementName();
 		if (!processed.contains(name)) {
 			processed.add(name);
-			translatorMap.add(ContextTranslator.create(context));
+			translatorMap.add(ContextTranslator.create(context, ff, te));
 		}
 	}
 
diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java
index ed82d8a8e8ee13b70b2e191805fa67b5168c306b..4cf7538db93dfea3df0b9355063386031bca3f3a 100644
--- a/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java
+++ b/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java
@@ -23,6 +23,7 @@ import de.be4.classicalb.core.parser.node.AEventBModelParseUnit;
 import de.be4.classicalb.core.parser.node.Node;
 import de.prob.core.translator.ITranslator;
 import de.prob.core.translator.TranslationFailedException;
+import de.prob.core.translator.pragmas.IPragma;
 import de.prob.eventb.translator.AbstractComponentTranslator;
 import de.prob.eventb.translator.ContextTranslator;
 import de.prob.prolog.output.IPrologTermOutput;
@@ -112,6 +113,24 @@ public abstract class EventBTranslator implements ITranslator {
 			printFlowInformation(pout);
 	}
 
+	private void printPragmaContents(
+			Collection<ModelTranslator> refinementChainTranslators,
+			Collection<ContextTranslator> contextTranslators,
+			IPrologTermOutput pout) {
+		ArrayList<IPragma> pragmas = new ArrayList<IPragma>();
+
+		for (ContextTranslator contextTranslator : contextTranslators) {
+			pragmas.addAll(contextTranslator.getPragmas());
+		}
+		for (ModelTranslator modelTranslator : refinementChainTranslators) {
+			pragmas.addAll(modelTranslator.getPragmas());
+		}
+
+		for (IPragma pragma : pragmas) {
+			pragma.output(pout);
+		}
+	}
+
 	protected abstract void printFlowInformation(final IPrologTermOutput pout);
 
 	private ASTProlog createAstVisitor(
@@ -147,6 +166,8 @@ public abstract class EventBTranslator implements ITranslator {
 		// } catch (RodinDBException e) {
 		// e.printStackTrace();
 		// }
+		printPragmaContents(refinementChainTranslators, contextTranslators,
+				pout);
 		pout.closeList();
 		pout.printVariable("_Error");
 		pout.closeTerm();
diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java
index ead67da6ba447b4f830418088f54eb34069a3bf7..b121f405c522a52f7b8f866fd93487234a8900e0 100644
--- a/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java
+++ b/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java
@@ -35,13 +35,16 @@ import org.eventb.core.ISCVariable;
 import org.eventb.core.ISCVariant;
 import org.eventb.core.ISCWitness;
 import org.eventb.core.ITraceableElement;
+import org.eventb.core.IVariable;
 import org.eventb.core.ast.FormulaFactory;
 import org.eventb.core.ast.ITypeEnvironment;
 import org.eventb.core.ast.Predicate;
 import org.eventb.core.seqprover.IConfidence;
+import org.rodinp.core.IAttributeType;
 import org.rodinp.core.IElementType;
 import org.rodinp.core.IRodinElement;
 import org.rodinp.core.IRodinFile;
+import org.rodinp.core.RodinCore;
 import org.rodinp.core.RodinDBException;
 
 import de.be4.classicalb.core.parser.node.AAnticipatedEventstatus;
@@ -67,6 +70,8 @@ import de.be4.classicalb.core.parser.node.PSubstitution;
 import de.be4.classicalb.core.parser.node.PWitness;
 import de.be4.classicalb.core.parser.node.TIdentifierLiteral;
 import de.prob.core.translator.TranslationFailedException;
+import de.prob.core.translator.pragmas.IPragma;
+import de.prob.core.translator.pragmas.UnitPragma;
 import de.prob.eventb.translator.AbstractComponentTranslator;
 import de.prob.eventb.translator.AssignmentVisitor;
 import de.prob.eventb.translator.ExpressionVisitor;
@@ -81,6 +86,8 @@ public class ModelTranslator extends AbstractComponentTranslator {
 	private final ITypeEnvironment te;
 	private final IMachineRoot origin;
 	private final List<ProofObligation> proofs = new ArrayList<ProofObligation>();
+	private final List<IPragma> pragmas = new ArrayList<IPragma>();
+
 	// private final List<String> depContext = new ArrayList<String>();
 
 	// Confined in the thread calling the factory method
@@ -117,6 +124,10 @@ public class ModelTranslator extends AbstractComponentTranslator {
 		return Collections.unmodifiableList(proofs);
 	}
 
+	public List<IPragma> getPragmas() {
+		return Collections.unmodifiableList(pragmas);
+	}
+
 	public AEventBModelParseUnit getModelAST() {
 		if (broken) {
 			final String message = "The machine contains Rodin Problems. Please fix it before animating";
@@ -164,6 +175,28 @@ public class ModelTranslator extends AbstractComponentTranslator {
 
 		// Check for fully discharged Invariants and Events
 		collectProofInfo();
+
+		// Collect Pragmas, Units, etc.
+		collectPragmas();
+	}
+
+	private void collectPragmas() throws RodinDBException {
+		// unit pragma, attached to constants
+		final IAttributeType.String UNITATTRIBUTE = RodinCore
+				.getStringAttrType("de.prob.units.unitPragmaAttribute");
+
+		final IVariable[] variables = origin.getVariables();
+
+		for (final IVariable variable : variables) {
+			if (variable.hasAttribute(UNITATTRIBUTE)) {
+				String content = variable.getAttributeValue(UNITATTRIBUTE);
+
+				if (!content.isEmpty()) {
+					pragmas.add(new UnitPragma(getResource(), variable
+							.getIdentifierString(), content));
+				}
+			}
+		}
 	}
 
 	private void collectProofInfo() throws RodinDBException {
@@ -179,7 +212,8 @@ public class ModelTranslator extends AbstractComponentTranslator {
 
 			EProofStatus pstatus = EProofStatus.UNPROVEN;
 
-			if (!broken && (confidence > IConfidence.PENDING && confidence <= IConfidence.REVIEWED_MAX))
+			if (!broken
+					&& (confidence > IConfidence.PENDING && confidence <= IConfidence.REVIEWED_MAX))
 				pstatus = EProofStatus.REVIEWED;
 			if (!broken && confidence == IConfidence.DISCHARGED_MAX)
 				pstatus = EProofStatus.PROVEN;
diff --git a/de.prob.ui/.classpath b/de.prob.ui/.classpath
index f67843181ee95a7771d0edd1009be1faaed415b0..100092b255b1ad1a077f31d3e5931b134f6f5f45 100644
--- a/de.prob.ui/.classpath
+++ b/de.prob.ui/.classpath
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry exported="true" kind="lib" path="lib/dependencies/commons-codec-1.6.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/apache_xmlrpc.jar"/>
 	<classpathentry exported="true" kind="lib" path="lib/ws_commons.jar"/>
 	<classpathentry kind="output" path="bin"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/commons-codec-1.6.jar"/>
 </classpath>
diff --git a/de.prob.units/.classpath b/de.prob.units/.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..ad32c83a7885b8953a938b41df3b4fd4fe1aae01
--- /dev/null
+++ b/de.prob.units/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/de.prob.units/.project b/de.prob.units/.project
new file mode 100644
index 0000000000000000000000000000000000000000..22333fa9cb227f96d35310a6635507f782547a31
--- /dev/null
+++ b/de.prob.units/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>de.prob.units</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.prob.units/.settings/org.eclipse.jdt.core.prefs b/de.prob.units/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..c537b63063ce6052bdc49c5fd0745b078f162c90
--- /dev/null
+++ b/de.prob.units/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+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.prob.units/META-INF/MANIFEST.MF b/de.prob.units/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..2fd89c80dfacabe94b60f1cb276335c25705d1f1
--- /dev/null
+++ b/de.prob.units/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: ProB Physical Units Support
+Bundle-SymbolicName: de.prob.units;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: de.prob.units.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ de.prob.core;bundle-version="9.3.0",
+ org.eventb.ui;bundle-version="[2.1.0,2.6.0)",
+ de.prob.ui;bundle-version="7.3.0"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-Vendor: HHU Düsseldorf STUPS Group
diff --git a/de.prob.units/build.properties b/de.prob.units/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..79785acaeea2f69bbe4b5e556221958fef4b9f55
--- /dev/null
+++ b/de.prob.units/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               icons/,\
+               plugin.xml
diff --git a/de.prob.units/icons/unit_analysis.png b/de.prob.units/icons/unit_analysis.png
new file mode 100644
index 0000000000000000000000000000000000000000..36d5d6278be2e2226de7b9d4d0fc9da720e47f1b
Binary files /dev/null and b/de.prob.units/icons/unit_analysis.png differ
diff --git a/de.prob.units/plugin.xml b/de.prob.units/plugin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9c40c5db7d2f4deb3e68226c679a129edede9373
--- /dev/null
+++ b/de.prob.units/plugin.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         point="org.eventb.ui.editorItems">
+      <textAttribute
+            class="de.prob.units.pragmas.UnitPragmaAttribute"
+            expandsHorizontally="true"
+            id="de.prob.units.unitPragmaAttribute"
+            isMath="true"
+            prefix="Physical Unit:"
+            style="de.prob.units.unitPragmaAttribute"
+            typeId="de.prob.units.unitPragmaAttribute">
+      </textAttribute>
+      <attributeRelation
+            elementTypeId="org.eventb.core.variable">
+         <attributeReference
+               descriptionId="de.prob.units.unitPragmaAttribute">
+         </attributeReference>
+         <attributeReference
+               descriptionId="de.prob.units.inferredUnitPragmaAttribute">
+         </attributeReference>
+      </attributeRelation>
+      <attributeRelation
+            elementTypeId="org.eventb.core.constant">
+         <attributeReference
+               descriptionId="de.prob.units.unitPragmaAttribute">
+         </attributeReference>
+         <attributeReference
+               descriptionId="de.prob.units.inferredUnitPragmaAttribute">
+         </attributeReference>
+      </attributeRelation>
+      <textAttribute
+            class="de.prob.units.pragmas.InferredUnitPragmaAttribute"
+            expandsHorizontally="true"
+            id="de.prob.units.inferredUnitPragmaAttribute"
+            isMath="true"
+            prefix="Inferred Physical Unit:"
+            style="de.prob.units.inferredUnitPragmaAttribute"
+            typeId="de.prob.units.inferredUnitPragmaAttribute">
+      </textAttribute>
+   </extension>
+   <extension
+         point="org.eclipse.ui.handlers">
+      <handler
+            class="de.prob.units.ui.StartUnitAnalysisHandler"
+            commandId="de.prob.units.startunitanalysis">
+      </handler>
+   </extension>
+   <extension
+         point="org.eclipse.ui.menus">
+      <menuContribution
+            locationURI="popup:fr.systerel.explorer.navigator.view">
+         <separator
+               name="de.prob.units.separator2"
+               visible="true">
+         </separator>
+         <command
+               commandId="de.prob.units.startunitanalysis"
+               icon="icons/unit_analysis.png"
+               label="Analyse Physical Units"
+               style="push">
+            <visibleWhen>
+               <with
+                     variable="selection">
+                  <iterate
+                        operator="or">
+                     <instanceof
+                           value="org.eventb.core.IEventBRoot">
+                     </instanceof>
+                  </iterate>
+               </with>
+            </visibleWhen>
+         </command>
+         <separator
+               name="de.prob.units.separator1"
+               visible="true">
+         </separator>
+      </menuContribution>
+   </extension>
+   <extension
+         point="org.eclipse.ui.commands">
+      <command
+            id="de.prob.units.startunitanalysis"
+            name="Analyse Physical Units">
+      </command>
+   </extension>
+   <extension
+         point="org.rodinp.core.attributeTypes">
+      <attributeType
+            id="unitPragmaAttribute"
+            kind="string"
+            name="Content of a unit Pragma to send to ProB">
+      </attributeType>
+      <attributeType
+            id="inferredUnitPragmaAttribute"
+            kind="string"
+            name="Content of a unit Pragma received from ProB">
+      </attributeType>
+   </extension>
+</plugin>
diff --git a/de.prob.units/src/de/prob/units/Activator.java b/de.prob.units/src/de/prob/units/Activator.java
new file mode 100644
index 0000000000000000000000000000000000000000..cb9482f57446625e611905dd23c999190b96cf5c
--- /dev/null
+++ b/de.prob.units/src/de/prob/units/Activator.java
@@ -0,0 +1,50 @@
+package de.prob.units;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "de.prob.units"; //$NON-NLS-1$
+
+	// The shared instance
+	private static Activator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+}
diff --git a/de.prob.units/src/de/prob/units/pragmas/InferredUnitPragmaAttribute.java b/de.prob.units/src/de/prob/units/pragmas/InferredUnitPragmaAttribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..a2d7ec278f082fb569e9827a184f7b6785a823c1
--- /dev/null
+++ b/de.prob.units/src/de/prob/units/pragmas/InferredUnitPragmaAttribute.java
@@ -0,0 +1,75 @@
+/**
+ * (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.prob.units.pragmas;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eventb.core.IVariable;
+import org.eventb.core.basis.Constant;
+import org.eventb.internal.ui.eventbeditor.manipulation.IAttributeManipulation;
+import org.rodinp.core.IAttributeType;
+import org.rodinp.core.IInternalElement;
+import org.rodinp.core.IRodinElement;
+import org.rodinp.core.RodinCore;
+import org.rodinp.core.RodinDBException;
+
+import de.prob.units.Activator;
+
+public class InferredUnitPragmaAttribute implements IAttributeManipulation {
+	public static IAttributeType.String ATTRIBUTE = RodinCore
+			.getStringAttrType(Activator.PLUGIN_ID
+					+ ".inferredUnitPragmaAttribute");
+
+	public InferredUnitPragmaAttribute() {
+		// empty constructor
+	}
+
+	private IInternalElement asInternalElement(IRodinElement element) {
+		if (element instanceof IVariable) {
+			return (IVariable) element;
+		} else if (element instanceof Constant) {
+			return (Constant) element;
+		}
+		return null;
+	}
+
+	@Override
+	public String[] getPossibleValues(IRodinElement element,
+			IProgressMonitor monitor) {
+		return null;
+	}
+
+	@Override
+	public String getValue(IRodinElement element, IProgressMonitor monitor)
+			throws RodinDBException {
+		return asInternalElement(element).getAttributeValue(ATTRIBUTE);
+	}
+
+	@Override
+	public boolean hasValue(IRodinElement element, IProgressMonitor monitor)
+			throws RodinDBException {
+		return asInternalElement(element).hasAttribute(ATTRIBUTE);
+	}
+
+	@Override
+	public void removeAttribute(IRodinElement element, IProgressMonitor monitor)
+			throws RodinDBException {
+		asInternalElement(element).removeAttribute(ATTRIBUTE, monitor);
+
+	}
+
+	@Override
+	public void setDefaultValue(IRodinElement element, IProgressMonitor monitor)
+			throws RodinDBException {
+		asInternalElement(element).setAttributeValue(ATTRIBUTE, "", monitor);
+	}
+
+	@Override
+	public void setValue(IRodinElement element, String value,
+			IProgressMonitor monitor) throws RodinDBException {
+		asInternalElement(element).setAttributeValue(ATTRIBUTE, value, monitor);
+	}
+}
diff --git a/de.prob.units/src/de/prob/units/pragmas/UnitPragmaAttribute.java b/de.prob.units/src/de/prob/units/pragmas/UnitPragmaAttribute.java
new file mode 100644
index 0000000000000000000000000000000000000000..8c0075f18b1545de6594c0234b6480b690db660f
--- /dev/null
+++ b/de.prob.units/src/de/prob/units/pragmas/UnitPragmaAttribute.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.prob.units.pragmas;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eventb.core.IVariable;
+import org.eventb.core.basis.Constant;
+import org.eventb.internal.ui.eventbeditor.manipulation.IAttributeManipulation;
+import org.rodinp.core.IAttributeType;
+import org.rodinp.core.IInternalElement;
+import org.rodinp.core.IRodinElement;
+import org.rodinp.core.RodinCore;
+import org.rodinp.core.RodinDBException;
+
+import de.prob.units.Activator;
+
+public class UnitPragmaAttribute implements IAttributeManipulation {
+	public static IAttributeType.String ATTRIBUTE = RodinCore
+			.getStringAttrType(Activator.PLUGIN_ID + ".unitPragmaAttribute");
+
+	public UnitPragmaAttribute() {
+		// empty constructor
+	}
+
+	private IInternalElement asInternalElement(IRodinElement element) {
+		if (element instanceof IVariable) {
+			return (IVariable) element;
+		} else if (element instanceof Constant) {
+			return (Constant) element;
+		}
+		return null;
+	}
+
+	@Override
+	public String[] getPossibleValues(IRodinElement element,
+			IProgressMonitor monitor) {
+		return null;
+	}
+
+	@Override
+	public String getValue(IRodinElement element, IProgressMonitor monitor)
+			throws RodinDBException {
+		return asInternalElement(element).getAttributeValue(ATTRIBUTE);
+	}
+
+	@Override
+	public boolean hasValue(IRodinElement element, IProgressMonitor monitor)
+			throws RodinDBException {
+		return asInternalElement(element).hasAttribute(ATTRIBUTE);
+	}
+
+	@Override
+	public void removeAttribute(IRodinElement element, IProgressMonitor monitor)
+			throws RodinDBException {
+		asInternalElement(element).removeAttribute(ATTRIBUTE, monitor);
+
+	}
+
+	@Override
+	public void setDefaultValue(IRodinElement element, IProgressMonitor monitor)
+			throws RodinDBException {
+		asInternalElement(element).setAttributeValue(ATTRIBUTE, "", monitor);
+	}
+
+	@Override
+	public void setValue(IRodinElement element, String value,
+			IProgressMonitor monitor) throws RodinDBException {
+		asInternalElement(element).setAttributeValue(ATTRIBUTE, value, monitor);
+	}
+}
diff --git a/de.prob.units/src/de/prob/units/ui/StartUnitAnalysisHandler.java b/de.prob.units/src/de/prob/units/ui/StartUnitAnalysisHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..13585c407fc04e9c63257ab7e220d1e8159d62e1
--- /dev/null
+++ b/de.prob.units/src/de/prob/units/ui/StartUnitAnalysisHandler.java
@@ -0,0 +1,283 @@
+/**
+ * (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.prob.units.ui;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+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.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eventb.core.IConstant;
+import org.eventb.core.IContextRoot;
+import org.eventb.core.IEventBRoot;
+import org.eventb.core.IMachineRoot;
+import org.eventb.core.IVariable;
+import org.rodinp.core.IRodinFile;
+import org.rodinp.core.RodinCore;
+import org.rodinp.core.RodinDBException;
+
+import de.prob.core.Animator;
+import de.prob.core.LimitedLogger;
+import de.prob.core.command.ActivateUnitPluginCommand;
+import de.prob.core.command.ClearMachineCommand;
+import de.prob.core.command.CommandException;
+import de.prob.core.command.ComposedCommand;
+import de.prob.core.command.GetPluginResultCommand;
+import de.prob.core.command.SetPreferencesCommand;
+import de.prob.core.command.StartAnimationCommand;
+import de.prob.core.command.internal.InternalLoadCommand;
+import de.prob.exceptions.ProBException;
+import de.prob.logging.Logger;
+import de.prob.parser.BindingGenerator;
+import de.prob.parser.ResultParserException;
+import de.prob.prolog.term.CompoundPrologTerm;
+import de.prob.prolog.term.ListPrologTerm;
+import de.prob.prolog.term.PrologTerm;
+import de.prob.units.pragmas.InferredUnitPragmaAttribute;
+
+public class StartUnitAnalysisHandler extends AbstractHandler implements
+		IHandler {
+
+	public static class ModificationListener implements IResourceChangeListener {
+
+		private final IPath path;
+
+		public ModificationListener(final IFile resource) {
+			if (resource == null) {
+				path = null;
+			} else {
+				this.path = resource.getProject().getFullPath();
+			}
+		}
+
+		public void resourceChanged(final IResourceChangeEvent event) {
+			if (path != null) {
+				final IResourceDelta delta = event.getDelta();
+				IResourceDelta member = delta.findMember(path);
+				if (member != null) {
+					Animator.getAnimator().setDirty();
+				}
+			}
+		}
+	}
+
+	private ISelection fSelection;
+	private ModificationListener listener;
+
+	public Object execute(final ExecutionEvent event) throws ExecutionException {
+
+		fSelection = HandlerUtil.getCurrentSelection(event);
+
+		// Get the Selection
+		final IEventBRoot rootElement = getRootElement();
+		final IFile resource = extractResource(rootElement);
+
+		ArrayList<String> errors = new ArrayList<String>();
+		boolean realError = checkErrorMarkers(resource, errors);
+		if (!errors.isEmpty()) {
+			String message = "Some components in your project contain "
+					+ (realError ? "errors" : "warnings")
+					+ ". This can lead to unexpected behavior (e.g. missing variables) when animating.\n\nDetails:\n";
+			StringBuffer stringBuffer = new StringBuffer(message);
+			for (String string : errors) {
+				stringBuffer.append(string);
+				stringBuffer.append('\n');
+			}
+			if (realError)
+				Logger.notifyUserWithoutBugreport(stringBuffer.toString());
+			else
+				Logger.notifyUserAboutWarningWithoutBugreport(stringBuffer
+						.toString());
+		}
+		;
+
+		if (resource != null) {
+			LimitedLogger.getLogger().log("user started unit analysis",
+					rootElement.getElementName(), null);
+			registerModificationListener(resource);
+
+			final Animator animator = Animator.getAnimator();
+			try {
+				// load machine and activate plugin
+				final ClearMachineCommand clear = new ClearMachineCommand();
+				final SetPreferencesCommand setPrefs = SetPreferencesCommand
+						.createSetPreferencesCommand(animator);
+				final InternalLoadCommand load = new InternalLoadCommand(
+						rootElement);
+				final StartAnimationCommand start = new StartAnimationCommand();
+				final ActivateUnitPluginCommand activatePlugin = new ActivateUnitPluginCommand();
+
+				final ComposedCommand composed = new ComposedCommand(clear,
+						setPrefs, load, start, activatePlugin);
+
+				animator.execute(composed);
+
+				GetPluginResultCommand pluginResultCommand = new GetPluginResultCommand(
+						"Grounded Result State");
+
+				animator.execute(pluginResultCommand);
+
+				processResults(pluginResultCommand.getResult());
+			} catch (ProBException e) {
+				e.notifyUserOnce();
+				throw new ExecutionException("Unit Analysis Failed", e);
+			} catch (RodinDBException e) {
+				throw new ExecutionException(
+						"Unit Analysis Failed with a RodinDBException", e);
+			}
+		}
+		return null;
+	}
+
+	private boolean checkErrorMarkers(final IFile resource, List<String> errors) {
+		boolean result = false;
+		IProject project = resource.getProject();
+		try {
+			IMarker[] markers = project.findMarkers(
+					"org.eclipse.core.resources.problemmarker", true,
+					IResource.DEPTH_INFINITE);
+			for (IMarker iMarker : markers) {
+				errors.add(iMarker.getResource().getName()
+						+ ": "
+						+ iMarker
+								.getAttribute(IMarker.MESSAGE, "unknown Error"));
+				result = result
+						|| (Integer) iMarker.getAttribute(IMarker.SEVERITY) == IMarker.SEVERITY_ERROR;
+			}
+
+		} catch (CoreException e1) {
+		}
+		return result;
+	}
+
+	private void processResults(ListPrologTerm result) throws RodinDBException,
+			ExecutionException {
+		// preprocess the list into a map
+		Map<String, String> variables = new HashMap<String, String>();
+		for (PrologTerm term : result) {
+			CompoundPrologTerm compoundTerm;
+			try {
+				compoundTerm = BindingGenerator
+						.getCompoundTerm(term, "bind", 2);
+
+				variables.put(
+						PrologTerm.atomicString(compoundTerm.getArgument(1)),
+						PrologTerm.atomicString(compoundTerm.getArgument(2)));
+			} catch (ResultParserException e) {
+				CommandException commandException = new CommandException(
+						e.getLocalizedMessage(), e);
+				commandException.notifyUserOnce();
+			}
+		}
+
+		IEventBRoot rootElement = getRootElement();
+		// look up the variables / constants of the selected machine in
+		// the state
+		// and set the inferredUnitPragma attribute
+		if (rootElement instanceof IMachineRoot) {
+			// find and update variables
+			IVariable[] allVariables = rootElement.getMachineRoot()
+					.getVariables();
+
+			for (IVariable var : allVariables) {
+				String variableName = var.getIdentifierString();
+				if (variables.containsKey(variableName)) {
+					var.setAttributeValue(
+							InferredUnitPragmaAttribute.ATTRIBUTE,
+							variables.get(variableName),
+							new NullProgressMonitor());
+				}
+			}
+
+		} else if (rootElement instanceof IContextRoot) {
+			// find and update constants
+			IConstant[] allConstants = rootElement.getContextRoot()
+					.getConstants();
+
+			for (IConstant var : allConstants) {
+				String constantName = var.getIdentifierString();
+				if (variables.containsKey(constantName)) {
+					var.setAttributeValue(
+							InferredUnitPragmaAttribute.ATTRIBUTE,
+							variables.get(constantName),
+							new NullProgressMonitor());
+				}
+			}
+		} else {
+			throw new ExecutionException(
+					"Cannot execute unit analysis on this element type. Type of "
+							+ rootElement.getComponentName() + " was: "
+							+ rootElement.getClass());
+		}
+	}
+
+	private IEventBRoot getRootElement() {
+		IEventBRoot root = null;
+		if (fSelection instanceof IStructuredSelection) {
+			final IStructuredSelection ssel = (IStructuredSelection) fSelection;
+			if (ssel.size() == 1) {
+				final Object element = ssel.getFirstElement();
+				if (element instanceof IEventBRoot) {
+					root = (IEventBRoot) element;
+				} else if (element instanceof IFile) {
+					IRodinFile rodinFile = RodinCore.valueOf((IFile) element);
+					if (rodinFile != null)
+						root = (IEventBRoot) rodinFile.getRoot();
+				}
+			}
+		}
+		return root;
+	}
+
+	private IFile extractResource(final IEventBRoot rootElement) {
+		IFile resource = null;
+		if (rootElement == null) {
+			resource = null;
+		} else if (rootElement instanceof IMachineRoot) {
+			resource = ((IMachineRoot) rootElement).getSCMachineRoot()
+					.getResource();
+		} else if (rootElement instanceof IContextRoot) {
+			resource = ((IContextRoot) rootElement).getSCContextRoot()
+					.getResource();
+		}
+		return resource;
+	}
+
+	private void registerModificationListener(final IFile resource) {
+		if (listener != null) {
+			ResourcesPlugin.getWorkspace().removeResourceChangeListener(
+					listener);
+		}
+		listener = new ModificationListener(resource);
+		ResourcesPlugin.getWorkspace().addResourceChangeListener(listener);
+	}
+
+	public void selectionChanged(final IAction action,
+			final ISelection selection) {
+		fSelection = selection;
+	}
+
+}
diff --git a/de.prob2.units.feature/.project b/de.prob2.units.feature/.project
new file mode 100644
index 0000000000000000000000000000000000000000..96b7c78653fba0643a8efc26c06b6a3f61c66bd7
--- /dev/null
+++ b/de.prob2.units.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>de.prob2.units.feature</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
diff --git a/de.prob2.units.feature/.settings/org.eclipse.core.resources.prefs b/de.prob2.units.feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..ae8dfb5865c1107f8366e1e8c2af6ad2d1a7a9f1
--- /dev/null
+++ b/de.prob2.units.feature/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Tue Nov 29 16:17:25 CET 2011
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/de.prob2.units.feature/.settings/org.eclipse.core.runtime.prefs b/de.prob2.units.feature/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..57a8ae0b2a629cab658cebb8c79bd02f33f25fb0
--- /dev/null
+++ b/de.prob2.units.feature/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#Tue Nov 29 16:17:25 CET 2011
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/de.prob2.units.feature/build.properties b/de.prob2.units.feature/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..64f93a9f0b7328eb563aa5ad6cec7f828020e124
--- /dev/null
+++ b/de.prob2.units.feature/build.properties
@@ -0,0 +1 @@
+bin.includes = feature.xml
diff --git a/de.prob2.units.feature/feature.xml b/de.prob2.units.feature/feature.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f02638a4f1ecfd6fc2843745fa8b2e45422ac453
--- /dev/null
+++ b/de.prob2.units.feature/feature.xml
@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="de.prob2.units.feature"
+      label="ProB for Rodin2 - Physical Units Support"
+      version="2.3.5.qualifier"
+      provider-name="HHU Düsseldorf STUPS Group">
+
+   <description url="http://www.stups.uni-duesseldorf.de/ProB">
+      ProB is an animator and model checker for the B-Method. It allows fully automatic animation of many B specifications, and can be used to systematically check a specification for errors. 
+Part of the research and development was conducted within the EPSRC funded projects ABCD and iMoc, and within the EU funded project Rodin. 
+Development is continued under the EU funded project Deploy and the DFG project Gepavas. 
+ProB has been successfully used on various industrial specifications and is now being used within Siemens.
+   </description>
+
+   <copyright>
+      (C) 2000-2011 Michael Leuschel (and many others) All rights reserved.
+   </copyright>
+
+   <license url="http://www.eclipse.org/org/documents/epl-v10.html">
+      ProB can be used freely for commercial, non-commercial and academic
+use under the Eclipse Public Licence v. 1.0. (below) 
+For availability of commercial support, please contact the author
+(http://www.stups.uni-duesseldorf.de/~leuschel). 
+Use of ProB&apos;s nauty library for symmetry reduction implies further
+restrictions (no applications with nontrivial military significance,
+see http://cs.anu.edu.au/~bdm/nauty/).
+--- 
+Eclipse Public License - v. 1.0
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS
+ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT&apos;S ACCEPTANCE
+OF THIS AGREEMENT.
+1. DEFINITIONS
+&quot;Contribution&quot; means:
+a) in the case of the initial Contributor, the initial code and
+documentation distributed under this Agreement, and
+b) in the case of each subsequent Contributor:
+i) changes to the Program, and
+ii) additions to the Program;
+where such changes and/or additions to the Program originate
+from and are distributed by that particular Contributor. A Contribution
+&apos;originates&apos; from a Contributor if it was added to the Program
+by such Contributor itself or anyone acting on such Contributor&apos;s
+behalf. Contributions do not include additions to the Program
+which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.
+&quot;Contributor&quot; means any person or entity that distributes the
+Program.
+&quot;Licensed Patents&quot; mean patent claims licensable by a Contributor
+which are necessarily infringed by the use or sale of its Contribution
+alone or when combined with the Program.
+&quot;Program&quot; means the Contributions distributed in accordance with
+this Agreement.
+&quot;Recipient&quot; means anyone who receives the Program under this
+Agreement, including all Contributors.
+2. GRANT OF RIGHTS
+a) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free copyright
+license to reproduce, prepare derivative works of, publicly display,
+publicly perform, distribute and sublicense the Contribution
+of such Contributor, if any, and such derivative works, in source
+code and object code form.
+b) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free patent
+license under Licensed Patents to make, use, sell, offer to sell,
+import and otherwise transfer the Contribution of such Contributor,
+if any, in source code and object code form. This patent license
+shall apply to the combination of the Contribution and the Program
+if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to
+be covered by the Licensed Patents. The patent license shall
+not apply to any other combinations which include the Contribution.
+No hardware per se is licensed hereunder.
+c) Recipient understands that although each Contributor grants
+the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe
+the patent or other intellectual property rights of any other
+entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement
+of intellectual property rights or otherwise. As a condition
+to exercising the rights and licenses granted hereunder, each
+Recipient hereby assumes sole responsibility to secure any other
+intellectual property rights needed, if any. For example, if
+a third party patent license is required to allow Recipient to
+distribute the Program, it is Recipient&apos;s responsibility to acquire
+that license before distributing the Program.
+d) Each Contributor represents that to its knowledge it has sufficient
+copyright rights in its Contribution, if any, to grant the copyright
+license set forth in this Agreement.
+3. REQUIREMENTS
+A Contributor may choose to distribute the Program in object
+code form under its own license agreement, provided that:
+a) it complies with the terms and conditions of this Agreement;
+and
+b) its license agreement:
+i) effectively disclaims on behalf of all Contributors all warranties
+and conditions, express and implied, including warranties or
+conditions of title and non-infringement, and implied warranties
+or conditions of merchantability and fitness for a particular
+purpose;
+ii) effectively excludes on behalf of all Contributors all liability
+for damages, including direct, indirect, special, incidental
+and consequential damages, such as lost profits;
+iii) states that any provisions which differ from this Agreement
+are offered by that Contributor alone and not by any other party;
+and
+iv) states that source code for the Program is available from
+such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for
+software exchange.
+When the Program is made available in source code form:
+a) it must be made available under this Agreement; and
+b) a copy of this Agreement must be included with each copy of
+the Program.
+Contributors may not remove or alter any copyright notices contained
+within the Program.
+Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.
+4. COMMERCIAL DISTRIBUTION
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While
+this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and indemnify
+every other Contributor (&quot;Indemnified Contributor&quot;) against any
+losses, damages and costs (collectively &quot;Losses&quot;) arising from
+claims, lawsuits and other legal actions brought by a third party
+against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection
+with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any
+claims or Losses relating to any actual or alleged intellectual
+property infringement. In order to qualify, an Indemnified Contributor
+must: a) promptly notify the Commercial Contributor in writing
+of such claim, and b) allow the Commercial Contributor to control,
+and cooperate with the Commercial Contributor in, the defense
+and any related settlement negotiations. The Indemnified Contributor
+may participate in any such claim at its own expense.
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor&apos;s responsibility
+alone. Under this section, the Commercial Contributor would have
+to defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any
+other Contributor to pay any damages as a result, the Commercial
+Contributor must pay those damages.
+5. NO WARRANTY
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM
+IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with
+its exercise of rights under this Agreement , including but not
+limited to the risks and costs of program errors, compliance
+with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations.
+6. DISCLAIMER OF LIABILITY
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE
+OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGES.
+7. GENERAL
+If any provision of this Agreement is invalid or unenforceable
+under applicable law, it shall not affect the validity or enforceability
+of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be
+reformed to the minimum extent necessary to make such provision
+valid and enforceable.
+If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging
+that the Program itself (excluding combinations of the Program
+with other software or hardware) infringes such Recipient&apos;s patent(s),
+then such Recipient&apos;s rights granted under Section 2(b) shall
+terminate as of the date such litigation is filed.
+All Recipient&apos;s rights under this Agreement shall terminate if
+it fails to comply with any of the material terms or conditions
+of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If
+all Recipient&apos;s rights under this Agreement terminate, Recipient
+agrees to cease use and distribution of the Program as soon as
+reasonably practicable. However, Recipient&apos;s obligations under
+this Agreement and any licenses granted by Recipient relating
+to the Program shall continue and survive.
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted
+and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other
+than the Agreement Steward has the right to modify this Agreement.
+The Eclipse Foundation is the initial Agreement Steward. The
+Eclipse Foundation may assign the responsibility to serve as
+the Agreement Steward to a suitable separate entity. Each new
+version of the Agreement will be given a distinguishing version
+number. The Program (including Contributions) may always be distributed
+subject to the version of the Agreement under which it was received.
+In addition, after a new version of the Agreement is published,
+Contributor may elect to distribute the Program (including its
+Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights
+or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under
+this Agreement are reserved.
+This Agreement is governed by the laws of the State of New York
+and the intellectual property laws of the United States of America.
+No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose.
+Each party waives its rights to a jury trial in any resulting
+litigation.
+   </license>
+
+   <requires>
+      <import feature="de.prob2.feature" version="2.3.5" match="greaterOrEqual"/>
+   </requires>
+
+   <plugin
+         id="de.prob.units"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/settings.gradle b/settings.gradle
index bb2187c38344f1fac923b7dee971552ee4cdd523..2999825e4166d18ddb81985fd572577f4c160833 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,2 +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'
+include 'de.prob.core', 'de.prob.core.tests', 'de.bmotionstudio.gef.editor' ,'de.bmotionstudio.rodin', 'de.bmotionstudio.help' , 'de.prob.plugin', 'de.prob.ui', 'de.prob2.feature', 'de.prob.units', 'de.prob2.units.feature'