diff --git a/README.md b/README.md
index 97e65600c55767c57ba6b145434d8c10393f25aa..b847cb396215ff7321df13b8c384b276e0309930 100644
--- a/README.md
+++ b/README.md
@@ -13,6 +13,16 @@ The ProB binary and source distributions contain the nauty library (http://cs.an
 
 For availability of commercial support, please contact Formal Mind (http://www.formalmind.com).
 
+# Bugs
+Please report bugs and feature requests at http://jira.cobra.cs.uni-duesseldorf.de/
+
+# Prolog Source Code
+The latest source code of the Prolog binary can be downloaded from http://nightly.cobra.cs.uni-duesseldorf.de/source/. To build the Prolog binaries you require a Sicstus 4 (http://sicstus.sics.se/index.html) licence. 
+
+# ProB 2.0 
+The development repository for ProB 2.0 is avaliable from https://github.com/bendisposto/prob2
+
+
 # Setting up the development environment
 
 - Clone the repository (http://github.com/bendisposto/prob) 
diff --git a/build.gradle b/build.gradle
index 40e11823aacbdfe27b11559d37842727e382d85d..f18a8db85b7f7441e9cdcf1e06c6746a8eaf86a0 100644
--- a/build.gradle
+++ b/build.gradle
@@ -36,7 +36,7 @@ project(':de.prob.core') {
 	}
 
 
-        def parser_version = '2.4.19-SNAPSHOT'
+        def parser_version = '2.4.28-SNAPSHOT'
 
 	dependencies {
 	 compile group: "de.prob", name: "answerparser", version: parser_version , changing: true
@@ -77,7 +77,7 @@ task downloadCli << {
 		delete file(dir)
 	    new File(dir).mkdirs() 
 	
-		['leopard64':'macos','linux':'linux','linux64':'linux64','win32':'windows'].each {
+		['leopard64':'macos','linux32':'linux','linux64':'linux64','win32':'windows'].each {
 		def n = it.getKey()
 	
 		def targetdir = dir+it.getValue()
@@ -93,8 +93,8 @@ task downloadCli << {
 	}
 
 	def targetdir = dir+"windows/"
-	def targetzip = targetdir+"windowslib.zip"
-	download("http://nightly.cobra.cs.uni-duesseldorf.de/cli/windowslib.zip",targetzip)
+	def targetzip = targetdir+"windowslib32.zip"
+	download("http://nightly.cobra.cs.uni-duesseldorf.de/cli/windowslib32.zip",targetzip)
 	FileTree zip = zipTree(targetzip)
 	    copy {
 		   from zip
@@ -112,7 +112,7 @@ task downloadCli2 ( type: Exec ) {
 		delete file(dir)
 	    new File(dir).mkdirs() 
 	
-		['leopard64':'macos','linux':'linux','linux64':'linux64','win32':'windows'].each {
+		['leopard64':'macos','linux32':'linux','linux64':'linux64','win32':'windows'].each {
 		def n = it.getKey()
 	
 		def targetdir = dir+it.getValue()
@@ -128,8 +128,8 @@ task downloadCli2 ( type: Exec ) {
 	}
 
 	def targetdir = dir+"windows/"
-	def targetzip = targetdir+"windowslib.zip"
-	download("http://nightly.cobra.cs.uni-duesseldorf.de/cli/windowslib.zip",targetzip)
+	def targetzip = targetdir+"windowslib32.zip"
+	download("http://nightly.cobra.cs.uni-duesseldorf.de/cli/windowslib32.zip",targetzip)
 	FileTree zip = zipTree(targetzip)
 	    copy {
 		   from zip
diff --git a/de.bmotionstudio.gef.editor/META-INF/MANIFEST.MF b/de.bmotionstudio.gef.editor/META-INF/MANIFEST.MF
index 2b01795b07782adef4fe27c52fd22f0f7a1b242e..d54bc13d2649b74b914014d7633584c8ba5fea49 100644
--- a/de.bmotionstudio.gef.editor/META-INF/MANIFEST.MF
+++ b/de.bmotionstudio.gef.editor/META-INF/MANIFEST.MF
@@ -13,8 +13,11 @@ Require-Bundle: org.eclipse.ui;bundle-version="[3.5.0,4.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.4.0,9.5.0)";visibility:=reexport,
- org.eventb.core;bundle-version="[2.5.0,2.6.0)",
- org.eclipse.help;bundle-version="3.5.100"
+ org.eventb.core;bundle-version="[3.0.0,3.2.0)",
+ org.eclipse.help;bundle-version="3.5.100",
+ org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)",
+ org.rodinp.core;bundle-version="[1.7.0,1.8.0)",
+ org.eventb.core.ast;bundle-version="[3.0.0,3.2.0)"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Eclipse-RegisterBuddy: de.prob.core
diff --git a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeCustom.java b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeCustom.java
index a2ff6fa20caa0970d0519bad991a4f0b1a0f93c6..476f71d06243ab8705c9ba308a48360051d56e53 100644
--- a/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeCustom.java
+++ b/de.bmotionstudio.gef.editor/src/de/bmotionstudio/gef/editor/attribute/BAttributeCustom.java
@@ -22,7 +22,7 @@ public class BAttributeCustom extends AbstractAttribute {
 
 	@Override
 	public String getName() {
-		return "a2:This";
+		return "a2:this";
 	}
 
 }
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 8714d58555e8c84e80fe64c84a628340c0ff0583..2b02cd813bf0fd2ded27ffc60c619f4caaef8b30 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,6 +11,7 @@ import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
 import org.eventb.core.ISCAction;
 import org.eventb.core.ISCConstant;
 import org.eventb.core.ISCContextRoot;
@@ -34,7 +35,7 @@ import de.bmotionstudio.gef.editor.model.Visualization;
 import de.prob.logging.Logger;
 
 public final class EventBHelper {
-	
+
 	private static FormulaFactory formularFactory = FormulaFactory.getDefault();
 
 	public static EventBRoot getCorrespondingFile(IFile file,
@@ -88,7 +89,7 @@ public final class EventBHelper {
 
 					}
 
-				} catch (RodinDBException e) {
+				} catch (CoreException e) {
 					String message = "Rodin DB Exception while getting operations: "
 							+ e.getLocalizedMessage();
 					Logger.notifyUser(message, e);
@@ -127,7 +128,7 @@ public final class EventBHelper {
 					machinevar.setType(var.getType(formularFactory));
 					tmpSet.add(machinevar);
 				}
-			} catch (RodinDBException e) {
+			} catch (CoreException e) {
 				String message = "Rodin DB Exception while getting variables: "
 						+ e.getLocalizedMessage();
 				Logger.notifyUser(message, e);
@@ -196,12 +197,19 @@ public final class EventBHelper {
 					for (ISCInternalContext context : seenContexts) {
 
 						for (ISCConstant constant : context.getSCConstants()) {
-
-							MachineContentObject machineinv = new MachineContentObject(
-									constant.getIdentifierString());
-							machineinv.setType(constant
-									.getType(formularFactory));
-							tmpSet.add(machineinv);
+							try {
+								MachineContentObject machineinv = new MachineContentObject(
+										constant.getIdentifierString());
+								machineinv.setType(constant
+										.getType(formularFactory));
+								tmpSet.add(machineinv);
+							} catch (CoreException e) {
+								String message = "Rodin DB Exception while getting variables: "
+										+ e.getLocalizedMessage();
+								Logger.notifyUser(message, e);
+								return Collections
+										.unmodifiableList(new ArrayList<MachineContentObject>());
+							}
 
 						}
 
@@ -214,7 +222,16 @@ public final class EventBHelper {
 					for (ISCConstant constant : contextRoot.getSCConstants()) {
 						MachineContentObject machineinv = new MachineContentObject(
 								constant.getIdentifierString());
-						machineinv.setType(constant.getType(formularFactory));
+						try {
+							machineinv.setType(constant
+									.getType(formularFactory));
+						} catch (CoreException e) {
+							String message = "Rodin DB Exception while getting variables: "
+									+ e.getLocalizedMessage();
+							Logger.notifyUser(message, e);
+							return Collections
+									.unmodifiableList(new ArrayList<MachineContentObject>());
+						}
 						tmpSet.add(machineinv);
 					}
 
@@ -234,7 +251,9 @@ public final class EventBHelper {
 
 	}
 
-	public static String renderEvent(ISCEvent event) throws RodinDBException {
+	// Changed RodinDBException to CoreException for Rodin 3
+	// Might not be an intentional change in Rodin?
+	public static String renderEvent(ISCEvent event) throws CoreException {
 		StringBuffer sb = new StringBuffer();
 		sb.append("event ");
 		sb.append(event.getLabel());
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 1f9a6b76e83c627a1de6fc7c4efc9159d53e4d58..b1eabadb4acf3c0ba358ae9242d2bbc051975072 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
@@ -55,7 +55,7 @@ public class WizardObserverSimpleValueDisplay extends ObserverWizard {
 			container.setLayout(new GridLayout(2, false));
 
 			Label lb = new Label(container, SWT.NONE);
-			lb.setText("Predicate:");
+			lb.setText("Guard:");
 
 			txtPredicate = new Text(container, SWT.BORDER);
 			txtPredicate.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
@@ -73,7 +73,7 @@ public class WizardObserverSimpleValueDisplay extends ObserverWizard {
 			// BMotionStudioConstants.RODIN_FONT_KEY));
 
 			lb = new Label(container, SWT.NONE);
-			lb.setText("Replacement String:");
+			lb.setText("Replacement String*:");
 
 			txtReplacementString = new Text(container, SWT.BORDER);
 			txtReplacementString.setLayoutData(new GridData(
@@ -81,6 +81,10 @@ public class WizardObserverSimpleValueDisplay extends ObserverWizard {
 			txtReplacementString.setFont(new Font(Display.getDefault(),
 					new FontData("Arial", 10, SWT.NONE)));
 
+			lb = new Label(container, SWT.NONE);
+			lb.setLayoutData(new GridData(0,0,true,true,2,1));
+			lb.setText("*String that will be replaced with the result of the expression.");
+			
 			initBindings(dbc);
 
 			setControl(container);
diff --git a/de.bmotionstudio.rodin/fragment.xml b/de.bmotionstudio.rodin/fragment.xml
index 5fb8856c321fcf6aced0f36b205ed0ad51bf3536..47bd37efdd477647cacaa5309040f58a3c8e2eb8 100644
--- a/de.bmotionstudio.rodin/fragment.xml
+++ b/de.bmotionstudio.rodin/fragment.xml
@@ -31,23 +31,7 @@
                   <iterate
                         operator="or">
                      <instanceof
-                           value="de.bmotionstudio.rodin.IBMotionSurfaceRoot">
-                     </instanceof>
-                  </iterate>
-               </with>
-            </visibleWhen>
-         </command>
-         <command
-               commandId="de.bmotionstudio.rodin.command.renameVisualization"
-               label="Rename"
-               style="push">
-            <visibleWhen>
-               <with
-                     variable="selection">
-                  <iterate
-                        operator="or">
-                     <instanceof
-                           value="de.bmotionstudio.rodin.IBMotionSurfaceRoot">
+                           value="de.bmotionstudio.rodin.BMotionStudioRodinFile">
                      </instanceof>
                   </iterate>
                </with>
@@ -62,11 +46,6 @@
             id="de.bmotionstudio.rodin.command.startVisualization"
             name="Start Visualization">
       </command>
-      <command
-            defaultHandler="de.bmotionstudio.rodin.RenameFileHandler"
-            id="de.bmotionstudio.rodin.command.renameVisualization"
-            name="Rename">
-      </command>
    </extension>
    <extension
          point="org.rodinp.core.fileAssociations">
@@ -75,20 +54,6 @@
             root-element-type="de.bmotionstudio.gef.editor.BMotionStudioFile">
       </fileAssociation>
    </extension>
-   <extension
-         point="org.eclipse.core.contenttype.contentTypes">
-      <content-type
-            base-type="org.rodinp.core.rodin"
-            file-extensions="bmso"
-            id="BMotionStudioFile"
-            name="BMotion Studio Surface File"
-            priority="normal">
-      </content-type>
-      <file-association
-            content-type="de.bmotionstudio.gef.editor.BMotionStudioFile"
-            file-extensions="bmso">
-      </file-association>
-   </extension>
    <extension
          point="org.eclipse.ui.navigator.navigatorContent">
       <navigatorContent
@@ -104,7 +69,7 @@
          </triggerPoints>
          <possibleChildren>
             <instanceof
-                  value="de.bmotionstudio.rodin.IBMotionSurfaceRoot">
+                  value="de.bmotionstudio.rodin.BMotionStudioRodinFile">
             </instanceof>
          </possibleChildren>
          <actionProvider
@@ -112,8 +77,7 @@
                id="de.bmotionstudio.ui.navigatorAction"
                priority="normal">
             <enablement>
-               <instanceof
-                     value="de.bmotionstudio.rodin.IBMotionSurfaceRoot">
+               <instanceof value="de.bmotionstudio.rodin.BMotionStudioRodinFile">
                </instanceof>
             </enablement>
          </actionProvider>
@@ -138,14 +102,6 @@
          </includes>
       </viewerActionBinding>
    </extension>
-   <extension
-         point="org.rodinp.core.internalElementTypes">
-      <internalElementType
-            class="de.bmotionstudio.rodin.BMotionSurfaceRoot"
-            id="BMotionStudioFile"
-            name="BMotion Studio Surface File">
-      </internalElementType>
-   </extension>
    
    
 
diff --git a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/ActionCollection.java b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/ActionCollection.java
index 9ac7a03b70f8ee9a69be3d884193ec0fc255812f..b70999a3c7f292bd21ac025b275a98ff4c8a7678 100644
--- a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/ActionCollection.java
+++ b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/ActionCollection.java
@@ -11,6 +11,8 @@ import java.util.Collection;
 import java.util.Iterator;
 
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Status;
@@ -18,15 +20,16 @@ import org.eclipse.jface.action.Action;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.*;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.navigator.ICommonActionExtensionSite;
 import org.eclipse.ui.part.FileEditorInput;
-import org.rodinp.core.IRodinElement;
-import org.rodinp.core.IRodinFile;
-import org.rodinp.core.RodinDBException;
 
 import de.bmotionstudio.gef.editor.BMotionEditorPlugin;
-import de.bmotionstudio.gef.editor.BMotionStudioImage;
 
 public class ActionCollection {
 
@@ -42,42 +45,39 @@ public class ActionCollection {
 			@Override
 			public void run() {
 
-				IRodinFile component;
-
 				final ISelection selection = site.getStructuredViewer()
 						.getSelection();
 				final Object obj = ((IStructuredSelection) selection)
 						.getFirstElement();
 
-				if (obj instanceof IBMotionSurfaceRoot) {
-
-					component = (IRodinFile) ((IRodinElement) obj)
-							.getOpenable();
+				if (obj instanceof BMotionStudioRodinFile) {
 
-					if (component == null) {
-						return;
-					}
+					BMotionStudioRodinFile file = (BMotionStudioRodinFile) obj;
+					IResource resource = file.getResource();
+					final IFile ifile = resource.getProject().getFile(
+							resource.getName());
 
 					try {
 
 						final IEditorDescriptor desc = PlatformUI
 								.getWorkbench().getEditorRegistry()
-								.getDefaultEditor(
-										component.getCorrespondingResource()
-												.getName());
-
-						BMotionEditorPlugin.getActivePage().openEditor(
-								new FileEditorInput(component.getResource()),
-								desc.getId());
+								.getDefaultEditor(resource.getName());
 
-						// editor.getSite().getSelectionProvider().setSelection(
-						// new StructuredSelection(obj));
+						BMotionEditorPlugin
+								.getDefault()
+								.getWorkbench()
+								.getActiveWorkbenchWindow()
+								.getActivePage()
+								.openEditor(new FileEditorInput(ifile),
+										desc.getId());
 
 					} catch (final PartInitException e) {
 						final String errorMsg = "Error open Editor";
 						MessageDialog.openError(null, null, errorMsg);
-						BMotionEditorPlugin.getDefault().getLog().log(
-								new Status(IStatus.ERROR,
+						BMotionEditorPlugin
+								.getDefault()
+								.getLog()
+								.log(new Status(IStatus.ERROR,
 										BMotionEditorPlugin.PLUGIN_ID,
 										errorMsg, e));
 					}
@@ -101,59 +101,56 @@ public class ActionCollection {
 			public void run() {
 				if (!(site.getStructuredViewer().getSelection().isEmpty())) {
 
-					Collection<IRodinElement> set = new ArrayList<IRodinElement>();
+					Collection<BMotionStudioRodinFile> set = new ArrayList<BMotionStudioRodinFile>();
 
 					IStructuredSelection ssel = (IStructuredSelection) site
 							.getStructuredViewer().getSelection();
 
 					for (Iterator<?> it = ssel.iterator(); it.hasNext();) {
 						final Object obj = it.next();
-						if (!(obj instanceof IBMotionSurfaceRoot)) {
+						if (!(obj instanceof BMotionStudioRodinFile)) {
 							continue;
 						}
-						IRodinElement elem = (IRodinElement) obj;
-						if (elem.isRoot()) {
-							elem = elem.getParent();
-						}
+						BMotionStudioRodinFile elem = (BMotionStudioRodinFile) obj;
 						set.add(elem);
 					}
 
 					int answer = YesToAllMessageDialog.YES;
-					for (IRodinElement element : set) {
-						if (element instanceof IRodinFile) {
-							if (answer != YesToAllMessageDialog.YES_TO_ALL) {
-								answer = YesToAllMessageDialog
-										.openYesNoToAllQuestion(
-												site.getViewSite().getShell(),
-												"Confirm File Delete",
-												"Are you sure you want to delete file '"
-														+ ((IRodinFile) element)
-																.getElementName()
-														+ "' in project '"
-														+ element
-																.getParent()
-																.getElementName()
-														+ "' ?");
-							}
+					for (BMotionStudioRodinFile element : set) {
+
+						if (answer != YesToAllMessageDialog.YES_TO_ALL) {
+							answer = YesToAllMessageDialog
+									.openYesNoToAllQuestion(
+											site.getViewSite().getShell(),
+											"Confirm File Delete",
+											"Are you sure you want to delete file '"
+													+ ((BMotionStudioRodinFile) element)
+															.getResource()
+															.getName()
+													+ "' in project '"
+													+ element.getResource()
+															.getProject()
+															.getName() + "' ?");
+						}
 
-							if (answer == YesToAllMessageDialog.NO_TO_ALL
-									|| answer == YesToAllMessageDialog.CANCEL)
-								break;
-
-							if (answer != YesToAllMessageDialog.NO) {
-								try {
-									closeOpenedEditor((IRodinFile) element);
-									((IRodinFile) element).delete(true,
-											new NullProgressMonitor());
-								} catch (PartInitException e) {
-									MessageDialog.openError(null, "Error",
-											"Could not delete file");
-								} catch (RodinDBException e) {
-									MessageDialog.openError(null, "Error",
-											"Could not delete file");
-								}
+						if (answer == YesToAllMessageDialog.NO_TO_ALL
+								|| answer == YesToAllMessageDialog.CANCEL)
+							break;
+
+						if (answer != YesToAllMessageDialog.NO) {
+							try {
+								closeOpenedEditor((BMotionStudioRodinFile) element);
+								((BMotionStudioRodinFile) element)
+										.getResource().delete(true,
+												new NullProgressMonitor());
+							} catch (PartInitException e) {
+								MessageDialog.openError(null, "Error",
+										"Could not delete file");
+							} catch (CoreException e) {
+								e.printStackTrace();
 							}
 						}
+
 					}
 
 				}
@@ -161,13 +158,15 @@ public class ActionCollection {
 		};
 		deleteAction.setText("&Delete");
 		deleteAction.setToolTipText("Delete these elements");
-		deleteAction.setImageDescriptor(BMotionStudioImage.getImageDescriptor(
-				"org.eclipse.ui", "$nl$/icons/full/etool16/delete_edit.gif"));
+		deleteAction.setImageDescriptor(BMotionEditorPlugin
+				.imageDescriptorFromPlugin("org.eclipse.ui",
+						"$nl$/icons/full/etool16/delete_edit.gif"));
 
 		return deleteAction;
 	}
 
-	static void closeOpenedEditor(IRodinFile file) throws PartInitException {
+	static void closeOpenedEditor(BMotionStudioRodinFile file)
+			throws PartInitException {
 		IEditorReference[] editorReferences = BMotionEditorPlugin
 				.getActivePage().getEditorReferences();
 		for (int j = 0; j < editorReferences.length; j++) {
diff --git a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionLabelProvider.java b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionLabelProvider.java
index 75c5a1606ec22b546ddd3615de307ef9f7f40c90..06ae49b37bd6eaff0b4d36a737d3a0fc671be1e1 100644
--- a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionLabelProvider.java
+++ b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionLabelProvider.java
@@ -9,8 +9,6 @@ package de.bmotionstudio.rodin;
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.ILabelProviderListener;
 import org.eclipse.swt.graphics.Image;
-import org.rodinp.core.IInternalElement;
-import org.rodinp.core.IRodinFile;
 
 import de.bmotionstudio.gef.editor.BMotionStudioImage;
 
@@ -22,12 +20,10 @@ public class BMotionLabelProvider implements ILabelProvider {
 
 	public String getText(final Object element) {
 
-		if (element instanceof IRodinFile) {
-			return ((IRodinFile) element).getBareName();
-		} else if (element instanceof IInternalElement) {
-			return ((IInternalElement) element).getRodinFile().getBareName();
-		}
-		return null;
+		if (element instanceof BMotionStudioRodinFile)
+			return ((BMotionStudioRodinFile) element).getResource().getName()
+					.replace(".bmso", "");
+		return element.toString();
 
 	}
 
diff --git a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionStudioActionProvider.java b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionStudioActionProvider.java
index 9492e7ac1b2e2861db0646a575546da1a565be1d..e6b1ca715fd09baa7f3fc3c6332cd0dbaf47411c 100644
--- a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionStudioActionProvider.java
+++ b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionStudioActionProvider.java
@@ -25,7 +25,7 @@ public class BMotionStudioActionProvider extends CommonActionProvider {
 
 	public static String GROUP_FILEACTIONS = "fileactionsGroup";
 
-	// StructuredViewer viewer;
+	// StructuredViewer viewer;
 
 	ICommonActionExtensionSite site;
 
@@ -33,7 +33,7 @@ public class BMotionStudioActionProvider extends CommonActionProvider {
 	public void init(final ICommonActionExtensionSite aSite) {
 		super.init(aSite);
 		site = aSite;
-		// viewer = aSite.getStructuredViewer();
+		// viewer = aSite.getStructuredViewer();
 	}
 
 	@Override
@@ -49,12 +49,12 @@ public class BMotionStudioActionProvider extends CommonActionProvider {
 	public void fillContextMenu(IMenuManager menu) {
 		super.fillContextMenu(menu);
 		menu.add(new GroupMarker(GROUP_FILEACTIONS));
-		menu.appendToGroup(ICommonMenuConstants.GROUP_OPEN, ActionCollection
-				.getOpenAction(site));
+		menu.appendToGroup(ICommonMenuConstants.GROUP_OPEN,
+				ActionCollection.getOpenAction(site));
 		menu.appendToGroup(ICommonMenuConstants.GROUP_OPEN_WITH,
 				buildOpenWithMenu());
-		menu.appendToGroup(GROUP_FILEACTIONS, ActionCollection
-				.getDeleteAction(site));
+		menu.appendToGroup(GROUP_FILEACTIONS,
+				ActionCollection.getDeleteAction(site));
 	}
 
 	MenuManager buildOpenWithMenu() {
@@ -63,7 +63,7 @@ public class BMotionStudioActionProvider extends CommonActionProvider {
 		ISelection selection = site.getStructuredViewer().getSelection();
 		Object obj = ((IStructuredSelection) selection).getFirstElement();
 		menu.add(new OpenWithMenu(BMotionEditorPlugin.getActivePage(),
-				((IBMotionSurfaceRoot) obj).getRodinFile().getResource()));
+				((BMotionStudioRodinFile) obj).getResource()));
 		return menu;
 	}
 
diff --git a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionStudioContentProvider.java b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionStudioContentProvider.java
index c00e4a4e928dbc393c5b4f55ba3dcd395b56fd14..7a6434327dce482226944bf1c97ce5455b2c8792 100644
--- a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionStudioContentProvider.java
+++ b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionStudioContentProvider.java
@@ -6,37 +6,45 @@
 
 package de.bmotionstudio.rodin;
 
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.rodinp.core.IRodinProject;
-import org.rodinp.core.RodinCore;
-import org.rodinp.core.RodinDBException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
 
 
 public class BMotionStudioContentProvider implements ITreeContentProvider {
 
 	public Object[] getChildren(final Object parentElement) {
 
-		if (parentElement instanceof IProject) {
-
-			final IProject project = (IProject) parentElement;
-
-			// if it is a RodinProject return the IRodinProject from the DB.
-			final IRodinProject proj = RodinCore.valueOf(project);
-			if (proj.exists()) {
-
-				try {
-					return proj
-							.getRootElementsOfType(IBMotionSurfaceRoot.ELEMENT_TYPE);
-				} catch (final RodinDBException e) {
-					e.printStackTrace();
-				}
-
-			}
-
-		}
-
+		List<Object> res = new ArrayList<Object>();
+
+		if (parentElement instanceof IProject) {
+
+			final IProject project = (IProject) parentElement;
+
+			if (project.exists()) {
+
+				try {
+					for (IResource rs : project.members()) {
+						if (rs.getFileExtension() != null
+								&& rs.getFileExtension().equals("bmso")) {
+							res.add(new BMotionStudioRodinFile(rs));
+						}
+
+					}
+				} catch (CoreException e) {
+					e.printStackTrace();
+				}
+			}
+
+			return res.toArray(new BMotionStudioRodinFile[res.size()]);
+
+		}
+
 		return new Object[0];
 
 	}
diff --git a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionStudioRodinFile.java b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionStudioRodinFile.java
new file mode 100644
index 0000000000000000000000000000000000000000..6286b03e5ce1410a60546697cca103f803318e17
--- /dev/null
+++ b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionStudioRodinFile.java
@@ -0,0 +1,27 @@
+/** 
+ * (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.rodin;
+
+import org.eclipse.core.resources.IResource;
+
+public class BMotionStudioRodinFile {
+
+	private IResource resource;
+	
+	public BMotionStudioRodinFile(IResource resource) {
+		this.resource = resource;
+	}
+
+	public IResource getResource() {
+		return resource;
+	}
+
+	public void setResource(IResource resource) {
+		this.resource = resource;
+	}
+
+}
diff --git a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionSurfaceRoot.java b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionSurfaceRoot.java
deleted file mode 100644
index 32710b10caf8a1c8d23b9e53f765be86e201328c..0000000000000000000000000000000000000000
--- a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/BMotionSurfaceRoot.java
+++ /dev/null
@@ -1,34 +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.rodin;
-
-import org.rodinp.core.IInternalElementType;
-import org.rodinp.core.IRodinElement;
-import org.rodinp.core.RodinDBException;
-import org.rodinp.core.basis.InternalElement;
-import org.rodinp.core.basis.RodinElement;
-
-
-
-public class BMotionSurfaceRoot extends InternalElement implements
-		IBMotionSurfaceRoot {
-
-	public BMotionSurfaceRoot(final String name, final IRodinElement parent) {
-		super(name, parent);
-	}
-
-	@Override
-	public RodinElement[] getChildren() throws RodinDBException {
-		return NO_ELEMENTS;
-	}
-
-	@Override
-	public IInternalElementType<IBMotionSurfaceRoot> getElementType() {
-		return ELEMENT_TYPE;
-	}
-
-}
diff --git a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/IBMotionSurfaceRoot.java b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/IBMotionSurfaceRoot.java
deleted file mode 100644
index 5311a6aa7ee51802bc712e2031081f600555949d..0000000000000000000000000000000000000000
--- a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/IBMotionSurfaceRoot.java
+++ /dev/null
@@ -1,21 +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.rodin;
-
-import org.rodinp.core.IInternalElement;
-import org.rodinp.core.IInternalElementType;
-import org.rodinp.core.RodinCore;
-
-import de.bmotionstudio.gef.editor.BMotionEditorPlugin;
-
-public interface IBMotionSurfaceRoot extends IInternalElement {
-
-	IInternalElementType<IBMotionSurfaceRoot> ELEMENT_TYPE = RodinCore
-			.getInternalElementType(BMotionEditorPlugin.PLUGIN_ID
-					+ ".BMotionStudioFile"); //$NON-NLS-1$
-
-}
diff --git a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/RenameFileHandler.java b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/RenameFileHandler.java
deleted file mode 100644
index 01f9f981a41c1baa3c4d0684a2584468bf5c8976..0000000000000000000000000000000000000000
--- a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/RenameFileHandler.java
+++ /dev/null
@@ -1,114 +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.rodin;
-
-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.IWorkspaceRunnable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.handlers.HandlerUtil;
-import org.rodinp.core.IRodinFile;
-import org.rodinp.core.IRodinProject;
-import org.rodinp.core.RodinCore;
-import org.rodinp.core.RodinDBException;
-
-import de.bmotionstudio.gef.editor.BMotionEditorPlugin;
-import de.bmotionstudio.gef.editor.internal.BMotionFileInputValidator;
-
-/**
- * @author Lukas Ladenberger
- * 
- */
-public class RenameFileHandler extends AbstractHandler implements IHandler {
-
-	private ISelection fSelection;
-	private IWorkbenchPart part;
-
-	@Override
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-
-		fSelection = HandlerUtil.getCurrentSelection(event);
-		part = HandlerUtil.getActivePart(event);
-
-		if (fSelection instanceof IStructuredSelection) {
-			IStructuredSelection ssel = (IStructuredSelection) fSelection;
-
-			if (ssel.size() == 1) {
-
-				Object obj = ssel.getFirstElement();
-
-				if (obj instanceof IBMotionSurfaceRoot) {
-
-					final IBMotionSurfaceRoot root = (IBMotionSurfaceRoot) obj;
-					if (root.getParent() instanceof IRodinFile) {
-
-						final IRodinFile file = root.getRodinFile();
-						final IRodinProject prj = file.getRodinProject();
-
-						InputDialog dialog = new InputDialog(part.getSite()
-								.getShell(), "Rename BMotion Studio Project",
-								"Please enter the new name for the Project",
-								getDefaultName(root),
-								new BMotionFileInputValidator(prj));
-
-						dialog.open();
-
-						final String bareName = dialog.getValue();
-
-						if (dialog.getReturnCode() == InputDialog.CANCEL)
-							return null; // Cancel
-
-						assert bareName != null;
-
-						try {
-							RodinCore.run(new IWorkspaceRunnable() {
-
-								public void run(IProgressMonitor monitor)
-										throws RodinDBException {
-									String newName = bareName
-											+ "."
-											+ BMotionEditorPlugin.FILEEXT_STUDIO;
-									if (newName != null)
-										file.rename(newName, false, monitor);
-								}
-
-							}, null);
-						} catch (RodinDBException e) {
-							e.printStackTrace();
-						}
-
-					}
-				}
-
-			}
-		}
-
-		return null;
-
-	}
-
-	public void selectionChanged(final IAction action,
-			final ISelection selection) {
-		fSelection = selection;
-	}
-
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		part = targetPart;
-	}
-
-	private String getDefaultName(IBMotionSurfaceRoot root) {
-		return root.getResource().getName().replace(".bmso", "");
-	}
-
-}
diff --git a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/StartEventBVisualizationHandler.java b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/StartEventBVisualizationHandler.java
index b35987661b39908266d99274771a054655e3f93e..7d0799c38ad624891800d6b6cf41c0e6b64877d7 100644
--- a/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/StartEventBVisualizationHandler.java
+++ b/de.bmotionstudio.rodin/src/de/bmotionstudio/rodin/StartEventBVisualizationHandler.java
@@ -8,6 +8,11 @@ package de.bmotionstudio.rodin;
 
 import org.eclipse.core.commands.IHandler;
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
 import org.eclipse.jface.viewers.IStructuredSelection;
 
 import de.bmotionstudio.gef.editor.handler.StartVisualizationFileHandler;
@@ -21,8 +26,14 @@ public class StartEventBVisualizationHandler extends
 
 	@Override
 	protected IFile getBmsFileFromSelection(IStructuredSelection ssel) {
-		if (ssel.getFirstElement() instanceof IBMotionSurfaceRoot)
-			return ((IBMotionSurfaceRoot) ssel.getFirstElement()).getResource();
+		if (ssel.getFirstElement() instanceof BMotionStudioRodinFile) {
+			IResource resource = ((BMotionStudioRodinFile) ssel
+					.getFirstElement()).getResource();
+			IWorkspace workspace = ResourcesPlugin.getWorkspace();
+			IPath location = Path.fromOSString(resource.getFullPath()
+					.toOSString());
+			return workspace.getRoot().getFileForLocation(location);
+		}
 		return null;
 	}
 
diff --git a/de.prob.core/.classpath b/de.prob.core/.classpath
index 64514b5b61169cb4dadac9325e6be40ac47601dd..6037143e852ed9a2db70bc105172263b8d4bde55 100644
--- a/de.prob.core/.classpath
+++ b/de.prob.core/.classpath
@@ -4,17 +4,19 @@
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="output" path="bin"/>
-	<classpathentry exported="true" kind="lib" path="lib/dependencies/answerparser-2.4.19-SNAPSHOT.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/dependencies/bparser-2.4.19-SNAPSHOT.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/dependencies/cliparser-2.4.19-SNAPSHOT.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/answerparser-2.4.26-SNAPSHOT.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/bparser-2.4.26-SNAPSHOT.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/cliparser-2.4.26-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/jfmi-1.0.2-SNAPSHOT.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/jna-3.4.0.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.19-SNAPSHOT.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/dependencies/parserbase-2.4.19-SNAPSHOT.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/dependencies/prologlib-2.4.19-SNAPSHOT.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/dependencies/theorymapping-2.4.19-SNAPSHOT.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/dependencies/unicode-2.4.19-SNAPSHOT.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/ltlparser-2.4.26-SNAPSHOT.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/parserbase-2.4.26-SNAPSHOT.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/prologlib-2.4.26-SNAPSHOT.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/theorymapping-2.4.26-SNAPSHOT.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/dependencies/unicode-2.4.26-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"/>
diff --git a/de.prob.core/META-INF/MANIFEST.MF b/de.prob.core/META-INF/MANIFEST.MF
index 1e95a85cf49ca65c509e819f0b4743104ec6e854..448ac968741ca08c110cd38087eb0df2906061d5 100644
--- a/de.prob.core/META-INF/MANIFEST.MF
+++ b/de.prob.core/META-INF/MANIFEST.MF
@@ -2,11 +2,14 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: ProB Animator Core
 Bundle-SymbolicName: de.prob.core;singleton:=true
-Bundle-Version: 9.4.0.qualifier
+Bundle-Version: 9.4.1.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.5.0,2.6.0)",
- org.eventb.theory.core;bundle-version="[2.0.0,3.0.0)";resolution:=optional
+ org.rodinp.core;bundle-version="[1.7.0,1.8.0)",
+ org.eventb.theory.core;bundle-version="[2.0.0,3.0.0)";resolution:=optional,
+ org.eventb.core.ast;bundle-version="[3.0.0,3.2.0)",
+ org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)",
+ org.eventb.core.seqprover;bundle-version="[3.0.0,3.2.0)",
+ org.eventb.core;bundle-version="[3.0.0,3.2.0)"
 Bundle-ActivationPolicy: lazy
 Eclipse-BundleShape: dir
 Bundle-Vendor: HHU Dusseldorf STUPS Group
@@ -79,6 +82,7 @@ Export-Package: com.thoughtworks.xstream,
  de.prob.core.sablecc.parser,
  de.prob.core.translator,
  de.prob.core.types,
+ de.prob.cosimulation,
  de.prob.eventb.translator,
  de.prob.eventb.translator.flow,
  de.prob.eventb.translator.internal,
@@ -110,23 +114,36 @@ Export-Package: com.thoughtworks.xstream,
  org.apache.commons.lang.mutable,
  org.apache.commons.lang.reflect,
  org.apache.commons.lang.text,
- org.apache.commons.lang.time
+ org.apache.commons.lang.time,
+ org.ptolemy.fmi,
+ org.ptolemy.fmi.driver,
+ org.ptolemy.fmi.type
 Bundle-Activator: de.prob.core.internal.Activator
 Eclipse-BuddyPolicy: registered
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ClassPath: .,
- lib/dependencies/unicode-2.4.19-SNAPSHOT.jar,
- lib/dependencies/theorymapping-2.4.19-SNAPSHOT.jar,
- lib/dependencies/prologlib-2.4.19-SNAPSHOT.jar,
- lib/dependencies/parserbase-2.4.19-SNAPSHOT.jar,
- lib/dependencies/ltlparser-2.4.19-SNAPSHOT.jar,
- lib/dependencies/cliparser-2.4.19-SNAPSHOT.jar,
- lib/dependencies/bparser-2.4.19-SNAPSHOT.jar,
- lib/dependencies/answerparser-2.4.19-SNAPSHOT.jar,
+ lib/dependencies/unicode-2.4.26-SNAPSHOT.jar,
+ lib/dependencies/theorymapping-2.4.26-SNAPSHOT.jar,
+ lib/dependencies/prologlib-2.4.26-SNAPSHOT.jar,
+ lib/dependencies/parserbase-2.4.26-SNAPSHOT.jar,
+ lib/dependencies/ltlparser-2.4.26-SNAPSHOT.jar,
+ lib/dependencies/cliparser-2.4.26-SNAPSHOT.jar,
+ lib/dependencies/bparser-2.4.26-SNAPSHOT.jar,
+ lib/dependencies/answerparser-2.4.26-SNAPSHOT.jar,
+ lib/dependencies/unicode-2.4.22-SNAPSHOT.jar,
+ lib/dependencies/theorymapping-2.4.22-SNAPSHOT.jar,
+ lib/dependencies/prologlib-2.4.22-SNAPSHOT.jar,
+ lib/dependencies/parserbase-2.4.22-SNAPSHOT.jar,
+ lib/dependencies/ltlparser-2.4.22-SNAPSHOT.jar,
+ lib/dependencies/cliparser-2.4.22-SNAPSHOT.jar,
+ lib/dependencies/bparser-2.4.22-SNAPSHOT.jar,
+ lib/dependencies/answerparser-2.4.22-SNAPSHOT.jar,
  lib/dependencies/jgrapht-0.8.3.jar,
  lib/dependencies/commons-codec-1.6.jar,
  lib/dependencies/commons-lang-2.6.jar,
  lib/dependencies/jsr305-1.3.9.jar,
  lib/dependencies/xmlpull-1.1.3.1.jar,
  lib/dependencies/xpp3_min-1.1.4c.jar,
- lib/dependencies/xstream-1.4.3.jar
+ lib/dependencies/xstream-1.4.3.jar,
+ lib/dependencies/jfmi-1.0.2-SNAPSHOT.jar,
+ lib/dependencies/jna-3.4.0.jar
diff --git a/de.prob.core/build.gradle b/de.prob.core/build.gradle
index a4692401acacc2acb2529817321b113b81f4a2ec..60dd16f13dc3acdbf16941f1423292a2600a4663 100644
--- a/de.prob.core/build.gradle
+++ b/de.prob.core/build.gradle
@@ -14,4 +14,6 @@ dependencies {
  compile 'commons-lang:commons-lang:2.6'
  compile 'commons-codec:commons-codec:1.6'
  compile 'com.thoughtworks.xstream:xstream:1.4.3'
+ compile group: 'net.java.dev.jna', name: 'jna', version: '3.4.0'
+ compile group: 'edu.berkeley.eecs.ptolemy', name: 'jfmi', version: '1.0.2-SNAPSHOT'
 }
\ No newline at end of file
diff --git a/de.prob.core/build.properties b/de.prob.core/build.properties
index 1a6cddddba5661de2f965051163daed933d90407..99230d528427c77989fe9534724cf6533e521d2e 100644
--- a/de.prob.core/build.properties
+++ b/de.prob.core/build.properties
@@ -8,6 +8,8 @@ bin.includes = META-INF/,\
                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
+               lib/dependencies/xstream-1.4.3.jar,\
+               lib/dependencies/jfmi-1.0.2-SNAPSHOT.jar,\
+               lib/dependencies/jna-3.4.0.jar
              
 
diff --git a/de.prob.core/prob_target.target b/de.prob.core/prob_target.target
index 8834890556ae7309a133b1c3064a6e9b2961e4d5..1d4ccde825dd2d9e8fc8956b8f5dc20e67ff458a 100644
--- a/de.prob.core/prob_target.target
+++ b/de.prob.core/prob_target.target
@@ -1,27 +1,21 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?pde version="3.8"?><target name="prob_target" sequenceNumber="20">
+<?pde version="3.8"?><target name="prob_target" sequenceNumber="32">
 <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"/>
+<unit id="org.eclipse.gef" version="0.0.0"/>
+<repository location="http://download.eclipse.org/tools/gef/updates/releases"/>
 </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"/>
+<repository location="http://rodin-b-sharp.sourceforge.net/updates/"/>
 </location>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eventb.theory.feature.feature.group" version="2.0.0"/>
-<repository location="http://www.stups.uni-duesseldorf.de/ProB/buildlibs/theory/"/>
-</location>
-<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="epp.package.java" version="1.4.2.20120213-0813"/>
-<repository location="http://download.eclipse.org/releases/indigo/"/>
+<unit id="org.eventb.ide.feature.group" version="3.0.1.201406111447-5326174"/>
+<unit id="fr.systerel.editor.feature.group" version="0.7.0.201406111447-5326174"/>
+<unit id="org.rodinp.feature.group" version="1.7.0.201406111447-5326174"/>
+<unit id="org.rodinp.platform.feature.group" version="3.0.0.201406111447-5326174"/>
+<unit id="org.rodinp.platform.tests.feature.group" version="3.0.0.201406111447-5326174"/>
+<unit id="org.rodinp.platform.sources.feature.group" version="3.0.0.201406111447-5326174"/>
+<repository location="http://www.stups.uni-duesseldorf.de/ProB/buildlibs/rodin/"/>
 </location>
 </locations>
 </target>
diff --git a/de.prob.core/src/de/prob/animator/domainobjects/EventB.java b/de.prob.core/src/de/prob/animator/domainobjects/EventB.java
index 08ff51770bf26234da85372392ed8ff9978aa3fe..15e683a4955385a05cdf4fc2a588702e929c8da4 100644
--- a/de.prob.core/src/de/prob/animator/domainobjects/EventB.java
+++ b/de.prob.core/src/de/prob/animator/domainobjects/EventB.java
@@ -1,19 +1,5 @@
 package de.prob.animator.domainobjects;
 
-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.be4.classicalb.core.parser.analysis.prolog.ASTProlog;
 import de.be4.classicalb.core.parser.node.Node;
 import de.prob.model.representation.FormulaUUID;
@@ -44,51 +30,52 @@ public class EventB implements IEvalElement {
 	}
 
 	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);
-//		}
+		// 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());
-//		}
-//		final String error = Joiner.on(", \n").join(msgs);
-//		throw new EvaluationException("Cannot parse " + code + ":\n " + error);
-//	}
+	// 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());
+	// }
+	// final String error = Joiner.on(", \n").join(msgs);
+	// throw new EvaluationException("Cannot parse " + code + ":\n " + error);
+	// }
 
 	@Override
 	public String getCode() {
diff --git a/de.prob.core/src/de/prob/cli/CliStarter.java b/de.prob.core/src/de/prob/cli/CliStarter.java
index f71cf9aa2371474db9ee73c3f42bb95899eada52..69da33388117b4d397f96fc241c146a4331d2747 100644
--- a/de.prob.core/src/de/prob/cli/CliStarter.java
+++ b/de.prob.core/src/de/prob/cli/CliStarter.java
@@ -6,31 +6,15 @@
 
 package de.prob.cli;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Random;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-
-import de.prob.cli.clipatterns.CliPattern;
-import de.prob.cli.clipatterns.InterruptRefPattern;
-import de.prob.cli.clipatterns.PortPattern;
+import java.io.*;
+import java.net.*;
+import java.security.*;
+import java.util.*;
+
+import org.eclipse.core.runtime.*;
+import org.osgi.framework.Bundle;
+
+import de.prob.cli.clipatterns.*;
 import de.prob.core.internal.Activator;
 import de.prob.logging.Logger;
 
@@ -85,9 +69,8 @@ public final class CliStarter {
 		final File applicationPath = getCliPath();
 
 		final String fullcp = createFullClasspath(os, applicationPath);
-		
-		final OsSpecificInfo osInfo = getOsInfo(os,arch);
-		
+
+		final OsSpecificInfo osInfo = getOsInfo(os, arch);
 
 		final String osPath = applicationPath + File.separator + osInfo.subdir;
 		final String executable = osPath + File.separator + osInfo.cliName;
@@ -141,6 +124,7 @@ public final class CliStarter {
 		final Process p = prologProcess;
 
 		Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
+			@Override
 			public void run() {
 				p.destroy();
 			}
@@ -148,28 +132,29 @@ public final class CliStarter {
 
 	}
 
-	private OsSpecificInfo getOsInfo(final String os, String architecture) throws CliException {
+	private OsSpecificInfo getOsInfo(final String os, String architecture)
+			throws CliException {
 		if (os.equals(Platform.OS_MACOSX)) {
-			return new OsSpecificInfo("macos", "probcli.sh",
-					"sh", "send_user_interrupt");
+			return new OsSpecificInfo("macos", "probcli.sh", "sh",
+					"send_user_interrupt");
 		}
 		if (os.equals(Platform.OS_WIN32)) {
-			return new OsSpecificInfo("windows",
-					"probcli.exe", null, "send_user_interrupt.exe");
+			return new OsSpecificInfo("windows", "probcli.exe", null,
+					"send_user_interrupt.exe");
 		}
-		
+
 		if (os.equals(Platform.OS_LINUX)) {
 			String linux = "linux";
 			if (architecture.equals(Platform.ARCH_X86_64)) {
 				linux = "linux64";
 			}
-			return new OsSpecificInfo(linux, "probcli.sh",
-					"sh", "send_user_interrupt");
+			return new OsSpecificInfo(linux, "probcli.sh", "sh",
+					"send_user_interrupt");
 		}
-			final CliException cliException = new CliException(
-					"ProB does not support the plattform: " + os);
-			cliException.notifyUserOnce();
-			throw cliException;
+		final CliException cliException = new CliException(
+				"ProB does not support the plattform: " + os);
+		cliException.notifyUserOnce();
+		throw cliException;
 	}
 
 	@SuppressWarnings("unchecked")
@@ -255,31 +240,55 @@ public final class CliStarter {
 	}
 
 	private File getCliPath() throws CliException {
-		final Path path = new Path("prob");
-		final URL fileURL = FileLocator.find(
-				Activator.getDefault().getBundle(), path, null);
-		if (fileURL==null) {
-			throw new CliException("Unable to find directory with prob executables.");
+		final Bundle bundle = Activator.getDefault().getBundle();
+		final String fileURL = "prob";
+		final URL entry = bundle.getEntry(fileURL);
+
+		if (entry == null) {
+			throw new CliException(
+					"Unable to find directory with prob executables.");
 		}
-		URL resolved;
+
 		try {
-			resolved = FileLocator.resolve(fileURL);
+			URL resolvedUrl = FileLocator.find(bundle, new Path(fileURL), null);
+
+			// We need to use the 3-arg constructor of URI in order to properly
+			// escape file system chars.
+			URI resolvedUri = new URI("file", FileLocator
+					.toFileURL(resolvedUrl).getPath(), null);
+
+			return new File(resolvedUri);
+		} catch (URISyntaxException e) {
+			throw new CliException("Unable to construct file '"
+					+ entry.getPath() + "'");
 		} catch (IOException e2) {
 			throw new CliException("Input/output error when trying t find '"
 					+ fileURL + "'");
 		}
-		URI uri;
-		try {
-			uri = resolved.toURI();
-		} catch (URISyntaxException e) {
-			try {
-				uri = new URI("file", null, resolved.getPath(), null);
-			} catch (URISyntaxException e1) {
-				throw new CliException("Unable to construct file '"
-						+ resolved.getPath() + "'");
-			}
-		}
-		return new File(uri);
+
+		// final Path path = new Path("prob");
+		// final URL fileURL = FileLocator.find(
+		// Activator.getDefault().getBundle(), path, null);
+		// if (fileURL == null) {
+		// throw new CliException(
+		// "Unable to find directory with prob executables.");
+		// }
+		// URL resolved;
+		// try {
+		// resolved = FileLocator.resolve(fileURL);
+		// } catch (IOException e2) {
+		// throw new CliException("Input/output error when trying t find '"
+		// + fileURL + "'");
+		// }
+		// URI uri;
+		// try {
+		// uri = new URI(resolved.getProtocol(), resolved.getPath(), null);
+		// } catch (URISyntaxException e1) {
+		// throw new CliException("Unable to construct file '"
+		// + resolved.getPath() + "'");
+		// }
+		//
+		// return new File(uri);
 	}
 
 	private static class OutputLoggerThread extends Thread {
diff --git a/de.prob.core/src/de/prob/core/command/ConstraintBasedAssertionCheckCommand.java b/de.prob.core/src/de/prob/core/command/ConstraintBasedAssertionCheckCommand.java
index 5b17b6305645278641a89f67ab5ca611c1a8ad53..31439404574680d43e4dc95d1db19147363e8a05 100644
--- a/de.prob.core/src/de/prob/core/command/ConstraintBasedAssertionCheckCommand.java
+++ b/de.prob.core/src/de/prob/core/command/ConstraintBasedAssertionCheckCommand.java
@@ -18,7 +18,7 @@ import de.prob.prolog.term.PrologTerm;
 public class ConstraintBasedAssertionCheckCommand implements IComposableCommand {
 
 	public static enum ResultType {
-		INTERRUPTED, COUNTER_EXAMPLE, NO_COUNTER_EXAMPLE
+		INTERRUPTED, COUNTER_EXAMPLE, NO_COUNTER_EXAMPLE_FOUND, NO_COUNTER_EXAMPLE_EXISTS
 	};
 
 	private static final String COMMAND_NAME = "cbc_static_assertion_violation_checking";
@@ -59,7 +59,9 @@ public class ConstraintBasedAssertionCheckCommand implements IComposableCommand
 		if (resultTerm.hasFunctor("interrupted", 0)) {
 			result = ResultType.INTERRUPTED;
 		} else if (resultTerm.hasFunctor("no_counterexample_found", 0)) {
-			result = ResultType.NO_COUNTER_EXAMPLE;
+			result = ResultType.NO_COUNTER_EXAMPLE_FOUND;
+		}  else if (resultTerm.hasFunctor("no_counterexample_exists", 0)) {
+			result = ResultType.NO_COUNTER_EXAMPLE_EXISTS;
 		} else if (resultTerm.hasFunctor("counterexample_found", 2)) {
 			result = ResultType.COUNTER_EXAMPLE;
 			CompoundPrologTerm counterExampleTerm = (CompoundPrologTerm) resultTerm;
diff --git a/de.prob.core/src/de/prob/core/command/ExploreStateCommand.java b/de.prob.core/src/de/prob/core/command/ExploreStateCommand.java
index 3e6ab31acde14468ea71c2c94d11608dd5406bef..30af5f46ecbb2d1e8f9edb2ba904a18f628d5d9a 100644
--- a/de.prob.core/src/de/prob/core/command/ExploreStateCommand.java
+++ b/de.prob.core/src/de/prob/core/command/ExploreStateCommand.java
@@ -6,16 +6,10 @@
 
 package de.prob.core.command;
 
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 import de.prob.core.Animator;
-import de.prob.core.domainobjects.Operation;
-import de.prob.core.domainobjects.State;
-import de.prob.core.domainobjects.StateError;
-import de.prob.core.domainobjects.Variable;
+import de.prob.core.domainobjects.*;
 import de.prob.core.internal.Activator;
 import de.prob.exceptions.ProBException;
 import de.prob.logging.Logger;
@@ -33,6 +27,7 @@ public final class ExploreStateCommand implements IComposableCommand {
 	private final CheckBooleanPropertyCommand checkMaxOpCmd;
 	private final CheckBooleanPropertyCommand checkTimeoutCmd;
 	private final GetStateBasedErrorsCommand getStateErrCmd;
+	private final QuickDescribeUnsatPropertiesCommand unsatPropsCommand;
 	private final ComposedCommand allCommands;
 
 	private State state;
@@ -48,9 +43,11 @@ public final class ExploreStateCommand implements IComposableCommand {
 		checkTimeoutCmd = new CheckTimeoutStatusCommand(stateId);
 		checkTimeoutOpsCmd = new GetTimeoutedOperationsCommand(stateId);
 		getStateErrCmd = new GetStateBasedErrorsCommand(stateId);
+		unsatPropsCommand = new QuickDescribeUnsatPropertiesCommand();
 		this.allCommands = new ComposedCommand(getOpsCmd, getValuesCmd,
 				checkInitialisedCmd, checkInvCmd, checkMaxOpCmd,
-				checkTimeoutCmd, checkTimeoutOpsCmd, getStateErrCmd);
+				checkTimeoutCmd, checkTimeoutOpsCmd, getStateErrCmd,
+				unsatPropsCommand);
 	}
 
 	public static State exploreState(final Animator a, final String stateID)
@@ -64,6 +61,7 @@ public final class ExploreStateCommand implements IComposableCommand {
 		return stateId;
 	}
 
+	@Override
 	public void processResult(
 			final ISimplifiedROMap<String, PrologTerm> bindings)
 			throws CommandException {
@@ -73,13 +71,24 @@ public final class ExploreStateCommand implements IComposableCommand {
 		final boolean invariantOk = checkInvCmd.getResult();
 		final boolean timeoutOccured = checkTimeoutCmd.getResult();
 		final boolean maxOperationsReached = checkMaxOpCmd.getResult();
+		final boolean unsatPropertiesExist = unsatPropsCommand
+				.unsatPropertiesExist();
 		final List<Operation> enabledOperations = getOpsCmd
 				.getEnabledOperations();
 		final List<Variable> variables = getValuesCmd.getResult();
 		final Collection<StateError> stateErrors = getStateErrCmd.getResult();
 
-		if (!initialised && enabledOperations.isEmpty() && !timeoutOccured) {
-			Logger.notifyUserWithoutBugreport("ProB could not find valid constants/variables. This might be caused by the animation settings (e.g., Integer range or deferred set size) or by an inconsistency in the axioms");
+		// only show error message on SETUP_CONSTANTS and
+		// PARTIALLY_SETUP_CONSTANTS
+		if (enabledOperations.size() == 1
+				&& enabledOperations.get(0).getName().toLowerCase()
+						.contains("constants") && unsatPropertiesExist) {
+			Logger.notifyUserWithoutBugreport("ProB could not find valid constants wich satisfy the properties:\n\n"
+					+ unsatPropsCommand.getUnsatPropertiesDescription());
+
+		} else if (!initialised && enabledOperations.isEmpty()
+				&& !timeoutOccured) {
+			Logger.notifyUserWithoutBugreport("ProB could not find valid constants/variables. This might be caused by the animation settings (e.g., Integer range or deferred set size) or by an inconsistency in the axioms.");
 		}
 
 		Set<String> timeouts = new HashSet<String>(
@@ -92,6 +101,7 @@ public final class ExploreStateCommand implements IComposableCommand {
 		Activator.computedState(state);
 	}
 
+	@Override
 	public void writeCommand(final IPrologTermOutput pto)
 			throws CommandException {
 		allCommands.writeCommand(pto);
diff --git a/de.prob.core/src/de/prob/core/command/FindValidStateCommand.java b/de.prob.core/src/de/prob/core/command/FindValidStateCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..8a76cf28b11cf66a9c4fe900ab979fcf1d9c26fa
--- /dev/null
+++ b/de.prob.core/src/de/prob/core/command/FindValidStateCommand.java
@@ -0,0 +1,88 @@
+/**
+ * 
+ */
+package de.prob.core.command;
+
+import de.prob.core.LanguageDependendAnimationPart;
+import de.prob.core.domainobjects.Operation;
+import de.prob.parser.ISimplifiedROMap;
+import de.prob.prolog.output.IPrologTermOutput;
+import de.prob.prolog.term.*;
+
+public class FindValidStateCommand implements IComposableCommand {
+
+	public static enum ResultType {
+		STATE_FOUND, NO_STATE_FOUND, INTERRUPTED, ERROR
+	};
+
+	private static final String COMMAND_NAME = "find_state_satisfying_predicate";
+	private static final String RESULT_VARIABLE = "R";
+
+	private final PrologTerm predicate;
+
+	private ResultType result;
+	private String stateId;
+	private Operation operation;
+
+	/**
+	 * @param predicate
+	 *            is a parsed predicate or <code>null</code>
+	 * @see LanguageDependendAnimationPart#parsePredicate(IPrologTermOutput,
+	 *      String, boolean)
+	 */
+	public FindValidStateCommand(final PrologTerm predicate) {
+		this.predicate = predicate;
+	}
+
+	public PrologTerm getPredicate() {
+		return predicate;
+	}
+
+	public ResultType getResult() {
+		return result;
+	}
+
+	public String getStateId() {
+		return stateId;
+	}
+
+	public Operation getOperation() {
+		return operation;
+	}
+
+	@Override
+	public void writeCommand(final IPrologTermOutput pto) {
+		pto.openTerm(COMMAND_NAME);
+		if (predicate != null) {
+			predicate.toTermOutput(pto);
+		}
+		pto.printVariable(RESULT_VARIABLE);
+		pto.closeTerm();
+	}
+
+	@Override
+	public void processResult(
+			final ISimplifiedROMap<String, PrologTerm> bindings)
+			throws CommandException {
+		final PrologTerm resultTerm = bindings.get(RESULT_VARIABLE);
+		final ResultType result;
+
+		if (resultTerm.hasFunctor("no_valid_state_found", 0)) {
+			result = ResultType.NO_STATE_FOUND;
+		} else if (resultTerm.hasFunctor("errors", 1)) {
+			result = ResultType.ERROR;
+		} else if (resultTerm.hasFunctor("interrupted", 0)) {
+			result = ResultType.INTERRUPTED;
+		} else if (resultTerm.hasFunctor("state_found", 2)) {
+			CompoundPrologTerm term = (CompoundPrologTerm) resultTerm;
+			result = ResultType.STATE_FOUND;
+			operation = Operation.fromPrologTerm(term.getArgument(1));
+			stateId = term.getArgument(2).toString();
+		} else
+			throw new CommandException(
+					"unexpected result when trying to find a valid state: "
+							+ resultTerm);
+
+		this.result = result;
+	}
+}
diff --git a/de.prob.core/src/de/prob/core/command/GetErrorsCommand.java b/de.prob.core/src/de/prob/core/command/GetErrorsCommand.java
index 78f42a07f9e185ad4208d96faaa6226b8e7def6b..19cad6e471b6f0a544ae90e212a33fb074d71b3a 100644
--- a/de.prob.core/src/de/prob/core/command/GetErrorsCommand.java
+++ b/de.prob.core/src/de/prob/core/command/GetErrorsCommand.java
@@ -1,6 +1,8 @@
 /**
- * 
- */
+ * (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 java.util.List;
@@ -20,6 +22,7 @@ public class GetErrorsCommand implements IComposableCommand {
 	public static final String ERRORS_VARIABLE = "Errors";
 	private List<String> errors;
 
+	@Override
 	public void processResult(
 			final ISimplifiedROMap<String, PrologTerm> bindings)
 			throws CommandException {
@@ -27,6 +30,7 @@ public class GetErrorsCommand implements IComposableCommand {
 				.get(ERRORS_VARIABLE));
 	}
 
+	@Override
 	public void writeCommand(final IPrologTermOutput pto) {
 		pto.openTerm("getErrorMessages").printVariable(ERRORS_VARIABLE)
 				.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 78335f27dbe8219e1129b5286e771ac514283b15..7a95e7d77046bee597733d5543142987e62ea4a3 100644
--- a/de.prob.core/src/de/prob/core/command/LoadEventBModelCommand.java
+++ b/de.prob.core/src/de/prob/core/command/LoadEventBModelCommand.java
@@ -6,24 +6,15 @@
 
 package de.prob.core.command;
 
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eventb.core.IContextRoot;
-import org.eventb.core.IEventBRoot;
-import org.eventb.core.IMachineRoot;
-import org.osgi.service.prefs.BackingStoreException;
-import org.osgi.service.prefs.Preferences;
+import java.util.*;
+
+import org.eventb.core.*;
+import org.osgi.service.prefs.*;
 import org.rodinp.core.RodinDBException;
 
-import de.prob.core.Animator;
-import de.prob.core.LanguageDependendAnimationPart;
+import de.prob.core.*;
 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.domainobjects.*;
 import de.prob.core.langdep.EventBAnimatorPart;
 import de.prob.exceptions.ProBException;
 import de.prob.logging.Logger;
@@ -97,7 +88,7 @@ public final class LoadEventBModelCommand {
 				Operation.NULL_OPERATION);
 
 		if (commandResult.isTimeoutOccured() && context) {
-			final String message = "A timeout occured when finding constants. Typically this means, that your axioms are too complicated for automatical solving. You might create an animation refinement using the context menu to help ProB finding a solution";
+			final String message = "A timeout occured when finding constants. Typically this means, that your axioms are too complicated for automatical solving. You might create an animation refinement using the context menu to help ProB finding a solution.";
 			Logger.notifyUserWithoutBugreport(message);
 		}
 
diff --git a/de.prob.core/src/de/prob/core/command/ConsistencyCheckingCommand.java b/de.prob.core/src/de/prob/core/command/ModelCheckingCommand.java
similarity index 64%
rename from de.prob.core/src/de/prob/core/command/ConsistencyCheckingCommand.java
rename to de.prob.core/src/de/prob/core/command/ModelCheckingCommand.java
index d2cfdfb9b4a599fb0f27414f115ee1d37b350492..5e5858fe1c0d3712b7bedcb0ce8755e152405f0f 100644
--- a/de.prob.core/src/de/prob/core/command/ConsistencyCheckingCommand.java
+++ b/de.prob.core/src/de/prob/core/command/ModelCheckingCommand.java
@@ -12,10 +12,9 @@ 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.CompoundPrologTerm;
-import de.prob.prolog.term.PrologTerm;
+import de.prob.prolog.term.*;
 
-public final class ConsistencyCheckingCommand implements IComposableCommand {
+public final class ModelCheckingCommand implements IComposableCommand {
 	private final int time;
 	private final List<String> options;
 	private ModelCheckingResult<Result> result;
@@ -23,7 +22,7 @@ public final class ConsistencyCheckingCommand implements IComposableCommand {
 	public static enum Result {
 		ok(true), ok_not_all_nodes_considered(true), deadlock(true), invariant_violation(
 				true), assertion_violation(true), not_yet_finished(false), state_error(
-				true), well_definedness_error(true), general_error(true);
+				true), well_definedness_error(true), general_error(true),full_coverage(true);
 		// I assume true means we can stop the model checking
 		private final boolean abort;
 
@@ -36,15 +35,14 @@ public final class ConsistencyCheckingCommand implements IComposableCommand {
 		}
 	}
 
-	ConsistencyCheckingCommand(final int time, final List<String> options) {
+	ModelCheckingCommand(final int time, final List<String> options) {
 		this.time = time;
 		this.options = options;
 	}
 
 	public static ModelCheckingResult<Result> modelcheck(final Animator a,
 			final int time, final List<String> options) throws ProBException {
-		ConsistencyCheckingCommand command = new ConsistencyCheckingCommand(
-				time, options);
+		ModelCheckingCommand command = new ModelCheckingCommand(time, options);
 		a.execute(command);
 		return command.getResult();
 	}
@@ -53,20 +51,32 @@ public final class ConsistencyCheckingCommand implements IComposableCommand {
 		return result;
 	}
 
+	@Override
 	public void processResult(
 			final ISimplifiedROMap<String, PrologTerm> bindings)
 			throws CommandException {
 
 		CompoundPrologTerm term = (CompoundPrologTerm) bindings.get("Result");
-		result = new ModelCheckingResult<Result>(Result.class, term);
 
+		CompoundPrologTerm stats = (CompoundPrologTerm) bindings.get("Stats");
+		int processedTotal = ((IntegerPrologTerm) stats.getArgument(3))
+				.getValue().intValue();
+		int numStates = ((IntegerPrologTerm) stats.getArgument(1)).getValue()
+				.intValue();
+		int numTransitions = ((IntegerPrologTerm) stats.getArgument(2))
+				.getValue().intValue();
+
+		result = new ModelCheckingResult<Result>(Result.class, term,
+				processedTotal, numStates, numTransitions);
 	}
 
+	@Override
 	public void writeCommand(final IPrologTermOutput pto) {
 		pto.openTerm("do_modelchecking").printNumber(time).openList();
 		for (String o : options) {
 			pto.printAtom(o);
 		}
-		pto.closeList().printVariable("Result").closeTerm();
+		pto.closeList().printVariable("Result");
+		pto.printVariable("Stats").closeTerm();
 	}
 }
diff --git a/de.prob.core/src/de/prob/core/command/ModelCheckingResult.java b/de.prob.core/src/de/prob/core/command/ModelCheckingResult.java
index 0b5f4b7f02cd3a860ec307fc38795c4760d0f3ce..b77ce406fcfdc610d6a9920fc68c8b198d7d6394 100644
--- a/de.prob.core/src/de/prob/core/command/ModelCheckingResult.java
+++ b/de.prob.core/src/de/prob/core/command/ModelCheckingResult.java
@@ -6,23 +6,26 @@
 
 package de.prob.core.command;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
-import de.prob.prolog.term.CompoundPrologTerm;
-import de.prob.prolog.term.PrologTerm;
+import de.prob.prolog.term.*;
 
 public class ModelCheckingResult<T extends Enum<T>> {
 
 	private final T result;
 	private final List<PrologTerm> arguments = new ArrayList<PrologTerm>();
+	private final int processedTotal, numStates, numTransitions;
 
 	public ModelCheckingResult(final Class<T> enumeration,
-			final CompoundPrologTerm term) {
+			final CompoundPrologTerm term, int total, int numStates,
+			int numTransitions) {
 		result = Enum.valueOf(enumeration, term.getFunctor());
 		for (int i = 1; i <= term.getArity(); i++) {
 			arguments.add(term.getArgument(i));
 		}
+		processedTotal = total;
+		this.numStates = numStates;
+		this.numTransitions = numTransitions;
 	}
 
 	public PrologTerm getArgument(final int i) {
@@ -33,4 +36,19 @@ public class ModelCheckingResult<T extends Enum<T>> {
 		return result;
 	}
 
+	public int getProcessedTotal() {
+		return processedTotal;
+	}
+
+	public int getNumStates() {
+		return numStates;
+	}
+
+	public int getNumTransitions() {
+		return numTransitions;
+	}
+
+	public int getWorked() {
+		return (int) (1000 * Math.pow((double) processedTotal / numStates, 5));
+	}
 }
diff --git a/de.prob.core/src/de/prob/core/command/ConsistencyCheckingSearchOption.java b/de.prob.core/src/de/prob/core/command/ModelCheckingSearchOption.java
similarity index 51%
rename from de.prob.core/src/de/prob/core/command/ConsistencyCheckingSearchOption.java
rename to de.prob.core/src/de/prob/core/command/ModelCheckingSearchOption.java
index 736dafe4339083790eff9ebb234ab5766ba94d49..a069ac36066918cc13cfb2c394d51efa9b66e551 100644
--- a/de.prob.core/src/de/prob/core/command/ConsistencyCheckingSearchOption.java
+++ b/de.prob.core/src/de/prob/core/command/ModelCheckingSearchOption.java
@@ -13,18 +13,19 @@ import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.Map;
 
-public enum ConsistencyCheckingSearchOption {
-			breadth_first_search(0, "Breadth First Search", false),
-			find_deadlocks(1,"Find Deadlocks", true),
-			find_invariant_violations(2,"Find Invariant Violations", true),
-			find_assertion_violations(3,"Find Theorem Violations", false),
-			inspect_existing_nodes(4,"Recheck existing states", false);
+public enum ModelCheckingSearchOption {
+	breadth_first_search(0, "Breadth First Search", false), find_deadlocks(1,
+			"Find Deadlocks", true), find_invariant_violations(2,
+			"Find Invariant Violations", true), find_assertion_violations(3,
+			"Find Theorem Violations", false), inspect_existing_nodes(4,
+			"Recheck Existing States", false), stop_at_full_coverage(5,
+			"Stop when all Events are Covered", false);
 
 	private final String text;
 	private final int pos;
 	private final boolean enabledByDefault;
 
-	private ConsistencyCheckingSearchOption(final int pos, final String text,
+	private ModelCheckingSearchOption(final int pos, final String text,
 			final boolean enabledByDefault) {
 		this.pos = pos;
 		this.text = text;
@@ -35,11 +36,11 @@ public enum ConsistencyCheckingSearchOption {
 		return text;
 	}
 
-	private static final Map<Integer, ConsistencyCheckingSearchOption> lookup = new HashMap<Integer, ConsistencyCheckingSearchOption>();
+	private static final Map<Integer, ModelCheckingSearchOption> lookup = new HashMap<Integer, ModelCheckingSearchOption>();
 
 	static {
-		for (ConsistencyCheckingSearchOption s : EnumSet
-				.allOf(ConsistencyCheckingSearchOption.class)) {
+		for (ModelCheckingSearchOption s : EnumSet
+				.allOf(ModelCheckingSearchOption.class)) {
 			lookup.put(s.getPos(), s);
 		}
 	}
@@ -52,7 +53,7 @@ public enum ConsistencyCheckingSearchOption {
 		return enabledByDefault;
 	}
 
-	public final static ConsistencyCheckingSearchOption get(final int code) {
+	public final static ModelCheckingSearchOption get(final int code) {
 		return lookup.get(code);
 	}
 
diff --git a/de.prob.core/src/de/prob/core/command/QuickDescribeUnsatPropertiesCommand.java b/de.prob.core/src/de/prob/core/command/QuickDescribeUnsatPropertiesCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b1547da2cec21ae02893b3339b52c7690530528
--- /dev/null
+++ b/de.prob.core/src/de/prob/core/command/QuickDescribeUnsatPropertiesCommand.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.prob.core.command;
+
+import de.prob.parser.ISimplifiedROMap;
+import de.prob.prolog.output.IPrologTermOutput;
+import de.prob.prolog.term.*;
+
+public class QuickDescribeUnsatPropertiesCommand implements IComposableCommand {
+	public static final String OUTPUT_VARIABLE = "Output";
+	private boolean unsatPropertiesExist;
+	private String description;
+
+	@Override
+	public void processResult(
+			final ISimplifiedROMap<String, PrologTerm> bindings)
+			throws CommandException {
+		if (bindings.get(OUTPUT_VARIABLE).hasFunctor(
+				"no_unsat_properties_found", 0)) {
+			unsatPropertiesExist = false;
+			description = "";
+		} else {
+			unsatPropertiesExist = true;
+			ListPrologTerm outputStrings = (ListPrologTerm) bindings.get(
+					OUTPUT_VARIABLE).getArgument(1);
+
+			StringBuilder sb = new StringBuilder();
+
+			for (PrologTerm p : outputStrings) {
+				if (p.isAtom()) {
+					sb.append(PrologTerm.atomicString(p));
+				} else {
+					sb.append(p.toString());
+				}
+			}
+
+			// replace newline dummys. maybe we should restructure the Prolog
+			// part?
+			description = sb.toString().replace(";", "\n");
+
+		}
+	}
+
+	@Override
+	public void writeCommand(final IPrologTermOutput pto) {
+		pto.openTerm("quick_describe_unsat_properties")
+				.printVariable(OUTPUT_VARIABLE).closeTerm();
+	}
+
+	public boolean unsatPropertiesExist() {
+		return unsatPropertiesExist;
+	}
+
+	public String getUnsatPropertiesDescription() {
+		return description;
+	}
+
+}
diff --git a/de.prob.core/src/de/prob/core/domainobjects/eval/ExpressionEvalElement.java b/de.prob.core/src/de/prob/core/domainobjects/eval/ExpressionEvalElement.java
index 59f50c99bafaa3d0802a28a356381597cbe350eb..02b22f69b7e4db39e10487a95bef3fd9c13ec93f 100644
--- a/de.prob.core/src/de/prob/core/domainobjects/eval/ExpressionEvalElement.java
+++ b/de.prob.core/src/de/prob/core/domainobjects/eval/ExpressionEvalElement.java
@@ -6,16 +6,15 @@
 
 package de.prob.core.domainobjects.eval;
 
-import java.util.LinkedList;
-
 import org.eventb.core.ast.Expression;
 
 import de.be4.classicalb.core.parser.BParser;
 import de.be4.classicalb.core.parser.exceptions.BException;
 import de.be4.classicalb.core.parser.node.AExpressionParseUnit;
 import de.be4.classicalb.core.parser.node.EOF;
+import de.be4.classicalb.core.parser.node.PExpression;
 import de.be4.classicalb.core.parser.node.Start;
-import de.prob.eventb.translator.ExpressionVisitor;
+import de.prob.eventb.translator.internal.TranslationVisitor;
 
 public final class ExpressionEvalElement extends AbstractEvalElement {
 
@@ -28,9 +27,9 @@ public final class ExpressionEvalElement extends AbstractEvalElement {
 			String message = "Expression input must not be null";
 			throw new BException("", new NullPointerException(message));
 		}
-		ExpressionVisitor ev = new ExpressionVisitor(new LinkedList<String>());
-		expression.accept(ev);
-		AExpressionParseUnit epu = new AExpressionParseUnit(ev.getExpression());
+		final PExpression expr = TranslationVisitor
+				.translateExpression(expression);
+		AExpressionParseUnit epu = new AExpressionParseUnit(expr);
 		Start start = new Start(epu, new EOF());
 		return new ExpressionEvalElement(expression, start);
 	}
diff --git a/de.prob.core/src/de/prob/core/domainobjects/eval/PredicateEvalElement.java b/de.prob.core/src/de/prob/core/domainobjects/eval/PredicateEvalElement.java
index a77142212165fa93f83aa1a143d7ff2a2447a1da..c5589b2a195b8be2c16aa8d9261993a75ac9d5c4 100644
--- a/de.prob.core/src/de/prob/core/domainobjects/eval/PredicateEvalElement.java
+++ b/de.prob.core/src/de/prob/core/domainobjects/eval/PredicateEvalElement.java
@@ -20,8 +20,9 @@ import de.be4.classicalb.core.parser.node.AImplicationPredicate;
 import de.be4.classicalb.core.parser.node.ANegationPredicate;
 import de.be4.classicalb.core.parser.node.APredicateParseUnit;
 import de.be4.classicalb.core.parser.node.EOF;
+import de.be4.classicalb.core.parser.node.PPredicate;
 import de.be4.classicalb.core.parser.node.Start;
-import de.prob.eventb.translator.PredicateVisitor;
+import de.prob.eventb.translator.internal.TranslationVisitor;
 
 public class PredicateEvalElement extends AbstractEvalElement {
 
@@ -34,9 +35,9 @@ public class PredicateEvalElement extends AbstractEvalElement {
 			String message = "Predicate input must not be null";
 			throw new BException("", new NullPointerException(message));
 		}
-		PredicateVisitor pv = new PredicateVisitor();
-		predicate.accept(pv);
-		APredicateParseUnit ppu = new APredicateParseUnit(pv.getPredicate());
+		final PPredicate apred = TranslationVisitor
+				.translatePredicate(predicate);
+		final APredicateParseUnit ppu = new APredicateParseUnit(apred);
 		Start start = new Start(ppu, new EOF());
 		return new PredicateEvalElement(predicate, start);
 	}
@@ -106,7 +107,7 @@ public class PredicateEvalElement extends AbstractEvalElement {
 			hasChildren = true;
 		}
 
- 		@Override
+		@Override
 		public void inAExistsPredicate(AExistsPredicate arg0) {
 			hasChildren = true;
 		}
diff --git a/de.prob.core/src/de/prob/core/domainobjects/ltl/CounterExample.java b/de.prob.core/src/de/prob/core/domainobjects/ltl/CounterExample.java
index ab9082e164d793cd4311837eb1f9a89db2dece6f..4c6990ac9afe0e480e24aa903e20273b343107c3 100644
--- a/de.prob.core/src/de/prob/core/domainobjects/ltl/CounterExample.java
+++ b/de.prob.core/src/de/prob/core/domainobjects/ltl/CounterExample.java
@@ -68,6 +68,7 @@ public class CounterExample {
 		for (final PrologTerm term : modelCheckingResult.getAtomics()) {
 			res[i] = PrologTerm.atomicString(((CompoundPrologTerm) term)
 					.getArgument(1));
+			i++;
 		}
 		return res;
 	}
diff --git a/de.prob.core/src/de/prob/core/internal/AnimatorImpl.java b/de.prob.core/src/de/prob/core/internal/AnimatorImpl.java
index 278252caae2cede3dfbfa1351626e4580430582b..ee13d12c0986b87c0ea0b0be8fb8ef4d7a2e6c34 100644
--- a/de.prob.core/src/de/prob/core/internal/AnimatorImpl.java
+++ b/de.prob.core/src/de/prob/core/internal/AnimatorImpl.java
@@ -113,12 +113,15 @@ public class AnimatorImpl {
 	}
 
 	public synchronized final ITrace getTraceImpl() {
-		if (connector instanceof ServerTraceConnection) {
+		final ITrace trace;
+		if (connector != null && connector instanceof ServerTraceConnection) {
 			ServerTraceConnection conn = (ServerTraceConnection) connector;
 			conn.preferenceToTrace("seed: " + getSeed().toString());
-			return conn.getTrace();
+			trace = conn.getTrace();
+		} else {
+			trace = null;
 		}
-		return null;
+		return trace;
 	}
 
 	public void setSeed(final RandomSeed seed) {
@@ -206,6 +209,8 @@ public class AnimatorImpl {
 	}
 
 	public void sendUserInterruptSignal() {
-		connector.sendUserInterruptSignal();
+		if (connector != null) {
+			connector.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 21a6fb5e9067cf7b5410451569998de28fa33556..7cbc62aeca6ab0542686debf24dc66297ce277f5 100644
--- a/de.prob.core/src/de/prob/core/langdep/EventBAnimatorPart.java
+++ b/de.prob.core/src/de/prob/core/langdep/EventBAnimatorPart.java
@@ -5,11 +5,11 @@ package de.prob.core.langdep;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
 import org.apache.commons.lang.ObjectUtils;
+import org.eclipse.core.runtime.CoreException;
 import org.eventb.core.IContextRoot;
 import org.eventb.core.IEventBRoot;
 import org.eventb.core.IMachineRoot;
@@ -26,7 +26,7 @@ import org.eventb.core.ast.FormulaFactory;
 import org.eventb.core.ast.IParseResult;
 import org.eventb.core.ast.ITypeCheckResult;
 import org.eventb.core.ast.ITypeEnvironment;
-import org.eventb.core.ast.LanguageVersion;
+import org.eventb.core.ast.ITypeEnvironmentBuilder;
 import org.eventb.core.ast.Predicate;
 import org.eventb.core.ast.Type;
 import org.rodinp.core.IRodinFile;
@@ -34,12 +34,13 @@ import org.rodinp.core.RodinDBException;
 
 import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog;
 import de.be4.classicalb.core.parser.node.Node;
+import de.be4.classicalb.core.parser.node.PExpression;
+import de.be4.classicalb.core.parser.node.PPredicate;
 import de.prob.core.Animator;
 import de.prob.core.LanguageDependendAnimationPart;
 import de.prob.core.command.LoadEventBModelCommand;
-import de.prob.eventb.translator.ExpressionVisitor;
 import de.prob.eventb.translator.FormulaTranslator;
-import de.prob.eventb.translator.PredicateVisitor;
+import de.prob.eventb.translator.internal.TranslationVisitor;
 import de.prob.exceptions.ProBException;
 import de.prob.parserbase.ProBParseException;
 import de.prob.prolog.output.IPrologTermOutput;
@@ -63,32 +64,30 @@ public class EventBAnimatorPart implements LanguageDependendAnimationPart {
 			final String expression1, final boolean wrap)
 			throws ProBParseException {
 		final String expression = FormulaTranslator.translate(expression1);
-		final FormulaFactory ff = FormulaFactory.getDefault();
-		final IParseResult parseResult = ff.parseExpression(expression,
-				LanguageVersion.LATEST, null);
+
+		final FormulaFactory ff = root.getFormulaFactory();
+		final IParseResult parseResult = ff.parseExpression(expression, null);
+
 		checkParseResult(parseResult);
 		final Expression ee = parseResult.getParsedExpression();
 		typeCheck(ff, ee);
-		final ExpressionVisitor visitor = new ExpressionVisitor(
-				new LinkedList<String>());
-		ee.accept(visitor);
-		toPrologTerm(pto, visitor.getExpression(), wrap, EXPR_WRAPPER);
+		final PExpression expr = TranslationVisitor.translateExpression(ee);
+		toPrologTerm(pto, expr, wrap, EXPR_WRAPPER);
 	}
 
 	public void parsePredicate(final IPrologTermOutput pto,
 			final String predicate1, final boolean wrap)
 			throws ProBParseException {
 		final String predicate = FormulaTranslator.translate(predicate1);
-		final FormulaFactory ff = FormulaFactory.getDefault();
-		final IParseResult parseResult = ff.parsePredicate(predicate,
-				LanguageVersion.LATEST, null);
+
+		final FormulaFactory ff = root.getFormulaFactory();
+		final IParseResult parseResult = ff.parsePredicate(predicate, null);
+
 		checkParseResult(parseResult);
 		final Predicate pp = parseResult.getParsedPredicate();
 		typeCheck(ff, pp);
-		final PredicateVisitor visitor = new PredicateVisitor(
-				new LinkedList<String>());
-		pp.accept(visitor);
-		toPrologTerm(pto, visitor.getPredicate(), wrap, PRED_WRAPPER);
+		final PPredicate apred = TranslationVisitor.translatePredicate(pp);
+		toPrologTerm(pto, apred, wrap, PRED_WRAPPER);
 	}
 
 	private void toPrologTerm(final IPrologTermOutput pto,
@@ -131,15 +130,15 @@ public class EventBAnimatorPart implements LanguageDependendAnimationPart {
 
 		try {
 			if (root instanceof IMachineRoot)
-				typeEnv = root.getSCMachineRoot().getTypeEnvironment(ff);
+				typeEnv = root.getSCMachineRoot().getTypeEnvironment();
 			if (root instanceof ISCMachineRoot)
-				typeEnv = root.getSCMachineRoot().getTypeEnvironment(ff);
+				typeEnv = root.getSCMachineRoot().getTypeEnvironment();
 			if (root instanceof IContextRoot)
-				typeEnv = root.getSCContextRoot().getTypeEnvironment(ff);
+				typeEnv = root.getSCContextRoot().getTypeEnvironment();
 			if (root instanceof ISCContextRoot)
-				typeEnv = root.getSCContextRoot().getTypeEnvironment(ff);
+				typeEnv = root.getSCContextRoot().getTypeEnvironment();
 
-		} catch (RodinDBException e) {
+		} catch (CoreException e) {
 			throw rodin2parseException(e);
 		}
 		return typeEnv;
@@ -200,12 +199,16 @@ public class EventBAnimatorPart implements LanguageDependendAnimationPart {
 	private Predicate parseTransPredicate(final String predicateString,
 			final ISCEvent event) throws ProBParseException {
 		final String utf8String = FormulaTranslator.translate(predicateString);
-		final FormulaFactory ff = FormulaFactory.getDefault();
-		final IParseResult parseResult = ff.parsePredicate(utf8String,
-				LanguageVersion.LATEST, null);
+
+		final FormulaFactory ff = root.getFormulaFactory();
+		final IParseResult parseResult = ff.parsePredicate(utf8String, null);
+
 		checkParseResult(parseResult);
 		final Predicate predicate = parseResult.getParsedPredicate();
-		final ITypeEnvironment typeEnv = getTypeEnvironment(ff).clone();
+
+		final ITypeEnvironmentBuilder typeEnv = ff.makeTypeEnvironment();
+		typeEnv.addAll(getTypeEnvironment(ff));
+
 		addEventParameters(event, ff, typeEnv, new ArrayList<String>());
 		final ISCMachineRoot machine = ((IMachineRoot) root).getSCMachineRoot();
 		addPostStateVariables(machine, ff, typeEnv, new ArrayList<String>());
@@ -214,7 +217,7 @@ public class EventBAnimatorPart implements LanguageDependendAnimationPart {
 	}
 
 	private void addPostStateVariables(final ISCMachineRoot machine,
-			final FormulaFactory ff, final ITypeEnvironment typeEnv,
+			final FormulaFactory ff, final ITypeEnvironmentBuilder typeEnv,
 			final ArrayList<String> allVariables) throws ProBParseException {
 		try {
 			final ISCVariable[] variables = machine.getSCVariables();
@@ -224,13 +227,13 @@ public class EventBAnimatorPart implements LanguageDependendAnimationPart {
 						.getRoot();
 				addPostStateVariables(absMachine, ff, typeEnv, allVariables);
 			}
-		} catch (RodinDBException e) {
+		} catch (CoreException e) {
 			throw rodin2parseException(e);
 		}
 	}
 
 	private void addEventParameters(final ISCEvent event,
-			final FormulaFactory ff, final ITypeEnvironment typeEnv,
+			final FormulaFactory ff, final ITypeEnvironmentBuilder typeEnv,
 			final Collection<String> allParameters) throws ProBParseException {
 		try {
 			ISCParameter[] params = event.getSCParameters();
@@ -240,16 +243,16 @@ public class EventBAnimatorPart implements LanguageDependendAnimationPart {
 			// for (final ISCEvent absEvent : event.getAbstractSCEvents()) {
 			// addEventParameters(absEvent, ff, typeEnv, allParameters);
 			// }
-		} catch (RodinDBException e) {
+		} catch (CoreException e) {
 			throw rodin2parseException(e);
 		}
 	}
 
 	private void addAllIdentifiers(final FormulaFactory ff,
-			final ITypeEnvironment typeEnv,
+			final ITypeEnvironmentBuilder typeEnv,
 			final Collection<String> allParameters,
 			final ISCIdentifierElement[] ids, final String postfix)
-			throws RodinDBException {
+			throws CoreException {
 		for (final ISCIdentifierElement identifier : ids) {
 			final String name = identifier.getIdentifierString() + postfix;
 			if (!allParameters.contains(name)) {
@@ -260,7 +263,7 @@ public class EventBAnimatorPart implements LanguageDependendAnimationPart {
 		}
 	}
 
-	private ProBParseException rodin2parseException(final RodinDBException e) {
+	private ProBParseException rodin2parseException(final CoreException e) {
 		return new ProBParseException(
 				"Error in the underlying Rodin Database.\nTry cleaning your workspace.\n Details: "
 						+ e.getLocalizedMessage());
@@ -275,11 +278,10 @@ public class EventBAnimatorPart implements LanguageDependendAnimationPart {
 		pto.openTerm("event");
 		pto.printAtom(eventName);
 		if (predicate != null) {
-			final PredicateVisitor visitor = new PredicateVisitor(
-					new LinkedList<String>());
-			predicate.accept(visitor);
+			final PPredicate apred = TranslationVisitor
+					.translatePredicate(predicate);
 			final ASTProlog prolog = new ASTProlog(pto, null);
-			visitor.getPredicate().apply(prolog);
+			apred.apply(prolog);
 		}
 		pto.closeTerm();
 		if (wrap) {
diff --git a/de.prob.core/src/de/prob/cosimulation/FMU.java b/de.prob.core/src/de/prob/cosimulation/FMU.java
new file mode 100644
index 0000000000000000000000000000000000000000..d726cdea926eb06c21100d0c7da0774fb18d216a
--- /dev/null
+++ b/de.prob.core/src/de/prob/cosimulation/FMU.java
@@ -0,0 +1,240 @@
+package de.prob.cosimulation;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.ptolemy.fmi.FMICallbackFunctions;
+import org.ptolemy.fmi.FMILibrary;
+import org.ptolemy.fmi.FMIModelDescription;
+import org.ptolemy.fmi.FMIScalarVariable;
+import org.ptolemy.fmi.FMUFile;
+import org.ptolemy.fmi.FMULibrary;
+
+import com.sun.jna.Function;
+import com.sun.jna.NativeLibrary;
+import com.sun.jna.Pointer;
+
+public class FMU {
+
+	private static final double TIMEOUT = 1000;
+
+	/** The modelIdentifier from modelDescription.xml. */
+	String _modelIdentifier;
+
+	/** The NativeLibrary that contains the functions. */
+	NativeLibrary _nativeLibrary;
+	private Pointer component;
+
+	private final FMIModelDescription modelDescription;
+
+	private final Map<String, FMIScalarVariable> variables = new HashMap<String, FMIScalarVariable>();
+
+	private final Set<IFMUListener> listeners = new HashSet<IFMUListener>();
+
+	public void registerListener(final IFMUListener listener) {
+		listeners.add(listener);
+	}
+
+	public void unregisterListener(final IFMUListener listener) {
+		listeners.remove(listener);
+	}
+
+	public FMU(final String fmuFileName) throws IOException {
+		modelDescription = FMUFile.parseFMUFile(fmuFileName);
+		String sharedLibrary = FMUFile.fmuSharedLibrary(modelDescription);
+
+		for (FMIScalarVariable fmiScalarVariable : modelDescription.modelVariables) {
+			variables.put(fmiScalarVariable.name, fmiScalarVariable);
+		}
+
+		_nativeLibrary = NativeLibrary.getInstance(sharedLibrary);
+
+		// The modelName may have spaces in it.
+		_modelIdentifier = modelDescription.modelIdentifier;
+
+		// The URL of the fmu file.
+		String fmuLocation = new File(fmuFileName).toURI().toURL().toString();
+
+		// The tool to use if we have tool coupling.
+		String mimeType = "application/x-fmu-sharedlibrary";
+
+		// Timeout in ms., 0 means wait forever.
+		double timeout = TIMEOUT;
+
+		// There is no simulator UI.
+		byte visible = 0;
+		// Run the simulator without user interaction.
+		byte interactive = 0;
+		// Callbacks
+		FMICallbackFunctions.ByValue callbacks = new FMICallbackFunctions.ByValue(
+				new FMULibrary.FMULogger(), new FMULibrary.FMUAllocateMemory(),
+				new FMULibrary.FMUFreeMemory(),
+				new FMULibrary.FMUStepFinished());
+		// Logging tends to cause segfaults because of vararg callbacks.
+		byte loggingOn = (byte) 0;
+
+		component = instantiateFMU(fmuLocation, mimeType, timeout, visible,
+				interactive, callbacks, loggingOn);
+
+		if (component.equals(Pointer.NULL)) {
+			throw new RuntimeException("Could not instantiate model.");
+		}
+	}
+
+	public String getFmiVersion() {
+		assert _nativeLibrary != null;
+		Function function = getFunction("_fmiGetVersion");
+		return (String) function.invoke(String.class, new Object[0]);
+	}
+
+	public void initialize(final double startTime, final double endTime) {
+		invoke("_fmiInitializeSlave", new Object[] { component, startTime,
+				(byte) 1, endTime }, "Could not initialize slave: ");
+	}
+
+	public boolean getBoolean(final String name) {
+		FMIScalarVariable fmiScalarVariable = variables.get(name);
+		return fmiScalarVariable.getBoolean(component);
+	}
+
+	public double getDouble(final String name) {
+		FMIScalarVariable fmiScalarVariable = variables.get(name);
+		return fmiScalarVariable.getDouble(component);
+	}
+
+	public int getInt(final String name) {
+		FMIScalarVariable fmiScalarVariable = variables.get(name);
+		return fmiScalarVariable.getInt(component);
+	}
+
+	public String getString(final String name) {
+		FMIScalarVariable fmiScalarVariable = variables.get(name);
+		return fmiScalarVariable.getString(component);
+	}
+
+	public void set(final String name, final boolean b) {
+		FMIScalarVariable fmiScalarVariable = variables.get(name);
+		fmiScalarVariable.setBoolean(component, b);
+	}
+
+	public void set(final String name, final int i) {
+		FMIScalarVariable fmiScalarVariable = variables.get(name);
+		fmiScalarVariable.setInt(component, i);
+	}
+
+	public void set(final String name, final double d) {
+		FMIScalarVariable fmiScalarVariable = variables.get(name);
+		fmiScalarVariable.setDouble(component, d);
+	}
+
+	public void set(final String name, final String s) {
+		FMIScalarVariable fmiScalarVariable = variables.get(name);
+		fmiScalarVariable.setString(component, s);
+	}
+
+	public double doStep(final double time, final double delta_t) {
+		Function doStep = getFunction("_fmiDoStep");
+		invoke(doStep, new Object[] { component, time, delta_t, (byte) 1 },
+				"Could not simulate, time was " + time + ": ");
+
+		for (IFMUListener l : listeners) {
+			l.trigger(variables);
+		}
+		return time + delta_t;
+	}
+
+	public void terminate() {
+		invoke("_fmiTerminateSlave", new Object[] { component },
+				"Could not terminate slave: ");
+		invoke("_fmiFreeSlaveInstance", new Object[] { component },
+				"Could not dispose resources of slave: ");
+		component = null;
+	}
+
+	@Override
+	protected void finalize() throws Throwable {
+		this.terminate();
+		super.finalize();
+	}
+
+	public void reset() {
+		invoke("_fmiResetSlave", new Object[] { component },
+				"Could not reset slave: ");
+	}
+
+	public FMIModelDescription getModelDescription() {
+		return modelDescription;
+	}
+
+	private Pointer instantiateFMU(final String fmuLocation,
+			final String mimeType, final double timeout, final byte visible,
+			final byte interactive,
+			final FMICallbackFunctions.ByValue callbacks, final byte loggingOn) {
+		Function instantiateSlave = getFunction("_fmiInstantiateSlave");
+		Pointer fmiComponent = (Pointer) instantiateSlave.invoke(Pointer.class,
+				new Object[] { _modelIdentifier, modelDescription.guid,
+						fmuLocation, mimeType, timeout, visible, interactive,
+						callbacks, loggingOn });
+		return fmiComponent;
+	}
+
+	/**
+	 * Return a function by name.
+	 * 
+	 * @param name
+	 *            The name of the function. The value of the modelIdentifier is
+	 *            prepended to the value of this parameter to yield the function
+	 *            name.
+	 * @return the function.
+	 */
+	public Function getFunction(final String name) {
+		// This is syntactic sugar.
+		return _nativeLibrary.getFunction(_modelIdentifier + name);
+	}
+
+	/**
+	 * Invoke a function that returns an integer representing the FMIStatus
+	 * return value.
+	 * 
+	 * @param name
+	 *            The name of the function.
+	 * @param arguments
+	 *            The arguments to be passed to the function.
+	 * @param message
+	 *            The error message to be used if there is a problem. The
+	 *            message should end with ": " because the return value of the
+	 *            function will be printed after the error message.
+	 */
+	public void invoke(final String name, final Object[] arguments,
+			final String message) {
+		Function function = getFunction(name);
+		invoke(function, arguments, message);
+	}
+
+	/**
+	 * Invoke a function that returns an integer representing the FMIStatus
+	 * return value.
+	 * 
+	 * @param function
+	 *            The function to be invoked.
+	 * @param arguments
+	 *            The arguments to be passed to the function.
+	 * @param message
+	 *            The error message to be used if there is a problem. The
+	 *            message should end with ": " because the return value of the
+	 *            function will be printed after the error message.
+	 */
+	public void invoke(final Function function, final Object[] arguments,
+			final String message) {
+		int fmiFlag = ((Integer) function.invoke(Integer.class, arguments))
+				.intValue();
+		if (fmiFlag > FMILibrary.FMIStatus.fmiWarning) {
+			throw new RuntimeException(message + fmiFlag);
+		}
+	}
+
+}
diff --git a/de.prob.core/src/de/prob/cosimulation/IFMUListener.java b/de.prob.core/src/de/prob/cosimulation/IFMUListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..2001ffddf65a1e1aa8941b133b3d81cf65cb5b6b
--- /dev/null
+++ b/de.prob.core/src/de/prob/cosimulation/IFMUListener.java
@@ -0,0 +1,11 @@
+package de.prob.cosimulation;
+
+import java.util.Map;
+
+import org.ptolemy.fmi.FMIScalarVariable;
+
+public interface IFMUListener {
+
+	void trigger(Map<String, FMIScalarVariable> variables);
+
+}
diff --git a/de.prob.core/src/de/prob/eventb/translator/AbstractComponentTranslator.java b/de.prob.core/src/de/prob/eventb/translator/AbstractComponentTranslator.java
index 8c4ef9e17212212b280d61f9bb9e72d6246a3b3d..97afea1f1a7708ebaf24bc3a830cefd6f2f979f3 100644
--- a/de.prob.core/src/de/prob/eventb/translator/AbstractComponentTranslator.java
+++ b/de.prob.core/src/de/prob/eventb/translator/AbstractComponentTranslator.java
@@ -8,11 +8,11 @@ package de.prob.eventb.translator;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eventb.core.ISCExpressionElement;
 import org.eventb.core.ISCIdentifierElement;
 import org.eventb.core.ISCPredicateElement;
@@ -41,7 +41,6 @@ public abstract class AbstractComponentTranslator {
 		return Collections.unmodifiableMap(labelMapping);
 	}
 
-	private boolean theoryIsUsed = false;
 	private final List<IPragma> pragmas = new ArrayList<IPragma>();
 	private final List<ProofObligation> proofs = new ArrayList<ProofObligation>();
 	private final String resourceName;
@@ -90,30 +89,16 @@ public abstract class AbstractComponentTranslator {
 
 	protected PPredicate translatePredicate(FormulaFactory ff,
 			final ITypeEnvironment env, final ISCPredicateElement predicate)
-			throws RodinDBException {
-		final PredicateVisitor visitor = new PredicateVisitor(
-				new LinkedList<String>());
-		final Predicate pred = predicate.getPredicate(ff, env);
-		pred.accept(visitor);
-		final PPredicate result = visitor.getPredicate();
-		theoryIsUsed |= TranslationVisitor.checkNewImplementation(pred, result);
-		return result;
+			throws CoreException {
+		final Predicate pred = predicate.getPredicate(env);
+		return TranslationVisitor.translatePredicate(pred);
 	}
 
 	protected PExpression translateExpression(FormulaFactory ff,
 			final ITypeEnvironment env, final ISCExpressionElement expression)
-			throws RodinDBException {
-		final ExpressionVisitor visitor = new ExpressionVisitor(
-				new LinkedList<String>());
-		final Expression expr = expression.getExpression(ff, env);
-		expr.accept(visitor);
-		final PExpression result = visitor.getExpression();
-		theoryIsUsed |= TranslationVisitor.checkNewImplementation(expr, result);
-		return result;
-	}
-
-	public boolean isTheoryUsed() {
-		return theoryIsUsed;
+			throws CoreException {
+		final Expression expr = expression.getExpression(env);
+		return TranslationVisitor.translateExpression(expr);
 	}
 
 	abstract public Node getAST();
diff --git a/de.prob.core/src/de/prob/eventb/translator/AssignmentVisitor.java b/de.prob.core/src/de/prob/eventb/translator/AssignmentVisitor.java
deleted file mode 100644
index a27ce9ff66b0540666ecd3534a393ca494b514da..0000000000000000000000000000000000000000
--- a/de.prob.core/src/de/prob/eventb/translator/AssignmentVisitor.java
+++ /dev/null
@@ -1,124 +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.prob.eventb.translator;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eventb.core.ast.BecomesEqualTo;
-import org.eventb.core.ast.BecomesMemberOf;
-import org.eventb.core.ast.BecomesSuchThat;
-import org.eventb.core.ast.Expression;
-import org.eventb.core.ast.FreeIdentifier;
-import org.eventb.core.ast.ISimpleVisitor;
-import org.eventb.core.ast.Predicate;
-
-import de.be4.classicalb.core.parser.node.AAssignSubstitution;
-import de.be4.classicalb.core.parser.node.ABecomesElementOfSubstitution;
-import de.be4.classicalb.core.parser.node.ABecomesSuchSubstitution;
-import de.be4.classicalb.core.parser.node.AIdentifierExpression;
-import de.be4.classicalb.core.parser.node.PExpression;
-import de.be4.classicalb.core.parser.node.PSubstitution;
-import de.be4.classicalb.core.parser.node.TIdentifierLiteral;
-import de.prob.eventb.translator.internal.SimpleVisitorAdapter;
-
-public class AssignmentVisitor extends SimpleVisitorAdapter implements
-		ISimpleVisitor {
-
-	private PSubstitution sub;
-	private boolean substitutonSet = false;
-
-	public PSubstitution getSubstitution() {
-		return sub;
-	}
-
-	public void setSub(final PSubstitution sub) {
-		if (substitutonSet) {
-			throw new AssertionError("The Visitor must not be used twice!");
-		}
-		substitutonSet = true;
-		this.sub = sub;
-	}
-
-	@Override
-	public void visitBecomesEqualTo(final BecomesEqualTo assignment) {
-		final FreeIdentifier[] identifiers = assignment
-				.getAssignedIdentifiers();
-		final Expression[] expressions = assignment.getExpressions();
-		final AAssignSubstitution assignSubstitution = new AAssignSubstitution();
-		assignSubstitution
-				.setLhsExpression(createListOfIdentifiers(identifiers));
-		assignSubstitution
-				.setRhsExpressions(createListOfExpressions(expressions));
-		setSub(assignSubstitution);
-	}
-
-	private List<PExpression> createListOfExpressions(
-			final Expression[] expressions) {
-		final List<PExpression> list = new ArrayList<PExpression>();
-		for (Expression e : expressions) {
-			final ExpressionVisitor visitor = new ExpressionVisitor(
-					new LinkedList<String>());
-			e.accept(visitor);
-			list.add(visitor.getExpression());
-		}
-		return list;
-	}
-
-	private List<PExpression> createListOfIdentifiers(
-			final FreeIdentifier[] identifiers) {
-		final List<PExpression> res = new ArrayList<PExpression>(
-				identifiers.length);
-		for (FreeIdentifier freeIdentifier : identifiers) {
-			final List<TIdentifierLiteral> list = Arrays
-					.asList(new TIdentifierLiteral[] { new TIdentifierLiteral(
-							freeIdentifier.getName()) });
-			final AIdentifierExpression expression = new AIdentifierExpression();
-			expression.setIdentifier(list);
-			res.add(expression);
-		}
-		return res;
-	}
-
-	@Override
-	public void visitBecomesMemberOf(final BecomesMemberOf assignment) {
-		final ABecomesElementOfSubstitution becomesElementOfSubstitution = new ABecomesElementOfSubstitution();
-		final FreeIdentifier[] identifiers = assignment
-				.getAssignedIdentifiers();
-		final Expression set = assignment.getSet();
-
-		final ExpressionVisitor visitor = new ExpressionVisitor(
-				new LinkedList<String>());
-		set.accept(visitor);
-
-		becomesElementOfSubstitution
-				.setIdentifiers(createListOfIdentifiers(identifiers));
-		becomesElementOfSubstitution.setSet(visitor.getExpression());
-		setSub(becomesElementOfSubstitution);
-	}
-
-	@Override
-	public void visitBecomesSuchThat(final BecomesSuchThat assignment) {
-		final FreeIdentifier[] identifiers = assignment
-				.getAssignedIdentifiers();
-		LinkedList<String> list = new LinkedList<String>();
-		for (FreeIdentifier f : identifiers) {
-			list.addFirst(f.getName() + "'");
-		}
-		final Predicate predicate = assignment.getCondition();
-		final PredicateVisitor visitor = new PredicateVisitor(list);
-		predicate.accept(visitor);
-		final ABecomesSuchSubstitution becomesSuchSubstitution = new ABecomesSuchSubstitution();
-		becomesSuchSubstitution
-				.setIdentifiers(createListOfIdentifiers(identifiers));
-		becomesSuchSubstitution.setPredicate(visitor.getPredicate());
-		setSub(becomesSuchSubstitution);
-
-	}
-}
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 eff85650268f94482c98f46d6fb92bb61927febb..844b47802434d5b3ceecb2a3bd717a99979e81d6 100644
--- a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java
+++ b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java
@@ -13,7 +13,9 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.lang.StringUtils;
 import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
 import org.eventb.core.IContextRoot;
 import org.eventb.core.IEventBRoot;
 import org.eventb.core.IExtendsContext;
@@ -61,6 +63,7 @@ import de.prob.core.translator.TranslationFailedException;
 import de.prob.eventb.translator.internal.EProofStatus;
 import de.prob.eventb.translator.internal.ProofObligation;
 import de.prob.eventb.translator.internal.SequentSource;
+import de.prob.logging.Logger;
 
 public final class ContextTranslator extends AbstractComponentTranslator {
 
@@ -79,12 +82,12 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 		try {
 			assertConsistentModel(context);
 			final FormulaFactory ff = context.getFormulaFactory();
-			final ITypeEnvironment te = context.getTypeEnvironment(ff);
+			final ITypeEnvironment te = context.getTypeEnvironment();
 			final ContextTranslator translator = new ContextTranslator(context,
 					ff, te, context);
 			translator.translate();
 			return translator;
-		} catch (RodinDBException e) {
+		} catch (CoreException e) {
 			throw createTranslationFailedException(context, e);
 		}
 	}
@@ -98,7 +101,7 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 		try {
 			assertConsistentModel(context.getRoot());
 			translator.translate();
-		} catch (RodinDBException e) {
+		} catch (CoreException e) {
 			throw createTranslationFailedException(context, e);
 		}
 		return translator;
@@ -124,7 +127,7 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 	}
 
 	private static TranslationFailedException createTranslationFailedException(
-			final ISCContext context, RodinDBException e)
+			final ISCContext context, CoreException 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(),
@@ -162,7 +165,7 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 		this.root = root;
 	}
 
-	private void translate() throws RodinDBException {
+	private void translate() throws CoreException {
 		translateContext();
 		collectProofInfo();
 		collectPragmas();
@@ -180,47 +183,57 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 	}
 
 	private void collectProofInfo(IEventBRoot origin) throws RodinDBException {
-
-		IPSRoot proofStatus = origin.getPSRoot();
-		IPSStatus[] statuses = proofStatus.getStatuses();
-
 		List<String> bugs = new LinkedList<String>();
 
-		for (IPSStatus status : statuses) {
-			final int confidence = status.getConfidence();
-			boolean broken = status.isBroken();
+		try {
+			IPSRoot proofStatus = origin.getPSRoot();
+			IPSStatus[] statuses = proofStatus.getStatuses();
 
-			EProofStatus pstatus = EProofStatus.UNPROVEN;
+			for (IPSStatus status : statuses) {
+				final int confidence = status.getConfidence();
+				boolean broken = status.isBroken();
 
-			if (!broken && confidence == IConfidence.REVIEWED_MAX)
-				pstatus = EProofStatus.REVIEWED;
-			if (!broken && confidence == IConfidence.DISCHARGED_MAX)
-				pstatus = EProofStatus.PROVEN;
+				EProofStatus pstatus = EProofStatus.UNPROVEN;
 
-			IPOSequent sequent = status.getPOSequent();
-			IPOSource[] sources = sequent.getSources();
+				if (!broken && confidence == IConfidence.REVIEWED_MAX)
+					pstatus = EProofStatus.REVIEWED;
+				if (!broken && confidence == IConfidence.DISCHARGED_MAX)
+					pstatus = EProofStatus.PROVEN;
 
-			String name = sequent.getDescription();
+				IPOSequent sequent = status.getPOSequent();
+				IPOSource[] sources = sequent.getSources();
 
-			ArrayList<SequentSource> s = new ArrayList<SequentSource>(
-					sources.length);
-			for (IPOSource source : sources) {
+				String name = sequent.getDescription();
 
-				IRodinElement srcElement = source.getSource();
-				if (!srcElement.exists()
-						|| !(srcElement instanceof ILabeledElement)) {
-					bugs.add(status.getElementName());
-					break;
-				}
+				ArrayList<SequentSource> s = new ArrayList<SequentSource>(
+						sources.length);
+				for (IPOSource source : sources) {
 
-				ILabeledElement le = (ILabeledElement) srcElement;
+					IRodinElement srcElement = source.getSource();
+					if (!srcElement.exists()
+							|| !(srcElement instanceof ILabeledElement)) {
+						bugs.add(status.getElementName());
+						break;
+					}
 
-				s.add(new SequentSource(srcElement.getElementType(), le
-						.getLabel()));
+					ILabeledElement le = (ILabeledElement) srcElement;
 
+					s.add(new SequentSource(srcElement.getElementType(), le
+							.getLabel()));
+
+				}
+				addProof(new ProofObligation(origin, s, name, pstatus));
 			}
-			addProof(new ProofObligation(origin, s, name, pstatus));
+		} catch (RodinDBException e) {
+			bugs.add(e.getLocalizedMessage());
 		}
+		
+		if (!bugs.isEmpty()) {
+			String message = "Translation incomplete due to a Bug in Rodin. This does not affect correctness of the Animation/Model Checking but can decrease its performance. Skipped discharged information about: "
+					+ StringUtils.join(bugs, ",");
+			Logger.notifyUser(message);
+		}
+
 
 	}
 
@@ -232,7 +245,7 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 		return depContext;
 	}
 
-	private void translateContext() throws RodinDBException {
+	private void translateContext() throws CoreException {
 		model.setName(new TIdentifierLiteral(context.getComponentName()));
 
 		final List<PContextClause> clauses = new ArrayList<PContextClause>();
@@ -244,7 +257,7 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 		model.setContextClauses(clauses);
 	}
 
-	private AExtendsContextClause processExtends() throws RodinDBException {
+	private AExtendsContextClause processExtends() throws CoreException {
 
 		if (context instanceof ISCContextRoot)
 			return processExtendsForContextRoot();
@@ -293,7 +306,7 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 	}
 
 	private AExtendsContextClause processExtendsForContextRoot()
-			throws RodinDBException {
+			throws CoreException {
 		ISCExtendsContext[] extendsClauses = null;
 		ISCContextRoot rcontext = (ISCContextRoot) context;
 
@@ -371,14 +384,14 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 		return Arrays.asList(constantsContextClause, abstractConstantsClause);
 	}
 
-	private ATheoremsContextClause processTheorems() throws RodinDBException {
+	private ATheoremsContextClause processTheorems() throws CoreException {
 		final ISCAxiom[] axioms = context.getSCAxioms();
 		final ATheoremsContextClause theoremsContextClause = new ATheoremsContextClause();
 		theoremsContextClause.setPredicates(extractPredicates(axioms, true));
 		return theoremsContextClause;
 	}
 
-	private AAxiomsContextClause processAxioms() throws RodinDBException {
+	private AAxiomsContextClause processAxioms() throws CoreException {
 		final ISCAxiom[] axioms = context.getSCAxioms();
 		final AAxiomsContextClause axiomsContextClause = new AAxiomsContextClause();
 		axiomsContextClause.setPredicates(extractPredicates(axioms, false));
@@ -386,7 +399,7 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 	}
 
 	private List<PPredicate> extractPredicates(final ISCAxiom[] predicates,
-			final boolean theorems) throws RodinDBException {
+			final boolean theorems) throws CoreException {
 		final List<PPredicate> list = new ArrayList<PPredicate>(
 				predicates.length);
 		for (final ISCAxiom element : predicates) {
diff --git a/de.prob.core/src/de/prob/eventb/translator/ExpressionVisitor.java b/de.prob.core/src/de/prob/eventb/translator/ExpressionVisitor.java
deleted file mode 100644
index 5516aafa840e352344e7e48a8a73b005d2117a29..0000000000000000000000000000000000000000
--- a/de.prob.core/src/de/prob/eventb/translator/ExpressionVisitor.java
+++ /dev/null
@@ -1,734 +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.prob.eventb.translator; // NOPMD
-// high coupling is ok, we only use the AST nodes
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eventb.core.ast.AssociativeExpression;
-import org.eventb.core.ast.AtomicExpression;
-import org.eventb.core.ast.BinaryExpression;
-import org.eventb.core.ast.BoolExpression;
-import org.eventb.core.ast.BoundIdentDecl;
-import org.eventb.core.ast.BoundIdentifier;
-import org.eventb.core.ast.Expression;
-import org.eventb.core.ast.ExtendedExpression;
-import org.eventb.core.ast.Formula;
-import org.eventb.core.ast.FreeIdentifier;
-import org.eventb.core.ast.ISimpleVisitor;
-import org.eventb.core.ast.IntegerLiteral;
-import org.eventb.core.ast.Predicate;
-import org.eventb.core.ast.QuantifiedExpression;
-import org.eventb.core.ast.SetExtension;
-import org.eventb.core.ast.UnaryExpression;
-import org.eventb.core.ast.extension.IExpressionExtension;
-
-import de.be4.classicalb.core.parser.node.AAddExpression;
-import de.be4.classicalb.core.parser.node.ABoolSetExpression;
-import de.be4.classicalb.core.parser.node.ABooleanFalseExpression;
-import de.be4.classicalb.core.parser.node.ABooleanTrueExpression;
-import de.be4.classicalb.core.parser.node.ACardExpression;
-import de.be4.classicalb.core.parser.node.ACartesianProductExpression;
-import de.be4.classicalb.core.parser.node.ACompositionExpression;
-import de.be4.classicalb.core.parser.node.AConvertBoolExpression;
-import de.be4.classicalb.core.parser.node.ACoupleExpression;
-import de.be4.classicalb.core.parser.node.ADirectProductExpression;
-import de.be4.classicalb.core.parser.node.ADivExpression;
-import de.be4.classicalb.core.parser.node.ADomainExpression;
-import de.be4.classicalb.core.parser.node.ADomainRestrictionExpression;
-import de.be4.classicalb.core.parser.node.ADomainSubtractionExpression;
-import de.be4.classicalb.core.parser.node.AEmptySetExpression;
-import de.be4.classicalb.core.parser.node.AEventBComprehensionSetExpression;
-import de.be4.classicalb.core.parser.node.AEventBFirstProjectionExpression;
-import de.be4.classicalb.core.parser.node.AEventBFirstProjectionV2Expression;
-import de.be4.classicalb.core.parser.node.AEventBIdentityExpression;
-import de.be4.classicalb.core.parser.node.AEventBSecondProjectionExpression;
-import de.be4.classicalb.core.parser.node.AEventBSecondProjectionV2Expression;
-import de.be4.classicalb.core.parser.node.AExtendedExprExpression;
-import de.be4.classicalb.core.parser.node.AFunctionExpression;
-import de.be4.classicalb.core.parser.node.AGeneralIntersectionExpression;
-import de.be4.classicalb.core.parser.node.AGeneralUnionExpression;
-import de.be4.classicalb.core.parser.node.AIdentifierExpression;
-import de.be4.classicalb.core.parser.node.AIdentityExpression;
-import de.be4.classicalb.core.parser.node.AImageExpression;
-import de.be4.classicalb.core.parser.node.AIntegerExpression;
-import de.be4.classicalb.core.parser.node.AIntegerSetExpression;
-import de.be4.classicalb.core.parser.node.AIntersectionExpression;
-import de.be4.classicalb.core.parser.node.AIntervalExpression;
-import de.be4.classicalb.core.parser.node.AMaxExpression;
-import de.be4.classicalb.core.parser.node.AMinExpression;
-import de.be4.classicalb.core.parser.node.AMinusExpression;
-import de.be4.classicalb.core.parser.node.AModuloExpression;
-import de.be4.classicalb.core.parser.node.AMultiplicationExpression;
-import de.be4.classicalb.core.parser.node.ANatural1SetExpression;
-import de.be4.classicalb.core.parser.node.ANaturalSetExpression;
-import de.be4.classicalb.core.parser.node.AOverwriteExpression;
-import de.be4.classicalb.core.parser.node.AParallelProductExpression;
-import de.be4.classicalb.core.parser.node.APartialFunctionExpression;
-import de.be4.classicalb.core.parser.node.APartialInjectionExpression;
-import de.be4.classicalb.core.parser.node.APartialSurjectionExpression;
-import de.be4.classicalb.core.parser.node.APow1SubsetExpression;
-import de.be4.classicalb.core.parser.node.APowSubsetExpression;
-import de.be4.classicalb.core.parser.node.APowerOfExpression;
-import de.be4.classicalb.core.parser.node.APredecessorExpression;
-import de.be4.classicalb.core.parser.node.AQuantifiedIntersectionExpression;
-import de.be4.classicalb.core.parser.node.AQuantifiedUnionExpression;
-import de.be4.classicalb.core.parser.node.ARangeExpression;
-import de.be4.classicalb.core.parser.node.ARangeRestrictionExpression;
-import de.be4.classicalb.core.parser.node.ARangeSubtractionExpression;
-import de.be4.classicalb.core.parser.node.ARelationsExpression;
-import de.be4.classicalb.core.parser.node.AReverseExpression;
-import de.be4.classicalb.core.parser.node.ARingExpression;
-import de.be4.classicalb.core.parser.node.ASetExtensionExpression;
-import de.be4.classicalb.core.parser.node.ASetSubtractionExpression;
-import de.be4.classicalb.core.parser.node.ASuccessorExpression;
-import de.be4.classicalb.core.parser.node.ASurjectionRelationExpression;
-import de.be4.classicalb.core.parser.node.ATotalBijectionExpression;
-import de.be4.classicalb.core.parser.node.ATotalFunctionExpression;
-import de.be4.classicalb.core.parser.node.ATotalInjectionExpression;
-import de.be4.classicalb.core.parser.node.ATotalRelationExpression;
-import de.be4.classicalb.core.parser.node.ATotalSurjectionExpression;
-import de.be4.classicalb.core.parser.node.ATotalSurjectionRelationExpression;
-import de.be4.classicalb.core.parser.node.AUnaryMinusExpression;
-import de.be4.classicalb.core.parser.node.AUnionExpression;
-import de.be4.classicalb.core.parser.node.PExpression;
-import de.be4.classicalb.core.parser.node.PPredicate;
-import de.be4.classicalb.core.parser.node.TIdentifierLiteral;
-import de.be4.classicalb.core.parser.node.TIntegerLiteral;
-import de.prob.eventb.translator.internal.SimpleVisitorAdapter;
-
-// Complexity is actually quite low for a visitor ;-)
-public class ExpressionVisitor extends SimpleVisitorAdapter implements // NOPMD
-		// by bendisposto
-		ISimpleVisitor {
-
-	private PExpression e;
-	private final LinkedList<String> bounds; // NOPMD bendisposto
-	// we need some abilities of the linked list, using List is not an option
-	private boolean expressionSet = false;
-
-	public ExpressionVisitor(final LinkedList<String> bounds) { // NOPMD
-		super();
-		this.bounds = bounds;
-	}
-
-	public PExpression getExpression() {
-		return e;
-	}
-
-	public void setExpression(final PExpression e) {
-		if (expressionSet) {
-			throw new AssertionError("The Visitor must not be used twice!");
-		}
-		expressionSet = true;
-		this.e = e;
-	}
-
-	@Override
-	public void visitQuantifiedExpression(final QuantifiedExpression expression) {
-		// QUNION, QINTER, CSET
-		final int tag = expression.getTag();
-
-		final List<ExpressionVisitor> ev = new LinkedList<ExpressionVisitor>();
-
-		final BoundIdentDecl[] decls = expression.getBoundIdentDecls();
-		for (final BoundIdentDecl boundIdentDecl : decls) {
-			final ExpressionVisitor visitor = new ExpressionVisitor(bounds);
-			boundIdentDecl.accept(visitor);
-			ev.add(visitor);
-			bounds.addFirst(boundIdentDecl.getName());
-		}
-
-		// Collect Subtrees in a list.
-		final LinkedList<PExpression> list = new LinkedList<PExpression>();
-		for (final ExpressionVisitor visitor : ev) {
-			list.add(visitor.getExpression());
-		}
-
-		// Process internal Expression and Predicate
-		final Predicate predicate = expression.getPredicate();
-		final PredicateVisitor predicateVisitor = new PredicateVisitor(bounds);
-		predicate.accept(predicateVisitor);
-
-		final PPredicate pr = predicateVisitor.getPredicate();
-
-		final ExpressionVisitor expressionVisitor = new ExpressionVisitor(
-				bounds);
-		expression.getExpression().accept(expressionVisitor);
-
-		final PExpression ex = expressionVisitor.getExpression();
-
-		switch (tag) {
-		case Formula.QUNION:
-			final AQuantifiedUnionExpression quantifiedUnionExpression = new AQuantifiedUnionExpression();
-			quantifiedUnionExpression.setExpression(ex);
-			quantifiedUnionExpression.setPredicates(pr);
-			quantifiedUnionExpression.setIdentifiers(list);
-			setExpression(quantifiedUnionExpression);
-			break;
-		case Formula.QINTER:
-			final AQuantifiedIntersectionExpression quantifiedIntersectionExpression = new AQuantifiedIntersectionExpression();
-			quantifiedIntersectionExpression.setExpression(ex);
-			quantifiedIntersectionExpression.setPredicates(pr);
-			quantifiedIntersectionExpression.setIdentifiers(list);
-			setExpression(quantifiedIntersectionExpression);
-			break;
-		case Formula.CSET:
-			final AEventBComprehensionSetExpression comprehensionSetExpression = new AEventBComprehensionSetExpression();
-			comprehensionSetExpression.setExpression(ex);
-			comprehensionSetExpression.setPredicates(pr);
-			comprehensionSetExpression.setIdentifiers(list);
-			setExpression(comprehensionSetExpression);
-			break;
-		default:
-			break;
-		}
-
-		for (int i = 0; i < decls.length; i++) {
-			bounds.remove(0);
-		}
-	}
-
-	@Override
-	public void visitAssociativeExpression(
-			final AssociativeExpression expression) {
-		// BUNION, BINTER, BCOMP, FCOMP, OVR, PLUS, MUL
-		final Expression[] children = expression.getChildren();
-
-		final LinkedList<ExpressionVisitor> ev = new LinkedList<ExpressionVisitor>();
-
-		for (final Expression ex : children) {
-			final ExpressionVisitor e = new ExpressionVisitor(bounds);
-			ev.add(e);
-			ex.accept(e);
-		}
-
-		final int tag = expression.getTag();
-		switch (tag) {
-		case Formula.BUNION:
-			setExpression(recurseBUNION(ev));
-			break;
-		case Formula.BINTER:
-			setExpression(recurseBINTER(ev));
-			break;
-		case Formula.BCOMP:
-			setExpression(recurseBCOMP(ev));
-			break;
-		case Formula.FCOMP:
-			setExpression(recurseFCOMP(ev));
-			break;
-		case Formula.OVR:
-			setExpression(recurseOVR(ev));
-			break;
-		case Formula.PLUS:
-			setExpression(recursePLUS(ev));
-			break;
-		case Formula.MUL:
-			setExpression(recurseMUL(ev));
-			break;
-
-		default:
-			break;
-		}
-		super.visitAssociativeExpression(expression);
-	}
-
-	private PExpression recurseFCOMP(final List<ExpressionVisitor> list) {
-		final ACompositionExpression r = new ACompositionExpression();
-		if (list.size() == 2) {
-			r.setLeft(list.get(0).getExpression());
-			r.setRight(list.get(1).getExpression());
-		} else {
-			r.setLeft(list.get(0).getExpression());
-			r.setRight(recurseFCOMP(list.subList(1, list.size())));
-		}
-		return r;
-	}
-
-	private PExpression recurseOVR(final List<ExpressionVisitor> list) {
-		final AOverwriteExpression r = new AOverwriteExpression();
-		if (list.size() == 2) {
-			r.setLeft(list.get(0).getExpression());
-			r.setRight(list.get(1).getExpression());
-		} else {
-			r.setLeft(list.get(0).getExpression());
-			r.setRight(recurseOVR(list.subList(1, list.size())));
-		}
-		return r;
-	}
-
-	private PExpression recursePLUS(final List<ExpressionVisitor> list) {
-		final AAddExpression r = new AAddExpression();
-		if (list.size() == 2) {
-			r.setLeft(list.get(0).getExpression());
-			r.setRight(list.get(1).getExpression());
-		} else {
-			r.setLeft(list.get(0).getExpression());
-			r.setRight(recursePLUS(list.subList(1, list.size())));
-		}
-		return r;
-	}
-
-	private PExpression recurseMUL(final List<ExpressionVisitor> list) {
-		final AMultiplicationExpression r = new AMultiplicationExpression();
-		if (list.size() == 2) {
-			r.setLeft(list.get(0).getExpression());
-			r.setRight(list.get(1).getExpression());
-		} else {
-			r.setLeft(list.get(0).getExpression());
-			r.setRight(recurseMUL(list.subList(1, list.size())));
-		}
-		return r;
-	}
-
-	private PExpression recurseBUNION(final List<ExpressionVisitor> list) {
-		final AUnionExpression r = new AUnionExpression();
-		if (list.size() == 2) {
-			r.setLeft(list.get(0).getExpression());
-			r.setRight(list.get(1).getExpression());
-		} else {
-			r.setLeft(list.get(0).getExpression());
-			r.setRight(recurseBUNION(list.subList(1, list.size())));
-		}
-		return r;
-	}
-
-	private PExpression recurseBINTER(final List<ExpressionVisitor> list) {
-		final AIntersectionExpression r = new AIntersectionExpression();
-		if (list.size() == 2) {
-			r.setLeft(list.get(0).getExpression());
-			r.setRight(list.get(1).getExpression());
-		} else {
-			r.setLeft(list.get(0).getExpression());
-			r.setRight(recurseBINTER(list.subList(1, list.size())));
-		}
-		return r;
-	}
-
-	private PExpression recurseBCOMP(final List<ExpressionVisitor> list) {
-		final ARingExpression r = new ARingExpression();
-		if (list.size() == 2) {
-			r.setLeft(list.get(0).getExpression());
-			r.setRight(list.get(1).getExpression());
-		} else {
-			r.setLeft(list.get(0).getExpression());
-			r.setRight(recurseBCOMP(list.subList(1, list.size())));
-		}
-		return r;
-	}
-
-	@Override
-	// this long method is far easier to read than smaller ones
-	public void visitBinaryExpression(final BinaryExpression expression) { // NOPMD
-		final int tag = expression.getTag();
-		final ExpressionVisitor visitorLeft = new ExpressionVisitor(bounds);
-		final ExpressionVisitor visitorRight = new ExpressionVisitor(bounds);
-		expression.getLeft().accept(visitorLeft);
-		expression.getRight().accept(visitorRight);
-		final PExpression exL = visitorLeft.getExpression();
-		final PExpression exR = visitorRight.getExpression();
-
-		switch (tag) {
-		case Formula.MAPSTO:
-			final ACoupleExpression coupleExpression = new ACoupleExpression();
-			coupleExpression.setList(Arrays
-					.asList(new PExpression[] { exL, exR }));
-			setExpression(coupleExpression);
-			break;
-		case Formula.REL:
-			final ARelationsExpression relationsExpression = new ARelationsExpression();
-			relationsExpression.setLeft(exL);
-			relationsExpression.setRight(exR);
-			setExpression(relationsExpression);
-			break;
-		case Formula.TREL:
-			final ATotalRelationExpression totalRelationExpression = new ATotalRelationExpression();
-			totalRelationExpression.setLeft(exL);
-			totalRelationExpression.setRight(exR);
-			setExpression(totalRelationExpression);
-			break;
-		case Formula.SREL:
-			final ASurjectionRelationExpression surjectionRelationExpression = new ASurjectionRelationExpression();
-			surjectionRelationExpression.setLeft(exL);
-			surjectionRelationExpression.setRight(exR);
-			setExpression(surjectionRelationExpression);
-			break;
-		case Formula.STREL:
-			final ATotalSurjectionRelationExpression totalSurjectionRelationExpression = new ATotalSurjectionRelationExpression();
-			totalSurjectionRelationExpression.setLeft(exL);
-			totalSurjectionRelationExpression.setRight(exR);
-			setExpression(totalSurjectionRelationExpression);
-			break;
-		case Formula.PFUN:
-			final APartialFunctionExpression partialFunctionExpression = new APartialFunctionExpression();
-			partialFunctionExpression.setLeft(exL);
-			partialFunctionExpression.setRight(exR);
-			setExpression(partialFunctionExpression);
-			break;
-		case Formula.TFUN:
-			final ATotalFunctionExpression totalFunctionExpression = new ATotalFunctionExpression();
-			totalFunctionExpression.setLeft(exL);
-			totalFunctionExpression.setRight(exR);
-			setExpression(totalFunctionExpression);
-			break;
-		case Formula.PINJ:
-			final APartialInjectionExpression partialInjectionExpression = new APartialInjectionExpression();
-			partialInjectionExpression.setLeft(exL);
-			partialInjectionExpression.setRight(exR);
-			setExpression(partialInjectionExpression);
-			break;
-		case Formula.TINJ:
-			final ATotalInjectionExpression totalInjectionExpression = new ATotalInjectionExpression();
-			totalInjectionExpression.setLeft(exL);
-			totalInjectionExpression.setRight(exR);
-			setExpression(totalInjectionExpression);
-			break;
-		case Formula.PSUR:
-			final APartialSurjectionExpression partialSurjectionExpression = new APartialSurjectionExpression();
-			partialSurjectionExpression.setLeft(exL);
-			partialSurjectionExpression.setRight(exR);
-			setExpression(partialSurjectionExpression);
-			break;
-		case Formula.TSUR:
-			final ATotalSurjectionExpression totalSurjectionExpression = new ATotalSurjectionExpression();
-			totalSurjectionExpression.setLeft(exL);
-			totalSurjectionExpression.setRight(exR);
-			setExpression(totalSurjectionExpression);
-			break;
-		case Formula.TBIJ:
-			final ATotalBijectionExpression totalBijectionExpression = new ATotalBijectionExpression();
-			totalBijectionExpression.setLeft(exL);
-			totalBijectionExpression.setRight(exR);
-			setExpression(totalBijectionExpression);
-			break;
-		case Formula.SETMINUS:
-			final ASetSubtractionExpression setSubtractionExpression = new ASetSubtractionExpression();
-			setSubtractionExpression.setLeft(exL);
-			setSubtractionExpression.setRight(exR);
-			setExpression(setSubtractionExpression);
-			break;
-		case Formula.CPROD:
-			final ACartesianProductExpression mulExpression = new ACartesianProductExpression();
-			mulExpression.setLeft(exL);
-			mulExpression.setRight(exR);
-			setExpression(mulExpression);
-			break;
-		case Formula.DPROD:
-			final ADirectProductExpression directProductExpression = new ADirectProductExpression();
-			directProductExpression.setLeft(exL);
-			directProductExpression.setRight(exR);
-			setExpression(directProductExpression);
-			break;
-		case Formula.PPROD:
-			final AParallelProductExpression parallelProductExpression = new AParallelProductExpression();
-			parallelProductExpression.setLeft(exL);
-			parallelProductExpression.setRight(exR);
-			setExpression(parallelProductExpression);
-			break;
-		case Formula.DOMRES:
-			final ADomainRestrictionExpression domainRestrictionExpression = new ADomainRestrictionExpression();
-			domainRestrictionExpression.setLeft(exL);
-			domainRestrictionExpression.setRight(exR);
-			setExpression(domainRestrictionExpression);
-			break;
-		case Formula.DOMSUB:
-			final ADomainSubtractionExpression domainSubtractionExpression = new ADomainSubtractionExpression();
-			domainSubtractionExpression.setLeft(exL);
-			domainSubtractionExpression.setRight(exR);
-			setExpression(domainSubtractionExpression);
-			break;
-		case Formula.RANRES:
-			final ARangeRestrictionExpression rangeRestrictionExpression = new ARangeRestrictionExpression();
-			rangeRestrictionExpression.setLeft(exL);
-			rangeRestrictionExpression.setRight(exR);
-			setExpression(rangeRestrictionExpression);
-			break;
-		case Formula.RANSUB:
-			final ARangeSubtractionExpression rangeSubtractionExpression = new ARangeSubtractionExpression();
-			rangeSubtractionExpression.setLeft(exL);
-			rangeSubtractionExpression.setRight(exR);
-			setExpression(rangeSubtractionExpression);
-			break;
-		case Formula.UPTO:
-			final AIntervalExpression intervalExpression = new AIntervalExpression();
-			intervalExpression.setLeftBorder(exL);
-			intervalExpression.setRightBorder(exR);
-			setExpression(intervalExpression);
-			break;
-		case Formula.MINUS:
-			final AMinusExpression minusExpression = new AMinusExpression();
-			minusExpression.setLeft(exL);
-			minusExpression.setRight(exR);
-			setExpression(minusExpression);
-			break;
-		case Formula.DIV:
-			final ADivExpression divExpression = new ADivExpression();
-			divExpression.setLeft(exL);
-			divExpression.setRight(exR);
-			setExpression(divExpression);
-			break;
-		case Formula.MOD:
-			final AModuloExpression moduloExpression = new AModuloExpression();
-			moduloExpression.setLeft(exL);
-			moduloExpression.setRight(exR);
-			setExpression(moduloExpression);
-			break;
-		case Formula.EXPN:
-			final APowerOfExpression powerOfExpression = new APowerOfExpression();
-			powerOfExpression.setLeft(exL);
-			powerOfExpression.setRight(exR);
-			setExpression(powerOfExpression);
-			break;
-		case Formula.FUNIMAGE:
-			final AFunctionExpression functionExpression = new AFunctionExpression();
-			functionExpression.setIdentifier(exL);
-			functionExpression.setParameters(Arrays
-					.asList(new PExpression[] { exR }));
-			setExpression(functionExpression);
-			break;
-		case Formula.RELIMAGE:
-			final AImageExpression imageExpression = new AImageExpression();
-			imageExpression.setLeft(exL);
-			imageExpression.setRight(exR);
-			setExpression(imageExpression);
-			break;
-		default:
-			throw new AssertionError("Uncovered Expression");
-		}
-
-	}
-
-	@Override
-	public void visitAtomicExpression(final AtomicExpression expression) { // NOPMD
-		// by
-		// bendisposto
-		final int tag = expression.getTag();
-
-		switch (tag) {
-		case Formula.INTEGER:
-			setExpression(new AIntegerSetExpression());
-			break;
-		case Formula.NATURAL:
-			setExpression(new ANaturalSetExpression());
-			break;
-		case Formula.NATURAL1:
-			setExpression(new ANatural1SetExpression());
-			break;
-		case Formula.BOOL:
-			setExpression(new ABoolSetExpression());
-			break;
-		case Formula.TRUE:
-			setExpression(new ABooleanTrueExpression());
-			break;
-		case Formula.FALSE:
-			setExpression(new ABooleanFalseExpression());
-			break;
-		case Formula.EMPTYSET:
-			setExpression(new AEmptySetExpression());
-			break;
-		case Formula.KPRED:
-			setExpression(new APredecessorExpression());
-			break;
-		case Formula.KSUCC:
-			setExpression(new ASuccessorExpression());
-			break;
-		case Formula.KPRJ1_GEN: // see task#215
-			setExpression(new AEventBFirstProjectionV2Expression());
-			break;
-		case Formula.KPRJ2_GEN:
-			setExpression(new AEventBSecondProjectionV2Expression());
-			break;
-		case Formula.KID_GEN:
-			setExpression(new AEventBIdentityExpression());
-			break;
-		default:
-			throw new AssertionError("Uncovered Expression " + expression);
-		}
-	}
-
-	@Override
-	public void visitBoolExpression(final BoolExpression expression) {
-		final AConvertBoolExpression convertBoolExpression = new AConvertBoolExpression();
-		final PredicateVisitor visitor = new PredicateVisitor(bounds);
-		expression.getPredicate().accept(visitor);
-		convertBoolExpression.setPredicate(visitor.getPredicate());
-		setExpression(convertBoolExpression);
-	}
-
-	@Override
-	public void visitBoundIdentDecl(final BoundIdentDecl boundIdentDecl) {
-		final List<TIdentifierLiteral> list = Arrays
-				.asList(new TIdentifierLiteral[] { new TIdentifierLiteral(
-						boundIdentDecl.getName()) });
-		final AIdentifierExpression expression = new AIdentifierExpression();
-		expression.setIdentifier(list);
-		setExpression(expression);
-	}
-
-	@Override
-	public void visitBoundIdentifier(final BoundIdentifier identifierExpression) {
-		final List<TIdentifierLiteral> list = Arrays
-				.asList(new TIdentifierLiteral[] { new TIdentifierLiteral(
-						bounds.get(identifierExpression.getBoundIndex())) });
-		final AIdentifierExpression expression = new AIdentifierExpression();
-		expression.setIdentifier(list);
-		setExpression(expression);
-	}
-
-	@Override
-	public void visitFreeIdentifier(final FreeIdentifier identifierExpression) {
-		final List<TIdentifierLiteral> list = Arrays
-				.asList(new TIdentifierLiteral[] { new TIdentifierLiteral(
-						identifierExpression.getName()) });
-		final AIdentifierExpression expression = new AIdentifierExpression();
-		expression.setIdentifier(list);
-		setExpression(expression);
-	}
-
-	@Override
-	public void visitIntegerLiteral(final IntegerLiteral expression) {
-		final BigInteger value = expression.getValue();
-		final AIntegerExpression integerExpression = new AIntegerExpression();
-		integerExpression.setLiteral(new TIntegerLiteral(value.toString()));
-		setExpression(integerExpression);
-	}
-
-	@Override
-	public void visitSetExtension(final SetExtension expression) {
-		final Expression[] members = expression.getMembers();
-		final ASetExtensionExpression setExtensionExpression = new ASetExtensionExpression();
-		final List<PExpression> list = new ArrayList<PExpression>();
-		for (final Expression e : members) {
-			final ExpressionVisitor visitor = new ExpressionVisitor(bounds);
-			e.accept(visitor);
-			list.add(visitor.getExpression());
-		}
-		setExtensionExpression.setExpressions(list);
-		setExpression(setExtensionExpression);
-	}
-
-	@Override
-	public void visitExtendedExpression(ExtendedExpression expression) {
-		AExtendedExprExpression p = new AExtendedExprExpression();
-
-		IExpressionExtension extension = expression.getExtension();
-		String symbol = extension.getSyntaxSymbol();
-
-		p.setIdentifier(new TIdentifierLiteral(symbol));
-		Expression[] expressions = expression.getChildExpressions();
-		List<PExpression> childExprs = new ArrayList<PExpression>();
-		for (Expression e : expressions) {
-			ExpressionVisitor v = new ExpressionVisitor(bounds);
-			e.accept(v);
-			childExprs.add(v.getExpression());
-		}
-		p.setExpressions(childExprs);
-
-		Predicate[] childPredicates = expression.getChildPredicates();
-		List<PPredicate> childPreds = new ArrayList<PPredicate>();
-		for (Predicate pd : childPredicates) {
-			PredicateVisitor v = new PredicateVisitor(bounds);
-			pd.accept(v);
-			childPreds.add(v.getPredicate());
-		}
-		p.setPredicates(childPreds);
-
-		setExpression(p);
-
-	}
-
-	@SuppressWarnings("deprecation")
-	@Override
-	public void visitUnaryExpression(final UnaryExpression expression) { // NOPMD
-		// by
-		// bendisposto
-		final int tag = expression.getTag();
-		final ExpressionVisitor visitor = new ExpressionVisitor(bounds);
-		expression.getChild().accept(visitor);
-		final PExpression exp = visitor.getExpression();
-
-		switch (tag) {
-		case Formula.KCARD:
-			final ACardExpression cardExpression = new ACardExpression();
-			cardExpression.setExpression(exp);
-			setExpression(cardExpression);
-			break;
-		case Formula.POW:
-			final APowSubsetExpression powExpression = new APowSubsetExpression();
-			powExpression.setExpression(exp);
-			setExpression(powExpression);
-			break;
-		case Formula.POW1:
-			final APow1SubsetExpression pow1Expression = new APow1SubsetExpression();
-			pow1Expression.setExpression(exp);
-			setExpression(pow1Expression);
-			break;
-		case Formula.KUNION:
-			final AGeneralUnionExpression unionExpression = new AGeneralUnionExpression();
-			unionExpression.setExpression(exp);
-			setExpression(unionExpression);
-			break;
-		case Formula.KINTER:
-			final AGeneralIntersectionExpression interExpression = new AGeneralIntersectionExpression();
-			interExpression.setExpression(exp);
-			setExpression(interExpression);
-			break;
-		case Formula.KDOM:
-			final ADomainExpression domainExpression = new ADomainExpression();
-			domainExpression.setExpression(exp);
-			setExpression(domainExpression);
-			break;
-		case Formula.KRAN:
-			final ARangeExpression rangeExpression = new ARangeExpression();
-			rangeExpression.setExpression(exp);
-			setExpression(rangeExpression);
-			break;
-		case Formula.KPRJ1:
-			final AEventBFirstProjectionExpression firstProjectionExpression = new AEventBFirstProjectionExpression();
-			firstProjectionExpression.setExpression(exp);
-			setExpression(firstProjectionExpression);
-			break;
-		case Formula.KPRJ2:
-			final AEventBSecondProjectionExpression secondProjectionExpression = new AEventBSecondProjectionExpression();
-			secondProjectionExpression.setExpression(exp);
-			setExpression(secondProjectionExpression);
-			break;
-		case Formula.KID:
-			final AIdentityExpression identityExpression = new AIdentityExpression();
-			identityExpression.setExpression(exp);
-			setExpression(identityExpression);
-			break;
-		case Formula.KMIN:
-			final AMinExpression minExpression = new AMinExpression();
-			minExpression.setExpression(exp);
-			setExpression(minExpression);
-			break;
-		case Formula.KMAX:
-			final AMaxExpression maxExpression = new AMaxExpression();
-			maxExpression.setExpression(exp);
-			setExpression(maxExpression);
-			break;
-		case Formula.CONVERSE:
-			final AReverseExpression reverseExpression = new AReverseExpression();
-			reverseExpression.setExpression(exp);
-			setExpression(reverseExpression);
-			break;
-		case Formula.UNMINUS:
-			final AUnaryMinusExpression unaryExpression = new AUnaryMinusExpression();
-			unaryExpression.setExpression(exp);
-			setExpression(unaryExpression);
-			break;
-
-		default:
-			throw new AssertionError("Uncovered Expression");
-		}
-	}
-}
diff --git a/de.prob.core/src/de/prob/eventb/translator/PredicateVisitor.java b/de.prob.core/src/de/prob/eventb/translator/PredicateVisitor.java
deleted file mode 100644
index 59463a55ffd7ad62b5766d80bf622b9a88d6afc9..0000000000000000000000000000000000000000
--- a/de.prob.core/src/de/prob/eventb/translator/PredicateVisitor.java
+++ /dev/null
@@ -1,448 +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.prob.eventb.translator; // NOPMD
-// High number of imports because it depends on AST
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eventb.core.ast.AssociativePredicate;
-import org.eventb.core.ast.BinaryPredicate;
-import org.eventb.core.ast.BoundIdentDecl;
-import org.eventb.core.ast.Expression;
-import org.eventb.core.ast.ExtendedPredicate;
-import org.eventb.core.ast.Formula;
-import org.eventb.core.ast.ISimpleVisitor;
-import org.eventb.core.ast.LiteralPredicate;
-import org.eventb.core.ast.MultiplePredicate;
-import org.eventb.core.ast.Predicate;
-import org.eventb.core.ast.QuantifiedPredicate;
-import org.eventb.core.ast.RelationalPredicate;
-import org.eventb.core.ast.SimplePredicate;
-import org.eventb.core.ast.UnaryPredicate;
-import org.eventb.core.ast.extension.IPredicateExtension;
-
-import de.be4.classicalb.core.parser.node.AConjunctPredicate;
-import de.be4.classicalb.core.parser.node.ADisjunctPredicate;
-import de.be4.classicalb.core.parser.node.AEqualPredicate;
-import de.be4.classicalb.core.parser.node.AEquivalencePredicate;
-import de.be4.classicalb.core.parser.node.AExistsPredicate;
-import de.be4.classicalb.core.parser.node.AExtendedPredPredicate;
-import de.be4.classicalb.core.parser.node.AFalsityPredicate;
-import de.be4.classicalb.core.parser.node.AFinitePredicate;
-import de.be4.classicalb.core.parser.node.AForallPredicate;
-import de.be4.classicalb.core.parser.node.AGreaterEqualPredicate;
-import de.be4.classicalb.core.parser.node.AGreaterPredicate;
-import de.be4.classicalb.core.parser.node.AImplicationPredicate;
-import de.be4.classicalb.core.parser.node.ALessEqualPredicate;
-import de.be4.classicalb.core.parser.node.ALessPredicate;
-import de.be4.classicalb.core.parser.node.AMemberPredicate;
-import de.be4.classicalb.core.parser.node.ANegationPredicate;
-import de.be4.classicalb.core.parser.node.ANotEqualPredicate;
-import de.be4.classicalb.core.parser.node.ANotMemberPredicate;
-import de.be4.classicalb.core.parser.node.ANotSubsetPredicate;
-import de.be4.classicalb.core.parser.node.ANotSubsetStrictPredicate;
-import de.be4.classicalb.core.parser.node.APartitionPredicate;
-import de.be4.classicalb.core.parser.node.ASubsetPredicate;
-import de.be4.classicalb.core.parser.node.ASubsetStrictPredicate;
-import de.be4.classicalb.core.parser.node.ATruthPredicate;
-import de.be4.classicalb.core.parser.node.PExpression;
-import de.be4.classicalb.core.parser.node.PPredicate;
-import de.be4.classicalb.core.parser.node.TIdentifierLiteral;
-import de.prob.eventb.translator.internal.SimpleVisitorAdapter;
-
-public class PredicateVisitor extends SimpleVisitorAdapter implements // NOPMD
-		ISimpleVisitor {
-
-	private static final String UNCOVERED_PREDICATE = "Uncovered Predicate";
-
-	private PPredicate p;
-
-	private final LinkedList<String> bounds; // NOPMD
-	// we need properties of linked lists, List is not an option
-
-	private boolean predicateSet = false;
-
-	public PPredicate getPredicate() {
-		return p;
-	}
-
-	public void setPredicate(final PPredicate p) {
-		synchronized (bounds) {
-			if (predicateSet) {
-				throw new AssertionError("The Visitor must not be used twice!");
-			}
-			predicateSet = true;
-			this.p = p;
-		}
-		// public ClassifiedPragma(String name, Node attachedTo, List<String>
-		// arguments, List<String> warnings, SourcePosition start,
-		// SourcePosition end) {
-
-		// new ClassifiedPragma("discharged", p, proof, Collections.emptyList(),
-		// new SourcePosition(-1, -1), new SourcePosition(-1, -1));
-	}
-
-	public PredicateVisitor() {
-		this(null);
-	}
-
-	public PredicateVisitor(LinkedList<String> bounds) {
-		super();
-		if (bounds == null) {
-			this.bounds = new LinkedList<String>();
-		} else {
-			this.bounds = bounds;
-		}
-	}
-
-	@Override
-	public void visitQuantifiedPredicate(final QuantifiedPredicate predicate) {
-		final int tag = predicate.getTag();
-
-		// Add quantified identifiers to bound list and recursively create
-		// subtrees representing the identifiers
-		final List<ExpressionVisitor> ev = new LinkedList<ExpressionVisitor>();
-		final BoundIdentDecl[] decls = predicate.getBoundIdentDecls();
-		for (final BoundIdentDecl boundIdentDecl : decls) {
-			final ExpressionVisitor visitor = new ExpressionVisitor(bounds);
-			boundIdentDecl.accept(visitor);
-			ev.add(visitor);
-			bounds.addFirst(boundIdentDecl.getName());
-		}
-
-		// Collect Subtrees in a list
-		final LinkedList<PExpression> list = new LinkedList<PExpression>();
-		for (final ExpressionVisitor visitor : ev) {
-			list.add(visitor.getExpression());
-		}
-
-		// Recursively analyze the predicate (important, bounds are already set)
-		final PredicateVisitor predicateVisitor = new PredicateVisitor(bounds);
-		predicate.getPredicate().accept(predicateVisitor);
-
-		switch (tag) {
-		case Formula.EXISTS:
-			final AExistsPredicate existentialQuantificationPredicate = new AExistsPredicate();
-			existentialQuantificationPredicate.setIdentifiers(list);
-			existentialQuantificationPredicate.setPredicate(predicateVisitor
-					.getPredicate());
-			setPredicate(existentialQuantificationPredicate);
-			break;
-		case Formula.FORALL:
-			final AForallPredicate universalQuantificationPredicate = new AForallPredicate();
-			universalQuantificationPredicate.setIdentifiers(list);
-			PPredicate pred = predicateVisitor.getPredicate();
-			if (!(pred instanceof AImplicationPredicate)) {
-				pred = new AImplicationPredicate(new ATruthPredicate(), pred);
-			}
-			universalQuantificationPredicate.setImplication(pred);
-			setPredicate(universalQuantificationPredicate);
-			break;
-
-		default:
-			throw new AssertionError(UNCOVERED_PREDICATE);
-		}
-		// remove quantified identifiers from bound list (leaving scope)
-		for (int i = 0; i < decls.length; i++) {
-			bounds.removeFirst();
-		}
-
-	}
-
-	@Override
-	public void visitAssociativePredicate(final AssociativePredicate predicate) {
-		// {LAND, LOR, LEQV}
-		final int tag = predicate.getTag();
-		final Predicate[] children = predicate.getChildren();
-		if (children.length < 2) {
-			throw new AssertionError(
-					"Predicate must have at least 2 subpredicates.");
-		}
-
-		final LinkedList<PredicateVisitor> pv = new LinkedList<PredicateVisitor>();
-
-		for (final Predicate pr : children) {
-			final PredicateVisitor p = new PredicateVisitor(bounds);
-			pv.add(p);
-			pr.accept(p);
-		}
-
-		switch (tag) {
-		case Formula.LOR:
-			setPredicate(recurseOR(pv));
-			break;
-
-		case Formula.LAND:
-			setPredicate(recurseAND(pv));
-			break;
-		case Formula.LEQV:
-			setPredicate(recurseEQV(pv));
-			break;
-
-		default:
-			throw new AssertionError(UNCOVERED_PREDICATE);
-		}
-
-	}
-
-	private PPredicate recurseOR(final List<PredicateVisitor> list) {
-		final ADisjunctPredicate r = new ADisjunctPredicate();
-		if (list.size() == 2) {
-			r.setLeft(list.get(0).getPredicate());
-			r.setRight(list.get(1).getPredicate());
-		} else {
-			r.setLeft(list.get(0).getPredicate());
-			r.setRight(recurseOR(list.subList(1, list.size())));
-		}
-		return r;
-	}
-
-	private PPredicate recurseAND(final List<PredicateVisitor> list) {
-		final AConjunctPredicate r = new AConjunctPredicate();
-		if (list.size() == 2) {
-			r.setLeft(list.get(0).getPredicate());
-			r.setRight(list.get(1).getPredicate());
-		} else {
-			r.setLeft(list.get(0).getPredicate());
-			r.setRight(recurseAND(list.subList(1, list.size())));
-		}
-		return r;
-	}
-
-	private PPredicate recurseEQV(final List<PredicateVisitor> list) {
-		final AEquivalencePredicate r = new AEquivalencePredicate();
-		if (list.size() == 2) {
-			r.setLeft(list.get(0).getPredicate());
-			r.setRight(list.get(1).getPredicate());
-		} else {
-			r.setLeft(list.get(0).getPredicate());
-			r.setRight(recurseEQV(list.subList(1, list.size())));
-		}
-		return r;
-	}
-
-	@Override
-	public void visitBinaryPredicate(final BinaryPredicate predicate) {
-		final int tag = predicate.getTag();
-
-		final PredicateVisitor subLeft = new PredicateVisitor(bounds);
-		predicate.getLeft().accept(subLeft);
-		final PredicateVisitor subRight = new PredicateVisitor(bounds);
-		predicate.getRight().accept(subRight);
-
-		switch (tag) {
-		case Formula.LIMP:
-			final AImplicationPredicate limp = new AImplicationPredicate();
-			limp.setLeft(subLeft.getPredicate());
-			limp.setRight(subRight.getPredicate());
-			setPredicate(limp);
-			break;
-		case Formula.LEQV:
-			final AEquivalencePredicate leqv = new AEquivalencePredicate();
-			leqv.setLeft(subLeft.getPredicate());
-			leqv.setRight(subRight.getPredicate());
-			setPredicate(leqv);
-			break;
-		default:
-			throw new AssertionError(UNCOVERED_PREDICATE);
-		}
-	}
-
-	@Override
-	public void visitLiteralPredicate(final LiteralPredicate predicate) {
-		final int tag = predicate.getTag();
-		switch (tag) {
-		case Formula.BTRUE:
-			setPredicate(new ATruthPredicate());
-			break;
-		case Formula.BFALSE:
-			setPredicate(new AFalsityPredicate());
-			break;
-
-		default:
-			throw new AssertionError(UNCOVERED_PREDICATE);
-		}
-	}
-
-	@Override
-	public void visitRelationalPredicate(final RelationalPredicate predicate) { // NOPMD
-		// High complexity is ok
-		// EQUAL, NOTEQUAL, LT, LE, GT, GE, IN, NOTIN, SUBSET,
-		// NOTSUBSET, SUBSETEQ, NOTSUBSETEQ
-		final ExpressionVisitor subLeft = new ExpressionVisitor(bounds);
-		predicate.getLeft().accept(subLeft);
-		final ExpressionVisitor subRight = new ExpressionVisitor(bounds);
-		predicate.getRight().accept(subRight);
-
-		final int tag = predicate.getTag();
-
-		switch (tag) {
-		case Formula.EQUAL:
-			final AEqualPredicate equalPredicate = new AEqualPredicate();
-			equalPredicate.setLeft(subLeft.getExpression());
-			equalPredicate.setRight(subRight.getExpression());
-			setPredicate(equalPredicate);
-			break;
-		case Formula.NOTEQUAL:
-			final ANotEqualPredicate unequalPredicate = new ANotEqualPredicate();
-			unequalPredicate.setLeft(subLeft.getExpression());
-			unequalPredicate.setRight(subRight.getExpression());
-			setPredicate(unequalPredicate);
-			break;
-
-		case Formula.LT:
-			final ALessPredicate ltPredicate = new ALessPredicate();
-			ltPredicate.setLeft(subLeft.getExpression());
-			ltPredicate.setRight(subRight.getExpression());
-			setPredicate(ltPredicate);
-			break;
-		case Formula.LE:
-			final ALessEqualPredicate lePredicate = new ALessEqualPredicate();
-			lePredicate.setLeft(subLeft.getExpression());
-			lePredicate.setRight(subRight.getExpression());
-			setPredicate(lePredicate);
-			break;
-		case Formula.GT:
-			final AGreaterPredicate gtPredicate = new AGreaterPredicate();
-			gtPredicate.setLeft(subLeft.getExpression());
-			gtPredicate.setRight(subRight.getExpression());
-			setPredicate(gtPredicate);
-			break;
-		case Formula.GE:
-			final AGreaterEqualPredicate gePredicate = new AGreaterEqualPredicate();
-			gePredicate.setLeft(subLeft.getExpression());
-			gePredicate.setRight(subRight.getExpression());
-			setPredicate(gePredicate);
-			break;
-
-		case Formula.IN:
-			final AMemberPredicate inPredicate = new AMemberPredicate();
-			inPredicate.setLeft(subLeft.getExpression());
-			inPredicate.setRight(subRight.getExpression());
-			setPredicate(inPredicate);
-			break;
-		case Formula.NOTIN:
-			final ANotMemberPredicate ninPredicate = new ANotMemberPredicate();
-			ninPredicate.setLeft(subLeft.getExpression());
-			ninPredicate.setRight(subRight.getExpression());
-			setPredicate(ninPredicate);
-			break;
-		case Formula.SUBSET:
-			final ASubsetStrictPredicate strictSubsetPredicate = new ASubsetStrictPredicate();
-			strictSubsetPredicate.setLeft(subLeft.getExpression());
-			strictSubsetPredicate.setRight(subRight.getExpression());
-			setPredicate(strictSubsetPredicate);
-			break;
-		case Formula.NOTSUBSET:
-			final ANotSubsetStrictPredicate notStrictSubsetPredicate = new ANotSubsetStrictPredicate();
-			notStrictSubsetPredicate.setLeft(subLeft.getExpression());
-			notStrictSubsetPredicate.setRight(subRight.getExpression());
-			setPredicate(notStrictSubsetPredicate);
-			break;
-		case Formula.SUBSETEQ:
-			final ASubsetPredicate subsetPredicate = new ASubsetPredicate();
-			subsetPredicate.setLeft(subLeft.getExpression());
-			subsetPredicate.setRight(subRight.getExpression());
-			setPredicate(subsetPredicate);
-			break;
-		case Formula.NOTSUBSETEQ:
-			final ANotSubsetPredicate notSubsetPredicate = new ANotSubsetPredicate();
-			notSubsetPredicate.setLeft(subLeft.getExpression());
-			notSubsetPredicate.setRight(subRight.getExpression());
-			setPredicate(notSubsetPredicate);
-			break;
-
-		default:
-			throw new AssertionError(UNCOVERED_PREDICATE);
-		}
-
-	}
-
-	@Override
-	public void visitSimplePredicate(final SimplePredicate predicate) {
-		if (predicate.getTag() != Formula.KFINITE) {
-			throw new AssertionError(UNCOVERED_PREDICATE);
-		}
-		final AFinitePredicate finite = new AFinitePredicate();
-		final ExpressionVisitor subEx = new ExpressionVisitor(bounds);
-		predicate.getExpression().accept(subEx);
-		finite.setSet(subEx.getExpression());
-		setPredicate(finite);
-	}
-
-	@Override
-	public void visitUnaryPredicate(final UnaryPredicate predicate) {
-		if (predicate.getTag() != Formula.NOT) {
-			throw new AssertionError(UNCOVERED_PREDICATE);
-		}
-		final ANegationPredicate negationPredicate = new ANegationPredicate();
-		final PredicateVisitor sub = new PredicateVisitor(bounds);
-		predicate.getChild().accept(sub);
-		negationPredicate.setPredicate(sub.getPredicate());
-		setPredicate(negationPredicate);
-	}
-
-	@Override
-	public void visitMultiplePredicate(final MultiplePredicate predicate) {
-		final Expression[] subs = predicate.getChildren();
-		final List<PExpression> expressions = new ArrayList<PExpression>(
-				subs.length);
-		for (Expression e : subs) {
-			final ExpressionVisitor sub = new ExpressionVisitor(bounds);
-			e.accept(sub);
-			expressions.add(sub.getExpression());
-		}
-
-		final PPredicate result;
-		if (predicate.getTag() == Formula.KPARTITION) {
-			if (expressions.size() > 0) {
-				PExpression set = expressions.remove(0);
-				result = new APartitionPredicate(set, expressions);
-			} else {
-				throw new AssertionError("to few arguments for PARTITION");
-			}
-		} else {
-			throw new AssertionError(UNCOVERED_PREDICATE);
-		}
-		setPredicate(result);
-	}
-
-	@Override
-	public void visitExtendedPredicate(ExtendedPredicate predicate) {
-		AExtendedPredPredicate p = new AExtendedPredPredicate();
-		IPredicateExtension extension = predicate.getExtension();
-		String symbol = extension.getSyntaxSymbol();
-
-		// FIXME THEORY-PLUGIN re-enable when the theory plugin was released
-
-		// Theories.addOrigin(origin);
-
-		p.setIdentifier(new TIdentifierLiteral(symbol));
-
-		Expression[] expressions = predicate.getChildExpressions();
-		List<PExpression> childExprs = new ArrayList<PExpression>();
-		for (Expression e : expressions) {
-			ExpressionVisitor v = new ExpressionVisitor(bounds);
-			e.accept(v);
-			childExprs.add(v.getExpression());
-		}
-		p.setExpressions(childExprs);
-
-		Predicate[] childPredicates = predicate.getChildPredicates();
-		List<PPredicate> childPreds = new ArrayList<PPredicate>();
-		for (Predicate pd : childPredicates) {
-			PredicateVisitor v = new PredicateVisitor(bounds);
-			pd.accept(v);
-			childPreds.add(v.getPredicate());
-		}
-		p.setPredicates(childPreds);
-		setPredicate(p);
-	}
-
-}
diff --git a/de.prob.core/src/de/prob/eventb/translator/Theories.java b/de.prob.core/src/de/prob/eventb/translator/Theories.java
index 18de77aaa2a92386c2e9573aaee25d5273916a5a..cede1459aa58b4d634ddc9deec9f54ded5ac49cb 100644
--- a/de.prob.core/src/de/prob/eventb/translator/Theories.java
+++ b/de.prob.core/src/de/prob/eventb/translator/Theories.java
@@ -4,9 +4,10 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedList;
+import java.util.HashSet;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
@@ -18,7 +19,10 @@ import org.eventb.core.ISCIdentifierElement;
 import org.eventb.core.ast.Expression;
 import org.eventb.core.ast.Formula;
 import org.eventb.core.ast.FormulaFactory;
+import org.eventb.core.ast.FreeIdentifier;
+import org.eventb.core.ast.IParseResult;
 import org.eventb.core.ast.ITypeEnvironment;
+import org.eventb.core.ast.ITypeEnvironmentBuilder;
 import org.eventb.core.ast.Predicate;
 import org.eventb.core.ast.Type;
 import org.eventb.theory.core.DatabaseUtilities;
@@ -36,8 +40,12 @@ import org.eventb.theory.core.ISCNewOperatorDefinition;
 import org.eventb.theory.core.ISCOperatorArgument;
 import org.eventb.theory.core.ISCRecursiveDefinitionCase;
 import org.eventb.theory.core.ISCRecursiveOperatorDefinition;
+import org.eventb.theory.core.ISCTheoryRoot;
 import org.eventb.theory.core.ISCTypeArgument;
 import org.eventb.theory.core.ITheoryPathRoot;
+import org.eventb.theory.core.IUseTheory;
+import org.eventb.theory.core.TheoryAttributes;
+import org.eventb.theory.core.TheoryElement;
 import org.rodinp.core.IRodinProject;
 import org.rodinp.core.RodinDBException;
 
@@ -45,6 +53,7 @@ import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog;
 import de.be4.classicalb.core.parser.node.PExpression;
 import de.be4.classicalb.core.parser.node.PPredicate;
 import de.prob.core.translator.TranslationFailedException;
+import de.prob.eventb.translator.internal.TranslationVisitor;
 import de.prob.prolog.output.IPrologTermOutput;
 import de.prob.prolog.output.StructuredPrologOutput;
 import de.prob.prolog.term.PrologTerm;
@@ -52,34 +61,62 @@ import de.prob.tmparser.OperatorMapping;
 import de.prob.tmparser.TheoryMappingException;
 import de.prob.tmparser.TheoryMappingParser;
 
-
 public class Theories {
 	private static final String PROB_THEORY_MAPPING_SUFFIX = "ptm";
 
 	public static void translate(IEventBProject project, IPrologTermOutput pout)
 			throws TranslationFailedException {
 		try {
+			// Start with an empty set of visited theories. This set is used to
+			// prevent printing of a theory twice.
+			final Collection<String> visitedTheories = new HashSet<String>();
+
 			final IRodinProject rProject = project.getRodinProject();
-			final IDeployedTheoryRoot[] theories = rProject
-					.getRootElementsOfType(IDeployedTheoryRoot.ELEMENT_TYPE);
-			for (IDeployedTheoryRoot theory : theories) {
-				savePrintTranslation(theory, pout);
-			}
+			// It seems that we need only the theories that are referenced by
+			// the theory path objects. If this is not the case, we need to
+			// add the deployed theories.
 			final ITheoryPathRoot[] theoryPaths = rProject
 					.getRootElementsOfType(ITheoryPathRoot.ELEMENT_TYPE);
 			for (ITheoryPathRoot theoryPath : theoryPaths) {
 				for (IAvailableTheoryProject ap : theoryPath
 						.getAvailableTheoryProjects()) {
 					for (IAvailableTheory at : ap.getTheories()) {
-						savePrintTranslation(at.getDeployedTheory(), pout);
+						final IDeployedTheoryRoot deployedTheory = at
+								.getDeployedTheory();
+						savePrintTranslation(deployedTheory, visitedTheories,
+								pout);
 					}
 				}
 			}
-		} catch (RodinDBException e) {
+		} catch (CoreException e) {
 			throw new TranslationFailedException(e);
 		}
 	}
 
+	/**
+	 * Returns the used theories of a deployed theory. These are (at least I
+	 * think so) the (deployed versions of) theories imported by the original
+	 * theory.
+	 * 
+	 * Please note that {@link IDeployedTheoryRoot#getSCImportTheoryProjects()}
+	 * does not work as it always returns an empty list.
+	 * 
+	 * @param deployedTheory
+	 * @return An {@link Iterable} with the deployed theories that are used by
+	 *         the given theory.
+	 * @throws RodinDBException
+	 */
+	private static Iterable<IDeployedTheoryRoot> getUsedTheories(
+			final IDeployedTheoryRoot deployedTheory) throws RodinDBException {
+		Collection<IDeployedTheoryRoot> theories = new ArrayList<IDeployedTheoryRoot>();
+		for (IUseTheory use : deployedTheory.getUsedTheories()) {
+			if (use.hasUseTheory()) {
+				theories.add(use.getUsedTheory());
+			}
+		}
+		return theories;
+	}
+
 	/**
 	 * We currently write the translated theory into a PrologTerm object because
 	 * the translation is currently very unstable and erroneous. Writing in a
@@ -89,20 +126,49 @@ public class Theories {
 	 * @throws TranslationFailedException
 	 */
 	private static void savePrintTranslation(IDeployedTheoryRoot theory,
-			IPrologTermOutput opto) throws RodinDBException,
-			TranslationFailedException {
-
+			Collection<String> visitedTheories, IPrologTermOutput opto)
+			throws CoreException, TranslationFailedException {
 		final StructuredPrologOutput pto = new StructuredPrologOutput();
-		printTranslation(theory, pto);
-		pto.fullstop();
-		final PrologTerm result = pto.getSentences().get(0);
-		opto.printTerm(result);
+		printTranslation(theory, visitedTheories, pto);
+		for (PrologTerm result : pto.getSentences()) {
+			opto.printTerm(result);
+		}
 	}
 
 	private static void printTranslation(IDeployedTheoryRoot theory,
-			StructuredPrologOutput pto) throws RodinDBException,
-			TranslationFailedException {
+			Collection<String> visitedTheories, StructuredPrologOutput pto)
+			throws CoreException, TranslationFailedException {
+		final String name = theory.getElementName();
+		// Check if the theory has already been printed, if yes, skip it
+		if (!visitedTheories.contains(name)) {
+			visitedTheories.add(name);
+			// First print the imported theories, this guarantees that needed
+			// dependencies are printed first. (I'm not sure that ProB needs
+			// that, anyway)
+			Iterable<IDeployedTheoryRoot> imported = getUsedTheories(theory);
+			printImportedTheories(imported, visitedTheories, pto);
+			printTheory(theory, imported, pto);
+			// We add a full stop, because we want to build a list of terms that
+			// will be printed after everything went well.
+			pto.fullstop();
+		}
+	}
+
+	private static void printImportedTheories(
+			Iterable<IDeployedTheoryRoot> theories,
+			Collection<String> visitedTheories, StructuredPrologOutput pto)
+			throws CoreException, TranslationFailedException {
+		for (IDeployedTheoryRoot theory : theories) {
+			printTranslation(theory, visitedTheories, pto);
+		}
+	}
+
+	private static void printTheory(IDeployedTheoryRoot theory,
+			Iterable<IDeployedTheoryRoot> imported, StructuredPrologOutput pto)
+			throws CoreException, TranslationFailedException {
 		pto.openTerm("theory");
+		printTheoryName(theory, pto);
+		printListOfImportedTheories(imported, pto);
 		printIdentifiers(theory.getSCTypeParameters(), pto);
 		printDataTypes(theory, pto);
 		printOperatorDefs(theory, pto);
@@ -111,7 +177,40 @@ public class Theories {
 		pto.closeTerm();
 	}
 
-	private static void findProBMappingFile(IDeployedTheoryRoot theory,
+	private static void printListOfImportedTheories(
+			Iterable<IDeployedTheoryRoot> imported, StructuredPrologOutput pto)
+			throws RodinDBException {
+		pto.openList();
+		for (IDeployedTheoryRoot theory : imported) {
+			printTheoryName(theory, pto);
+		}
+		pto.closeList();
+	}
+
+	private static void printTheoryName(IDeployedTheoryRoot theory,
+			IPrologTermOutput pto) {
+		pto.openTerm("theory_name");
+		pto.printAtom(theory.getRodinProject().getElementName());
+		pto.printAtom(theory.getElementName());
+		pto.closeTerm();
+	}
+
+	/**
+	 * Each theory might have a ProB Mapping File which describes how ProB
+	 * should handle operators of the theory. We look if there is a special
+	 * named file in the same directory as the original theory file.
+	 * 
+	 * E.g. if the theory is "example" in the project "P" we look for a file
+	 * named "example.ptm" in "P".
+	 * 
+	 * If a mapping file is found, it contents is processed and printed to the
+	 * Prolog output.
+	 * 
+	 * @param theory
+	 * @param pto
+	 * @throws TranslationFailedException
+	 */
+	private static void findProBMappingFile(ISCTheoryRoot theory,
 			IPrologTermOutput pto) throws TranslationFailedException {
 		final String theoryName = theory.getComponentName();
 		final IPath path = new Path(theoryName + "."
@@ -128,7 +227,7 @@ public class Theories {
 	}
 
 	private static Collection<OperatorMapping> readMappingFile(IFile file,
-			IDeployedTheoryRoot theory) throws TranslationFailedException {
+			ISCTheoryRoot theory) throws TranslationFailedException {
 		try {
 			final InputStream input = file.getContents();
 			final String name = theory.getComponentName();
@@ -168,8 +267,8 @@ public class Theories {
 		pto.closeList();
 	}
 
-	private static void printDataTypes(IDeployedTheoryRoot theory,
-			IPrologTermOutput pto) throws RodinDBException {
+	private static void printDataTypes(ISCTheoryRoot theory,
+			IPrologTermOutput pto) throws CoreException {
 		final FormulaFactory ff = theory.getFormulaFactory();
 		pto.openList();
 		for (ISCDatatypeDefinition def : theory.getSCDatatypeDefinitions()) {
@@ -179,12 +278,12 @@ public class Theories {
 	}
 
 	private static void printDataType(ISCDatatypeDefinition def,
-			FormulaFactory ff, IPrologTermOutput pto) throws RodinDBException {
+			FormulaFactory ff, IPrologTermOutput pto) throws CoreException {
 		pto.openTerm("datatype");
 		pto.printAtom(def.getIdentifierString());
 		pto.openList();
 		for (ISCTypeArgument arg : def.getTypeArguments()) {
-			printType(arg.getSCGivenType(ff), ff, pto);
+			printType(arg.getSCGivenType(ff), pto);
 		}
 		pto.closeList();
 		pto.openList();
@@ -197,7 +296,7 @@ public class Theories {
 	}
 
 	private static void printConstructor(ISCDatatypeConstructor cons,
-			FormulaFactory ff, IPrologTermOutput pto) throws RodinDBException {
+			FormulaFactory ff, IPrologTermOutput pto) throws CoreException {
 		pto.openTerm("constructor");
 		pto.printAtom(cons.getIdentifierString());
 		pto.openList();
@@ -206,11 +305,10 @@ public class Theories {
 		}
 		pto.closeList();
 		pto.closeTerm();
-
 	}
 
-	private static void printOperatorDefs(IDeployedTheoryRoot theory,
-			IPrologTermOutput pto) throws RodinDBException {
+	private static void printOperatorDefs(ISCTheoryRoot theory,
+			IPrologTermOutput pto) throws CoreException {
 		pto.openList();
 		for (ISCNewOperatorDefinition opdef : theory
 				.getSCNewOperatorDefinitions()) {
@@ -220,17 +318,23 @@ public class Theories {
 	}
 
 	private static void printOperator(ISCNewOperatorDefinition opDef,
-			IDeployedTheoryRoot theory, IPrologTermOutput prologOutput)
-			throws RodinDBException {
+			ISCTheoryRoot theory, IPrologTermOutput prologOutput)
+			throws CoreException {
 
 		prologOutput.openTerm("operator");
 		prologOutput.printAtom(opDef.getLabel());
 
 		final FormulaFactory ff = theory.getFormulaFactory();
-		final ITypeEnvironment te = theory.getTypeEnvironment(ff);
+		final ITypeEnvironment teFromFF = theory.getTypeEnvironment(ff);
+
+		final ITypeEnvironmentBuilder te = ff.makeTypeEnvironment();
+		te.addAll(teFromFF);
 
 		// Arguments
 		printOperatorArguments(opDef.getOperatorArguments(), prologOutput, ff);
+		for (ISCOperatorArgument arg : opDef.getOperatorArguments()) {
+			te.add(arg.getIdentifier(ff));
+		}
 
 		// WD Condition
 		Predicate wdCondition = opDef.getWDCondition(ff, te);
@@ -247,21 +351,52 @@ public class Theories {
 		ISCRecursiveOperatorDefinition[] definitions = opDef
 				.getRecursiveOperatorDefinitions();
 		for (ISCRecursiveOperatorDefinition definition : definitions) {
+			final String indArg = definition.getInductiveArgument();
 			ISCRecursiveDefinitionCase[] recursiveDefinitionCases = definition
 					.getRecursiveDefinitionCases();
 			for (ISCRecursiveDefinitionCase c : recursiveDefinitionCases) {
-				Expression ex = c.getExpression(ff, te);
-				printExpression(prologOutput, ex);
+				printRecDefCase(indArg, prologOutput, ff, c);
 			}
 		}
 		prologOutput.closeList();
+		prologOutput.closeTerm();
+	}
+
+	private static void printRecDefCase(String indArg,
+			IPrologTermOutput prologOutput, final FormulaFactory ff,
+			ISCRecursiveDefinitionCase c) throws RodinDBException {
+		final String es = c.getExpressionString();
+		final IParseResult pr = ff.parseExpression(es, null);
+		final Expression ex = pr.getParsedExpression();
+
+		final String formulaAsString = c
+				.getAttributeValue(TheoryAttributes.FORMULA_ATTRIBUTE);
+		Formula<?> formula = TheoryElement.parseFormula(formulaAsString, ff,
+				false);
 
+		prologOutput.openTerm("case");
+		prologOutput.printAtom(indArg);
+		prologOutput.openList();
+		for (FreeIdentifier fi : ex.getFreeIdentifiers()) {
+			prologOutput.printAtom(fi.getName());
+		}
+		prologOutput.closeList();
+		printExpression(prologOutput, ex);
+		if (formula instanceof Predicate) {
+			printPredicate(prologOutput, (Predicate) formula);
+		} else if (formula instanceof Expression) {
+			printExpression(prologOutput, (Expression) formula);
+		} else {
+			throw new IllegalStateException("unexpected formula of type "
+					+ formula.getClass().getName()
+					+ " for recursive definition case in theory");
+		}
 		prologOutput.closeTerm();
 	}
 
 	private static void printOperatorArguments(ISCOperatorArgument[] arguments,
 			IPrologTermOutput prologOutput, final FormulaFactory ff)
-			throws RodinDBException {
+			throws CoreException {
 		prologOutput.openList();
 		for (ISCOperatorArgument argument : arguments) {
 			printTypedIdentifier("argument", argument, ff, prologOutput);
@@ -290,41 +425,34 @@ public class Theories {
 
 	private static void printTypedIdentifier(final String functor,
 			final ISCIdentifierElement id, final FormulaFactory ff,
-			final IPrologTermOutput pto) throws RodinDBException {
+			final IPrologTermOutput pto) throws CoreException {
 		pto.openTerm(functor);
 		pto.printAtom(id.getIdentifierString());
 		Type type = id.getType(ff);
-		printType(type, ff, pto);
+		printType(type, pto);
 		pto.closeTerm();
 	}
 
-	private static void printType(final Type type, final FormulaFactory ff,
-			final IPrologTermOutput pto) {
-		printExpression(pto, type.toExpression(ff));
+	private static void printType(final Type type, final IPrologTermOutput pto) {
+		printExpression(pto, type.toExpression());
 	}
 
 	private static void printExpression(IPrologTermOutput prologOutput,
-			Expression pp) {
-		ExpressionVisitor visitor = new ExpressionVisitor(
-				new LinkedList<String>());
-		pp.accept(visitor);
-		PExpression ex = visitor.getExpression();
-		ASTProlog pv = new ASTProlog(prologOutput, null);
-		ex.apply(pv);
+			Expression ee) {
+		final PExpression expr = TranslationVisitor.translateExpression(ee);
+		final ASTProlog pv = new ASTProlog(prologOutput, null);
+		expr.apply(pv);
 	}
 
 	private static void printPredicate(IPrologTermOutput prologOutput,
 			Predicate pp) {
-		PredicateVisitor visitor = new PredicateVisitor(
-				new LinkedList<String>());
-		pp.accept(visitor);
-		PPredicate predicate = visitor.getPredicate();
-		ASTProlog pv = new ASTProlog(prologOutput, null);
+		final PPredicate predicate = TranslationVisitor.translatePredicate(pp);
+		final ASTProlog pv = new ASTProlog(prologOutput, null);
 		predicate.apply(pv);
 	}
 
-	private static void printAxiomaticDefs(IDeployedTheoryRoot theory,
-			IPrologTermOutput pto) throws RodinDBException {
+	private static void printAxiomaticDefs(ISCTheoryRoot theory,
+			IPrologTermOutput pto) throws CoreException {
 		FormulaFactory ff = theory.getFormulaFactory();
 		ITypeEnvironment te = theory.getTypeEnvironment(ff);
 		pto.openList();
@@ -337,19 +465,19 @@ public class Theories {
 
 	private static void printAxiomaticDefBlock(
 			ISCAxiomaticDefinitionsBlock block, FormulaFactory ff,
-			ITypeEnvironment te, IPrologTermOutput pto) throws RodinDBException {
+			ITypeEnvironment te, IPrologTermOutput pto) throws CoreException {
 		pto.openTerm("axiomatic_def_block");
 		pto.printAtom(block.getLabel());
 		printIdentifiers(block.getAxiomaticTypeDefinitions(), pto);
 		printAxiomaticOperators(block.getAxiomaticOperatorDefinitions(), ff,
 				pto);
-		printAxioms(block.getAxiomaticDefinitionAxioms(), ff, te, pto);
+		printAxioms(block.getAxiomaticDefinitionAxioms(), te, pto);
 		pto.closeTerm();
 	}
 
 	private static void printAxiomaticOperators(
 			ISCAxiomaticOperatorDefinition[] axdefs, FormulaFactory ff,
-			IPrologTermOutput pto) throws RodinDBException {
+			IPrologTermOutput pto) throws CoreException {
 		pto.openList();
 		for (final ISCAxiomaticOperatorDefinition opdef : axdefs) {
 			pto.openTerm("opdef");
@@ -365,11 +493,10 @@ public class Theories {
 	}
 
 	private static void printAxioms(ISCAxiomaticDefinitionAxiom[] axioms,
-			FormulaFactory ff, ITypeEnvironment te, IPrologTermOutput pto)
-			throws RodinDBException {
+			ITypeEnvironment te, IPrologTermOutput pto) throws CoreException {
 		pto.openList();
 		for (ISCAxiomaticDefinitionAxiom axiom : axioms) {
-			printPredicate(pto, axiom.getPredicate(ff, te));
+			printPredicate(pto, axiom.getPredicate(te));
 		}
 		pto.closeList();
 	}
diff --git a/de.prob.core/src/de/prob/eventb/translator/flow/Event.java b/de.prob.core/src/de/prob/eventb/translator/flow/Event.java
index 0f96e1ff2cb5d164f910ee71cc4fac8069d11ed0..a57292a6f48e1f635d4aa63d2093f9d6297eb472 100644
--- a/de.prob.core/src/de/prob/eventb/translator/flow/Event.java
+++ b/de.prob.core/src/de/prob/eventb/translator/flow/Event.java
@@ -7,6 +7,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eventb.core.ISCAction;
 import org.eventb.core.ISCEvent;
 import org.eventb.core.ISCGuard;
@@ -18,6 +19,7 @@ import org.eventb.core.ast.BoundIdentDecl;
 import org.eventb.core.ast.FormulaFactory;
 import org.eventb.core.ast.FreeIdentifier;
 import org.eventb.core.ast.ITypeEnvironment;
+import org.eventb.core.ast.ITypeEnvironmentBuilder;
 import org.eventb.core.ast.Predicate;
 import org.eventb.core.ast.QuantifiedPredicate;
 import org.rodinp.core.RodinDBException;
@@ -46,7 +48,7 @@ public class Event {
 	}
 
 	private Event(final ISCEvent evt, final FlowAnalysis analysis)
-			throws RodinDBException {
+			throws CoreException {
 		this.analysis = analysis;
 		this.name = evt.getLabel();
 		this.localTypeEnv = generateLocalTypeEnvironment(evt, analysis);
@@ -72,29 +74,29 @@ public class Event {
 	}
 
 	private Predicate getGuard(final FlowAnalysis analysis, ISCEvent event)
-			throws RodinDBException {
+			throws CoreException {
 		ISCParameter[] parameters = event.getSCParameters();
 		ISCGuard[] guards = event.getSCGuards();
 
 		FormulaFactory factory = analysis.FF;
 
-		ITypeEnvironment typenv = factory.makeTypeEnvironment();
+		ITypeEnvironmentBuilder typenv = factory.makeTypeEnvironment();
 		typenv.addAll(analysis.getTypeEnvironment());
 		typenv.addAll(freeIdentifiers);
 
 		Predicate[] gPreds = new Predicate[guards.length];
 		for (int k = 0; k < guards.length; k++) {
-			gPreds[k] = guards[k].getPredicate(factory, typenv);
+			gPreds[k] = guards[k].getPredicate(typenv);
 		}
 
 		if (guards.length == 0)
 			return factory.makeLiteralPredicate(Predicate.BTRUE, null);
 		Predicate conjPred = guards.length == 1 ? gPreds[0] : factory
 				.makeAssociativePredicate(Predicate.LAND, gPreds, null);
-		Predicate predicate = parameters.length == 0 ? conjPred : factory
-				.makeQuantifiedPredicate(Predicate.EXISTS, boundIdentifiers,
-						conjPred.bindTheseIdents(
-								Arrays.asList(freeIdentifiers), factory), null);
+		Predicate predicate = parameters.length == 0 ? conjPred
+				: factory.makeQuantifiedPredicate(Predicate.EXISTS,
+						boundIdentifiers, conjPred.bindTheseIdents(Arrays
+								.asList(freeIdentifiers)), null);
 		return predicate;
 
 	}
@@ -104,10 +106,10 @@ public class Event {
 	}
 
 	private List<Assignment> getAssignments(final FlowAnalysis analysis,
-			final List<ISCAction> actions) throws RodinDBException {
+			final List<ISCAction> actions) throws CoreException {
 		List<Assignment> assignements = new ArrayList<Assignment>();
 		for (ISCAction action : actions) {
-			assignements.add(action.getAssignment(analysis.FF, localTypeEnv));
+			assignements.add(action.getAssignment(localTypeEnv));
 		}
 		return Collections.unmodifiableList(assignements);
 	}
@@ -158,17 +160,17 @@ public class Event {
 	}
 
 	private ITypeEnvironment generateLocalTypeEnvironment(final ISCEvent evt,
-			final FlowAnalysis analysis) throws RodinDBException {
+			final FlowAnalysis analysis) throws CoreException {
 		final ITypeEnvironment globalTypeEnvironment = analysis
 				.getTypeEnvironment();
-		final ITypeEnvironment typeEnvironment = evt.getTypeEnvironment(
-				globalTypeEnvironment, analysis.FF);
+		final ITypeEnvironmentBuilder typeEnvironment = evt
+				.getTypeEnvironment(globalTypeEnvironment);
 		typeEnvironment.addAll(globalTypeEnvironment);
 		return typeEnvironment;
 	}
 
 	public static Event create(final ISCEvent evt, final FlowAnalysis analysis)
-			throws RodinDBException {
+			throws CoreException {
 		Event event = new Event(evt, analysis);
 		return event;
 	}
@@ -183,7 +185,7 @@ public class Event {
 				// FIXME We need to deal with non deterministic assignments
 				// here
 			}
-			p = p.applyAssignments(deterministic, analysis.FF);
+			p = p.applyAssignments(deterministic);
 		}
 
 		return p;
diff --git a/de.prob.core/src/de/prob/eventb/translator/flow/FlowAnalysis.java b/de.prob.core/src/de/prob/eventb/translator/flow/FlowAnalysis.java
index 7ea22f902921913d4ab43b3c0e652dd2ecfa5396..1e78b1e8eafe39f951db3ca0bc81292a9e50a57b 100644
--- a/de.prob.core/src/de/prob/eventb/translator/flow/FlowAnalysis.java
+++ b/de.prob.core/src/de/prob/eventb/translator/flow/FlowAnalysis.java
@@ -4,11 +4,11 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eventb.core.ISCEvent;
 import org.eventb.core.ISCMachineRoot;
 import org.eventb.core.ISCVariable;
@@ -22,7 +22,7 @@ import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog;
 import de.be4.classicalb.core.parser.analysis.prolog.ClassicalPositionPrinter;
 import de.be4.classicalb.core.parser.analysis.prolog.NodeIdAssignment;
 import de.be4.classicalb.core.parser.node.PPredicate;
-import de.prob.eventb.translator.PredicateVisitor;
+import de.prob.eventb.translator.internal.TranslationVisitor;
 import de.prob.prolog.output.IPrologTermOutput;
 
 public class FlowAnalysis {
@@ -55,9 +55,8 @@ public class FlowAnalysis {
 			pout.printAtom(evt.toString());
 			pout.openList();
 			final Predicate predicate = evt.getGuardsAfterAssignment();
-			PredicateVisitor pv = new PredicateVisitor(new LinkedList<String>());
-			predicate.accept(pv);
-			PPredicate p = pv.getPredicate();
+			final PPredicate p = TranslationVisitor
+					.translatePredicate(predicate);
 			p.apply(prolog);
 			pout.closeList();
 			pout.closeTerm();
@@ -65,8 +64,8 @@ public class FlowAnalysis {
 
 	}
 
-	public FlowAnalysis(final ISCMachineRoot model) throws RodinDBException {
-		this.typeEnvironment = model.getTypeEnvironment(FF);
+	public FlowAnalysis(final ISCMachineRoot model) throws CoreException {
+		this.typeEnvironment = model.getTypeEnvironment();
 		this.identifiers = enumerateVariables(model.getSCVariables());
 		this.events = createEvents(model);
 		noEffect = new ArrayList<EventTuple>();
@@ -92,7 +91,7 @@ public class FlowAnalysis {
 	}
 
 	private ArrayList<Event> createEvents(final ISCMachineRoot model)
-			throws RodinDBException {
+			throws CoreException {
 		ISCEvent[] revents = model.getSCEvents();
 		final ArrayList<Event> arrayList = new ArrayList<Event>(revents.length);
 
@@ -112,7 +111,7 @@ public class FlowAnalysis {
 	}
 
 	private Map<FreeIdentifier, Integer> enumerateVariables(
-			final ISCVariable[] variables) throws RodinDBException {
+			final ISCVariable[] variables) throws CoreException {
 		Map<FreeIdentifier, Integer> varNumber = new HashMap<FreeIdentifier, Integer>();
 		int count = 0;
 		for (ISCVariable variable : variables) {
diff --git a/de.prob.core/src/de/prob/eventb/translator/flow/WeakestPrecondition.java b/de.prob.core/src/de/prob/eventb/translator/flow/WeakestPrecondition.java
index 2f5ccfda4539ad374e4145cd6dbd5770b3ce0cdb..c24b6ca59b3df23b6c9b2506e4665335e9a96232 100644
--- a/de.prob.core/src/de/prob/eventb/translator/flow/WeakestPrecondition.java
+++ b/de.prob.core/src/de/prob/eventb/translator/flow/WeakestPrecondition.java
@@ -1,14 +1,12 @@
 package de.prob.eventb.translator.flow;
 
-import java.util.LinkedList;
-
 import org.eventb.core.ast.Predicate;
 
 import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog;
 import de.be4.classicalb.core.parser.analysis.prolog.ClassicalPositionPrinter;
 import de.be4.classicalb.core.parser.analysis.prolog.NodeIdAssignment;
 import de.be4.classicalb.core.parser.node.PPredicate;
-import de.prob.eventb.translator.PredicateVisitor;
+import de.prob.eventb.translator.internal.TranslationVisitor;
 import de.prob.prolog.output.IPrologTermOutput;
 
 public class WeakestPrecondition {
@@ -48,9 +46,7 @@ public class WeakestPrecondition {
 		pout.openList();
 		// pout.openTerm("entry");
 		// pout.printAtom(ReverseTranslate.reverseTranslate(p.toString()));
-		PredicateVisitor pv = new PredicateVisitor(new LinkedList<String>());
-		wps.accept(pv);
-		PPredicate predicate = pv.getPredicate();
+		final PPredicate predicate = TranslationVisitor.translatePredicate(wps);
 		predicate.apply(prolog);
 		// pout.closeTerm();
 		pout.closeList();
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 075270d4ae253ae3aef71dafd9d877e1ee61a433..6cbc80eaffc419411953c78268c16623fe6ee4e4 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
@@ -9,11 +9,11 @@ package de.prob.eventb.translator.internal;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eventb.core.ISCContext;
 import org.eventb.core.ISCContextRoot;
 import org.eventb.core.ISCExtendsContext;
 import org.eventb.core.ISCInternalContext;
-import org.rodinp.core.RodinDBException;
 
 import de.prob.core.translator.TranslationFailedException;
 import de.prob.eventb.translator.ContextTranslator;
@@ -77,7 +77,7 @@ public final class EventBContextTranslator extends EventBTranslator {
 							.getAbstractSCContext();
 					collectContexts(translatorMap, processed, element);
 				}
-			} catch (RodinDBException e) {
+			} catch (CoreException e) {
 				throw new TranslationFailedException(e);
 			}
 		}
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 845e660ebefc838aed2ec001cf513234c114e16e..8995a4a1ba8ebbeed8ab72e95081bd2d9bc4f763 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
@@ -9,12 +9,12 @@ package de.prob.eventb.translator.internal;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.core.runtime.CoreException;
 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;
 
 import de.prob.core.translator.TranslationFailedException;
 import de.prob.eventb.translator.ContextTranslator;
@@ -75,14 +75,14 @@ public final class EventBMachineTranslator extends EventBTranslator {
 
 		try {
 			buildRefinementChain(machine, roots);
-		} catch (RodinDBException e) {
+		} catch (CoreException e) {
 			throw new TranslationFailedException(e);
 		}
 		return roots;
 	}
 
 	private void buildRefinementChain(final ISCMachineRoot element,
-			final List<ISCMachineRoot> list) throws RodinDBException {
+			final List<ISCMachineRoot> list) throws CoreException {
 		list.add(element);
 		IRodinFile[] abst = element.getAbstractSCMachines();
 		for (IRodinFile rodinFile : abst) {
@@ -108,12 +108,12 @@ public final class EventBMachineTranslator extends EventBTranslator {
 		for (final ISCMachineRoot m : models) {
 			try {
 				final FormulaFactory ff = m.getFormulaFactory();
-				final ITypeEnvironment te = m.getTypeEnvironment(ff);
+				final ITypeEnvironment te = m.getTypeEnvironment();
 				final ISCInternalContext[] seenContexts = m.getSCSeenContexts();
 				for (final ISCInternalContext seenContext : seenContexts) {
 					collectContexts(translators, processed, seenContext, ff, te);
 				}
-			} catch (RodinDBException e) {
+			} catch (CoreException e) {
 				throw new TranslationFailedException(e);
 			}
 		}
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 f92eb90882e451f467ead544691c747ac0a24930..64c57fcf6570831e02039809b3f492a46409d175 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
@@ -16,6 +16,9 @@ import org.eventb.core.IEventBRoot;
 import org.eventb.core.ISCInternalContext;
 import org.eventb.core.ISCMachineRoot;
 import org.rodinp.core.IInternalElement;
+import org.rodinp.core.IRodinElement;
+import org.rodinp.core.IRodinFile;
+import org.rodinp.core.RodinDBException;
 
 import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog;
 import de.be4.classicalb.core.parser.node.Node;
@@ -28,7 +31,6 @@ import de.prob.prolog.output.IPrologTermOutput;
 
 public abstract class EventBTranslator implements ITranslator {
 	protected final IEventBProject project;
-	private boolean theoryIsUsed;
 
 	protected EventBTranslator(final IEventBRoot root) {
 		this.project = root.getEventBProject();
@@ -58,7 +60,6 @@ public abstract class EventBTranslator implements ITranslator {
 		Collection<Node> nodes = new ArrayList<Node>();
 		for (final AbstractComponentTranslator translator : refinementChainTranslators) {
 			nodes.add(translator.getAST());
-			theoryIsUsed |= translator.isTheoryUsed();
 		}
 		return nodes;
 	}
@@ -140,10 +141,10 @@ public abstract class EventBTranslator implements ITranslator {
 			final Collection<? extends AbstractComponentTranslator> refinementChainTranslators,
 			final Collection<? extends AbstractComponentTranslator> contextTranslators,
 			final IPrologTermOutput pout) throws TranslationFailedException {
-		theoryIsUsed = false;
 		Collection<Node> machineNodes = translateModels(refinementChainTranslators);
 		Collection<Node> contextNodes = translateModels(contextTranslators);
 
+		final boolean theoryIsUsed = areTheoriesAreUsed();
 		if (theoryIsUsed) {
 			checkIfTheoriesAvailable();
 		}
@@ -174,6 +175,25 @@ public abstract class EventBTranslator implements ITranslator {
 		pout.closeTerm();
 	}
 
+	private boolean areTheoriesAreUsed() throws TranslationFailedException {
+		try {
+			final IRodinElement[] elements;
+			elements = project.getRodinProject().getChildren();
+			for (IRodinElement element : elements) {
+				if (element instanceof IRodinFile) {
+					IRodinFile file = (IRodinFile) element;
+					final String id = file.getRootElementType().getId();
+					if (id.startsWith("org.eventb.theory.core")) {
+						return true;
+					}
+				}
+			}
+			return false;
+		} catch (RodinDBException e) {
+			throw new TranslationFailedException(e);
+		}
+	}
+
 	private void checkIfTheoriesAvailable() throws TranslationFailedException {
 		try {
 			Theories.touch();
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 eba944992a1f6904beb9969790fd3e679cb9eed2..b25225cfb42ef06fe6b10d5109facf48edd1e5be 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
@@ -13,6 +13,7 @@ import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
+import org.eclipse.core.runtime.CoreException;
 import org.eventb.core.IConvergenceElement.Convergence;
 import org.eventb.core.ILabeledElement;
 import org.eventb.core.IMachineRoot;
@@ -34,14 +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.IVariant;
+import org.eventb.core.ast.Assignment;
 import org.eventb.core.ast.FormulaFactory;
 import org.eventb.core.ast.ITypeEnvironment;
+import org.eventb.core.ast.ITypeEnvironmentBuilder;
 import org.eventb.core.basis.Event;
 import org.eventb.core.basis.Guard;
 import org.eventb.core.seqprover.IConfidence;
 import org.rodinp.core.IElementType;
 import org.rodinp.core.IRodinElement;
-import org.rodinp.core.IRodinFile;
 import org.rodinp.core.RodinDBException;
 
 import de.be4.classicalb.core.parser.node.AAnticipatedEventstatus;
@@ -69,7 +72,6 @@ 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.eventb.translator.AbstractComponentTranslator;
-import de.prob.eventb.translator.AssignmentVisitor;
 import de.prob.logging.Logger;
 
 public class ModelTranslator extends AbstractComponentTranslator {
@@ -94,8 +96,8 @@ public class ModelTranslator extends AbstractComponentTranslator {
 		ModelTranslator modelTranslator = new ModelTranslator(model);
 		try {
 			modelTranslator.translate();
-		} catch (RodinDBException re) {
-			final String message = "Rodin Database Exception: \n"
+		} catch (CoreException re) {
+			final String message = "Rodin Database Exception / Core Exception: \n"
 					+ re.getLocalizedMessage();
 			throw new TranslationFailedException(modelTranslator.getClass()
 					.toString(), message);
@@ -139,16 +141,15 @@ public class ModelTranslator extends AbstractComponentTranslator {
 		origin = machine.getMachineRoot();
 		ff = machine.getFormulaFactory();
 		try {
-			te = machine.getTypeEnvironment(ff);
-		} catch (RodinDBException e) {
+			te = machine.getTypeEnvironment();
+		} catch (CoreException e) {
 			final String message = "A Rodin exception occured during translation process. Original Exception: ";
 			throw new TranslationFailedException(machine.getComponentName(),
 					message + e.getLocalizedMessage());
 		}
 	}
 
-	private void translate() throws RodinDBException,
-			TranslationFailedException {
+	private void translate() throws CoreException, TranslationFailedException {
 
 		final String message = "machine.getRodinFile().isConsistent() [Note: Maybe you can fix this Rodin problem by refreshing and rebuilding the project]";
 		Logger.assertProB(message, machine.getRodinFile().isConsistent());
@@ -170,55 +171,68 @@ public class ModelTranslator extends AbstractComponentTranslator {
 		addUnitPragmas(machine.getSCVariables());
 	}
 
-	private void collectProofInfo() throws RodinDBException {
-
-		IPSRoot proofStatus = machine.getPSRoot();
-		IPSStatus[] statuses = proofStatus.getStatuses();
-
+	private void collectProofInfo() {
 		List<String> bugs = new LinkedList<String>();
+		try {
+			IPSRoot proofStatus = machine.getPSRoot();
+			IPSStatus[] statuses = proofStatus.getStatuses();
+
+			for (IPSStatus status : statuses) {
+				final int confidence = status.getConfidence();
+				boolean broken = status.isBroken();
+
+				EProofStatus pstatus = EProofStatus.UNPROVEN;
+
+				if (!broken
+						&& (confidence > IConfidence.PENDING && confidence <= IConfidence.REVIEWED_MAX))
+					pstatus = EProofStatus.REVIEWED;
+				if (!broken && confidence == IConfidence.DISCHARGED_MAX)
+					pstatus = EProofStatus.PROVEN;
+
+				IPOSequent sequent = status.getPOSequent();
+				IPOSource[] sources = sequent.getSources();
+
+				String name = sequent.getDescription();
+
+				ArrayList<SequentSource> s = new ArrayList<SequentSource>(
+						sources.length);
+				for (IPOSource source : sources) {
+
+					IRodinElement srcElement = source.getSource();
+					if (!srcElement.exists()
+							|| (!(srcElement instanceof ILabeledElement) && !(srcElement instanceof IVariant))) {
+						bugs.add(status.getElementName());
+						break;
+					}
+
+					if (srcElement instanceof ILabeledElement) {
+						ILabeledElement le = (ILabeledElement) srcElement;
+						IElementType<? extends IRodinElement> type = srcElement
+								.getElementType();
+						s.add(new SequentSource(type, le.getLabel()));
+					} else if (srcElement instanceof IVariant) {
+						/*
+						 * Variants are not ILabeledElements, hence we need to
+						 * find another "label"
+						 */
+						IElementType<? extends IRodinElement> type = srcElement
+								.getElementType();
+						s.add(new SequentSource(type, machine
+								.getComponentName()));
+					}
+
+					if (srcElement instanceof Guard) {
+						Event srcEvent = (Event) srcElement.getParent();
+						String srvEventName = srcEvent.getLabel();
+						s.add(new SequentSource(srcEvent.getElementType(),
+								srvEventName));
+					}
 
-		for (IPSStatus status : statuses) {
-			final int confidence = status.getConfidence();
-			boolean broken = status.isBroken();
-
-			EProofStatus pstatus = EProofStatus.UNPROVEN;
-
-			if (!broken
-					&& (confidence > IConfidence.PENDING && confidence <= IConfidence.REVIEWED_MAX))
-				pstatus = EProofStatus.REVIEWED;
-			if (!broken && confidence == IConfidence.DISCHARGED_MAX)
-				pstatus = EProofStatus.PROVEN;
-
-			IPOSequent sequent = status.getPOSequent();
-			IPOSource[] sources = sequent.getSources();
-
-			String name = sequent.getDescription();
-
-			ArrayList<SequentSource> s = new ArrayList<SequentSource>(
-					sources.length);
-			for (IPOSource source : sources) {
-
-				IRodinElement srcElement = source.getSource();
-				if (!srcElement.exists()
-						|| !(srcElement instanceof ILabeledElement)) {
-					bugs.add(status.getElementName());
-					break;
-				}
-
-				ILabeledElement le = (ILabeledElement) srcElement;
-				IElementType<? extends IRodinElement> type = srcElement
-						.getElementType();
-				s.add(new SequentSource(type, le.getLabel()));
-
-				if (srcElement instanceof Guard) {
-					Event srcEvent = (Event) srcElement.getParent();
-					String srvEventName = srcEvent.getLabel();
-					s.add(new SequentSource(srcEvent.getElementType(),
-							srvEventName));
 				}
-
+				addProof(new ProofObligation(origin, s, name, pstatus));
 			}
-			addProof(new ProofObligation(origin, s, name, pstatus));
+		} catch (Exception e) {
+			bugs.add(e.getLocalizedMessage());
 		}
 
 		if (!bugs.isEmpty()) {
@@ -229,7 +243,7 @@ public class ModelTranslator extends AbstractComponentTranslator {
 
 	}
 
-	private void translateMachine() throws RodinDBException,
+	private void translateMachine() throws CoreException,
 			TranslationFailedException {
 		model.setName(new TIdentifierLiteral(machine.getRodinFile()
 				.getBareName()));
@@ -253,7 +267,7 @@ public class ModelTranslator extends AbstractComponentTranslator {
 		model.setModelClauses(clauses);
 	}
 
-	private AVariantModelClause processVariant() throws RodinDBException,
+	private AVariantModelClause processVariant() throws CoreException,
 			TranslationFailedException {
 		final ISCVariant[] variant = machine.getSCVariants();
 		final AVariantModelClause var;
@@ -270,7 +284,7 @@ public class ModelTranslator extends AbstractComponentTranslator {
 		return var;
 	}
 
-	private ARefinesModelClause processRefines() throws RodinDBException,
+	private ARefinesModelClause processRefines() throws CoreException,
 			TranslationFailedException {
 		final ISCRefinesMachine[] refinesClauses = machine
 				.getSCRefinesClauses();
@@ -303,7 +317,7 @@ public class ModelTranslator extends AbstractComponentTranslator {
 	}
 
 	private AEventsModelClause processEvents()
-			throws TranslationFailedException, RodinDBException {
+			throws TranslationFailedException, CoreException {
 		final AEventsModelClause clause = new AEventsModelClause();
 		final ISCEvent[] events = machine.getSCEvents();
 		final List<PEvent> eventsList = new ArrayList<PEvent>(events.length);
@@ -311,13 +325,13 @@ public class ModelTranslator extends AbstractComponentTranslator {
 
 			broken = broken || !revent.isAccurate();
 
-			ITypeEnvironment localEnv = revent.getTypeEnvironment(te, ff);
+			ITypeEnvironmentBuilder localEnv = revent.getTypeEnvironment(te);
 			localEnv.addAll(te);
 
 			ISCVariable[] variables = machine.getSCVariables();
 			for (ISCVariable variable : variables) {
 				if (variable.isAbstract() || variable.isConcrete()) {
-					localEnv.add(variable.getIdentifier(ff).withPrime(ff));
+					localEnv.add(variable.getIdentifier(ff).withPrime());
 				}
 			}
 
@@ -344,7 +358,7 @@ public class ModelTranslator extends AbstractComponentTranslator {
 	}
 
 	private PEventstatus extractEventStatus(final ISCEvent revent)
-			throws TranslationFailedException, RodinDBException {
+			throws TranslationFailedException, CoreException {
 		Convergence convergence = revent.getConvergence();
 		PEventstatus status;
 		switch (convergence) {
@@ -365,7 +379,7 @@ public class ModelTranslator extends AbstractComponentTranslator {
 	}
 
 	private List<TIdentifierLiteral> extractRefinedEvents(final ISCEvent revent)
-			throws RodinDBException {
+			throws CoreException {
 		final ISCRefinesEvent[] refinesClauses = revent.getSCRefinesClauses();
 		final List<TIdentifierLiteral> refines = new ArrayList<TIdentifierLiteral>(
 				refinesClauses.length);
@@ -393,7 +407,7 @@ public class ModelTranslator extends AbstractComponentTranslator {
 
 	private void extractGuards(final ISCEvent revent,
 			final ITypeEnvironment localEnv, final List<PPredicate> guardsList,
-			final List<PPredicate> theoremsList) throws RodinDBException {
+			final List<PPredicate> theoremsList) throws CoreException {
 		final ISCGuard[] guards = revent.getSCGuards();
 		for (final ISCGuard guard : guards) {
 			final PPredicate predicate = translatePredicate(ff, localEnv, guard);
@@ -426,7 +440,7 @@ public class ModelTranslator extends AbstractComponentTranslator {
 	}
 
 	private List<PWitness> extractWitnesses(final ISCEvent revent,
-			final ITypeEnvironment localEnv) throws RodinDBException {
+			final ITypeEnvironment localEnv) throws CoreException {
 		final ISCWitness[] witnesses = revent.getSCWitnesses();
 		final List<PWitness> witnessList = new ArrayList<PWitness>(
 				witnesses.length);
@@ -442,27 +456,29 @@ public class ModelTranslator extends AbstractComponentTranslator {
 	}
 
 	private List<PSubstitution> extractActions(final ISCEvent revent,
-			final ITypeEnvironment localEnv) throws RodinDBException {
+			final ITypeEnvironment localEnv) throws CoreException {
 		final ISCAction[] actions = revent.getSCActions();
 		final List<PSubstitution> actionList = new ArrayList<PSubstitution>();
 		for (final ISCAction action : actions) {
-			final AssignmentVisitor visitor = new AssignmentVisitor();
-			action.getAssignment(ff, localEnv).accept(visitor);
-			final PSubstitution substitution = visitor.getSubstitution();
+			final Assignment assignment = action.getAssignment(localEnv);
+			final PSubstitution substitution = TranslationVisitor
+					.translateAssignment(assignment);
 			actionList.add(substitution);
 			labelMapping.put(substitution, action);
 		}
 		return actionList;
 	}
 
-	private AInvariantModelClause processInvariants() throws RodinDBException {
+	private AInvariantModelClause processInvariants() throws CoreException,
+			TranslationFailedException {
 		final AInvariantModelClause invariantModelClause = new AInvariantModelClause();
 		invariantModelClause.setPredicates(getPredicateList(
 				machine.getSCInvariants(), false));
 		return invariantModelClause;
 	}
 
-	private ATheoremsModelClause processTheorems() throws RodinDBException {
+	private ATheoremsModelClause processTheorems() throws CoreException,
+			TranslationFailedException {
 		final ATheoremsModelClause theoremsModelClause = new ATheoremsModelClause();
 		theoremsModelClause.setPredicates(getPredicateList(
 				machine.getSCInvariants(), true));
@@ -482,9 +498,11 @@ public class ModelTranslator extends AbstractComponentTranslator {
 	 *            false, if all theorems shall be filtered out
 	 * @return
 	 * @throws RodinDBException
+	 * @throws TranslationFailedException
 	 */
 	private List<PPredicate> getPredicateList(final ISCInvariant[] predicates,
-			final boolean theorems) throws RodinDBException {
+			final boolean theorems) throws CoreException,
+			TranslationFailedException {
 		final List<PPredicate> list = new ArrayList<PPredicate>(
 				predicates.length);
 		for (final ISCInvariant evPredicate : predicates) {
@@ -494,7 +512,7 @@ public class ModelTranslator extends AbstractComponentTranslator {
 			}
 			// only use predicates that are defined in the current refinement
 			// level, not in an abstract machine
-			if (!isDefinedInAbstraction(evPredicate)) {
+			if (isDefinedHere(evPredicate)) {
 				final PPredicate predicate = translatePredicate(ff, te,
 						evPredicate);
 				list.add(predicate);
@@ -504,28 +522,19 @@ public class ModelTranslator extends AbstractComponentTranslator {
 		return list;
 	}
 
-	private boolean isDefinedInAbstraction(final ITraceableElement element)
-			throws RodinDBException {
+	private boolean isDefinedHere(final ITraceableElement element)
+			throws CoreException, TranslationFailedException {
 		final IRodinElement parentsource = element.getSource().getParent();
 		final boolean result;
+		final String currentName = machine.getComponentName();
 
 		if (parentsource instanceof IMachineRoot) {
-			IMachineRoot src = (IMachineRoot) parentsource;
-
-			// do a finer level check
-			String srcName = src.getRodinFile().getBareName();
-
-			// is the source one of the refined machines?
-			for (IRodinFile abstr : machine.getAbstractSCMachines())
-				if (abstr.getBareName().equals(srcName))
-					return true;
-
-			result = false;
-
-			// result = !machine.getRodinFile().getBareName()
-			// .equals(src.getRodinFile().getBareName());
+			final IMachineRoot src = (IMachineRoot) parentsource;
+			final String srcName = src.getRodinFile().getBareName();
+			result = currentName.equals(srcName);
 		} else {
-			result = false;
+			throw new TranslationFailedException("Machine " + currentName,
+					"Source of invariant is not a machine");
 		}
 		return result;
 	}
diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/SimpleVisitorAdapter.java b/de.prob.core/src/de/prob/eventb/translator/internal/SimpleVisitorAdapter.java
deleted file mode 100644
index b6b186285f102b1336e76d5686360313ec31dfef..0000000000000000000000000000000000000000
--- a/de.prob.core/src/de/prob/eventb/translator/internal/SimpleVisitorAdapter.java
+++ /dev/null
@@ -1,157 +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.prob.eventb.translator.internal;
-
-import org.eventb.core.ast.AssociativeExpression;
-import org.eventb.core.ast.AssociativePredicate;
-import org.eventb.core.ast.AtomicExpression;
-import org.eventb.core.ast.BecomesEqualTo;
-import org.eventb.core.ast.BecomesMemberOf;
-import org.eventb.core.ast.BecomesSuchThat;
-import org.eventb.core.ast.BinaryExpression;
-import org.eventb.core.ast.BinaryPredicate;
-import org.eventb.core.ast.BoolExpression;
-import org.eventb.core.ast.BoundIdentDecl;
-import org.eventb.core.ast.BoundIdentifier;
-import org.eventb.core.ast.ExtendedExpression;
-import org.eventb.core.ast.ExtendedPredicate;
-import org.eventb.core.ast.FreeIdentifier;
-import org.eventb.core.ast.ISimpleVisitor;
-import org.eventb.core.ast.IntegerLiteral;
-import org.eventb.core.ast.LiteralPredicate;
-import org.eventb.core.ast.MultiplePredicate;
-import org.eventb.core.ast.QuantifiedExpression;
-import org.eventb.core.ast.QuantifiedPredicate;
-import org.eventb.core.ast.RelationalPredicate;
-import org.eventb.core.ast.SetExtension;
-import org.eventb.core.ast.SimplePredicate;
-import org.eventb.core.ast.UnaryExpression;
-import org.eventb.core.ast.UnaryPredicate;
-
-public class SimpleVisitorAdapter implements ISimpleVisitor {
-
-	public void visitAssociativeExpression(
-			final AssociativeExpression expression) {
-		// Default implementation does nothing
-	}
-
-	public void visitAssociativePredicate(final AssociativePredicate predicate) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitAtomicExpression(final AtomicExpression expression) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitBecomesEqualTo(final BecomesEqualTo assignment) {
-
-		// Default implementation does nothing
-	}
-
-	public void visitBecomesMemberOf(final BecomesMemberOf assignment) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitBecomesSuchThat(final BecomesSuchThat assignment) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitBinaryExpression(final BinaryExpression expression) {
-
-		// Default implementation does nothing
-	}
-
-	public void visitBinaryPredicate(final BinaryPredicate predicate) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitBoolExpression(final BoolExpression expression) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitBoundIdentDecl(final BoundIdentDecl boundIdentDecl) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitBoundIdentifier(final BoundIdentifier identifierExpression) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitFreeIdentifier(final FreeIdentifier identifierExpression) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitIntegerLiteral(final IntegerLiteral expression) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitLiteralPredicate(final LiteralPredicate predicate) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitQuantifiedExpression(final QuantifiedExpression expression) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitQuantifiedPredicate(final QuantifiedPredicate predicate) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitRelationalPredicate(final RelationalPredicate predicate) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitSetExtension(final SetExtension expression) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitSimplePredicate(final SimplePredicate predicate) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitUnaryExpression(final UnaryExpression expression) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitUnaryPredicate(final UnaryPredicate predicate) {
-		// Default implementation does nothing
-
-	}
-
-	public void visitMultiplePredicate(final MultiplePredicate predicate) {
-		// Default implementation does nothing
-
-	}
-
-	@Override
-	public void visitExtendedExpression(final ExtendedExpression expression) {
-		// Default implementation does nothing
-	}
-
-	@Override
-	public void visitExtendedPredicate(final ExtendedPredicate predicate) {
-		// Default implementation does nothing
-	}
-
-}
diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/TranslationVisitor.java b/de.prob.core/src/de/prob/eventb/translator/internal/TranslationVisitor.java
index e1a9a5c336cf370ea6a15b8acfe33332e90bdea5..36eb4f7f411da20884885b4a7ce911fcf419c96e 100644
--- a/de.prob.core/src/de/prob/eventb/translator/internal/TranslationVisitor.java
+++ b/de.prob.core/src/de/prob/eventb/translator/internal/TranslationVisitor.java
@@ -8,8 +8,10 @@ package de.prob.eventb.translator.internal;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
+import org.eventb.core.ast.Assignment;
 import org.eventb.core.ast.AssociativeExpression;
 import org.eventb.core.ast.AssociativePredicate;
 import org.eventb.core.ast.AtomicExpression;
@@ -19,6 +21,7 @@ import org.eventb.core.ast.BecomesSuchThat;
 import org.eventb.core.ast.BinaryExpression;
 import org.eventb.core.ast.BinaryPredicate;
 import org.eventb.core.ast.BoolExpression;
+import org.eventb.core.ast.BooleanType;
 import org.eventb.core.ast.BoundIdentDecl;
 import org.eventb.core.ast.BoundIdentifier;
 import org.eventb.core.ast.Expression;
@@ -26,31 +29,46 @@ import org.eventb.core.ast.ExtendedExpression;
 import org.eventb.core.ast.ExtendedPredicate;
 import org.eventb.core.ast.Formula;
 import org.eventb.core.ast.FreeIdentifier;
+import org.eventb.core.ast.GivenType;
 import org.eventb.core.ast.ISimpleVisitor;
 import org.eventb.core.ast.IntegerLiteral;
+import org.eventb.core.ast.IntegerType;
 import org.eventb.core.ast.LiteralPredicate;
 import org.eventb.core.ast.MultiplePredicate;
+import org.eventb.core.ast.ParametricType;
+import org.eventb.core.ast.PowerSetType;
 import org.eventb.core.ast.Predicate;
+import org.eventb.core.ast.ProductType;
 import org.eventb.core.ast.QuantifiedExpression;
 import org.eventb.core.ast.QuantifiedPredicate;
 import org.eventb.core.ast.RelationalPredicate;
 import org.eventb.core.ast.SetExtension;
 import org.eventb.core.ast.SimplePredicate;
+import org.eventb.core.ast.Type;
 import org.eventb.core.ast.UnaryExpression;
 import org.eventb.core.ast.UnaryPredicate;
+import org.eventb.core.ast.extension.IExpressionExtension;
 
 import de.be4.classicalb.core.parser.node.*;
 
+/**
+ * This visitor on an Event-B AST generates an AST in ProB's format.
+ * 
+ * @author plagge
+ */
 public class TranslationVisitor implements ISimpleVisitor {
 	private static final String UNCOVERED_PREDICATE = "Uncovered Predicate";
 
-	private LookupStack<PPredicate> predicates = new LookupStack<PPredicate>();
-	private LookupStack<PExpression> expressions = new LookupStack<PExpression>();
-	private LookupStack<PSubstitution> substitutions = new LookupStack<PSubstitution>();
-	private LookupStack<String> boundVariables = new LookupStack<String>();
+	private static final int[] EXTRA_TYPE_CONSTRUCTS = new int[] {
+			Formula.EMPTYSET, Formula.KPRJ1_GEN, Formula.KPRJ2_GEN,
+			Formula.KID_GEN };
 
-	private boolean usesTheories = false;
+	private final LookupStack<PPredicate> predicates = new LookupStack<PPredicate>();
+	private final LookupStack<PExpression> expressions = new LookupStack<PExpression>();
+	private final LookupStack<PSubstitution> substitutions = new LookupStack<PSubstitution>();
+	private final LookupStack<String> boundVariables = new LookupStack<String>();
 
+	@Override
 	public void visitAssociativeExpression(
 			final AssociativeExpression expression) {
 		// BUNION, BINTER, BCOMP, FCOMP, OVR, PLUS, MUL
@@ -81,7 +99,100 @@ public class TranslationVisitor implements ISimpleVisitor {
 		default:
 			throw new AssertionError(UNCOVERED_PREDICATE);
 		}
-		expressions.push(result);
+		pushExpression(expression, result);
+	}
+
+	/**
+	 * Push an expression on the stack. The original (not translated) expression
+	 * is needed to check whether the expression should wrapped by a typeof(...)
+	 * operator.
+	 * 
+	 * @param original
+	 * @param translated
+	 */
+	private void pushExpression(Expression original, PExpression translated) {
+		final PExpression toPush;
+		if (original.getType() != null && shouldHaveExtraTypeInfo(original)) {
+			toPush = new ATypeofExpression(translated,
+					translateType(original.getType()));
+		} else {
+			toPush = translated;
+		}
+		expressions.push(toPush);
+	}
+
+	/**
+	 * Check if this expression needs additional type information in the
+	 * translation. This can be the e.g. case for {} or id
+	 * 
+	 * @see #EXTRA_TYPE_CONSTRUCTS
+	 * @param original
+	 * @return <code>true</code> if the
+	 */
+	private boolean shouldHaveExtraTypeInfo(Expression original) {
+		if (original instanceof ExtendedExpression) {
+			// We always wrap extended expressions
+			return true;
+		} else {
+			// Look into the list of constructs that need type information.
+			// A linear search shouldn't be problematic (or is maybe the fastest
+			// solution) because there are only a few elements.
+			int tag = original.getTag();
+			for (int i = 0; i < EXTRA_TYPE_CONSTRUCTS.length; i++) {
+				if (EXTRA_TYPE_CONSTRUCTS[i] == tag)
+					return true;
+			}
+			return false;
+		}
+	}
+
+	/**
+	 * Translate a Event-B type to a corresponding ProB AST.
+	 * 
+	 * This could theoretically directly be done by using
+	 * {@link Type#toExpression(org.eventb.core.ast.FormulaFactory)} and
+	 * translating that expression, but then we would need a formula factory.
+	 * 
+	 * @param type
+	 *            the type to translate, never <code>null</code>
+	 * @return the translated expression, never <code>null</code>
+	 * @throws AssertionError
+	 *             if a type is encountered that cannot be translated
+	 */
+	private PExpression translateType(Type type) {
+		final PExpression result;
+		if (type instanceof BooleanType) {
+			result = new ABoolSetExpression();
+		} else if (type instanceof GivenType) {
+			final String name = ((GivenType) type).getName();
+			result = createIdentifierExpression(name);
+		} else if (type instanceof IntegerType) {
+			result = new AIntegerSetExpression();
+		} else if (type instanceof PowerSetType) {
+			final Type a = ((PowerSetType) type).getBaseType();
+			result = new APowSubsetExpression(translateType(a));
+		} else if (type instanceof ProductType) {
+			final Type a = ((ProductType) type).getLeft();
+			final Type b = ((ProductType) type).getRight();
+			result = new ACartesianProductExpression(translateType(a),
+					translateType(b));
+		} else if (type instanceof ParametricType) {
+			final ParametricType pt = (ParametricType) type;
+			final IExpressionExtension ext = pt.getExprExtension();
+			final Type[] params = pt.getTypeParameters();
+			final List<PExpression> list = new ArrayList<PExpression>();
+			for (final Type param : params) {
+				list.add(translateType(param));
+			}
+			result = new AExtendedExprExpression(new TIdentifierLiteral(
+					ext.getSyntaxSymbol()), list,
+					Collections.<PPredicate> emptyList());
+		} else {
+			throw new AssertionError(
+					"Don't know how to handle the Event-B type of class "
+							+ type.getClass().getCanonicalName());
+		}
+		return result;
 	}
 
 	private PExpression recurseFCOMP(final List<PExpression> list) {
@@ -126,6 +237,7 @@ public class TranslationVisitor implements ISimpleVisitor {
 		return new ARingExpression(list.get(0), right);
 	}
 
+	@Override
 	public void visitAssociativePredicate(final AssociativePredicate predicate) {
 		List<PPredicate> children = getSubPredicates(predicate.getChildren());
 		final PPredicate result;
@@ -163,6 +275,7 @@ public class TranslationVisitor implements ISimpleVisitor {
 		return new AEquivalencePredicate(list.get(0), right);
 	}
 
+	@Override
 	public void visitAtomicExpression(final AtomicExpression expression) {
 		final PExpression result;
 		switch (expression.getTag()) {
@@ -205,9 +318,10 @@ public class TranslationVisitor implements ISimpleVisitor {
 		default:
 			throw new AssertionError("Uncovered Expression " + expression);
 		}
-		expressions.push(result);
+		pushExpression(expression, result);
 	}
 
+	@Override
 	public void visitBecomesEqualTo(final BecomesEqualTo assignment) {
 		final List<PExpression> lhs = getSubExpressions(assignment
 				.getAssignedIdentifiers());
@@ -216,6 +330,7 @@ public class TranslationVisitor implements ISimpleVisitor {
 		substitutions.push(new AAssignSubstitution(lhs, rhs));
 	}
 
+	@Override
 	public void visitBecomesMemberOf(final BecomesMemberOf assignment) {
 		final List<PExpression> lhs = getSubExpressions(assignment
 				.getAssignedIdentifiers());
@@ -223,11 +338,12 @@ public class TranslationVisitor implements ISimpleVisitor {
 		substitutions.push(new ABecomesElementOfSubstitution(lhs, set));
 	}
 
+	@Override
 	public void visitBecomesSuchThat(final BecomesSuchThat assignment) {
 		final List<PExpression> lhs = getSubExpressions(assignment
 				.getAssignedIdentifiers());
 		final int originalBoundSize = boundVariables.size();
-		for (final FreeIdentifier id : assignment.getFreeIdentifiers()) {
+		for (final FreeIdentifier id : assignment.getAssignedIdentifiers()) {
 			boundVariables.push(id.getName() + "'");
 		}
 		final PPredicate predicate = getPredicate(assignment.getCondition());
@@ -235,6 +351,7 @@ public class TranslationVisitor implements ISimpleVisitor {
 		substitutions.push(new ABecomesSuchSubstitution(lhs, predicate));
 	}
 
+	@Override
 	public void visitBinaryExpression(final BinaryExpression expression) {
 		final PExpression exL = getExpression(expression.getLeft());
 		final PExpression exR = getExpression(expression.getRight());
@@ -326,9 +443,10 @@ public class TranslationVisitor implements ISimpleVisitor {
 		default:
 			throw new AssertionError("Uncovered Expression");
 		}
-		expressions.push(result);
+		pushExpression(expression, result);
 	}
 
+	@Override
 	public void visitBinaryPredicate(final BinaryPredicate predicate) {
 		final PPredicate left = getPredicate(predicate.getLeft());
 		final PPredicate right = getPredicate(predicate.getRight());
@@ -346,11 +464,13 @@ public class TranslationVisitor implements ISimpleVisitor {
 		predicates.push(result);
 	}
 
+	@Override
 	public void visitBoolExpression(final BoolExpression expression) {
 		final PPredicate pred = getPredicate(expression.getPredicate());
-		expressions.push(new AConvertBoolExpression(pred));
+		pushExpression(expression, new AConvertBoolExpression(pred));
 	}
 
+	@Override
 	public void visitBoundIdentDecl(final BoundIdentDecl boundIdentDecl) {
 		final String name = boundIdentDecl.getName();
 		boundVariables.push(name);
@@ -363,22 +483,27 @@ public class TranslationVisitor implements ISimpleVisitor {
 						name) }));
 	}
 
+	@Override
 	public void visitBoundIdentifier(final BoundIdentifier identifierExpression) {
 		final String name = boundVariables.get(identifierExpression
 				.getBoundIndex());
-		expressions.push(createIdentifierExpression(name));
+		pushExpression(identifierExpression, createIdentifierExpression(name));
 	}
 
+	@Override
 	public void visitFreeIdentifier(final FreeIdentifier identifierExpression) {
-		expressions.push(createIdentifierExpression(identifierExpression
-				.getName()));
+		pushExpression(identifierExpression,
+				createIdentifierExpression(identifierExpression.getName()));
 	}
 
+	@Override
 	public void visitIntegerLiteral(final IntegerLiteral expression) {
 		final String value = expression.getValue().toString();
-		expressions.push(new AIntegerExpression(new TIntegerLiteral(value)));
+		pushExpression(expression, new AIntegerExpression(new TIntegerLiteral(
+				value)));
 	}
 
+	@Override
 	public void visitLiteralPredicate(final LiteralPredicate predicate) {
 		final PPredicate result;
 		switch (predicate.getTag()) {
@@ -394,39 +519,43 @@ public class TranslationVisitor implements ISimpleVisitor {
 		predicates.push(result);
 	}
 
+	@Override
 	public void visitQuantifiedExpression(final QuantifiedExpression expression) {
 		// Add quantified identifiers to bound list and recursively create
 		// subtrees representing the identifiers
-		int originalBoundSize = boundVariables.size();
-		final List<PExpression> list = getSubExpressions(expression
-				.getBoundIdentDecls());
+		final int originalBoundSize = boundVariables.size();
+		final BoundIdentDecl[] decls = expression.getBoundIdentDecls();
+		final List<PExpression> list = getSubExpressions(decls);
 		final PPredicate pr = getPredicate(expression.getPredicate());
 		final PExpression ex = getExpression(expression.getExpression());
 		boundVariables.shrinkToSize(originalBoundSize);
 
+		final PPredicate pred = addTypesToPredicate(pr, decls);
+
 		final PExpression result;
 		switch (expression.getTag()) {
 		case Formula.QUNION:
-			result = new AQuantifiedUnionExpression(list, pr, ex);
+			result = new AQuantifiedUnionExpression(list, pred, ex);
 			break;
 		case Formula.QINTER:
-			result = new AQuantifiedIntersectionExpression(list, pr, ex);
+			result = new AQuantifiedIntersectionExpression(list, pred, ex);
 			break;
 		case Formula.CSET:
-			result = new AEventBComprehensionSetExpression(list, ex, pr);
+			result = new AEventBComprehensionSetExpression(list, ex, pred);
 			break;
 		default:
 			throw new AssertionError(UNCOVERED_PREDICATE);
 		}
-		expressions.push(result);
+		pushExpression(expression, result);
 	}
 
+	@Override
 	public void visitQuantifiedPredicate(final QuantifiedPredicate predicate) {
 		// Add quantified identifiers to bound list and recursively create
 		// subtrees representing the identifiers
 		int originalBoundSize = boundVariables.size();
-		final List<PExpression> list = getSubExpressions(predicate
-				.getBoundIdentDecls());
+		final BoundIdentDecl[] decls = predicate.getBoundIdentDecls();
+		final List<PExpression> list = getSubExpressions(decls);
 		// Recursively analyze the predicate (important, bounds are already set)
 		final PPredicate pred = getPredicate(predicate.getPredicate());
 		boundVariables.shrinkToSize(originalBoundSize);
@@ -434,11 +563,22 @@ public class TranslationVisitor implements ISimpleVisitor {
 		final PPredicate result;
 		switch (predicate.getTag()) {
 		case Formula.EXISTS:
-			result = new AExistsPredicate(list, pred);
+			result = new AExistsPredicate(list,
+					addTypesToPredicate(pred, decls));
 			break;
 		case Formula.FORALL:
-			final PPredicate impl = pred instanceof AImplicationPredicate ? pred
-					: new AImplicationPredicate(new ATruthPredicate(), pred);
+			final PPredicate left;
+			final PPredicate right;
+			if (pred instanceof AImplicationPredicate) {
+				final AImplicationPredicate i = (AImplicationPredicate) pred;
+				left = addTypesToPredicate(i.getLeft(), decls);
+				right = i.getRight();
+			} else {
+				left = addTypesToPredicate(null, decls);
+				right = pred;
+			}
+			final PPredicate impl = new AImplicationPredicate(
+					left != null ? left : new ATruthPredicate(), right);
 			result = new AForallPredicate(list, impl);
 			break;
 		default:
@@ -447,6 +587,50 @@ public class TranslationVisitor implements ISimpleVisitor {
 		predicates.push(result);
 	}
 
+	/**
+	 * If we have declarations of x and y with types S resp. T, add the type
+	 * information to the original predicate P. The result would be
+	 * <code>x:S & (y:T & P)</code>.
+	 * 
+	 * If decls is empty, the original predicate is returned unmodified.
+	 * 
+	 * An alternative approach to this would be adding the type information
+	 * directly to the identifiers with an oftype expression. The AST allows
+	 * this because it expects expressions in the list of declarations. But the
+	 * type checker must be adapted. The approach here makes (arguably) stronger
+	 * modifications to the structure of the AST.
+	 * 
+	 * @param predicate
+	 *            the original predicate, <code>null</code> if no original
+	 *            predicate is used.
+	 * @param decls
+	 *            a list of declarations, never <code>null</code>
+	 * @return the original predicate plus type information, <code>null</code>
+	 *         if no original predicate is given and decls is empty
+	 */
+	private PPredicate addTypesToPredicate(PPredicate predicate,
+			BoundIdentDecl[] decls) {
+		for (int i = decls.length; i > 0; i--) {
+			final BoundIdentDecl decl = decls[i - 1];
+			final Type type = decl.getType();
+			// I've encountered null types. Maybe that was a bug but just to be
+			// sure (in most cases, missing type information won't hurt):
+			if (type != null) {
+				final PExpression expr = createIdentifierExpression(decl
+						.getName());
+				// construct "expr:type"
+				final PPredicate member = new AMemberPredicate(expr,
+						translateType(type));
+				// and P := "expr:type & P", if no P is given (predicate is
+				// null), just "expr:type"
+				predicate = predicate == null ? member
+						: new AConjunctPredicate(member, predicate);
+			}
+		}
+		return predicate;
+	}
+
+	@Override
 	public void visitRelationalPredicate(final RelationalPredicate predicate) {
 		// EQUAL, NOTEQUAL, LT, LE, GT, GE, IN, NOTIN, SUBSET,
 		// NOTSUBSET, SUBSETEQ, NOTSUBSETEQ
@@ -496,12 +680,14 @@ public class TranslationVisitor implements ISimpleVisitor {
 		predicates.push(result);
 	}
 
+	@Override
 	public void visitSetExtension(final SetExtension expression) {
 		final Expression[] members = expression.getMembers();
 		final List<PExpression> list = getSubExpressions(members);
-		expressions.push(new ASetExtensionExpression(list));
+		pushExpression(expression, new ASetExtensionExpression(list));
 	}
 
+	@Override
 	public void visitSimplePredicate(final SimplePredicate predicate) {
 		final PPredicate result;
 		if (predicate.getTag() == Formula.KFINITE) {
@@ -514,6 +700,7 @@ public class TranslationVisitor implements ISimpleVisitor {
 	}
 
 	@SuppressWarnings("deprecation")
+	@Override
 	public void visitUnaryExpression(final UnaryExpression expression) {
 		final PExpression exp = getExpression(expression.getChild());
 		final PExpression result;
@@ -563,9 +750,10 @@ public class TranslationVisitor implements ISimpleVisitor {
 		default:
 			throw new AssertionError("Uncovered Expression");
 		}
-		expressions.push(result);
+		pushExpression(expression, result);
 	}
 
+	@Override
 	public void visitUnaryPredicate(final UnaryPredicate predicate) {
 		final PPredicate result;
 		if (predicate.getTag() == Formula.NOT) {
@@ -576,6 +764,7 @@ public class TranslationVisitor implements ISimpleVisitor {
 		predicates.push(result);
 	}
 
+	@Override
 	public void visitMultiplePredicate(final MultiplePredicate predicate) {
 		final PPredicate result;
 		if (predicate.getTag() == Formula.KPARTITION) {
@@ -600,9 +789,8 @@ public class TranslationVisitor implements ISimpleVisitor {
 				.getChildExpressions());
 		List<PPredicate> childPreds = getSubPredicates(expression
 				.getChildPredicates());
-		expressions.push(new AExtendedExprExpression(new TIdentifierLiteral(
-				symbol), childExprs, childPreds));
-		usesTheories = true;
+		pushExpression(expression, new AExtendedExprExpression(
+				new TIdentifierLiteral(symbol), childExprs, childPreds));
 	}
 
 	@Override
@@ -614,7 +802,6 @@ public class TranslationVisitor implements ISimpleVisitor {
 				.getChildPredicates());
 		predicates.push(new AExtendedPredPredicate(new TIdentifierLiteral(
 				symbol), childExprs, childPreds));
-		usesTheories = true;
 	}
 
 	private List<PExpression> getSubExpressions(final Formula<?>[] children) {
@@ -653,7 +840,7 @@ public class TranslationVisitor implements ISimpleVisitor {
 	 * @param <T>
 	 */
 	private static class LookupStack<T> {
-		private List<T> elements = new ArrayList<T>();
+		private final List<T> elements = new ArrayList<T>();
 
 		public void push(T elem) {
 			elements.add(elem);
@@ -719,33 +906,25 @@ public class TranslationVisitor implements ISimpleVisitor {
 		}
 	}
 
-	public static boolean checkNewImplementation(Predicate p,
-			Node oldImplementation) {
-		TranslationVisitor visitor = new TranslationVisitor();
+	public static PPredicate translatePredicate(Predicate p) {
+		// Create a visitor and use it to translate the predicate
+		final TranslationVisitor visitor = new TranslationVisitor();
 		p.accept(visitor);
-		final String expected = oldImplementation.toString();
-		final String actual = visitor.getPredicate().toString();
-		if (!expected.equals(actual)) {
-			throw new AssertionError("Expected:\n" + expected + "\n but was:\n"
-					+ actual);
-		}
-		return visitor.usesTheories;
+		return visitor.getPredicate();
 	}
 
-	public static boolean checkNewImplementation(Expression e,
-			Node oldImplementation) {
-		TranslationVisitor visitor = new TranslationVisitor();
+	public static PExpression translateExpression(Expression e) {
+		// Create a visitor and use it to translate the predicate
+		final TranslationVisitor visitor = new TranslationVisitor();
 		e.accept(visitor);
-		final String expected = oldImplementation.toString();
-		final String actual = visitor.getExpression().toString();
-		if (!expected.equals(actual)) {
-			throw new AssertionError("Expected:\n" + expected + "\n but was:\n"
-					+ actual);
-		}
-		return visitor.usesTheories;
+		return visitor.getExpression();
 	}
 
-	public boolean usesTheories() {
-		return usesTheories;
+	public static PSubstitution translateAssignment(Assignment a) {
+		// Create a visitor and use it to translate the predicate
+		final TranslationVisitor visitor = new TranslationVisitor();
+		a.accept(visitor);
+		return visitor.getSubstitution();
 	}
+
 }
diff --git a/de.prob.core/src/de/prob/model/serialize/EventBModelTranslator.java b/de.prob.core/src/de/prob/model/serialize/EventBModelTranslator.java
index f1940cc115174d1b9b54ae7c26d86b20b204ab13..71a028952d1138f23a9e25595e42c95955a8aac4 100644
--- a/de.prob.core/src/de/prob/model/serialize/EventBModelTranslator.java
+++ b/de.prob.core/src/de/prob/model/serialize/EventBModelTranslator.java
@@ -11,6 +11,7 @@ import java.util.Map;
 import java.util.zip.GZIPOutputStream;
 
 import org.apache.commons.codec.binary.Base64;
+import org.eclipse.core.runtime.CoreException;
 import org.eventb.core.IConvergenceElement.Convergence;
 import org.eventb.core.IEventBProject;
 import org.eventb.core.IEventBRoot;
@@ -34,7 +35,6 @@ import org.eventb.core.ISCWitness;
 import org.rodinp.core.IInternalElement;
 import org.rodinp.core.IInternalElementType;
 import org.rodinp.core.IRodinFile;
-import org.rodinp.core.RodinDBException;
 
 import com.thoughtworks.xstream.XStream;
 
@@ -125,7 +125,7 @@ public class EventBModelTranslator {
 				constants.add(new EventBConstant(iscConstant.getElementName()));
 			}
 			c.addConstants(constants);
-		} catch (RodinDBException e) {
+		} catch (CoreException e) {
 			e.printStackTrace();
 		}
 		contexts.put(c.getName(), c);
@@ -189,14 +189,14 @@ public class EventBModelTranslator {
 				events.add(extractEvent(iscEvent));
 			}
 			machine.addEvents(events);
-		} catch (RodinDBException e) {
+		} catch (CoreException e) {
 			e.printStackTrace();
 		}
 		machines.put(machine.getName(), machine);
 		return machine;
 	}
 
-	private Event extractEvent(final ISCEvent iscEvent) throws RodinDBException {
+	private Event extractEvent(final ISCEvent iscEvent) throws CoreException {
 		String name = iscEvent.getLabel();
 
 		int typeId = iscEvent.getConvergence().getCode();
@@ -273,10 +273,11 @@ public class EventBModelTranslator {
 	public File getModelFile() {
 		return modelFile;
 	}
-	
+
 	public String serialized() {
 		XStream xstream = new XStream();
-		String xml = xstream.toXML(new ModelObject(getMachines(), getContexts(), modelFile, mainComponent));
+		String xml = xstream.toXML(new ModelObject(getMachines(),
+				getContexts(), modelFile, mainComponent));
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 		GZIPOutputStream gzip;
 		byte[] bytes;
diff --git a/de.prob.core/src/de/prob/sap/commands/GenerateTestcaseCommand.java b/de.prob.core/src/de/prob/sap/commands/GenerateTestcaseCommand.java
index 8bb990195a453a78303b22e37c38e1af3e3abcd6..3ba18c58aaab0d92c024335c5091706a02ffa718 100644
--- a/de.prob.core/src/de/prob/sap/commands/GenerateTestcaseCommand.java
+++ b/de.prob.core/src/de/prob/sap/commands/GenerateTestcaseCommand.java
@@ -9,15 +9,14 @@ package de.prob.sap.commands;
 import java.util.ArrayList;
 import java.util.Collection;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eventb.core.IMachineRoot;
 import org.eventb.core.ast.FormulaFactory;
 import org.eventb.core.ast.IParseResult;
 import org.eventb.core.ast.ITypeCheckResult;
 import org.eventb.core.ast.ITypeEnvironment;
-import org.eventb.core.ast.LanguageVersion;
 import org.eventb.core.ast.Predicate;
 import org.eventb.core.basis.MachineRoot;
-import org.rodinp.core.RodinDBException;
 
 import de.prob.core.Animator;
 import de.prob.core.command.CommandException;
@@ -72,7 +71,7 @@ public class GenerateTestcaseCommand implements IComposableCommand {
 			final IMachineRoot machineRoot,
 			final Collection<String> operationNames,
 			final String targetPredicate, final int maxDepth,
-			final int maxNodes, final String filename) throws RodinDBException,
+			final int maxNodes, final String filename) throws CoreException,
 			ProBException {
 		final Predicate predicate = parsePredicate(machineRoot, targetPredicate);
 		return generateTestcases(operationNames, predicate, maxDepth, maxNodes,
@@ -115,16 +114,16 @@ public class GenerateTestcaseCommand implements IComposableCommand {
 
 	private static Predicate parsePredicate(final IMachineRoot machineRoot,
 			final String targetPredicate) throws ParseProblemException,
-			RodinDBException {
+			CoreException {
 		final FormulaFactory formfact = FormulaFactory.getDefault();
 		final IParseResult parsedPredicate = formfact.parsePredicate(
-				targetPredicate, LanguageVersion.LATEST, null);
+				targetPredicate, null);
 		if (parsedPredicate.hasProblem())
 			throw new ParseProblemException(parsedPredicate.getProblems());
 		final Predicate predicate = parsedPredicate.getParsedPredicate();
 
 		final ITypeEnvironment typeEnv = machineRoot.getSCMachineRoot()
-				.getTypeEnvironment(formfact);
+				.getTypeEnvironment();
 		final ITypeCheckResult tcr = predicate.typeCheck(typeEnv);
 		if (tcr.hasProblem())
 			throw new ParseProblemException(tcr.getProblems());
diff --git a/de.prob.core/src/de/prob/sap/util/FormulaUtils.java b/de.prob.core/src/de/prob/sap/util/FormulaUtils.java
index 551c1292dbe3744e6213b60f4e5b037f41c3790d..0da8504f4b3f0bbb4cf3a8147e1bb3413f4c3c06 100644
--- a/de.prob.core/src/de/prob/sap/util/FormulaUtils.java
+++ b/de.prob.core/src/de/prob/sap/util/FormulaUtils.java
@@ -3,13 +3,11 @@
  */
 package de.prob.sap.util;
 
-import java.util.LinkedList;
-
 import org.eventb.core.ast.Predicate;
 
 import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog;
 import de.be4.classicalb.core.parser.node.PPredicate;
-import de.prob.eventb.translator.PredicateVisitor;
+import de.prob.eventb.translator.internal.TranslationVisitor;
 import de.prob.prolog.output.IPrologTermOutput;
 
 /**
@@ -27,10 +25,8 @@ public final class FormulaUtils {
 	 */
 	static public void printPredicate(final Predicate predicate,
 			final IPrologTermOutput pto) {
-		final PredicateVisitor visitor = new PredicateVisitor(
-				new LinkedList<String>());
-		predicate.accept(visitor);
-		final PPredicate probPredicate = visitor.getPredicate();
+		final PPredicate probPredicate = TranslationVisitor
+				.translatePredicate(predicate);
 		final ASTProlog prolog = new ASTProlog(pto, null);
 		probPredicate.apply(prolog);
 	}
diff --git a/de.prob.eventb.disprover.core/.classpath b/de.prob.eventb.disprover.core/.classpath
index 64c5e31b7a264082f4c1dfdabb8097de820e66ce..ad32c83a7885b8953a938b41df3b4fd4fe1aae01 100644
--- a/de.prob.eventb.disprover.core/.classpath
+++ b/de.prob.eventb.disprover.core/.classpath
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.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"/>
diff --git a/de.prob.eventb.disprover.core/.settings/org.eclipse.jdt.core.prefs b/de.prob.eventb.disprover.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..c537b63063ce6052bdc49c5fd0745b078f162c90
--- /dev/null
+++ b/de.prob.eventb.disprover.core/.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.eventb.disprover.core/META-INF/MANIFEST.MF b/de.prob.eventb.disprover.core/META-INF/MANIFEST.MF
index 24a3895dacc48d7daf17944b18492769fbf85dc5..55ff7ade5f04b2d9eef77e6f8556b4c32bf394a6 100644
--- a/de.prob.eventb.disprover.core/META-INF/MANIFEST.MF
+++ b/de.prob.eventb.disprover.core/META-INF/MANIFEST.MF
@@ -6,10 +6,13 @@ Bundle-Version: 1.3.2.qualifier
 Bundle-Vendor: Heinrich-Heine University Dusseldorf
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
  de.prob.core;bundle-version="[9.4.0,9.5.0)",
- org.eventb.core.seqprover;bundle-version="[2.5.0,3.0.0)",
- org.eventb.core;bundle-version="2.5.1",
- org.eclipse.ui;bundle-version="[3.5.0,4.0.0)"
+ org.eventb.core.seqprover;bundle-version="[3.0.0,3.2.0)",
+ org.eventb.core;bundle-version="[3.0.0,3.2.0)",
+ org.eclipse.ui;bundle-version="[3.5.0,4.0.0)",
+ org.eventb.core.ast;bundle-version="[3.0.0,3.2.0)",
+ org.rodinp.core;bundle-version="[1.7.0,1.8.0)"
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
 Bundle-Localization: plugin
-Export-Package: de.prob.eventb.disprover.core
+Export-Package: de.prob.eventb.disprover.core,
+ de.prob.eventb.disprover.core.translation
diff --git a/de.prob.eventb.disprover.core/plugin.xml b/de.prob.eventb.disprover.core/plugin.xml
index 30a8c2e72c6ef161759c1fdb7eb86fcece6f19d4..caa58d21bc53b640186cef181bcb063d3603dacd 100644
--- a/de.prob.eventb.disprover.core/plugin.xml
+++ b/de.prob.eventb.disprover.core/plugin.xml
@@ -4,7 +4,7 @@
    <extension
          point="org.eventb.core.seqprover.reasoners">
       <reasoner
-            class="de.prob.eventb.disprover.core.internal.DisproverReasoner"
+            class="de.prob.eventb.disprover.core.DisproverReasoner"
             id="disproverReasoner"
             name="%reasoner.name">
       </reasoner>
diff --git a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/Disprover.java b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/Disprover.java
index dabd6e719096ef3ccf4d9ac12fb7647ac3ae096b..9c977d04ade26352955ac73880c983e165dc2d8e 100644
--- a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/Disprover.java
+++ b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/Disprover.java
@@ -2,8 +2,6 @@ package de.prob.eventb.disprover.core;
 
 import org.eventb.core.seqprover.IReasoner;
 
-import de.prob.eventb.disprover.core.internal.DisproverReasoner;
-
 public class Disprover {
 
 	private Disprover() {
@@ -18,7 +16,11 @@ public class Disprover {
 	 * @return a new {@link DisproverReasoner} instance.
 	 */
 	public static IReasoner createDisproverReasoner() {
-		return new DisproverReasoner();
+		return new DisproverReasoner(1);
+	}
+
+	public static IReasoner createExtendedTimeoutDisproverReasoner(int factor) {
+		return new DisproverReasoner(factor);
 	}
 
 }
diff --git a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverReasoner.java b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/DisproverReasoner.java
similarity index 55%
rename from de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverReasoner.java
rename to de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/DisproverReasoner.java
index 74298a6e33ff6b6ef0d420375f1a40e96c41d68f..1c7f3f8c8ecf5220c35770faf0e2d09d5a775647 100644
--- a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverReasoner.java
+++ b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/DisproverReasoner.java
@@ -1,35 +1,21 @@
-package de.prob.eventb.disprover.core.internal;
+package de.prob.eventb.disprover.core;
 
-import java.util.HashSet;
-import java.util.Set;
+import java.util.*;
 
 import org.eclipse.core.runtime.Status;
-import org.eventb.core.IContextRoot;
-import org.eventb.core.IEventBProject;
-import org.eventb.core.IEventBRoot;
-import org.eventb.core.IMachineRoot;
+import org.eventb.core.*;
 import org.eventb.core.ast.Predicate;
-import org.eventb.core.basis.POSequent;
-import org.eventb.core.seqprover.IConfidence;
-import org.eventb.core.seqprover.IProofMonitor;
-import org.eventb.core.seqprover.IProofRule;
+import org.eventb.core.seqprover.*;
 import org.eventb.core.seqprover.IProofRule.IAntecedent;
-import org.eventb.core.seqprover.IProverSequent;
-import org.eventb.core.seqprover.IReasoner;
-import org.eventb.core.seqprover.IReasonerInput;
-import org.eventb.core.seqprover.IReasonerInputReader;
-import org.eventb.core.seqprover.IReasonerInputWriter;
-import org.eventb.core.seqprover.IReasonerOutput;
-import org.eventb.core.seqprover.ProverFactory;
-import org.eventb.core.seqprover.SerializeException;
-import org.rodinp.core.RodinDBException;
-import org.rodinp.core.basis.InternalElement;
+import org.rodinp.core.*;
 
 import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog;
-import de.prob.core.Animator;
-import de.prob.core.PrologException;
-import de.prob.eventb.disprover.core.DisproverReasonerInput;
-import de.prob.eventb.translator.PredicateVisitor;
+import de.be4.classicalb.core.parser.node.AEventBContextParseUnit;
+import de.prob.core.*;
+import de.prob.eventb.disprover.core.internal.DisproverCommand;
+import de.prob.eventb.disprover.core.internal.ICounterExample;
+import de.prob.eventb.disprover.core.translation.DisproverContextCreator;
+import de.prob.eventb.translator.internal.TranslationVisitor;
 import de.prob.exceptions.ProBException;
 import de.prob.logging.Logger;
 import de.prob.prolog.output.PrologTermStringOutput;
@@ -40,6 +26,16 @@ public class DisproverReasoner implements IReasoner {
 
 	private static final String DISPROVER_REASONER_NAME = "de.prob.eventb.disprover.core.disproverReasoner";
 
+	private final int timeoutFactor;
+
+	public DisproverReasoner() {
+		this(1);
+	}
+
+	public DisproverReasoner(int timeoutFactor) {
+		this.timeoutFactor = timeoutFactor;
+	}
+
 	@Override
 	public String getReasonerID() {
 		return DISPROVER_REASONER_NAME;
@@ -50,7 +46,8 @@ public class DisproverReasoner implements IReasoner {
 			final IReasonerInput input, final IProofMonitor pm) {
 		try {
 			DisproverReasonerInput disproverInput = (DisproverReasonerInput) input;
-			ICounterExample ce = evaluateSequent(sequent, disproverInput, pm);
+			ICounterExample ce = evaluateSequent(sequent, disproverInput,
+					timeoutFactor, pm);
 			return createDisproverResult(ce, sequent, input);
 		} catch (PrologException e) {
 			Logger.log(Logger.WARNING, Status.WARNING, e.getMessage(), e);
@@ -68,16 +65,25 @@ public class DisproverReasoner implements IReasoner {
 	}
 
 	private ICounterExample evaluateSequent(final IProverSequent sequent,
-			final DisproverReasonerInput disproverInput, IProofMonitor pm)
-			throws ProBException, RodinDBException, InterruptedException {
+			final DisproverReasonerInput disproverInput, int timeoutFactor,
+			IProofMonitor pm) throws ProBException, RodinDBException,
+			InterruptedException {
 		// Logger.info("Calling Disprover on Sequent");
 
-		Set<Predicate> hypotheses = new HashSet<Predicate>();
-		StringBuilder hypothesesString = new StringBuilder();
+		Set<Predicate> allHypotheses = new HashSet<Predicate>();
+		// StringBuilder hypothesesString = new StringBuilder();
 		for (Predicate predicate : sequent.hypIterable()) {
-			hypotheses.add(predicate);
-			hypothesesString.append(predicateToProlog(predicate));
-			hypothesesString.append(" & ");
+			allHypotheses.add(predicate);
+			// hypothesesString.append(predicateToProlog(predicate));
+			// hypothesesString.append(" & ");
+		}
+
+		Set<Predicate> selectedHypotheses = new HashSet<Predicate>();
+		// StringBuilder hypothesesString = new StringBuilder();
+		for (Predicate predicate : sequent.selectedHypIterable()) {
+			selectedHypotheses.add(predicate);
+			// hypothesesString.append(predicateToProlog(predicate));
+			// hypothesesString.append(" & ");
 		}
 
 		/*
@@ -92,10 +98,17 @@ public class DisproverReasoner implements IReasoner {
 		// Logger.info("Disprover: Sending Goal: "+
 		// UnicodeTranslator.toAscii(predicateToProlog(goal)));
 
-		IEventBRoot root = getRoot(sequent);
+		AEventBContextParseUnit context = DisproverContextCreator
+				.createDisproverContext(sequent);
 
+		// find the IEventBProject belonging to the sequent
+		IPOSequent origin = (IPOSequent) sequent.getOrigin();
+		IRodinProject project = origin.getRodinProject();
+		IEventBProject evbProject = (IEventBProject) project
+				.getAdapter(IEventBProject.class);
 		ICounterExample counterExample = DisproverCommand.disprove(
-				Animator.getAnimator(), hypotheses, goal, root, pm);
+				Animator.getAnimator(), evbProject, allHypotheses,
+				selectedHypotheses, goal, timeoutFactor, context, pm);
 		// Logger.info("Disprover: Result: " + counterExample.toString());
 
 		return counterExample;
@@ -103,38 +116,13 @@ public class DisproverReasoner implements IReasoner {
 
 	private String predicateToProlog(Predicate pred) {
 		PrologTermStringOutput pto = new PrologTermStringOutput();
-		PredicateVisitor v = new PredicateVisitor();
+		TranslationVisitor v = new TranslationVisitor();
 		pred.accept(v);
 		ASTProlog p = new ASTProlog(pto, null);
 		v.getPredicate().apply(p);
 		return pto.toString();
 	}
 
-	private IEventBRoot getRoot(IProverSequent sequent) {
-		POSequent origin = (POSequent) sequent.getOrigin();
-		InternalElement poRoot = origin.getRoot();
-
-		// IPORoot poRoot = origin.getComponent().getPORoot();
-		String name = poRoot.getElementName();
-		IEventBProject eventBProject = (IEventBProject) poRoot
-				.getRodinProject().getAdapter(IEventBProject.class);
-
-		// We don't know whether we have a machine or a context.
-		IMachineRoot machineRoot = eventBProject.getMachineRoot(name);
-		IContextRoot contextRoot = eventBProject.getContextRoot(name);
-
-		if (machineRoot.exists()) {
-			return machineRoot;
-
-		} else if (contextRoot.exists()) {
-			return contextRoot;
-		} else {
-			// Neither Machine nor Context
-			throw new RuntimeException(
-					"Cannot use ProB Disprover on non Machine/Context Files");
-		}
-	}
-
 	/**
 	 * Create a {@link IProofRule} containing the result from the disprover.
 	 */
@@ -145,24 +133,51 @@ public class DisproverReasoner implements IReasoner {
 		Predicate goal = sequent.goal();
 
 		IAntecedent ante = ProverFactory.makeAntecedent(goal);
+		
+		if (counterExample == null) {
+			return ProverFactory.reasonerFailure(this, input,
+					"ProB: Error occurred.");
+		}
 
-		if (counterExample.timeoutOccured())
+		if (counterExample.timeoutOccured()) {
+			System.out.println(sequent.toString() + ": Timeout occured.");
 			return ProverFactory.reasonerFailure(this, input,
 					"ProB: Timeout occurred.");
+		}
 
-		if (!counterExample.counterExampleFound() && counterExample.isProof())
+		if (!counterExample.counterExampleFound() && counterExample.isProof()) {
+			System.out.println(sequent.toString() + ": Proof.");
 			return ProverFactory.makeProofRule(this, input, sequent.goal(),
 					null, IConfidence.DISCHARGED_MAX,
 					"ProB (no enumeration / all cases checked)");
+		}
+
+		if (!counterExample.counterExampleFound()) {
+			System.out.println(sequent.toString() + ": Unsure.");
+
+			return ProverFactory.reasonerFailure(
+					this,
+					input,
+					"ProB: No Counter-Example found due to "
+							+ counterExample.getReason()
+							+ ", but there might exist one.");
+		}
+
+		if (counterExample.counterExampleFound()
+				&& counterExample.onlySelectedHypotheses()) {
+			System.out.println(sequent.toString()
+					+ ": Counter-Example for selected hypotheses found.");
 
-		if (!counterExample.counterExampleFound())
 			return ProverFactory
-					.reasonerFailure(this, input,
-							"ProB: No Counter-Example found, but there might exist one.");
+					.reasonerFailure(
+							this,
+							input,
+							"ProB: Counter-Example for selected Hypotheses found, Goal not provable from selected Hypotheses (may be provable with all Hypotheses)");
+		}
 
+		System.out.println(sequent.toString() + ": Counter-Example found.");
 		return ProverFactory.makeProofRule(this, input, null, null,
-				IConfidence.PENDING,
-				"Counter-Example: " + counterExample.toString(), ante);
+				IConfidence.PENDING, counterExample.toString(), ante);
 	}
 
 	@Override
diff --git a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/DisproverReasonerInput.java b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/DisproverReasonerInput.java
index b5ea4b4d54d892c2eb5becd305b60578952e8a7f..8ad88b7bd290b382ca564ea9fa54fa5c98d06384 100644
--- a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/DisproverReasonerInput.java
+++ b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/DisproverReasonerInput.java
@@ -1,6 +1,9 @@
 package de.prob.eventb.disprover.core;
 
+import org.eventb.core.ast.FormulaFactory;
+import org.eventb.core.ast.ITypeEnvironment;
 import org.eventb.core.seqprover.IReasonerInput;
+import org.eventb.core.seqprover.ITranslatableReasonerInput;
 import org.eventb.core.seqprover.proofBuilder.ReplayHints;
 
 /**
@@ -11,7 +14,8 @@ import org.eventb.core.seqprover.proofBuilder.ReplayHints;
  * 
  * @author jastram
  */
-public class DisproverReasonerInput implements IReasonerInput {
+public class DisproverReasonerInput implements IReasonerInput,
+		ITranslatableReasonerInput {
 	@Override
 	public void applyHints(ReplayHints renaming) {
 		// TODO Auto-generated method stub
@@ -29,4 +33,16 @@ public class DisproverReasonerInput implements IReasonerInput {
 		return false;
 	}
 
+	@Override
+	public ITypeEnvironment getTypeEnvironment(FormulaFactory arg0) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public IReasonerInput translate(FormulaFactory arg0) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
 }
diff --git a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/command/DisproverLoadCommand.java b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/command/DisproverLoadCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..faf38c749654af9f32dd1961db863cc42c023748
--- /dev/null
+++ b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/command/DisproverLoadCommand.java
@@ -0,0 +1,101 @@
+package de.prob.eventb.disprover.core.command;
+
+import org.eventb.core.IEventBProject;
+import org.rodinp.core.*;
+
+import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog;
+import de.be4.classicalb.core.parser.node.AEventBContextParseUnit;
+import de.prob.core.command.*;
+import de.prob.core.translator.TranslationFailedException;
+import de.prob.eventb.translator.Theories;
+import de.prob.parser.ISimplifiedROMap;
+import de.prob.prolog.output.IPrologTermOutput;
+import de.prob.prolog.term.PrologTerm;
+
+public final class DisproverLoadCommand implements IComposableCommand {
+	private final AEventBContextParseUnit context;
+	private final IEventBProject project;
+
+	public DisproverLoadCommand(IEventBProject project,
+			AEventBContextParseUnit context) {
+		this.context = context;
+		this.project = project;
+	}
+
+	@Override
+	public void writeCommand(final IPrologTermOutput pto) {
+		ASTProlog modelAst = new ASTProlog(pto, null);
+		boolean theoryIsUsed;
+
+		// no proof information but the theories if used
+		try {
+			pto.openTerm("load_event_b_project");
+			pto.openList();
+			pto.closeList();
+
+			// load context
+			pto.openList();
+			context.apply(modelAst);
+			pto.closeList();
+
+			theoryIsUsed = theoriesUsed();
+			if (theoryIsUsed) {
+				theoriesAvailable();
+			}
+
+			pto.openList();
+
+			pto.openTerm("exporter_version");
+			pto.printNumber(3);
+			pto.closeTerm();
+
+			if (theoryIsUsed) {
+				Theories.translate(project, pto);
+			}
+			pto.closeList();
+
+			pto.printVariable("E");
+			pto.closeTerm();
+		} catch (TranslationFailedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+	}
+
+	@Override
+	public void processResult(
+			final ISimplifiedROMap<String, PrologTerm> bindings)
+			throws CommandException {
+		// there are no results to process
+	}
+
+	private boolean theoriesUsed() throws TranslationFailedException {
+		try {
+			final IRodinElement[] elements;
+			elements = project.getRodinProject().getChildren();
+			for (IRodinElement element : elements) {
+				if (element instanceof IRodinFile) {
+					IRodinFile file = (IRodinFile) element;
+					final String id = file.getRootElementType().getId();
+					if (id.startsWith("org.eventb.theory.core")) {
+						return true;
+					}
+				}
+			}
+			return false;
+		} catch (RodinDBException e) {
+			throw new TranslationFailedException(e);
+		}
+	}
+
+	private void theoriesAvailable() throws TranslationFailedException {
+		try {
+			Theories.touch();
+		} catch (NoClassDefFoundError e) {
+			throw new TranslationFailedException(
+					"Theory",
+					"The model to animate makes use of a theory but the theory plug-in is not installed");
+		}
+	}
+}
\ No newline at end of file
diff --git a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/CounterExample.java b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/CounterExample.java
index 3cc8a8baa5259b81f75099a13d601f051599c1ed..7116ec8f1f445a502d46fbe29bba395c5669aacf 100644
--- a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/CounterExample.java
+++ b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/CounterExample.java
@@ -1,7 +1,6 @@
 package de.prob.eventb.disprover.core.internal;
 
-import java.util.SortedMap;
-import java.util.TreeMap;
+import java.util.*;
 
 /**
  * This class wraps the results from a Disprover run. It either indicates that
@@ -17,11 +16,20 @@ class CounterExample implements ICounterExample {
 	public final SortedMap<String, String> state = new TreeMap<String, String>();
 	private final boolean timeoutOccured;
 	private boolean proof = false;
+	private boolean selectedHypotheses = false;
+	private String reason = "";
 
 	CounterExample(final boolean counterExampleFound,
-			final boolean timeoutOccured) {
+			final boolean timeoutOccured, final boolean selectedHypotheses) {
 		this.counterExampleFound = counterExampleFound;
 		this.timeoutOccured = timeoutOccured;
+		this.selectedHypotheses = selectedHypotheses;
+	}
+
+	CounterExample(final boolean counterExampleFound,
+			final boolean timeoutOccured, String reason) {
+		this(counterExampleFound, timeoutOccured, false);
+		this.reason = reason;
 	}
 
 	@Override
@@ -63,4 +71,14 @@ class CounterExample implements ICounterExample {
 	public boolean timeoutOccured() {
 		return timeoutOccured;
 	}
+
+	@Override
+	public String getReason() {
+		return reason;
+	}
+
+	@Override
+	public boolean onlySelectedHypotheses() {
+		return selectedHypotheses;
+	}
 }
diff --git a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverAutoTactic.java b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverAutoTactic.java
index 8c1e9db714adf73c65fcb0735005fcc6fc2d8a36..9e59b15ce48229c1aed5c8a997044a9681f7c385 100644
--- a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverAutoTactic.java
+++ b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverAutoTactic.java
@@ -4,13 +4,12 @@ import org.eventb.core.seqprover.ITactic;
 import org.eventb.core.seqprover.eventbExtensions.AutoTactics.AbsractLazilyConstrTactic;
 import org.eventb.core.seqprover.tactics.BasicTactics;
 
-import de.prob.eventb.disprover.core.DisproverReasonerInput;
-
+import de.prob.eventb.disprover.core.*;
 
 public class DisproverAutoTactic extends AbsractLazilyConstrTactic {
 	@Override
 	protected ITactic getSingInstance() {
-		return BasicTactics.reasonerTac(new DisproverReasoner(),
+		return BasicTactics.reasonerTac(new DisproverReasoner(1),
 				new DisproverReasonerInput());
 	}
 }
\ No newline at end of file
diff --git a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverCommand.java b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverCommand.java
index 2febdebfaba1350521a9b048b0ffdc8c76036378..f2d5d87b2e85eb5be776b3ce573fa8b818cb0a50 100644
--- a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverCommand.java
+++ b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverCommand.java
@@ -2,27 +2,25 @@ package de.prob.eventb.disprover.core.internal;
 
 import java.util.Set;
 
+import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.jobs.Job;
-import org.eventb.core.IEventBRoot;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eventb.core.IEventBProject;
 import org.eventb.core.ast.Predicate;
 import org.eventb.core.seqprover.IProofMonitor;
+import org.osgi.service.prefs.Preferences;
 
 import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog;
-import de.prob.core.Animator;
-import de.prob.core.ProBCommandJob;
-import de.prob.core.command.ClearMachineCommand;
-import de.prob.core.command.CommandException;
-import de.prob.core.command.ComposedCommand;
-import de.prob.core.command.IComposableCommand;
-import de.prob.core.command.SetPreferencesCommand;
-import de.prob.core.command.StartAnimationCommand;
-import de.prob.core.command.internal.InternalLoadCommand;
-import de.prob.eventb.translator.PredicateVisitor;
+import de.be4.classicalb.core.parser.node.AEventBContextParseUnit;
+import de.prob.core.*;
+import de.prob.core.command.*;
+import de.prob.eventb.disprover.core.DisproverReasoner;
+import de.prob.eventb.disprover.core.command.DisproverLoadCommand;
+import de.prob.eventb.translator.internal.TranslationVisitor;
 import de.prob.exceptions.ProBException;
 import de.prob.parser.ISimplifiedROMap;
 import de.prob.prolog.output.IPrologTermOutput;
-import de.prob.prolog.term.ListPrologTerm;
-import de.prob.prolog.term.PrologTerm;
+import de.prob.prolog.term.*;
 
 /**
  * The DisproverCommand takes two sets of ASTs (one for the machine and a list
@@ -41,29 +39,50 @@ public class DisproverCommand implements IComposableCommand {
 	private static final String RESULT = "Result";
 
 	private CounterExample counterExample;
-	private final Set<Predicate> hypotheses;
+	private final Set<Predicate> allHypotheses;
+	private final Set<Predicate> selectedHypotheses;
 	private final Predicate goal;
+	private final int timeout;
 
-	public DisproverCommand(Set<Predicate> hypotheses, Predicate goal) {
-		this.hypotheses = hypotheses;
+	private static ComposedCommand composed;
+
+	public DisproverCommand(Set<Predicate> allHypotheses,
+			Set<Predicate> selectedHypotheses, Predicate goal, int timeout) {
+		this.allHypotheses = allHypotheses;
+		this.selectedHypotheses = selectedHypotheses;
 		this.goal = goal;
+		this.timeout = timeout;
 	}
 
 	public static ICounterExample disprove(Animator animator,
-			Set<Predicate> hypotheses, Predicate goal, IEventBRoot root,
-			IProofMonitor pm) throws ProBException, InterruptedException {
+			IEventBProject project, Set<Predicate> allHypotheses,
+			Set<Predicate> selectedHypotheses, Predicate goal, int timeout,
+			AEventBContextParseUnit context, IProofMonitor pm)
+			throws ProBException, InterruptedException {
+		Preferences prefNode = Platform.getPreferencesService().getRootNode()
+				.node(InstanceScope.SCOPE).node("prob_disprover_preferences");
 
 		final ClearMachineCommand clear = new ClearMachineCommand();
+
 		final SetPreferencesCommand setPrefs = SetPreferencesCommand
 				.createSetPreferencesCommand(animator);
-		final InternalLoadCommand load = new InternalLoadCommand(root);
 
-		final StartAnimationCommand start = new StartAnimationCommand();
+		// set clpfd and chr preference
+		final SetPreferenceCommand setCLPFD = new SetPreferenceCommand("CLPFD",
+				Boolean.toString(prefNode.getBoolean("clpfd", true)));
+		final SetPreferenceCommand setCHR = new SetPreferenceCommand("CHR",
+				Boolean.toString(prefNode.getBoolean("clpfd", true)));
+
+		DisproverLoadCommand load = new DisproverLoadCommand(project, context);
 
-		DisproverCommand disprove = new DisproverCommand(hypotheses, goal);
+		StartAnimationCommand start = new StartAnimationCommand();
 
-		final ComposedCommand composed = new ComposedCommand(clear, setPrefs,
-				load, start, disprove);
+		DisproverCommand disprove = new DisproverCommand(allHypotheses,
+				selectedHypotheses, goal, timeout
+						* prefNode.getInt("timeout", 1000));
+
+		composed = new ComposedCommand(clear, setPrefs, setCLPFD, setCHR, load,
+				start, disprove);
 
 		final Job job = new ProBCommandJob("Disproving", animator, composed);
 		job.setUser(true);
@@ -77,6 +96,7 @@ public class DisproverCommand implements IComposableCommand {
 			job.cancel();
 			throw new InterruptedException();
 		}
+
 		return disprove.getResult();
 
 	}
@@ -87,22 +107,27 @@ public class DisproverCommand implements IComposableCommand {
 
 	@Override
 	public void writeCommand(final IPrologTermOutput pto) {
-
 		pto.openTerm("cbc_disprove");
 
 		Predicate pred = goal;
 		translatePredicate(pto, pred);
 		pto.openList();
-		for (Predicate p : this.hypotheses) {
+		for (Predicate p : this.allHypotheses) {
+			translatePredicate(pto, p);
+		}
+		pto.closeList();
+		pto.openList();
+		for (Predicate p : this.selectedHypotheses) {
 			translatePredicate(pto, p);
 		}
 		pto.closeList();
+		pto.printNumber(timeout);
 		pto.printVariable(RESULT);
 		pto.closeTerm();
 	}
 
 	private void translatePredicate(final IPrologTermOutput pto, Predicate pred) {
-		PredicateVisitor v = new PredicateVisitor();
+		TranslationVisitor v = new TranslationVisitor();
 		pred.accept(v);
 		ASTProlog p = new ASTProlog(pto, null);
 		v.getPredicate().apply(p);
@@ -118,22 +143,42 @@ public class DisproverCommand implements IComposableCommand {
 		counterExample = null;
 
 		if ("time_out".equals(term.getFunctor())) {
-			counterExample = new CounterExample(false, true);
+			counterExample = new CounterExample(false, true, false);
 		}
 		if ("interrupted".equals(term.getFunctor())) {
 			throw new CommandException("Interrupted");
 		}
 		if ("no_solution_found".equals(term.getFunctor())) {
-			counterExample = new CounterExample(false, false);
+			PrologTerm reason = term.getArgument(1);
+			if (reason.hasFunctor("clpfd_overflow", 0)) {
+				counterExample = new CounterExample(false, false,
+						"CLPFD Integer Overflow");
+			} else if (reason.hasFunctor("unfixed_deferred_sets", 0)) {
+				counterExample = new CounterExample(false, false,
+						"unfixed deferred sets in predicate");
+			} else {
+				counterExample = new CounterExample(false, false,
+						reason.toString());
+			}
 		}
 
 		if ("contradiction_found".equals(term.getFunctor())) {
-			counterExample = new CounterExample(false, false);
+			counterExample = new CounterExample(false, false, false);
 			counterExample.setProof(true);
 		}
 
 		if ("solution".equals(term.getFunctor())) {
-			counterExample = new CounterExample(true, false);
+			counterExample = new CounterExample(true, false, false);
+			ListPrologTerm vars = (ListPrologTerm) term.getArgument(1);
+
+			for (PrologTerm e : vars) {
+				counterExample.addVar(e.getArgument(1).getFunctor(), e
+						.getArgument(3).getFunctor());
+			}
+		}
+
+		if ("solution_on_selected_hypotheses".equals(term.getFunctor())) {
+			counterExample = new CounterExample(true, false, true);
 			ListPrologTerm vars = (ListPrologTerm) term.getArgument(1);
 
 			for (PrologTerm e : vars) {
diff --git a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverIdentifier.java b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverIdentifier.java
new file mode 100644
index 0000000000000000000000000000000000000000..00a0ed486fb1d86e1da41d85e1599329de85318d
--- /dev/null
+++ b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/DisproverIdentifier.java
@@ -0,0 +1,87 @@
+package de.prob.eventb.disprover.core.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eventb.core.ast.Expression;
+import org.eventb.core.ast.FormulaFactory;
+import org.eventb.core.ast.Type;
+
+import de.be4.classicalb.core.parser.node.AIdentifierExpression;
+import de.be4.classicalb.core.parser.node.PExpression;
+import de.be4.classicalb.core.parser.node.TIdentifierLiteral;
+import de.prob.eventb.translator.internal.TranslationVisitor;
+
+/**
+ * Helper class for the Disprover, containing an identifier and its type.
+ * <p>
+ * 
+ * As Nodes in the Syntax Tree can only have one parent, the getter methods
+ * always create new Objects, rather than handing out references.
+ * <p>
+ * 
+ * Types (vs. variables and constants ) have a name, but the type is null.
+ * 
+ * @author jastram
+ */
+public class DisproverIdentifier {
+
+	private final String name;
+	private final Type type;
+	private final FormulaFactory ff;
+	private final boolean givenSet;
+
+	public DisproverIdentifier(String name, Type type, boolean givenSet,
+			FormulaFactory ff) {
+		this.givenSet = givenSet;
+		this.ff = ff;
+		this.name = name;
+		this.type = type;
+	}
+
+	public boolean isGivenSet() {
+		return givenSet;
+	}
+
+	public boolean isPrimedVariable() {
+		return name.endsWith("'");
+	}
+
+	private PExpression typeToPExpression(Type type) {
+		TranslationVisitor visitor = new TranslationVisitor();
+		Expression expression = type.toExpression();
+		expression.accept(visitor);
+		PExpression typeExpr = visitor.getExpression();
+		return typeExpr;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public List<TIdentifierLiteral> getId() {
+		return stringToIdentifierLiteralList(name);
+	}
+
+	public AIdentifierExpression getIdExpression() {
+		return new AIdentifierExpression(getId());
+	}
+
+	public PExpression getType() {
+		if (type == null)
+			return null;
+		return typeToPExpression(type);
+	}
+
+	private List<TIdentifierLiteral> stringToIdentifierLiteralList(String name) {
+		List<TIdentifierLiteral> identifiers = new ArrayList<TIdentifierLiteral>();
+		identifiers.add(new TIdentifierLiteral(name));
+		return identifiers;
+	}
+
+	@Override
+	public String toString() {
+		return name + "(" + type + ")";
+	}
+
+}
diff --git a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/ICounterExample.java b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/ICounterExample.java
index 4890b1dc93a1d2a083ee6eaf699b7de9c1c0884e..13cb7f2df65388e503c6a892433b50ad23592275 100644
--- a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/ICounterExample.java
+++ b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/internal/ICounterExample.java
@@ -8,4 +8,8 @@ public interface ICounterExample {
 
 	public boolean isProof();
 
+	public boolean onlySelectedHypotheses();
+
+	public String getReason();
+
 }
\ No newline at end of file
diff --git a/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/translation/DisproverContextCreator.java b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/translation/DisproverContextCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..dceaec2b769aff5c1e4da9d0bacca51d47ff313f
--- /dev/null
+++ b/de.prob.eventb.disprover.core/src/de/prob/eventb/disprover/core/translation/DisproverContextCreator.java
@@ -0,0 +1,82 @@
+package de.prob.eventb.disprover.core.translation;
+
+import java.util.*;
+
+import org.eventb.core.ast.*;
+import org.eventb.core.ast.ITypeEnvironment.IIterator;
+import org.eventb.core.seqprover.IProverSequent;
+
+import de.be4.classicalb.core.parser.node.*;
+import de.prob.eventb.disprover.core.internal.DisproverIdentifier;
+import de.prob.eventb.translator.internal.TranslationVisitor;
+
+public class DisproverContextCreator {
+	public static AEventBContextParseUnit createDisproverContext(
+			IProverSequent sequent) {
+		return createDisproverContext(sequent.typeEnvironment(),
+				sequent.getFormulaFactory(), sequent.hypIterable());
+	}
+
+	public static AEventBContextParseUnit createDisproverContext(
+			ITypeEnvironment typeEnvironment, FormulaFactory ff,
+			Iterable<Predicate> hypotheses) {
+		AEventBContextParseUnit context = new AEventBContextParseUnit();
+		context.setName(new TIdentifierLiteral("DisproverContext"));
+
+		final List<PContextClause> contextClauses = new ArrayList<PContextClause>();
+
+		// collecting variables, sets and (type-)invariants
+		final AConstantsContextClause constantsClause = new AConstantsContextClause();
+		final List<PExpression> constantsIdentifiers = new ArrayList<PExpression>();
+
+		final ASetsContextClause setsContextClause = new ASetsContextClause();
+		final List<PSet> sets = new ArrayList<PSet>();
+
+		final AAxiomsContextClause axiomsContextClause = new AAxiomsContextClause();
+		final List<PPredicate> axioms = new ArrayList<PPredicate>();
+
+		// Iterate over the type environment to construct a typing context
+		IIterator typeIterator = typeEnvironment.getIterator();
+
+		while (typeIterator.hasNext()) {
+			typeIterator.advance();
+
+			DisproverIdentifier id = new DisproverIdentifier(
+					typeIterator.getName(), typeIterator.getType(),
+					typeIterator.isGivenSet(), ff);
+
+			// sets are added to the context, vars to the model
+			if (id.isGivenSet()) {
+				sets.add(new ADeferredSetSet(id.getId()));
+			} else {
+				// might not be necessary for constants
+				// if (!id.isPrimedVariable()) {
+				constantsIdentifiers.add(new AIdentifierExpression(id.getId()));
+				axioms.add(new AMemberPredicate(id.getIdExpression(), id
+						.getType()));
+				// }
+			}
+		}
+
+		// store hypothesis as axioms
+		TranslationVisitor translator = new TranslationVisitor();
+		for (Predicate predicate : hypotheses) {
+			predicate.accept(translator);
+			axioms.add(translator.getPredicate());
+		}
+
+		axiomsContextClause.setPredicates(axioms);
+		contextClauses.add(axiomsContextClause);
+
+		constantsClause.setIdentifiers(constantsIdentifiers);
+		contextClauses.add(constantsClause);
+
+		setsContextClause.setSet(sets);
+		contextClauses.add(setsContextClause);
+
+		context.setContextClauses(contextClauses);
+
+		return context;
+	}
+
+}
diff --git a/de.prob.eventb.disprover.ui/.classpath b/de.prob.eventb.disprover.ui/.classpath
index 64c5e31b7a264082f4c1dfdabb8097de820e66ce..ad32c83a7885b8953a938b41df3b4fd4fe1aae01 100644
--- a/de.prob.eventb.disprover.ui/.classpath
+++ b/de.prob.eventb.disprover.ui/.classpath
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.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"/>
diff --git a/de.prob.eventb.disprover.ui/.settings/org.eclipse.jdt.core.prefs b/de.prob.eventb.disprover.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..c537b63063ce6052bdc49c5fd0745b078f162c90
--- /dev/null
+++ b/de.prob.eventb.disprover.ui/.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.eventb.disprover.ui/META-INF/MANIFEST.MF b/de.prob.eventb.disprover.ui/META-INF/MANIFEST.MF
index 901afc33977d363018bcde70537530e632b1fc47..01f62e3ae5639352456797082f2693b6a3c58ff1 100644
--- a/de.prob.eventb.disprover.ui/META-INF/MANIFEST.MF
+++ b/de.prob.eventb.disprover.ui/META-INF/MANIFEST.MF
@@ -4,10 +4,16 @@ Bundle-Name: ProB Disprover UI for EventB
 Bundle-SymbolicName: de.prob.eventb.disprover.ui;singleton:=true
 Bundle-Version: 2.0.3.qualifier
 Bundle-Vendor: Heinrich-Heine University Dusseldorf
-Require-Bundle: org.eventb.ui;bundle-version="[2.5.0,3.0.0)",
+Require-Bundle: org.eclipse.core.runtime,
+ org.eventb.ui;bundle-version="[3.0.0,3.1.0)",
  de.prob.eventb.disprover.core;bundle-version="[1.3.2,2.0.0)",
  org.eclipse.ui;bundle-version="[3.5.0,4.0.0)",
- org.eventb.pp.ui;bundle-version="0.2.1"
+ de.prob.core,
+ org.eventb.core.ast;bundle-version="[3.0.0,3.2.0)",
+ org.eventb.core.seqprover;bundle-version="[3.0.0,3.2.0)",
+ org.eclipse.osgi,
+ org.rodinp.core;bundle-version="[1.7.0,1.8.0)",
+ org.eventb.core;bundle-version="[3.0.0,3.2.0)"
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
 Bundle-Localization: plugin
diff --git a/de.prob.eventb.disprover.ui/plugin.properties b/de.prob.eventb.disprover.ui/plugin.properties
index 10c3bee80f3314750bc43db72747fa3707f6a3d9..11c56170b3d390079c2d02be08942a3836688c4d 100644
--- a/de.prob.eventb.disprover.ui/plugin.properties
+++ b/de.prob.eventb.disprover.ui/plugin.properties
@@ -8,3 +8,6 @@
 
 tactic.disprover.name = Disprover
 tactic.disprover.tooltip = (Dis)Prove with ProB
+
+tactic.disprover.extended_timeout.name = Disprover (extended Timeout)
+tactic.disprover.extended_timeout.tooltip = (Dis)Prove with ProB (extended Timeout)
\ No newline at end of file
diff --git a/de.prob.eventb.disprover.ui/plugin.xml b/de.prob.eventb.disprover.ui/plugin.xml
index 82717ae33ff5f39530b623bed28c3b9f4434fe86..7518659c1c1a9942bcb13f5034489f98f82c05c7 100644
--- a/de.prob.eventb.disprover.ui/plugin.xml
+++ b/de.prob.eventb.disprover.ui/plugin.xml
@@ -14,7 +14,14 @@
             target="global"
             tooltip="%tactic.disprover.tooltip-relevant-context" />
      -->       
+      <dropdown
+            id="de.prob.eventb.disprover.ui.dropdown"
+            name="ProB (Dis-)Prover"
+            priority="10"
+            toolbar="org.eventb.ui.sequentToolbar">
+      </dropdown>
       <tactic
+            dropdown="de.prob.eventb.disprover.ui.dropdown"
             icon="icons/disprover-all.png"
             id="de.prob.eventb.disprover.ui.disproverTactic"
             interrupt="true"
@@ -22,8 +29,19 @@
             priority="10"
             tacticProvider="de.prob.eventb.disprover.ui.DisproverTacticProvider"
             target="global"
-            toolbar="org.eventb.ui.sequentToolbar"
-            tooltip="%tactic.disprover.tooltip"/>
+            tooltip="%tactic.disprover.tooltip">
+      </tactic>
+      <tactic
+            dropdown="de.prob.eventb.disprover.ui.dropdown"
+            icon="icons/disprover-all.png"
+            id="de.prob.eventb.disprover.ui.disproverExtendedTimeoutTactic"
+            interrupt="true"
+            name="%tactic.disprover.extended_timeout.name"
+            priority="10"
+            tacticProvider="de.prob.eventb.disprover.ui.DisproverExtendedTimeoutTacticProvider"
+            target="global"
+            tooltip="%tactic.disprover.extended_timeout.tooltip">
+      </tactic>
    <!--      <tactic
             dropdown="de.prob.eventb.disprover.ui.DisproverDropdown"
             icon="icons/disprover-config.png"
@@ -45,5 +63,14 @@
             target="global"
             tooltip="%tactic.disprover.tooltip-relevant" /> -->
    </extension>
+   <extension
+         point="org.eclipse.ui.preferencePages">
+      <page
+            category="probpreferences"
+            class="de.prob.eventb.disprover.ui.DisproverPreferences"
+            id="de.prob.ui.probclassic"
+            name="ProB (Dis-)Prover">
+      </page>
+   </extension>
 
 </plugin>
diff --git a/de.prob.eventb.disprover.ui/src/de/prob/eventb/disprover/ui/DisproverExtendedTimeoutTacticProvider.java b/de.prob.eventb.disprover.ui/src/de/prob/eventb/disprover/ui/DisproverExtendedTimeoutTacticProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..7d8c69b7a66e075fb510a05599a4ea465bbf7167
--- /dev/null
+++ b/de.prob.eventb.disprover.ui/src/de/prob/eventb/disprover/ui/DisproverExtendedTimeoutTacticProvider.java
@@ -0,0 +1,61 @@
+package de.prob.eventb.disprover.ui;
+
+import java.util.*;
+
+import org.eventb.core.ast.Predicate;
+import org.eventb.core.seqprover.*;
+import org.eventb.core.seqprover.tactics.BasicTactics;
+import org.eventb.ui.prover.*;
+
+import de.prob.eventb.disprover.core.*;
+
+public class DisproverExtendedTimeoutTacticProvider extends
+		DefaultTacticProvider {
+
+	protected boolean useContexts() {
+		return false;
+	}
+
+	protected static class MyPredicateApplication implements ITacticApplication {
+
+		private final IProofTreeNode node;
+
+		public MyPredicateApplication(IProofTreeNode node) {
+			this.node = node;
+		}
+
+		@Override
+		public ITactic getTactic(String[] inputs, String globalInput) {
+			return getTactic(node, globalInput, inputs);
+		}
+
+		public ITactic getTactic(IProofTreeNode node, String globalInput,
+				String[] inputs) {
+
+			IReasonerInput reasonerInput = new DisproverReasonerInput();
+			return BasicTactics.reasonerTac(
+					Disprover.createDisproverReasoner(), reasonerInput);
+		}
+
+		@Override
+		public String getTacticID() {
+			return "de.prob.eventb.disprover.ui.disproverTactic";
+		}
+
+	}
+
+	public DisproverExtendedTimeoutTacticProvider() {
+		super();
+	}
+
+	@Override
+	public List<ITacticApplication> getPossibleApplications(
+			IProofTreeNode node, Predicate hyp, String globalInput) {
+
+		if (node != null && node.isOpen()) {
+			ITacticApplication application = new MyPredicateApplication(node);
+			return Collections.singletonList(application);
+		}
+		return Collections.<ITacticApplication> emptyList();
+	}
+}
\ No newline at end of file
diff --git a/de.prob.eventb.disprover.ui/src/de/prob/eventb/disprover/ui/DisproverPreferences.java b/de.prob.eventb.disprover.ui/src/de/prob/eventb/disprover/ui/DisproverPreferences.java
new file mode 100644
index 0000000000000000000000000000000000000000..f2f8e38d7705276fa88e8d607295f8b5e142bc27
--- /dev/null
+++ b/de.prob.eventb.disprover.ui/src/de/prob/eventb/disprover/ui/DisproverPreferences.java
@@ -0,0 +1,153 @@
+package de.prob.eventb.disprover.ui;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.layout.*;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.*;
+import org.osgi.service.prefs.*;
+
+public class DisproverPreferences extends PreferencePage implements
+		IWorkbenchPreferencePage {
+
+	public static final class PushButton extends SelectionAdapter {
+
+		private final Text text;
+		private final Shell shell;
+
+		public PushButton(final Shell shell, final Text text) {
+			this.shell = shell;
+			this.text = text;
+		}
+
+		@Override
+		public void widgetSelected(final SelectionEvent e) {
+			super.widgetSelected(e);
+			FileDialog dialog = new FileDialog(shell, SWT.OPEN);
+			String open = dialog.open();
+			text.setText(open);
+		}
+
+	}
+
+	private Preferences prefNode;
+	private Text timeoutTextField;
+	private Button checkCLPFD;
+	private Button checkCHR;
+
+	public DisproverPreferences() {
+		super();
+	}
+
+	public DisproverPreferences(final String title) {
+		super(title);
+	}
+
+	public DisproverPreferences(final String title, final ImageDescriptor image) {
+		super(title, image);
+	}
+
+	@Override
+	protected Control createContents(final Composite parent) {
+		Composite pageComponent = new Composite(parent, SWT.NULL);
+
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+
+		pageComponent.setLayout(layout);
+
+		new Label(pageComponent, SWT.NONE).setText("Time-out:");
+		timeoutTextField = new Text(pageComponent, SWT.NONE);
+		int timeout = prefNode.getInt("timeout", 1000);
+		timeoutTextField.setText(Integer.toString(timeout));
+		timeoutTextField.setSize(100, timeoutTextField.getSize().y);
+		timeoutTextField.addVerifyListener(new VerifyListener() {
+			@Override
+			public void verifyText(VerifyEvent e) {
+				if (e.text.length() >= 1) {
+					e.doit = true;
+					for (int i = 0; i < e.text.length(); i++) {
+						if (!Character.isDigit(e.text.charAt(i))) {
+							e.doit = false;
+						}
+					}
+				}
+			}
+		});
+
+		Label timeoutRemark = new Label(pageComponent, SWT.WRAP);
+		timeoutRemark
+				.setText("Note: The time-out is applied to each constraint-solving action.\nThe maximum time-out is thus twice as long (solving with all hypotheses and with the selected hypotheses only).");
+		GridData gridData2 = new GridData();
+		gridData2.horizontalSpan = 2;
+		timeoutRemark.setLayoutData(gridData2);
+
+		new Label(pageComponent, SWT.NONE).setText("Use CLP(FD) Solver:");
+		checkCLPFD = new Button(pageComponent, SWT.CHECK);
+		checkCLPFD.setSelection(prefNode.getBoolean("clpfd", true));
+		checkCLPFD.addSelectionListener(new SelectionListener() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (!checkCLPFD.getSelection()) {
+					checkCHR.setSelection(false);
+				}
+			}
+
+			@Override
+			public void widgetDefaultSelected(SelectionEvent e) {
+				// TODO Auto-generated method stub
+
+			}
+		});
+
+		new Label(pageComponent, SWT.NONE).setText("Use CHR Solver:");
+		checkCHR = new Button(pageComponent, SWT.CHECK);
+		checkCHR.setSelection(prefNode.getBoolean("chr", true));
+		checkCHR.addSelectionListener(new SelectionListener() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (checkCHR.getSelection()) {
+					checkCLPFD.setSelection(true);
+				}
+			}
+
+			@Override
+			public void widgetDefaultSelected(SelectionEvent e) {
+				// TODO Auto-generated method stub
+
+			}
+		});
+
+		Label chrRemark = new Label(pageComponent, SWT.WRAP);
+		chrRemark
+				.setText("Note: The CHR Solver can only be used in conjunction with the CLP(FD) solver.");
+
+		return pageComponent;
+	}
+
+	@Override
+	public boolean performOk() {
+		prefNode.put("timeout", timeoutTextField.getText());
+		prefNode.putBoolean("clpfd", checkCLPFD.getSelection());
+		prefNode.putBoolean("chr", checkCHR.getSelection());
+		try {
+			prefNode.flush();
+		} catch (BackingStoreException e) {
+			e.printStackTrace();
+		}
+		return super.performOk();
+	}
+
+	@Override
+	public void init(final IWorkbench workbench) {
+		prefNode = Platform.getPreferencesService().getRootNode()
+				.node(InstanceScope.SCOPE).node("prob_disprover_preferences");
+	}
+
+}
diff --git a/de.prob.eventb.disprover.ui/src/de/prob/eventb/disprover/ui/DisproverTacticProvider.java b/de.prob.eventb.disprover.ui/src/de/prob/eventb/disprover/ui/DisproverTacticProvider.java
index 4a7f8d2fcc8f0d61e51139220aeaf41e9a8228ed..f7802e0351a3796fe26e079c5b74d453bbbda195 100644
--- a/de.prob.eventb.disprover.ui/src/de/prob/eventb/disprover/ui/DisproverTacticProvider.java
+++ b/de.prob.eventb.disprover.ui/src/de/prob/eventb/disprover/ui/DisproverTacticProvider.java
@@ -3,12 +3,14 @@ package de.prob.eventb.disprover.ui;
 import java.util.Collections;
 import java.util.List;
 
+import org.eclipse.swt.graphics.Image;
 import org.eventb.core.ast.Predicate;
 import org.eventb.core.seqprover.IProofTreeNode;
 import org.eventb.core.seqprover.IReasonerInput;
 import org.eventb.core.seqprover.ITactic;
 import org.eventb.core.seqprover.tactics.BasicTactics;
 import org.eventb.ui.prover.DefaultTacticProvider;
+import org.eventb.ui.prover.IPredicateApplication;
 import org.eventb.ui.prover.ITacticApplication;
 
 import de.prob.eventb.disprover.core.Disprover;
@@ -20,22 +22,10 @@ public class DisproverTacticProvider extends DefaultTacticProvider {
 		return false;
 	}
 
-	protected static class MyPredicateApplication implements ITacticApplication {
-
-		private final IProofTreeNode node;
-
-		public MyPredicateApplication(IProofTreeNode node) {
-			this.node = node;
-		}
-
+	protected static class MyPredicateApplication implements
+			IPredicateApplication {
 		@Override
 		public ITactic getTactic(String[] inputs, String globalInput) {
-			return getTactic(node, globalInput, inputs);
-		}
-
-		public ITactic getTactic(IProofTreeNode node, String globalInput,
-				String[] inputs) {
-
 			IReasonerInput reasonerInput = new DisproverReasonerInput();
 			return BasicTactics.reasonerTac(
 					Disprover.createDisproverReasoner(), reasonerInput);
@@ -46,6 +36,18 @@ public class DisproverTacticProvider extends DefaultTacticProvider {
 			return "de.prob.eventb.disprover.ui.disproverTactic";
 		}
 
+		@Override
+		public Image getIcon() {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		@Override
+		public String getTooltip() {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
 	}
 
 	public DisproverTacticProvider() {
@@ -57,7 +59,7 @@ public class DisproverTacticProvider extends DefaultTacticProvider {
 			IProofTreeNode node, Predicate hyp, String globalInput) {
 
 		if (node != null && node.isOpen()) {
-			ITacticApplication application = new MyPredicateApplication(node);
+			ITacticApplication application = new MyPredicateApplication();
 			return Collections.singletonList(application);
 		}
 		return Collections.<ITacticApplication> emptyList();
diff --git a/de.prob.symbolic/META-INF/MANIFEST.MF b/de.prob.symbolic/META-INF/MANIFEST.MF
index 52dc0015473f374b41c057a65da6df414c5d7892..52e10653dc0de613fe409cd198ca0a1d16e8ad36 100644
--- a/de.prob.symbolic/META-INF/MANIFEST.MF
+++ b/de.prob.symbolic/META-INF/MANIFEST.MF
@@ -6,8 +6,11 @@ Bundle-Version: 1.0.0.qualifier
 Bundle-Activator: de.prob.symbolic.Activator
 Require-Bundle: org.eclipse.core.runtime,
  de.prob.core;bundle-version="[9.4.0,9.5.0)",
- org.eventb.ui;bundle-version="[2.5.0,3.0.0)",
- de.prob.ui;bundle-version="[7.4.0,7.5.0)"
+ org.eventb.ui;bundle-version="[3.0.0,3.1.0)",
+ de.prob.ui;bundle-version="[7.4.0,7.5.0)",
+ org.rodinp.core;bundle-version="[1.7.0,1.8.0)",
+ org.eclipse.ui;bundle-version="[3.5.0,4.0.0)",
+ org.eventb.core;bundle-version="[3.0.0,3.2.0)"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-Vendor: HHU Düsseldorf STUPS Group
diff --git a/de.prob.symbolic/plugin.xml b/de.prob.symbolic/plugin.xml
index e74f8d3db3227a21f95f314148736728e664698e..c8833836bfcbc7c77fdb963530c7093fd33d62cf 100644
--- a/de.prob.symbolic/plugin.xml
+++ b/de.prob.symbolic/plugin.xml
@@ -14,6 +14,12 @@
                descriptionId="de.prob.symbolic.symbolicAttribute">
          </attributeReference>
       </attributeRelation>
+      <attributeRelation
+            elementTypeId="org.eventb.core.scConstant">
+         <attributeReference
+               descriptionId="de.prob.symbolic.symbolicAttribute">
+         </attributeReference>
+      </attributeRelation>
    </extension>
    <extension
          point="org.rodinp.core.attributeTypes">
diff --git a/de.prob.symbolic/src/de/prob/symbolic/SymbolicAttribute.java b/de.prob.symbolic/src/de/prob/symbolic/SymbolicAttribute.java
index 7d6f43b605f36c510ca26798ed91537053c01a6b..6493d4cee60484aaf425a6f976dae790dfa12486 100644
--- a/de.prob.symbolic/src/de/prob/symbolic/SymbolicAttribute.java
+++ b/de.prob.symbolic/src/de/prob/symbolic/SymbolicAttribute.java
@@ -16,12 +16,13 @@ import org.rodinp.core.IRodinElement;
 import org.rodinp.core.RodinCore;
 import org.rodinp.core.RodinDBException;
 
+@SuppressWarnings("restriction")
 public class SymbolicAttribute extends AbstractBooleanManipulation {
 	private static final String SYMBOLIC = "symbolic";
 	private static final String CONCRETE = "not symbolic";
 	public static IAttributeType.Boolean ATTRIBUTE = RodinCore
 			.getBooleanAttrType(Activator.PLUGIN_ID + ".symbolicAttribute");
-
+	
 	public SymbolicAttribute() {
 		super(SYMBOLIC, CONCRETE);
 	}
diff --git a/de.prob.ui/META-INF/MANIFEST.MF b/de.prob.ui/META-INF/MANIFEST.MF
index 65ed363cdd7212d5885670d206c47dc6f0ebf215..9560d2533dc204f2eedfa3b23fd178923b35b896 100644
--- a/de.prob.ui/META-INF/MANIFEST.MF
+++ b/de.prob.ui/META-INF/MANIFEST.MF
@@ -8,9 +8,11 @@ Require-Bundle: org.eclipse.ui;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.4.0,9.5.0)",
- org.eventb.core;bundle-version="[2.5.0,2.6.0)",
+ org.eventb.core;bundle-version="[3.0.0,3.2.0)",
  org.eclipse.core.expressions;bundle-version="[3.4.101,4.0.0)",
- org.eclipse.gef;bundle-version="[3.7.0,4.0.0)"
+ org.eclipse.gef;bundle-version="[3.7.0,4.0.0)",
+ org.eventb.core.ast;bundle-version="[3.0.0,3.2.0)",
+ org.rodinp.core;bundle-version="[1.7.0,1.8.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 14cb1e6079a38f9c81859fa317cb3709ace8d6b6..6bf2e1f287fe32c93a44f4924fcb7d4f3c4a6dfc 100644
--- a/de.prob.ui/plugin.xml
+++ b/de.prob.ui/plugin.xml
@@ -82,7 +82,7 @@
             category="de.hhu.stups.prob"
             class="de.prob.ui.ltl.CounterExampleViewPart"
             id="de.prob.ui.ltl.CounterExampleView"
-            name="Ltl Counter-Example"
+            name="LTL Counter-Example"
             restorable="true">
       </view>
    </extension>
@@ -179,8 +179,8 @@
       </command>
       <command
             categoryId="de.prob.ui.commands.category"
-            id="de.prob.ui.consistency_checking"
-            name="Consistencychecking">
+            id="de.prob.ui.model_checking"
+            name="Modelchecking">
       </command>
       
       <command
@@ -280,7 +280,7 @@
       <command
             id="de.prob.ui.stateview.toggleShowDuplicates"
             name="Toggle Show Duplicates">
-         <state class="org.eclipse.jface.commands.ToggleState"
+         <state class="org.eclipse.ui.handlers.RegistryToggleState:true"
             id="de.prob.ui.stateview.duplicateFilterState" />
       </command>
       <command
@@ -293,6 +293,10 @@
             id="de.prob.ui.show_parameter_dialog"
             name="Show Parameter Dialog">
       </command>
+      <command
+            id="de.prob.ui.show_custom_precondition_dialog"
+            name="Execute with additional Guard">
+      </command>
       <command
             categoryId="de.prob.ui.commands.category"
             id="de.prob.ui.deadlock_check"
@@ -365,6 +369,11 @@
             id="de.prob.ui.assertion_check"
             name="Check Context Theorems">
       </command>
+      <command
+            categoryId="de.prob.ui.commands.category"
+            id="de.prob.ui.find_valid_state"
+            name="Find State satisfying Predicate">
+      </command>
    </extension>
    <extension
          point="org.eclipse.ui.handlers">
@@ -406,7 +415,7 @@
          </class>
       </handler>
       <handler
-            commandId="de.prob.ui.consistency_checking">
+            commandId="de.prob.ui.model_checking">
          <enabledWhen>
            <with variable="de.prob.core.model_loaded">
                   <equals
@@ -415,7 +424,7 @@
                </with>
          </enabledWhen>
          <class
-               class="de.prob.ui.eventb.ConsistencyCheckCommand">
+               class="de.prob.ui.eventb.ModelCheckCommand">
          </class>
       </handler>
       <handler
@@ -647,6 +656,12 @@
          <class
                class="de.prob.ui.operationview.ShowParameterDialogHandler">
          </class>
+      </handler>
+            <handler
+            commandId="de.prob.ui.show_custom_precondition_dialog">
+         <class
+               class="de.prob.ui.operationview.CustomPreconditionDialogHandler">
+         </class>
       </handler>
       <handler
             commandId="de.prob.ui.deadlock_check">
@@ -672,7 +687,7 @@
       </handler>
       <handler
             commandId="de.prob.ui.opview.checks">
-            <class class="de.prob.ui.eventb.ConsistencyCheckCommand" />
+            <class class="de.prob.ui.eventb.ModelCheckCommand" />
                      <enabledWhen>
            <with variable="de.prob.core.model_loaded">
                   <equals
@@ -780,7 +795,7 @@
       <handler
             commandId="de.prob.ui.assertion_check">
          <enabledWhen>
-            <and>
+            <or>
                <with
                      variable="de.prob.core.model_loaded">
                   <equals
@@ -790,15 +805,29 @@
                <with
                      variable="de.prob.core.context_loaded">
                   <equals
-                        value="disabled">
+                        value="enabled">
                   </equals>
                </with>
-            </and>
+            </or>
          </enabledWhen>
          <class
                class="de.prob.ui.assertion.AssertionCheckHandler">
          </class>
       </handler>
+      <handler
+            commandId="de.prob.ui.find_valid_state">
+         <class
+               class="de.prob.ui.findvalidstate.FindValidStateHandler">
+         </class>
+         <enabledWhen>
+            <with
+                  variable="de.prob.core.model_loaded">
+               <equals
+                     value="enabled">
+               </equals>
+            </with>
+         </enabledWhen>
+      </handler>
 <!--      <handler
             commandId="de.prob.ui.startdmc">
          <class
@@ -1012,6 +1041,22 @@
          <separator
                name="de.prob.ui.separator2"
                visible="true">
+                           <visibleWhen>
+               <with
+                     variable="selection">
+                  <iterate
+                        operator="or">
+                     <or>
+                        <instanceof
+                              value="org.eventb.core.IMachineRoot">
+                        </instanceof>
+                        <instanceof
+                              value="org.eventb.core.IContextRoot">
+                        </instanceof>
+                     </or>
+                  </iterate>
+               </with>
+            </visibleWhen>
          </separator>
          <command
                commandId="de.prob.ui.starteventbanimation"
@@ -1023,9 +1068,14 @@
             variable="selection">
          <iterate
                operator="or">
-            <instanceof
-                  value="org.eventb.core.IEventBRoot">
-            </instanceof>
+            <or>
+               <instanceof
+                     value="org.eventb.core.IMachineRoot">
+               </instanceof>
+               <instanceof
+                     value="org.eventb.core.IContextRoot">
+               </instanceof>
+            </or>
          </iterate>
       </with>
             </visibleWhen>
@@ -1053,17 +1103,6 @@
                icon="icons/new_prob_mini.png"
                id="more_commands"
                label="ProB Classic ...">
-            <visibleWhen>
-               <with
-                     variable="selection">
-                  <iterate
-                        operator="or">
-                     <instanceof
-                           value="org.eventb.core.IEventBRoot">
-                     </instanceof>
-                  </iterate>
-               </with>
-            </visibleWhen>
             <command
                   commandId="de.prob.ui.newcore.export"
                   icon="icons/prob_mini_logo.gif"
@@ -1076,10 +1115,42 @@
                   label="Open in ProB classic"
                   style="push">
             </command>
+            <visibleWhen>
+               <with
+                     variable="selection">
+                  <iterate
+                        operator="or">
+                     <or>
+                        <instanceof
+                              value="org.eventb.core.IMachineRoot">
+                        </instanceof>
+                        <instanceof
+                              value="org.eventb.core.IContextRoot">
+                        </instanceof>
+                     </or>
+                  </iterate>
+               </with>
+            </visibleWhen>
          </menu>
          <separator
                name="de.prob.ui.separator1"
                visible="true">
+                           <visibleWhen>
+               <with
+                     variable="selection">
+                  <iterate
+                        operator="or">
+                     <or>
+                        <instanceof
+                              value="org.eventb.core.IMachineRoot">
+                        </instanceof>
+                        <instanceof
+                              value="org.eventb.core.IContextRoot">
+                        </instanceof>
+                     </or>
+                  </iterate>
+               </with>
+            </visibleWhen>
          </separator>
       </menuContribution>
       <menuContribution
@@ -1093,7 +1164,7 @@
       <menuContribution
             locationURI="menu:de.prob.ui.opview.checks">
          <command
-               commandId="de.prob.ui.consistency_checking"
+               commandId="de.prob.ui.model_checking"
                icon="icons/Consistency.png"
                label="Model Checking"
                mnemonic="C"
@@ -1136,6 +1207,13 @@
                   mnemonic="C"
                   style="push">
             </command>
+            <command
+                  commandId="de.prob.ui.find_valid_state"
+                  icon="icons/CBCInvariantCheck.png"
+                  label="Find State satisfying Predicate"
+                  mnemonic="f"
+                  style="push">
+            </command>
          </menu>
       </menuContribution>
       <!--
diff --git a/de.prob.ui/src/de/prob/ui/assertion/AssertionCheckFinishedListener.java b/de.prob.ui/src/de/prob/ui/assertion/AssertionCheckFinishedListener.java
index 876a6b175ec9f51959b8bcff25d516833c44488a..4f8826d8280817a420e3f5c14c118903f7ee0498 100644
--- a/de.prob.ui/src/de/prob/ui/assertion/AssertionCheckFinishedListener.java
+++ b/de.prob.ui/src/de/prob/ui/assertion/AssertionCheckFinishedListener.java
@@ -47,7 +47,12 @@ public class AssertionCheckFinishedListener extends ProBJobFinishedListener {
 			message = "ProB did not return a result";
 		} else {
 			switch (result) {
-			case NO_COUNTER_EXAMPLE:
+			case NO_COUNTER_EXAMPLE_EXISTS:
+				dialogType = MessageDialog.INFORMATION;
+				dialogTitle = "No Counter-Example Exists";
+				message = "No Counter-Example to the Context Theorems exists.";
+				break;
+			case NO_COUNTER_EXAMPLE_FOUND:
 				dialogType = MessageDialog.INFORMATION;
 				dialogTitle = "No Counter-Example Found";
 				message = "No Counter-Example to the Context Theorems was found.";
diff --git a/de.prob.ui/src/de/prob/ui/deadlock/DeadlockCheckHandler.java b/de.prob.ui/src/de/prob/ui/deadlock/DeadlockCheckHandler.java
index 7a7dc427d17b0bb06333835cf760e085781d1316..293ce887871be5519d73a2764cb69efafdc763a2 100644
--- a/de.prob.ui/src/de/prob/ui/deadlock/DeadlockCheckHandler.java
+++ b/de.prob.ui/src/de/prob/ui/deadlock/DeadlockCheckHandler.java
@@ -17,9 +17,9 @@ import de.prob.core.LanguageDependendAnimationPart;
 import de.prob.core.ProBCommandJob;
 import de.prob.core.command.ConstraintBasedDeadlockCheckCommand;
 import de.prob.logging.Logger;
-import de.prob.parserbase.ProBParseException;
 import de.prob.parserbase.ProBParserBaseAdapter;
 import de.prob.prolog.term.PrologTerm;
+import de.prob.ui.validators.PredicateValidator;
 
 /**
  * This handler provides a simple dialog to ask for an optional predicate to
@@ -86,30 +86,4 @@ public class DeadlockCheckHandler extends AbstractHandler {
 		}
 		return predicate;
 	}
-
-	private static final class PredicateValidator implements IInputValidator {
-		final LanguageDependendAnimationPart ldp;
-
-		public PredicateValidator(final LanguageDependendAnimationPart ldp) {
-			this.ldp = ldp;
-		}
-
-		@Override
-		public String isValid(final String newText) {
-			if (newText.trim().isEmpty())
-				return null;
-			if (ldp == null)
-				return "Cannot parse predicates for the current formalism";
-			try {
-				final ProBParserBaseAdapter parser = new ProBParserBaseAdapter(
-						ldp);
-				parser.parsePredicate(newText, false);
-			} catch (UnsupportedOperationException e) {
-				return "The parser for this formalism cannot parse predicates";
-			} catch (ProBParseException e) {
-				return e.getLocalizedMessage();
-			}
-			return null;
-		}
-	}
 }
diff --git a/de.prob.ui/src/de/prob/ui/eventb/ConsistencyCheckCommand.java b/de.prob.ui/src/de/prob/ui/eventb/ModelCheckCommand.java
similarity index 87%
rename from de.prob.ui/src/de/prob/ui/eventb/ConsistencyCheckCommand.java
rename to de.prob.ui/src/de/prob/ui/eventb/ModelCheckCommand.java
index f399fd2f45dce3d8e20393080bd39523d9816be3..16479403cb9bdf6dfbf7d7bb10acc706e69d8b2c 100644
--- a/de.prob.ui/src/de/prob/ui/eventb/ConsistencyCheckCommand.java
+++ b/de.prob.ui/src/de/prob/ui/eventb/ModelCheckCommand.java
@@ -14,9 +14,9 @@ import de.prob.core.Animator;
 import de.prob.ui.PerspectiveFactory;
 import de.prob.ui.ProbUiPlugin;
 
-public class ConsistencyCheckCommand extends AbstractHandler implements
-		IHandler {
+public class ModelCheckCommand extends AbstractHandler implements IHandler {
 
+	@Override
 	public Object execute(final ExecutionEvent event) throws ExecutionException {
 		PerspectiveFactory.openPerspective();
 
@@ -31,7 +31,7 @@ public class ConsistencyCheckCommand extends AbstractHandler implements
 			return null;
 		}
 
-		ConsistencyCheckingDialog md = new ConsistencyCheckingDialog(shell);
+		ModelCheckingDialog md = new ModelCheckingDialog(shell);
 
 		md.setBlockOnOpen(true);
 
diff --git a/de.prob.ui/src/de/prob/ui/eventb/ConsistencyCheckingDialog.java b/de.prob.ui/src/de/prob/ui/eventb/ModelCheckingDialog.java
similarity index 81%
rename from de.prob.ui/src/de/prob/ui/eventb/ConsistencyCheckingDialog.java
rename to de.prob.ui/src/de/prob/ui/eventb/ModelCheckingDialog.java
index 614f7c18ec6aa13c3d41836cbafccd15589cee38..b3aef5857ee502c296c91b039c33d8f05f58697e 100644
--- a/de.prob.ui/src/de/prob/ui/eventb/ConsistencyCheckingDialog.java
+++ b/de.prob.ui/src/de/prob/ui/eventb/ModelCheckingDialog.java
@@ -22,11 +22,11 @@ import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Group;
 import org.eclipse.swt.widgets.Shell;
 
-import de.prob.core.command.ConsistencyCheckingSearchOption;
+import de.prob.core.command.ModelCheckingSearchOption;
 import de.prob.core.command.SymmetryReductionOption;
 import de.prob.ui.DialogHelpers;
 
-public class ConsistencyCheckingDialog extends Dialog {
+public class ModelCheckingDialog extends Dialog {
 
 	private final class StartButtonSelectionListener implements
 			SelectionListener {
@@ -39,19 +39,20 @@ public class ConsistencyCheckingDialog extends Dialog {
 			this.symmetry = symmetry;
 		}
 
+		@Override
 		public void widgetSelected(final SelectionEvent e) {
 			String symmetryOption = selectSymmetryOption(symmetry);
-			Set<ConsistencyCheckingSearchOption> selectSettings = selectSettings(checks);
+			Set<ModelCheckingSearchOption> selectSettings = selectSettings(checks);
 			scheduleJob(selectSettings, symmetryOption);
 			close();
 		}
 
-		private Set<ConsistencyCheckingSearchOption> selectSettings(
+		private Set<ModelCheckingSearchOption> selectSettings(
 				final Button[] checks) {
-			HashSet<ConsistencyCheckingSearchOption> result = new HashSet<ConsistencyCheckingSearchOption>();
+			HashSet<ModelCheckingSearchOption> result = new HashSet<ModelCheckingSearchOption>();
 			for (int i = 0; i < checks.length; i++) {
 				if (checks[i].getSelection()) {
-					result.add(ConsistencyCheckingSearchOption.get(i));
+					result.add(ModelCheckingSearchOption.get(i));
 				}
 			}
 			return result;
@@ -69,15 +70,17 @@ public class ConsistencyCheckingDialog extends Dialog {
 		}
 
 		private void scheduleJob(
-				final Set<ConsistencyCheckingSearchOption> selectSettings,
+				final Set<ModelCheckingSearchOption> selectSettings,
 				final String symmetryOption) {
-			job = new ConsistencyCheckingJob("Consistency Checking",
-					selectSettings, symmetryOption);
+			job = new ModelCheckingJob("Model Checking", selectSettings,
+					symmetryOption);
 			job.setUser(true);
-			job.addJobChangeListener(new ConsistencyCheckingFinishedListener(shell));
+			job.addJobChangeListener(new ModelCheckingFinishedListener(
+					shell));
 			job.schedule();
 		}
 
+		@Override
 		public void widgetDefaultSelected(final SelectionEvent e) {
 			// Do nothing
 		}
@@ -87,7 +90,7 @@ public class ConsistencyCheckingDialog extends Dialog {
 	private final Shell shell;
 	private Button startButton;
 
-	protected ConsistencyCheckingDialog(final Shell shell) {
+	protected ModelCheckingDialog(final Shell shell) {
 		super(shell);
 		this.shell = shell;
 	}
@@ -109,7 +112,7 @@ public class ConsistencyCheckingDialog extends Dialog {
 
 		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
 		startButton = new Button(comp, SWT.PUSH);
-		startButton.setText("Start Consistency Checking");
+		startButton.setText("Start Model Checking");
 		startButton.setLayoutData(data);
 		startButton.addSelectionListener(new StartButtonSelectionListener(
 				checks, symmetry));
@@ -133,7 +136,7 @@ public class ConsistencyCheckingDialog extends Dialog {
 
 	private Button[] createSettingsGroup(final Composite c) {
 		Group group = DialogHelpers.createGroup(c, "Settings");
-		final ConsistencyCheckingSearchOption[] options = ConsistencyCheckingSearchOption
+		final ModelCheckingSearchOption[] options = ModelCheckingSearchOption
 				.values();
 		final Button[] checks = new Button[options.length];
 
@@ -153,7 +156,7 @@ public class ConsistencyCheckingDialog extends Dialog {
 	@Override
 	protected void configureShell(final Shell shell) {
 		super.configureShell(shell);
-		shell.setText("Consistency Checking");
+		shell.setText("Model Checking");
 	}
 
 }
diff --git a/de.prob.ui/src/de/prob/ui/eventb/ConsistencyCheckingFinishedListener.java b/de.prob.ui/src/de/prob/ui/eventb/ModelCheckingFinishedListener.java
similarity index 95%
rename from de.prob.ui/src/de/prob/ui/eventb/ConsistencyCheckingFinishedListener.java
rename to de.prob.ui/src/de/prob/ui/eventb/ModelCheckingFinishedListener.java
index 0033754c8c5ae6bfc19e203639b8e3b12c0f9d46..1da3693b1965cd83b49aeb8aa1d3f8fe0dc13434 100644
--- a/de.prob.ui/src/de/prob/ui/eventb/ConsistencyCheckingFinishedListener.java
+++ b/de.prob.ui/src/de/prob/ui/eventb/ModelCheckingFinishedListener.java
@@ -21,21 +21,21 @@ import de.prob.core.Animator;
 import de.prob.core.ProblemHandler;
 import de.prob.core.command.ComputeCoverageCommand;
 import de.prob.core.command.ComputeCoverageCommand.ComputeCoverageResult;
-import de.prob.core.command.ConsistencyCheckingCommand.Result;
 import de.prob.core.command.GetTraceCommand;
+import de.prob.core.command.ModelCheckingCommand.Result;
 import de.prob.core.command.ReplayTraceCommand;
 import de.prob.exceptions.ProBException;
 import de.prob.logging.Logger;
 import de.prob.ui.ProbUiPlugin;
 
-public class ConsistencyCheckingFinishedListener extends JobChangeAdapter {
+public class ModelCheckingFinishedListener extends JobChangeAdapter {
 
 	private static final String SEPARATOR_LINE = "===================================================";
 	private static final String PLUGIN_ID = ProbUiPlugin.PLUGIN_ID;
 	private final Shell shell;
 	private final Animator animator = Animator.getAnimator();
 
-	public ConsistencyCheckingFinishedListener(final Shell shell) {
+	public ModelCheckingFinishedListener(final Shell shell) {
 		this.shell = shell;
 	}
 
@@ -43,11 +43,11 @@ public class ConsistencyCheckingFinishedListener extends JobChangeAdapter {
 	public void done(final IJobChangeEvent event) {
 		super.done(event);
 		Job job = event.getJob();
-		if (job instanceof ConsistencyCheckingJob) {
-			ConsistencyCheckingJob ccJob = (ConsistencyCheckingJob) job;
+		if (job instanceof ModelCheckingJob) {
+			ModelCheckingJob ccJob = (ModelCheckingJob) job;
 			showResult(ccJob.getModelCheckingResult());
 		} else {
-			final String message = "The job has a wrong type. Expected ConsistencyCheckingJob but got "
+			final String message = "The job has a wrong type. Expected ModelCheckingJob but got "
 					+ job.getClass();
 			Logger.notifyUserWithoutBugreport(message);
 		}
@@ -205,6 +205,7 @@ public class ConsistencyCheckingFinishedListener extends JobChangeAdapter {
 
 	private void displayResult(final MultiStatus info) {
 		shell.getDisplay().asyncExec(new Runnable() {
+			@Override
 			public void run() {
 				ErrorDialog.openError(shell, "Model Checking finished", null,
 						info);
diff --git a/de.prob.ui/src/de/prob/ui/eventb/ConsistencyCheckingJob.java b/de.prob.ui/src/de/prob/ui/eventb/ModelCheckingJob.java
similarity index 53%
rename from de.prob.ui/src/de/prob/ui/eventb/ConsistencyCheckingJob.java
rename to de.prob.ui/src/de/prob/ui/eventb/ModelCheckingJob.java
index 704f467afbdd8d33712eace55a9b4cd636678ee1..3081f89c204cc77fd1721fbf70153c1fc658e1ea 100644
--- a/de.prob.ui/src/de/prob/ui/eventb/ConsistencyCheckingJob.java
+++ b/de.prob.ui/src/de/prob/ui/eventb/ModelCheckingJob.java
@@ -6,37 +6,31 @@
 
 package de.prob.ui.eventb;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.*;
 import org.eclipse.core.runtime.jobs.Job;
 
 import de.prob.core.Animator;
-import de.prob.core.command.ConsistencyCheckingCommand;
-import de.prob.core.command.ConsistencyCheckingSearchOption;
-import de.prob.core.command.SetPreferenceCommand;
-import de.prob.core.command.ConsistencyCheckingCommand.Result;
+import de.prob.core.command.*;
+import de.prob.core.command.ModelCheckingCommand.Result;
 import de.prob.exceptions.ProBException;
 
-public class ConsistencyCheckingJob extends Job {
+public class ModelCheckingJob extends Job {
 
 	private final Animator animator = Animator.getAnimator();
 	private boolean abort = false;
 	private final List<String> options;
 	private final String symmetryOption;
-	private Result modelCheckingResult = null;
+	private ModelCheckingResult<Result> modelCheckingResult = null;
+	private int workedSoFar = 0;
 
-	public ConsistencyCheckingJob(final String name,
-			final Set<ConsistencyCheckingSearchOption> options,
+	public ModelCheckingJob(final String name,
+			final Set<ModelCheckingSearchOption> options,
 			final String symmetryOption) {
 		super(name);
 		List<String> optlist = new ArrayList<String>();
-		for (ConsistencyCheckingSearchOption modelCheckingOption : options) {
+		for (ModelCheckingSearchOption modelCheckingOption : options) {
 			optlist.add(modelCheckingOption.name());
 		}
 		this.options = optlist;
@@ -44,7 +38,7 @@ public class ConsistencyCheckingJob extends Job {
 	}
 
 	public Result getModelCheckingResult() {
-		return modelCheckingResult;
+		return modelCheckingResult.getResult();
 	}
 
 	@Override
@@ -53,16 +47,28 @@ public class ConsistencyCheckingJob extends Job {
 			return Status.CANCEL_STATUS;
 		}
 
-		monitor.beginTask("Model checking", IProgressMonitor.UNKNOWN);
+		monitor.beginTask("Model Checking", 1000);
 		while (!abort) {
 			try {
 				modelCheckingResult = doSomeModelchecking();
 				options.remove("inspect_existing_nodes");
-				monitor.worked(500);
+
+				monitor.setTaskName("Model Checking - States: "
+						+ modelCheckingResult.getNumStates()
+						+ " (processed "
+						+ modelCheckingResult.getProcessedTotal()
+						+ ") - Transitions: "
+						+ modelCheckingResult.getNumTransitions());
+
+				int difference = modelCheckingResult.getWorked() - workedSoFar;
+				if (difference > 0) {
+					monitor.worked(difference);
+					workedSoFar = modelCheckingResult.getWorked();
+				}
 			} catch (ProBException e) {
 				return Status.CANCEL_STATUS; // Failed
 			}
-			abort = modelCheckingResult.isAbort() || monitor.isCanceled();
+			abort = getModelCheckingResult().isAbort() || monitor.isCanceled();
 		}
 		return Status.OK_STATUS;
 	}
@@ -77,9 +83,9 @@ public class ConsistencyCheckingJob extends Job {
 		return true;
 	}
 
-	private Result doSomeModelchecking() throws ProBException {
-		return ConsistencyCheckingCommand.modelcheck(animator, 500, options)
-				.getResult();
+	private ModelCheckingResult<Result> doSomeModelchecking()
+			throws ProBException {
+		return ModelCheckingCommand.modelcheck(animator, 500, options);
 	}
 
 }
diff --git a/de.prob.ui/src/de/prob/ui/eventb/StartAnimationHandler.java b/de.prob.ui/src/de/prob/ui/eventb/StartAnimationHandler.java
index 108ceed9f0c649efec04a1b682c08d766c138776..3c08dfd085230c7de006e6e4b04c5185c1ff8608 100644
--- a/de.prob.ui/src/de/prob/ui/eventb/StartAnimationHandler.java
+++ b/de.prob.ui/src/de/prob/ui/eventb/StartAnimationHandler.java
@@ -36,7 +36,6 @@ import de.prob.exceptions.ProBException;
 import de.prob.logging.Logger;
 import de.prob.ui.PerspectiveFactory;
 import de.prob.ui.services.ContextLoadedProvider;
-import de.prob.ui.services.ModelLoadedProvider;
 
 public class StartAnimationHandler extends AbstractHandler implements IHandler {
 
@@ -148,10 +147,10 @@ public class StartAnimationHandler extends AbstractHandler implements IHandler {
 		}
 		return root;
 	}
-	
+
 	private void updateContextLoadedProvider(boolean isContext) {
-		ISourceProviderService service = (ISourceProviderService) 
-				PlatformUI.getWorkbench().getService(ISourceProviderService.class);
+		ISourceProviderService service = (ISourceProviderService) PlatformUI
+				.getWorkbench().getService(ISourceProviderService.class);
 		ContextLoadedProvider sourceProvider = (ContextLoadedProvider) service
 				.getSourceProvider(ContextLoadedProvider.SERVICE);
 		sourceProvider.setEnabled(isContext);
diff --git a/de.prob.ui/src/de/prob/ui/findvalidstate/FindValidStateFinishedListener.java b/de.prob.ui/src/de/prob/ui/findvalidstate/FindValidStateFinishedListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..bc3d75a4c906554d0b5c1cbceef60ad1853c3c35
--- /dev/null
+++ b/de.prob.ui/src/de/prob/ui/findvalidstate/FindValidStateFinishedListener.java
@@ -0,0 +1,94 @@
+/**
+ * 
+ */
+package de.prob.ui.findvalidstate;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+
+import de.prob.core.Animator;
+import de.prob.core.ProBJobFinishedListener;
+import de.prob.core.command.ExecuteOperationCommand;
+import de.prob.core.command.FindValidStateCommand;
+import de.prob.core.command.FindValidStateCommand.ResultType;
+import de.prob.core.command.IComposableCommand;
+import de.prob.core.domainobjects.Operation;
+import de.prob.exceptions.ProBException;
+import de.prob.logging.Logger;
+
+public class FindValidStateFinishedListener extends ProBJobFinishedListener {
+	private final Shell shell;
+
+	public FindValidStateFinishedListener(final Shell shell) {
+		this.shell = shell;
+	}
+
+	@Override
+	protected void showResult(final IComposableCommand cmd,
+			final Animator animator) {
+		final FindValidStateCommand command = (FindValidStateCommand) cmd;
+		final ResultType result = command.getResult();
+		final int dialogType;
+		final String dialogTitle;
+		final String message;
+		if (result == null) {
+			dialogType = MessageDialog.ERROR;
+			dialogTitle = "Errow During Deadlock Freedom Check";
+			message = "ProB did not return a result";
+		} else {
+			switch (result) {
+			case NO_STATE_FOUND:
+				dialogType = MessageDialog.WARNING;
+				dialogTitle = "No State Found";
+				message = "No State satisfying both the Invariant and the Predicate was found.";
+				break;
+			case ERROR:
+				dialogType = MessageDialog.ERROR;
+				dialogTitle = "Errow During Search for Valid State";
+				message = "An unexpected error occurred while typechecking the given predicate.";
+				break;
+			case STATE_FOUND:
+				dialogType = MessageDialog.INFORMATION;
+				dialogTitle = "State found";
+				message = "The model contains a state satisfying the given predicate and the invariant, it will be shown in the state view.";
+				displayState(command, animator);
+				break;
+			case INTERRUPTED:
+				dialogType = MessageDialog.WARNING;
+				dialogTitle = "User Interrupt";
+				message = "The search has been interrupted by the user or a time-out.";
+				break;
+			default:
+				Logger.notifyUser("Unexpected result: " + result);
+				return;
+			}
+		}
+		if (shell.isDisposed()) {
+			System.out.println("Deadlock freedom check finished: "
+					+ dialogTitle);
+		} else {
+			final Runnable runnable = new Runnable() {
+				@Override
+				public void run() {
+					MessageDialog.open(dialogType, shell, dialogTitle, message,
+							SWT.NONE);
+				}
+			};
+			shell.getDisplay().asyncExec(runnable);
+		}
+	}
+
+	private void displayState(final FindValidStateCommand cmd,
+			final Animator animator) {
+		final Operation operation = cmd.getOperation();
+		try {
+			// we do not reset the history because we want to keep the root
+			// state, we just start a new path from root
+			animator.getHistory().gotoPos(0);
+			ExecuteOperationCommand.executeOperation(animator, operation);
+		} catch (ProBException e) {
+			e.notifyUserOnce();
+		}
+	}
+}
diff --git a/de.prob.ui/src/de/prob/ui/findvalidstate/FindValidStateHandler.java b/de.prob.ui/src/de/prob/ui/findvalidstate/FindValidStateHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..9de29c8f68fe1ecf9389c2c5ef37a29a778e584c
--- /dev/null
+++ b/de.prob.ui/src/de/prob/ui/findvalidstate/FindValidStateHandler.java
@@ -0,0 +1,89 @@
+/**
+ * 
+ */
+package de.prob.ui.findvalidstate;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+import de.prob.core.Animator;
+import de.prob.core.LanguageDependendAnimationPart;
+import de.prob.core.ProBCommandJob;
+import de.prob.core.command.FindValidStateCommand;
+import de.prob.logging.Logger;
+import de.prob.parserbase.ProBParserBaseAdapter;
+import de.prob.prolog.term.PrologTerm;
+import de.prob.ui.validators.PredicateValidator;
+
+/**
+ * This handler provides a simple dialog to ask for an optional predicate to
+ * check for deadlocks in the model.
+ * 
+ * @author krings
+ */
+public class FindValidStateHandler extends AbstractHandler {
+	@Override
+	public Object execute(final ExecutionEvent event) throws ExecutionException {
+		final Shell shell = HandlerUtil.getActiveShell(event);
+		if (Animator.getAnimator().isMachineLoaded()) {
+			findValidState(shell);
+		} else {
+			Logger.notifyUser("No ProB animation running. This is a bug. Please submit a report. Error in declaraion for class DeadlockCheckHandler");
+		}
+		return null;
+	}
+
+	private void findValidState(final Shell shell) throws ExecutionException {
+		final Animator animator = Animator.getAnimator();
+		final LanguageDependendAnimationPart ldp = animator
+				.getLanguageDependendPart();
+		final IInputValidator validator = new PredicateValidator(ldp);
+		final InputDialog dialog = new InputDialog(
+				shell,
+				"Find Valid State Freedom Check",
+				"ProB will try to find a state satisfying the invariant and the predicate:",
+				"1=1", validator);
+		final int status = dialog.open();
+		if (status == InputDialog.OK) {
+			startFindState(animator, ldp, dialog.getValue(), shell);
+		}
+	}
+
+	private void startFindState(final Animator animator,
+			final LanguageDependendAnimationPart ldp, final String value,
+			final Shell shell) throws ExecutionException {
+		final PrologTerm predicate = parsePredicate(ldp, value);
+		final FindValidStateCommand command = new FindValidStateCommand(
+				predicate);
+		final Job job = new ProBCommandJob(
+				"Searching for State satisfying Predicate", animator, command);
+		job.setUser(true);
+		job.addJobChangeListener(new FindValidStateFinishedListener(shell));
+		job.schedule();
+	}
+
+	private PrologTerm parsePredicate(final LanguageDependendAnimationPart ldp,
+			final String input) throws ExecutionException {
+		final PrologTerm predicate;
+		if (input != null && input.trim().isEmpty()) {
+			predicate = null;
+		} else {
+			try {
+				final ProBParserBaseAdapter parser = new ProBParserBaseAdapter(
+						ldp);
+				predicate = parser.parsePredicate(input, false);
+			} catch (Exception e) {
+				throw (new ExecutionException(
+						"Exception while parsing the input", e));
+			}
+		}
+		return predicate;
+	}
+
+}
diff --git a/de.prob.ui/src/de/prob/ui/historyview/HistoryElementLabelProvider.java b/de.prob.ui/src/de/prob/ui/historyview/HistoryElementLabelProvider.java
index 037673f10de18486b1ad020cc83a3c98bde1b40d..81424230f827338106a1bfd6a1a66bd27fed2f53 100644
--- a/de.prob.ui/src/de/prob/ui/historyview/HistoryElementLabelProvider.java
+++ b/de.prob.ui/src/de/prob/ui/historyview/HistoryElementLabelProvider.java
@@ -32,6 +32,7 @@ public class HistoryElementLabelProvider extends HistoryLabelProvider {
 
 	@Override
 	protected Color getForeground(final HistViewItem item) {
-		return slProvider.getForeground(item.getDestination(), sse);
+		// set changed to false, as we do not have the state here
+		return slProvider.getForeground(item.getDestination(), false, sse);
 	}
 }
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 818e3e2bea695445c1ac6f19f0e9c0bd8abc3e79..fc08cec6bc200e82415a8e1578d03cc37829d866 100644
--- a/de.prob.ui/src/de/prob/ui/historyview/HistoryLabelProvider.java
+++ b/de.prob.ui/src/de/prob/ui/historyview/HistoryLabelProvider.java
@@ -24,7 +24,7 @@ public abstract class HistoryLabelProvider extends CellLabelProvider {
 	final Font bold = JFaceResources.getFontRegistry().getBold(
 			JFaceResources.BANNER_FONT);
 
-	protected boolean showParameters;
+	protected boolean showParameters = true;
 
 	@Override
 	public void update(final ViewerCell cell) {
diff --git a/de.prob.ui/src/de/prob/ui/operationview/CustomPreconditionDialogHandler.java b/de.prob.ui/src/de/prob/ui/operationview/CustomPreconditionDialogHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..899c26b7e23b86465c44df14367b42719b3592ad
--- /dev/null
+++ b/de.prob.ui/src/de/prob/ui/operationview/CustomPreconditionDialogHandler.java
@@ -0,0 +1,49 @@
+package de.prob.ui.operationview;
+
+import java.util.*;
+
+import org.eclipse.core.commands.*;
+
+import de.prob.core.Animator;
+import de.prob.core.command.ExecuteOperationCommand;
+import de.prob.core.domainobjects.Operation;
+import de.prob.exceptions.ProBException;
+import de.prob.logging.Logger;
+
+public class CustomPreconditionDialogHandler extends AbstractHandler implements
+		IHandler {
+
+	@Override
+	public Object execute(final ExecutionEvent event) throws ExecutionException {
+
+		List<Operation> s = OperationTableViewer.getInstance()
+				.getSelectedOperations();
+		List<Operation> filtered = new ArrayList<Operation>();
+		List<String> seenNames = new ArrayList<String>();
+
+		for (Operation op : s) {
+			if (!seenNames.contains(op.getName())) {
+				seenNames.add(op.getName());
+				filtered.add(op);
+			}
+		}
+
+		if (filtered.size() != 1) {
+			Logger.notifyUser(filtered.size()
+					+ " operations selected. An additional Guard can only be added to a single operation");
+			return null;
+		}
+
+		Operation op = CustomPreconditionInputDialog.getOperation(filtered
+				.get(0));
+		if (op == null)
+			return null;
+		try {
+			ExecuteOperationCommand
+					.executeOperation(Animator.getAnimator(), op);
+		} catch (ProBException e) {
+			e.notifyUserOnce();
+		}
+		return null;
+	}
+}
diff --git a/de.prob.ui/src/de/prob/ui/operationview/CustomPreconditionInputDialog.java b/de.prob.ui/src/de/prob/ui/operationview/CustomPreconditionInputDialog.java
new file mode 100644
index 0000000000000000000000000000000000000000..43f4062017240e615f21e48433d1faa5e3379add
--- /dev/null
+++ b/de.prob.ui/src/de/prob/ui/operationview/CustomPreconditionInputDialog.java
@@ -0,0 +1,77 @@
+/** 
+ * (c) 2013 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.ui.operationview;
+
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.swt.widgets.Shell;
+
+import de.be4.classicalb.core.parser.exceptions.BException;
+import de.prob.core.Animator;
+import de.prob.core.command.*;
+import de.prob.core.domainobjects.Operation;
+import de.prob.exceptions.ProBException;
+import de.prob.unicode.UnicodeTranslator;
+
+public class CustomPreconditionInputDialog extends InputDialog {
+
+	private final Animator animator;
+	private final Operation op;
+
+	public CustomPreconditionInputDialog(final Shell parentShell, Operation op) {
+		super(parentShell, "Execute with additional Guard", getMenuText(op),
+				"", new EventBInputValidator());
+		this.op = op;
+		animator = Animator.getAnimator();
+	}
+
+	private static String getMenuText(Operation op) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("Enter Guard to be added to the Event \"");
+		sb.append(op.getName());
+		sb.append("\" before execution.");
+
+		// sb.append("\nYou may use the parameters: ");
+
+		// List<String> arguments = op.getArguments();
+		// for (int i = 0; i < arguments.size() - 1; i++) {
+		// sb.append(arguments.get(i));
+		// sb.append("' ");
+		// }
+		// sb.append(arguments.get(arguments.size() - 1));
+
+		return sb.toString();
+	}
+
+	private Operation getCustomOperation() {
+		try {
+			Operation customOp = GetOperationByPredicateCommand2.getOperation(
+					animator, op.getSource(),
+					Operation.getInternalName(op.getName()),
+					UnicodeTranslator.toUnicode(getValue()));
+
+			ExecuteOperationCommand.executeOperation(animator, customOp);
+		} catch (ProBException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (BException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		return null;
+	}
+
+	public static Operation getOperation(Operation op) {
+		CustomPreconditionInputDialog osd = new CustomPreconditionInputDialog(
+				new Shell(), op);
+		if (osd.open() == InputDialog.OK)
+			return osd.getCustomOperation();
+		else
+			return null;
+	}
+
+}
diff --git a/de.prob.ui/src/de/prob/ui/operationview/EventBInputValidator.java b/de.prob.ui/src/de/prob/ui/operationview/EventBInputValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..1fc14af3a397db2a0d7b443cbb1eaaa1caef69db
--- /dev/null
+++ b/de.prob.ui/src/de/prob/ui/operationview/EventBInputValidator.java
@@ -0,0 +1,22 @@
+package de.prob.ui.operationview;
+
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eventb.core.ast.FormulaFactory;
+import org.eventb.core.ast.IParseResult;
+
+import de.prob.unicode.UnicodeTranslator;
+
+class EventBInputValidator implements IInputValidator {
+	@Override
+	public String isValid(String newText) {
+		String formula = newText.equals("") ? newText : UnicodeTranslator
+				.toUnicode(newText);
+
+		IParseResult result = FormulaFactory.getDefault().parsePredicate(
+				formula, null);
+		if (result.hasProblem()) {
+			return "No Event-B Predicate";
+		}
+		return null;
+	}
+}
\ No newline at end of file
diff --git a/de.prob.ui/src/de/prob/ui/operationview/GetOperationByPredicateCommand2.java b/de.prob.ui/src/de/prob/ui/operationview/GetOperationByPredicateCommand2.java
new file mode 100644
index 0000000000000000000000000000000000000000..426a67f11bd91604c95eb1a98c9d91424d27bfe8
--- /dev/null
+++ b/de.prob.ui/src/de/prob/ui/operationview/GetOperationByPredicateCommand2.java
@@ -0,0 +1,173 @@
+/**
+ * (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.ui.operationview;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eventb.core.ast.FormulaFactory;
+import org.eventb.core.ast.IParseResult;
+import org.eventb.core.ast.Predicate;
+
+import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog;
+import de.be4.classicalb.core.parser.exceptions.BException;
+import de.prob.core.Animator;
+import de.prob.core.ProblemHandler;
+import de.prob.core.command.CommandException;
+import de.prob.core.command.IComposableCommand;
+import de.prob.core.domainobjects.Operation;
+import de.prob.core.domainobjects.eval.PredicateEvalElement;
+import de.prob.exceptions.ProBException;
+import de.prob.parser.ISimplifiedROMap;
+import de.prob.prolog.output.IPrologTermOutput;
+import de.prob.prolog.term.ListPrologTerm;
+import de.prob.prolog.term.PrologTerm;
+
+/**
+ * Command to execute an event that has not been enumerated by ProB, for further
+ * information see ({@link #getOperation})
+ * 
+ * @author Jens Bendisposto
+ * 
+ */
+
+// Kind of a hack for PROBPLUGIN-88
+public final class GetOperationByPredicateCommand2 implements
+		IComposableCommand {
+
+	private static final String NEW_STATE_ID_VARIABLE = "NewStateID";
+	private final PredicateEvalElement evalElement;
+	private final String stateId;
+	private final String name;
+	private List<Operation> operation;
+	private final int nrOfSolutions;
+
+	private GetOperationByPredicateCommand2() {
+		throw new UnsupportedOperationException("Do not call this constructor");
+	}
+
+	private GetOperationByPredicateCommand2(final String stateId,
+			final String name, final String predicate, final int nrOfSolutions)
+			throws CommandException {
+		this.stateId = stateId;
+		this.name = name;
+		this.nrOfSolutions = nrOfSolutions;
+		PredicateEvalElement parsedEvalElement = null;
+
+		IParseResult result = FormulaFactory.getDefault().parsePredicate(
+				predicate, null);
+		Predicate parsedPredicate = result.getParsedPredicate();
+
+		try {
+			parsedEvalElement = PredicateEvalElement.fromRodin(parsedPredicate);
+		} catch (BException e) {
+			String message = "Fatal error when trying to parse " + predicate
+					+ ". Execution of operation " + name + " aborted.";
+			ProblemHandler.raiseCommandException(message);
+			parsedEvalElement = null;
+		} finally {
+			evalElement = parsedEvalElement;
+		}
+	}
+
+	/**
+	 * Works like @see getOperations but returns a single solution
+	 */
+	public static Operation getOperation(final Animator a,
+			final String stateId, final String name, final String predicate)
+			throws ProBException, BException {
+
+		List<Operation> operations = getOperations(a, stateId, name, predicate,
+				1);
+
+		return operations == null ? null : operations.get(0);
+	}
+
+	/**
+	 * Tries to find a valid transition from the state <em>stateId</em>
+	 * satisfying a B <em>predicate</em> . Returns either null if no event
+	 * satisfying <em></em> was found by ProB or an Operation object that can be
+	 * executed using ExecuteOperationCommand.
+	 * 
+	 * @param animator
+	 *            - Animator Instance
+	 * @param stateId
+	 *            - The state in which the event should be fired
+	 * @param name
+	 *            - The event's name
+	 * @param predicate
+	 *            - Additional guarding predicate
+	 * @param nrOfSolutions
+	 *            - maximum number of solutions
+	 * @return an Operation or null
+	 * @throws BException
+	 *             - if the B predicate contains errors
+	 * @throws ProBException
+	 *             - if something terrible happens ;-)
+	 */
+	public static List<Operation> getOperations(final Animator a,
+			final String stateId, final String name, final String predicate,
+			final int nrOfSolutions) throws ProBException, BException {
+
+		GetOperationByPredicateCommand2 executeOperationCommand = new GetOperationByPredicateCommand2(
+				stateId, name, predicate, nrOfSolutions);
+		if (executeOperationCommand.evalElement != null) {
+			a.execute(executeOperationCommand);
+		}
+		return executeOperationCommand.getOperation();
+	}
+
+	/**
+	 * This method is called when the command is prepared for sending. The
+	 * method is called by the Animator class, most likely it is not interesting
+	 * for other classes.
+	 * 
+	 * @see de.prob.core.command.IComposableCommand#writeCommand(de.prob.prolog.output.IPrologTermOutput)
+	 */
+	@Override
+	public void writeCommand(final IPrologTermOutput pto) {
+		pto.openTerm("execute_custom_operations").printAtomOrNumber(stateId)
+				.printAtom(name);
+		final ASTProlog prolog = new ASTProlog(pto, null);
+		evalElement.getPrologAst().apply(prolog);
+		pto.printNumber(nrOfSolutions);
+		pto.printVariable(NEW_STATE_ID_VARIABLE);
+		pto.printVariable("Errors").closeTerm();
+	}
+
+	/**
+	 * This method is called to extract relevant information from ProB's answer.
+	 * The method is called by the Animator class, most likely it is not
+	 * interesting for other classes.
+	 * 
+	 * @see de.prob.core.command.IComposableCommand#writeCommand(de.prob.prolog.output.IPrologTermOutput)
+	 */
+	@Override
+	public void processResult(
+			final ISimplifiedROMap<String, PrologTerm> bindings)
+			throws CommandException {
+
+		ListPrologTerm list = (ListPrologTerm) bindings
+				.get(NEW_STATE_ID_VARIABLE);
+
+		if (list.isEmpty()) {
+			operation = null;
+		} else {
+			ArrayList<Operation> result = new ArrayList<Operation>();
+			for (PrologTerm prologTerm : list) {
+				Operation op = Operation.fromPrologTerm(prologTerm);
+				result.add(op);
+			}
+			operation = result;
+		}
+	}
+
+	private List<Operation> getOperation() {
+		return operation;
+	}
+
+}
diff --git a/de.prob.ui/src/de/prob/ui/operationview/OperationTableViewer.java b/de.prob.ui/src/de/prob/ui/operationview/OperationTableViewer.java
index e6e1b7352db04f6805d2ccd57000c7fc45a7f11a..0bf727c251f7d4a96dd5d5ab16eef7a49deef6b4 100644
--- a/de.prob.ui/src/de/prob/ui/operationview/OperationTableViewer.java
+++ b/de.prob.ui/src/de/prob/ui/operationview/OperationTableViewer.java
@@ -1,34 +1,21 @@
 package de.prob.ui.operationview;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
+import java.util.*;
 import java.util.List;
-import java.util.Random;
 
-import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.*;
 import org.eclipse.core.commands.State;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.viewers.*;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.widgets.*;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.commands.ICommandService;
 import org.eclipse.ui.handlers.IHandlerService;
 
-import de.prob.core.Animator;
-import de.prob.core.LimitedLogger;
-import de.prob.core.command.ExecuteOperationCommand;
-import de.prob.core.command.GetOperationNamesCommand;
-import de.prob.core.domainobjects.Operation;
-import de.prob.core.domainobjects.OperationInfo;
+import de.prob.core.*;
+import de.prob.core.command.*;
+import de.prob.core.domainobjects.*;
 import de.prob.exceptions.ProBException;
 import de.prob.logging.Logger;
 
@@ -54,6 +41,7 @@ public class OperationTableViewer {
 	};
 
 	private OperationTableViewer(final Composite parent, final int style) {
+		parent.addDisposeListener(new TableDisposedListener());
 		viewer = new TableViewer(parent, style);
 		createColumns();
 		viewer.setContentProvider(new OperationsContentProvider(operationNames));
@@ -128,6 +116,7 @@ public class OperationTableViewer {
 	 */
 	private class OTVDoubleClickListener implements IDoubleClickListener {
 
+		@Override
 		public void doubleClick(final DoubleClickEvent event) {
 			if (!getSelectedOperations().isEmpty()) {
 				LimitedLogger.getLogger().log("user chooses event", null, null);
@@ -154,6 +143,16 @@ public class OperationTableViewer {
 
 	}
 
+	/**
+	 * Listener that destroys the instance, if the parent object is disposed
+	 */
+	private class TableDisposedListener implements DisposeListener {
+		@Override
+		public void widgetDisposed(DisposeEvent e) {
+			destroy();
+		}
+	}
+
 	/**
 	 * Executes a random operation.
 	 */
diff --git a/de.prob.ui/src/de/prob/ui/operationview/OperationViewPart.java b/de.prob.ui/src/de/prob/ui/operationview/OperationViewPart.java
index 5725774b6b500b8ab442789c6163235a80d789d9..c53361a0cd9485ac36d94e3dbe2531cf2aa8281a 100644
--- a/de.prob.ui/src/de/prob/ui/operationview/OperationViewPart.java
+++ b/de.prob.ui/src/de/prob/ui/operationview/OperationViewPart.java
@@ -6,22 +6,15 @@
 
 package de.prob.ui.operationview;
 
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.action.*;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.*;
 import org.eclipse.ui.IWorkbenchActionConstants;
 import org.eclipse.ui.services.ISourceProviderService;
 
-import de.prob.core.domainobjects.Operation;
-import de.prob.core.domainobjects.State;
+import de.prob.core.domainobjects.*;
 import de.prob.ui.StateBasedViewPart;
 import de.prob.ui.services.ModelLoadedProvider;
 
@@ -62,11 +55,13 @@ public class OperationViewPart extends StateBasedViewPart implements
 		MenuManager menuMgr = new MenuManager("#PopupMenu");
 		menuMgr.setRemoveAllWhenShown(true);
 		menuMgr.addMenuListener(new IMenuListener() {
+			@Override
 			public void menuAboutToShow(final IMenuManager manager) {
 				x.fillContextMenu(manager);
 			}
 		});
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
+		Control c = viewer.getControl();
+		Menu menu = menuMgr.createContextMenu(c);
 		viewer.getControl().setMenu(menu);
 		getSite().registerContextMenu(menuMgr, viewer);
 	}
@@ -80,8 +75,10 @@ public class OperationViewPart extends StateBasedViewPart implements
 		OperationTableViewer.destroy();
 	}
 
+	@Override
 	public void filtersChanged() {
 		Display.getDefault().asyncExec(new Runnable() {
+			@Override
 			public void run() {
 				OperationTableViewer.getInstance().refresh();
 			}
diff --git a/de.prob.ui/src/de/prob/ui/operationview/ParameterMenu.java b/de.prob.ui/src/de/prob/ui/operationview/ParameterMenu.java
index 3240d8bb150e01fba79a1454bad613e4adfbfbf6..a4b97d45e3904b08903ea35221fef6fa3a1b7add 100644
--- a/de.prob.ui/src/de/prob/ui/operationview/ParameterMenu.java
+++ b/de.prob.ui/src/de/prob/ui/operationview/ParameterMenu.java
@@ -1,13 +1,9 @@
 package de.prob.ui.operationview;
 
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
 
 import org.eclipse.swt.SWT;
-import org.eclipse.ui.menus.CommandContributionItem;
-import org.eclipse.ui.menus.CommandContributionItemParameter;
-import org.eclipse.ui.menus.ExtensionContributionFactory;
-import org.eclipse.ui.menus.IContributionRoot;
+import org.eclipse.ui.menus.*;
 import org.eclipse.ui.services.IServiceLocator;
 
 import de.prob.core.domainobjects.Operation;
@@ -41,11 +37,19 @@ public class ParameterMenu extends ExtensionContributionFactory {
 		CommandContributionItemParameter contributionParameters = new CommandContributionItemParameter(
 				serviceLocator, "", "de.prob.ui.show_parameter_dialog",
 				SWT.PUSH);
-		contributionParameters.label = "Show Dialog ...";
+		contributionParameters.label = "Show Parameter Dialog ...";
 		CommandContributionItem dialogItem = new CommandContributionItem(
 				contributionParameters);
 		additions.addContributionItem(dialogItem, null);
 
+		CommandContributionItemParameter contributionCustomGuard = new CommandContributionItemParameter(
+				serviceLocator, "",
+				"de.prob.ui.show_custom_precondition_dialog", SWT.PUSH);
+		contributionCustomGuard.label = "Execute with additional Guard ...";
+		CommandContributionItem customGuardDialogItem = new CommandContributionItem(
+				contributionCustomGuard);
+		additions.addContributionItem(customGuardDialogItem, null);
+
 	}
 
 	private CommandContributionItem createEntry(
diff --git a/de.prob.ui/src/de/prob/ui/stateview/StateLabelProvider.java b/de.prob.ui/src/de/prob/ui/stateview/StateLabelProvider.java
index 9c405743544315e9823bc72f9d8d54ab82083f56..1c835c7d459a7efc6e6062634381109b30258605 100644
--- a/de.prob.ui/src/de/prob/ui/stateview/StateLabelProvider.java
+++ b/de.prob.ui/src/de/prob/ui/stateview/StateLabelProvider.java
@@ -4,14 +4,11 @@
 package de.prob.ui.stateview;
 
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.*;
 import org.eclipse.swt.widgets.Display;
 
 import de.prob.core.domainobjects.State;
-import de.prob.ui.stateview.statetree.EStateTreeElementProperty;
-import de.prob.ui.stateview.statetree.StateDependendElement;
-import de.prob.ui.stateview.statetree.StaticStateElement;
+import de.prob.ui.stateview.statetree.*;
 
 /**
  * A StateLabelProvider defines some properties of an entry in a table (like
@@ -40,7 +37,7 @@ public class StateLabelProvider {
 		return null;
 	}
 
-	public Color getForeground(final State state,
+	public Color getForeground(final State state, final boolean hasChanged,
 			final StaticStateElement element) {
 		final EStateTreeElementProperty property = getPropertyValue(state,
 				element);
@@ -57,7 +54,19 @@ public class StateLabelProvider {
 				colorcst = SWT.COLOR_GRAY;
 				break;
 			case NONBOOLEAN:
-				colorcst = SWT.COLOR_BLACK;
+				if ("TRUE".equals(element.getValue(state).getValue())) {
+					colorcst = SWT.COLOR_DARK_GREEN;
+					break;
+				}
+				if ("FALSE".equals(element.getValue(state).getValue())) {
+					colorcst = SWT.COLOR_RED;
+					break;
+				}
+				if (hasChanged) {
+					colorcst = SWT.COLOR_BLUE;
+				} else {
+					colorcst = SWT.COLOR_BLACK;
+				}
 				break;
 			case ERROR:
 				colorcst = SWT.COLOR_MAGENTA;
diff --git a/de.prob.ui/src/de/prob/ui/stateview/StateViewStrings.properties b/de.prob.ui/src/de/prob/ui/stateview/StateViewStrings.properties
index abb04c4fe88155e3921ffc0a04586f6dd2e9c00b..9c7ebb742b23bfe2bdd301a151e650ac621b5db1 100644
--- a/de.prob.ui/src/de/prob/ui/stateview/StateViewStrings.properties
+++ b/de.prob.ui/src/de/prob/ui/stateview/StateViewStrings.properties
@@ -1,10 +1,10 @@
-signalInvariantTooltip=This area signals whether the invariant is violated or not
-signalInvariantGood=invariant ok
+signalInvariantTooltip=This area signals whether the invariants are true or not
+signalInvariantGood=invariants ok
 signalInvariantBad=invariant violated!
 
 signalEventerrorTooltip=This area signals if an error occurred in an event
 signalEventerrorGood=no event errors detected
-signalEventerrorBad=event errors detected!
+signalEventerrorBad=event error(s) detected!
 
 signalModelmodifiedTooltip=This area signals whether the model has been changed. Doubleclick to reload it
 signalModelmodifiedBad=The model was modified!
diff --git a/de.prob.ui/src/de/prob/ui/stateview/VarLabelProvider.java b/de.prob.ui/src/de/prob/ui/stateview/VarLabelProvider.java
index ebf2b3a1b2bea22704dc1d54936159e7677cabdc..01c4edf84021505031e53d4a27e50e6a4aeb9440 100644
--- a/de.prob.ui/src/de/prob/ui/stateview/VarLabelProvider.java
+++ b/de.prob.ui/src/de/prob/ui/stateview/VarLabelProvider.java
@@ -11,16 +11,10 @@ package de.prob.ui.stateview;
 
 import static de.prob.ui.ProbUiPlugin.CHANGE_STAR;
 
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.BaseLabelProvider;
-import org.eclipse.jface.viewers.ITableColorProvider;
-import org.eclipse.jface.viewers.ITableFontProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.resource.*;
+import org.eclipse.jface.viewers.*;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.*;
 import org.eclipse.swt.widgets.Display;
 
 import de.prob.core.domainobjects.State;
@@ -55,6 +49,7 @@ public class VarLabelProvider extends BaseLabelProvider implements
 		this.lastState = lastState;
 	}
 
+	@Override
 	public Image getColumnImage(final Object element, final int columnIndex) {
 		final Image image;
 		if (isApplicable(element)) {
@@ -72,6 +67,7 @@ public class VarLabelProvider extends BaseLabelProvider implements
 		return image;
 	}
 
+	@Override
 	public String getColumnText(final Object element, final int columnIndex) {
 		final String result;
 		if (isApplicable(element)) {
@@ -88,6 +84,7 @@ public class VarLabelProvider extends BaseLabelProvider implements
 		return result;
 	}
 
+	@Override
 	public Color getBackground(final Object element, final int column) {
 		final Color color;
 		if (isApplicable(element)) {
@@ -100,18 +97,22 @@ public class VarLabelProvider extends BaseLabelProvider implements
 		return color;
 	}
 
+	@Override
 	public Color getForeground(final Object element, final int column) {
 		final Color color;
 		if (isApplicable(element)) {
-			final State state = getState(column == 0 ? 1 : column);
-			color = state == null ? gray : slProvider.getForeground(state,
-					(StaticStateElement) element);
+			final State curState = getState(column == 0 ? 1 : column);
+			final boolean changed = hasChanged(element);
+
+			color = curState == null ? gray : slProvider.getForeground(
+					curState, changed, (StaticStateElement) element);
 		} else {
 			color = null;
 		}
 		return color;
 	}
 
+	@Override
 	public Font getFont(final Object element, final int column) {
 		final Font font;
 		final FontRegistry fontRegistry = JFaceResources.getFontRegistry();
diff --git a/de.prob.ui/src/de/prob/ui/validators/PredicateValidator.java b/de.prob.ui/src/de/prob/ui/validators/PredicateValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..567cd042720803818550ad3745cbacd13ec241a3
--- /dev/null
+++ b/de.prob.ui/src/de/prob/ui/validators/PredicateValidator.java
@@ -0,0 +1,32 @@
+package de.prob.ui.validators;
+
+import org.eclipse.jface.dialogs.IInputValidator;
+
+import de.prob.core.LanguageDependendAnimationPart;
+import de.prob.parserbase.ProBParseException;
+import de.prob.parserbase.ProBParserBaseAdapter;
+
+public final class PredicateValidator implements IInputValidator {
+	final LanguageDependendAnimationPart ldp;
+
+	public PredicateValidator(final LanguageDependendAnimationPart ldp) {
+		this.ldp = ldp;
+	}
+
+	@Override
+	public String isValid(final String newText) {
+		if (newText.trim().isEmpty())
+			return null;
+		if (ldp == null)
+			return "Cannot parse predicates for the current formalism";
+		try {
+			final ProBParserBaseAdapter parser = new ProBParserBaseAdapter(ldp);
+			parser.parsePredicate(newText, false);
+		} catch (UnsupportedOperationException e) {
+			return "The parser for this formalism cannot parse predicates";
+		} catch (ProBParseException e) {
+			return e.getLocalizedMessage();
+		}
+		return null;
+	}
+}
\ No newline at end of file
diff --git a/de.prob.units/META-INF/MANIFEST.MF b/de.prob.units/META-INF/MANIFEST.MF
index a5091100200bf3ecbdd073ed5f090e3393bdfe74..fb821994124ddcbc1a64b988a414de1ce6920dc7 100644
--- a/de.prob.units/META-INF/MANIFEST.MF
+++ b/de.prob.units/META-INF/MANIFEST.MF
@@ -5,9 +5,15 @@ Bundle-SymbolicName: de.prob.units;singleton:=true
 Bundle-Version: 1.0.0.qualifier
 Bundle-Activator: de.prob.units.Activator
 Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.commands,
+ org.eclipse.core.resources,
+ org.eclipse.jface,
+ org.rodinp.core;bundle-version="[1.7.0,1.8.0)",
  de.prob.core;bundle-version="[9.4.0,9.5.0)",
- org.eventb.ui;bundle-version="[2.5.0,3.0.0)",
- de.prob.ui;bundle-version="[7.4.0,7.5.0)"
+ org.eventb.ui;bundle-version="[3.0.0,3.1.0)",
+ de.prob.ui;bundle-version="[7.4.0,7.5.0)",
+ org.eventb.core;bundle-version="[3.0.0,3.2.0)",
+ org.eclipse.ui.workbench
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-Vendor: HHU Düsseldorf STUPS Group
diff --git a/de.prob.units/plugin.xml b/de.prob.units/plugin.xml
index b638b268a7251133e354a7fef6595000bf4bc7fd..7c8fbc3eb4ae41cd56a219597d022f5e62ec8dd7 100644
--- a/de.prob.units/plugin.xml
+++ b/de.prob.units/plugin.xml
@@ -9,7 +9,7 @@
             id="de.prob.units.unitPragmaAttribute"
             isMath="true"
             prefix="Physical Unit:"
-            style="de.prob.units.unitPragmaAttribute"
+            style="single"
             typeId="de.prob.units.unitPragmaAttribute">
       </textAttribute>
       <attributeRelation
@@ -36,9 +36,27 @@
             id="de.prob.units.inferredUnitPragmaAttribute"
             isMath="true"
             prefix="Inferred Physical Unit:"
-            style="de.prob.units.inferredUnitPragmaAttribute"
+            style="single"
             typeId="de.prob.units.inferredUnitPragmaAttribute">
       </textAttribute>
+      <attributeRelation
+            elementTypeId="org.eventb.core.scVariable">
+         <attributeReference
+               descriptionId="de.prob.units.unitPragmaAttribute">
+         </attributeReference>
+         <attributeReference
+               descriptionId="de.prob.units.inferredUnitPragmaAttribute">
+         </attributeReference>
+      </attributeRelation>
+      <attributeRelation
+            elementTypeId="org.eventb.core.scConstant">
+         <attributeReference
+               descriptionId="de.prob.units.unitPragmaAttribute">
+         </attributeReference>
+         <attributeReference
+               descriptionId="de.prob.units.inferredUnitPragmaAttribute">
+         </attributeReference>
+      </attributeRelation>
    </extension>
    <extension
          point="org.eclipse.ui.handlers">
@@ -65,9 +83,14 @@
                      variable="selection">
                   <iterate
                         operator="or">
-                     <instanceof
-                           value="org.eventb.core.IEventBRoot">
-                     </instanceof>
+                     <or>
+                        <instanceof
+                              value="org.eventb.core.IMachineRoot">
+                        </instanceof>
+                        <instanceof
+                              value="org.eventb.core.IContextRoot">
+                        </instanceof>
+                     </or>
                   </iterate>
                </with>
             </visibleWhen>
diff --git a/de.prob.units/src/de/prob/units/ConfSettor.java b/de.prob.units/src/de/prob/units/ConfSettor.java
index c41716ec92dc0a51f2a0a3f7a4501be3c6a1dde5..3bcde7c95009dad497285fa05433eb6105b670f5 100644
--- a/de.prob.units/src/de/prob/units/ConfSettor.java
+++ b/de.prob.units/src/de/prob/units/ConfSettor.java
@@ -21,6 +21,7 @@ public class ConfSettor implements IElementChangedListener {
 
 	private static final String CONFIG = Activator.PLUGIN_ID + ".mchBase";
 
+	@Override
 	public void elementChanged(ElementChangedEvent event) {
 
 		final IRodinElementDelta d = event.getDelta();
diff --git a/de.prob.units/src/de/prob/units/pragmas/InferredUnitPragmaAttribute.java b/de.prob.units/src/de/prob/units/pragmas/InferredUnitPragmaAttribute.java
index 56b0c2da80cdb47cf9d9ed1c610ab9d9d05f46f3..7991b26aa8c86ab39f22325977cca18ed5cfae60 100644
--- a/de.prob.units/src/de/prob/units/pragmas/InferredUnitPragmaAttribute.java
+++ b/de.prob.units/src/de/prob/units/pragmas/InferredUnitPragmaAttribute.java
@@ -9,7 +9,7 @@ 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.eventb.ui.manipulation.IAttributeManipulation;
 import org.rodinp.core.IAttributeType;
 import org.rodinp.core.IInternalElement;
 import org.rodinp.core.IRodinElement;
diff --git a/de.prob.units/src/de/prob/units/pragmas/UnitPragmaAttribute.java b/de.prob.units/src/de/prob/units/pragmas/UnitPragmaAttribute.java
index eb287258d021c5248f1dd0b753454bae33ef7066..cff957964d3d56a8c6a024e685ae64369c97ac7f 100644
--- a/de.prob.units/src/de/prob/units/pragmas/UnitPragmaAttribute.java
+++ b/de.prob.units/src/de/prob/units/pragmas/UnitPragmaAttribute.java
@@ -9,7 +9,7 @@ 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.eventb.ui.manipulation.IAttributeManipulation;
 import org.rodinp.core.IAttributeType;
 import org.rodinp.core.IInternalElement;
 import org.rodinp.core.IRodinElement;
diff --git a/de.prob2.disprover.feature/feature.xml b/de.prob2.disprover.feature/feature.xml
index 84f31a898ba28ca93b5dfff7719ca48a4c0cb56f..ef18a17292e2114b3dfef21becf966ad6f25ee1c 100644
--- a/de.prob2.disprover.feature/feature.xml
+++ b/de.prob2.disprover.feature/feature.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <feature
       id="de.prob2.disprover.feature"
-      label="ProB for Rodin2 - EXPERIMENTAL (Dis)Prover"
-      version="2.4.1.qualifier"
+      label="ProB for Rodin3 - EXPERIMENTAL (Dis)Prover"
+      version="3.0.5.qualifier"
       provider-name="HHU Düsseldorf STUPS Group">
 
    <description url="http://www.stups.uni-duesseldorf.de/ProB">
@@ -232,12 +232,14 @@ litigation.
    <requires>
       <import plugin="org.eclipse.core.runtime" version="3.5.0" match="compatible"/>
       <import plugin="de.prob.core" version="9.4.0" match="equivalent"/>
-      <import plugin="org.eventb.core" version="2.5.1" match="greaterOrEqual"/>
       <import plugin="org.eclipse.ui" version="3.5.0" match="compatible"/>
+      <import plugin="org.rodinp.core" version="1.7.0" match="equivalent"/>
+      <import plugin="org.eventb.ui" version="3.0.0" match="equivalent"/>
       <import plugin="de.prob.eventb.disprover.core" version="1.3.2" match="compatible"/>
-      <import plugin="org.eventb.pp.ui" version="0.2.1" match="greaterOrEqual"/>
-      <import plugin="org.eventb.core.seqprover" version="2.5.0" match="greaterOrEqual"/>
-      <import plugin="org.eventb.ui" version="2.5.0" match="compatible"/>
+      <import plugin="org.eclipse.osgi"/>
+      <import plugin="org.eventb.core.seqprover" version="3.0.0"/>
+      <import plugin="org.eventb.core" version="3.0.0"/>
+      <import plugin="org.eventb.core.ast" version="3.0.0"/>
    </requires>
 
    <plugin
diff --git a/de.prob2.feature/feature.xml b/de.prob2.feature/feature.xml
index 64cacb78fbf007a53ea298e58af33561bf282459..51c720033b4933c43d42c49dab5db93d26350e98 100644
--- a/de.prob2.feature/feature.xml
+++ b/de.prob2.feature/feature.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <feature
       id="de.prob2.feature"
-      label="ProB for Rodin2"
-      version="2.4.1.qualifier"
+      label="ProB for Rodin3"
+      version="3.0.5.qualifier"
       provider-name="HHU Düsseldorf STUPS Group">
 
    <description url="http://www.stups.uni-duesseldorf.de/ProB">
@@ -233,14 +233,16 @@ litigation.
       <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.4.0" match="equivalent"/>
-      <import plugin="org.eventb.core" version="2.5.0" match="greaterOrEqual"/>
       <import plugin="org.eclipse.help" version="3.5.100" match="greaterOrEqual"/>
-      <import plugin="org.rodinp.core" version="1.3.1" match="greaterOrEqual"/>
-      <import plugin="de.prob.ui" version="7.4.0" match="equivalent"/>
       <import plugin="org.eclipse.core.resources" version="3.5.0" match="compatible"/>
+      <import plugin="org.rodinp.core" version="1.7.0" match="equivalent"/>
+      <import plugin="de.prob.ui" version="7.4.0" match="equivalent"/>
       <import plugin="org.eclipse.core.expressions" version="3.4.101" match="compatible"/>
       <import plugin="org.eclipse.ui.navigator" version="3.5.0" match="greaterOrEqual"/>
       <import plugin="de.bmotionstudio.gef.editor" version="5.5.0" match="equivalent"/>
+      <import plugin="org.eventb.core" version="3.0.0"/>
+      <import plugin="org.eventb.core.ast" version="3.0.0"/>
+      <import plugin="org.eventb.core.seqprover" version="3.0.0"/>
    </requires>
 
    <plugin
diff --git a/de.prob2.symbolic.feature/feature.xml b/de.prob2.symbolic.feature/feature.xml
index c94fe9221fef78ffca77edcbc49cc5e4a97eeaf3..bfdeac8810ab27faeb15a9d47025172a29e69b97 100644
--- a/de.prob2.symbolic.feature/feature.xml
+++ b/de.prob2.symbolic.feature/feature.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <feature
       id="de.prob2.symbolic.feature"
-      label="ProB for Rodin2 - Symbolic Constants Support"
-      version="2.4.1.qualifier"
+      label="ProB for Rodin3 - Symbolic Constants Support"
+      version="3.0.5.qualifier"
       provider-name="HHU Düsseldorf STUPS Group">
 
    <description url="http://www.stups.uni-duesseldorf.de/ProB">
@@ -232,8 +232,11 @@ litigation.
    <requires>
       <import plugin="org.eclipse.core.runtime"/>
       <import plugin="de.prob.core" version="9.4.0" match="equivalent"/>
-      <import plugin="org.eventb.ui" version="2.5.0" match="greaterOrEqual"/>
+      <import plugin="org.eventb.ui" version="3.0.0" match="equivalent"/>
       <import plugin="de.prob.ui" version="7.4.0" match="equivalent"/>
+      <import plugin="org.rodinp.core" version="1.7.0" match="equivalent"/>
+      <import plugin="org.eclipse.ui" version="3.5.0" match="compatible"/>
+      <import plugin="org.eventb.core" version="3.0.0"/>
    </requires>
 
    <plugin
diff --git a/de.prob2.units.feature/feature.xml b/de.prob2.units.feature/feature.xml
index b6b4ac34d0d4f2f4177872819a0c00e5f444c8e7..4d04c511664d82b17498f794615778b121103fec 100644
--- a/de.prob2.units.feature/feature.xml
+++ b/de.prob2.units.feature/feature.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <feature
       id="de.prob2.units.feature"
-      label="ProB for Rodin2 - Physical Units Support"
-      version="2.4.1.qualifier"
+      label="ProB for Rodin3 - Physical Units Support"
+      version="3.0.5.qualifier"
       provider-name="HHU Düsseldorf STUPS Group">
 
    <description url="http://www.stups.uni-duesseldorf.de/ProB">
@@ -225,9 +225,15 @@ litigation.
 
    <requires>
       <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="org.eclipse.core.commands"/>
+      <import plugin="org.eclipse.core.resources"/>
+      <import plugin="org.eclipse.jface"/>
+      <import plugin="org.rodinp.core" version="1.7.0" match="equivalent"/>
       <import plugin="de.prob.core" version="9.4.0" match="equivalent"/>
-      <import plugin="org.eventb.ui" version="2.5.0" match="greaterOrEqual"/>
+      <import plugin="org.eventb.ui" version="3.0.0" match="equivalent"/>
       <import plugin="de.prob.ui" version="7.4.0" match="equivalent"/>
+      <import plugin="org.eclipse.ui.workbench"/>
+      <import plugin="org.eventb.core" version="3.0.0"/>
    </requires>
 
    <plugin
diff --git a/index.html b/index.html
index 610de7a23affea84880d6f0f405b2962a5dc9a02..e235e5d80695865ffd163073d8884fbf9040913b 100644
--- a/index.html
+++ b/index.html
@@ -55,7 +55,6 @@
 </head>
 <body onload="init();">
 
-<!--[insert static HTML here]-->
 <a href="http://www.stups.uni-duesseldorf.de/"><img src="http://www.stups.uni-duesseldorf.de/hhulogo1.jpg" border="0" align="right"></a>
 <h1 class="title">Installing the ProB plug-ins</h1>
 <p class="bodyText">