diff --git a/build.gradle b/build.gradle
index 748ce6adc591ca7c3b9c66a49fd337911fe3ef9e..5c43d9f0721e4b2d6296971d7b6c0810b722c625 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,7 +6,7 @@ project.ext{
 	targetRepositories = ["http://download.eclipse.org/releases/indigo/",
                           "http://rodin-b-sharp.sourceforge.net/updates",
                           "http://rodin-b-sharp.sourceforge.net/core-updates"
-                    //      , "http://www.stups.uni-duesseldorf.de/ProB/buildlibs/theory/"
+                          , "http://www.stups.uni-duesseldorf.de/ProB/buildlibs/theory/"
                           ]
 
 	groupID = "de.prob"
diff --git a/de.prob.core/META-INF/MANIFEST.MF b/de.prob.core/META-INF/MANIFEST.MF
index 0aad54fe970deda71d5ab57eba0266a3837cdc32..1013502daf8f1a93fac673999f87dc02410025cb 100644
--- a/de.prob.core/META-INF/MANIFEST.MF
+++ b/de.prob.core/META-INF/MANIFEST.MF
@@ -5,8 +5,8 @@ Bundle-SymbolicName: de.prob.core;singleton:=true
 Bundle-Version: 9.4.0.qualifier
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
  org.rodinp.core;bundle-version="[1.3.1,1.7.0)",
- org.eventb.core;bundle-version="[2.5.0,2.6.0)"
-REENABLE-FOR-THEORY-PLUGIN: org.eventb.theory.core;bundle-version="2.0.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
 Bundle-ActivationPolicy: lazy
 Eclipse-BundleShape: dir
 Bundle-Vendor: HHU Dusseldorf STUPS Group
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 1d1940b4f3827037e47ff673ab7ee0a481e10d78..033df8ea5817b974f22b7e9044fe7d7e4010ca60 100644
--- a/de.prob.core/src/de/prob/eventb/translator/Theories.java
+++ b/de.prob.core/src/de/prob/eventb/translator/Theories.java
@@ -8,34 +8,30 @@ import de.prob.prolog.output.IPrologTermOutput;
 public class Theories {
 	private static final String PROB_THEORY_MAPPING_SUFFIX = "ptm";
 
-	public static void translate(IEventBProject project, IPrologTermOutput pout) {
+	public static void translate(IEventBProject project, IPrologTermOutput pout)
+			throws TranslationFailedException {
+		try {
+			final IRodinProject rProject = project.getRodinProject();
+			final IDeployedTheoryRoot[] theories = rProject
+					.getRootElementsOfType(IDeployedTheoryRoot.ELEMENT_TYPE);
+			for (IDeployedTheoryRoot theory : theories) {
+				savePrintTranslation(theory, pout);
+			}
+			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);
+					}
+				}
+			}
+		} catch (RodinDBException e) {
+			throw new TranslationFailedException(e);
+		}
 	}
 
-	// public static void translate(IEventBProject project, IPrologTermOutput
-	// pout)
-	// throws TranslationFailedException {
-	// try {
-	// final IRodinProject rProject = project.getRodinProject();
-	// final IDeployedTheoryRoot[] theories = rProject
-	// .getRootElementsOfType(IDeployedTheoryRoot.ELEMENT_TYPE);
-	// for (IDeployedTheoryRoot theory : theories) {
-	// savePrintTranslation(theory, pout);
-	// }
-	// 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);
-	// }
-	// }
-	// }
-	// } catch (RodinDBException e) {
-	// throw new TranslationFailedException(e);
-	// }
-	// }
-
 	/**
 	 * We currently write the translated theory into a PrologTerm object because
 	 * the translation is currently very unstable and erroneous. Writing in a
@@ -44,297 +40,295 @@ public class Theories {
 	 * 
 	 * @throws TranslationFailedException
 	 */
-//	private static void savePrintTranslation(IDeployedTheoryRoot theory,
-//			IPrologTermOutput opto) throws RodinDBException,
-//			TranslationFailedException {
-//
-//		final StructuredPrologOutput pto = new StructuredPrologOutput();
-//		printTranslation(theory, pto);
-//		pto.fullstop();
-//		final PrologTerm result = pto.getSentences().get(0);
-//		opto.printTerm(result);
-//	}
-//
-//	private static void printTranslation(IDeployedTheoryRoot theory,
-//			StructuredPrologOutput pto) throws RodinDBException,
-//			TranslationFailedException {
-//		pto.openTerm("theory");
-//		printIdentifiers(theory.getSCTypeParameters(), pto);
-//		printDataTypes(theory, pto);
-//		printOperatorDefs(theory, pto);
-//		printAxiomaticDefs(theory, pto);
-//		findProBMappingFile(theory, pto);
-//		pto.closeTerm();
-//	}
-//
-//	private static void findProBMappingFile(IDeployedTheoryRoot theory,
-//			IPrologTermOutput pto) throws TranslationFailedException {
-//		final String theoryName = theory.getComponentName();
-//		final IPath path = new Path(theoryName + "."
-//				+ PROB_THEORY_MAPPING_SUFFIX);
-//		final IProject project = theory.getRodinProject().getProject();
-//		final Collection<OperatorMapping> mappings;
-//		if (project.exists(path)) {
-//			final IFile file = project.getFile(path);
-//			mappings = readMappingFile(file, theory);
-//		} else {
-//			mappings = Collections.emptyList();
-//		}
-//		printMappings(mappings, pto);
-//	}
-//
-//	private static Collection<OperatorMapping> readMappingFile(IFile file,
-//			IDeployedTheoryRoot theory) throws TranslationFailedException {
-//		try {
-//			final InputStream input = file.getContents();
-//			final String name = theory.getComponentName();
-//			final Reader reader = new InputStreamReader(input);
-//			return TheoryMappingParser.parseTheoryMapping(name, reader);
-//		} catch (CoreException e) {
-//			throw new TranslationFailedException(e);
-//		} catch (TheoryMappingException e) {
-//			throw new TranslationFailedException(e);
-//		} catch (IOException e) {
-//			throw new TranslationFailedException(e);
-//		}
-//	}
-//
-//	private static void printMappings(Collection<OperatorMapping> mappings,
-//			IPrologTermOutput pto) {
-//		pto.openList();
-//		// Currently, we support only one kind of operator mapping, just tagging
-//		// an operator to indicate that an optimized ProB implementation should
-//		// be used. We do not invest any effort in preparing future kinds of
-//		// other operator mappings.
-//		for (OperatorMapping mapping : mappings) {
-//			pto.openTerm("tag");
-//			pto.printAtom(mapping.getOperatorName());
-//			pto.printAtom(mapping.getSpec());
-//			pto.closeTerm();
-//		}
-//		pto.closeList();
-//	}
-//
-//	private static void printIdentifiers(ISCIdentifierElement[] identifiers,
-//			IPrologTermOutput pto) throws RodinDBException {
-//		pto.openList();
-//		for (ISCIdentifierElement identifier : identifiers) {
-//			pto.printAtom(identifier.getIdentifierString());
-//		}
-//		pto.closeList();
-//	}
-//
-//	private static void printDataTypes(IDeployedTheoryRoot theory,
-//			IPrologTermOutput pto) throws RodinDBException {
-//		final FormulaFactory ff = theory.getFormulaFactory();
-//		pto.openList();
-//		for (ISCDatatypeDefinition def : theory.getSCDatatypeDefinitions()) {
-//			printDataType(def, ff, pto);
-//		}
-//		pto.closeList();
-//	}
-//
-//	private static void printDataType(ISCDatatypeDefinition def,
-//			FormulaFactory ff, IPrologTermOutput pto) throws RodinDBException {
-//		pto.openTerm("datatype");
-//		pto.printAtom(def.getIdentifierString());
-//		pto.openList();
-//		for (ISCTypeArgument arg : def.getTypeArguments()) {
-//			printType(arg.getSCGivenType(ff), ff, pto);
-//		}
-//		pto.closeList();
-//		pto.openList();
-//		for (ISCDatatypeConstructor cons : def.getConstructors()) {
-//			printConstructor(cons, ff, pto);
-//		}
-//		pto.closeList();
-//		pto.closeTerm();
-//
-//	}
-//
-//	private static void printConstructor(ISCDatatypeConstructor cons,
-//			FormulaFactory ff, IPrologTermOutput pto) throws RodinDBException {
-//		pto.openTerm("constructor");
-//		pto.printAtom(cons.getIdentifierString());
-//		pto.openList();
-//		for (ISCConstructorArgument arg : cons.getConstructorArguments()) {
-//			printTypedIdentifier("destructor", arg, ff, pto);
-//		}
-//		pto.closeList();
-//		pto.closeTerm();
-//
-//	}
-//
-//	private static void printOperatorDefs(IDeployedTheoryRoot theory,
-//			IPrologTermOutput pto) throws RodinDBException {
-//		pto.openList();
-//		for (ISCNewOperatorDefinition opdef : theory
-//				.getSCNewOperatorDefinitions()) {
-//			printOperator(opdef, theory, pto);
-//		}
-//		pto.closeList();
-//	}
-//
-//	private static void printOperator(ISCNewOperatorDefinition opDef,
-//			IDeployedTheoryRoot theory, IPrologTermOutput prologOutput)
-//			throws RodinDBException {
-//
-//		prologOutput.openTerm("operator");
-//		prologOutput.printAtom(opDef.getLabel());
-//
-//		final FormulaFactory ff = theory.getFormulaFactory();
-//		final ITypeEnvironment te = theory.getTypeEnvironment(ff);
-//
-//		// Arguments
-//		printOperatorArguments(opDef.getOperatorArguments(), prologOutput, ff);
-//
-//		// WD Condition
-//		Predicate wdCondition = opDef.getWDCondition(ff, te);
-//		printPredicate(prologOutput, wdCondition);
-//
-//		// Direct Definitions
-//		prologOutput.openList();
-//		processDefinitions(ff, te, prologOutput,
-//				opDef.getDirectOperatorDefinitions());
-//		prologOutput.closeList();
-//
-//		// Recursive Definitions
-//		prologOutput.openList();
-//		ISCRecursiveOperatorDefinition[] definitions = opDef
-//				.getRecursiveOperatorDefinitions();
-//		for (ISCRecursiveOperatorDefinition definition : definitions) {
-//			ISCRecursiveDefinitionCase[] recursiveDefinitionCases = definition
-//					.getRecursiveDefinitionCases();
-//			for (ISCRecursiveDefinitionCase c : recursiveDefinitionCases) {
-//				Expression ex = c.getExpression(ff, te);
-//				printExpression(prologOutput, ex);
-//			}
-//		}
-//		prologOutput.closeList();
-//
-//		prologOutput.closeTerm();
-//	}
-//
-//	private static void printOperatorArguments(ISCOperatorArgument[] arguments,
-//			IPrologTermOutput prologOutput, final FormulaFactory ff)
-//			throws RodinDBException {
-//		prologOutput.openList();
-//		for (ISCOperatorArgument argument : arguments) {
-//			printTypedIdentifier("argument", argument, ff, prologOutput);
-//		}
-//		prologOutput.closeList();
-//	}
-//
-//	private static void processDefinitions(FormulaFactory ff,
-//			ITypeEnvironment te, IPrologTermOutput prologOutput,
-//			ISCDirectOperatorDefinition[] directOperatorDefinitions)
-//			throws RodinDBException {
-//		for (ISCDirectOperatorDefinition def : directOperatorDefinitions) {
-//			Formula<?> scFormula = def.getSCFormula(ff, te);
-//
-//			if (scFormula instanceof Predicate) {
-//				Predicate pp = (Predicate) scFormula;
-//				printPredicate(prologOutput, pp);
-//			}
-//			if (scFormula instanceof Expression) {
-//				Expression pp = (Expression) scFormula;
-//				printExpression(prologOutput, pp);
-//			}
-//
-//		}
-//	}
-//
-//	private static void printTypedIdentifier(final String functor,
-//			final ISCIdentifierElement id, final FormulaFactory ff,
-//			final IPrologTermOutput pto) throws RodinDBException {
-//		pto.openTerm(functor);
-//		pto.printAtom(id.getIdentifierString());
-//		Type type = id.getType(ff);
-//		printType(type, ff, pto);
-//		pto.closeTerm();
-//	}
-//
-//	private static void printType(final Type type, final FormulaFactory ff,
-//			final IPrologTermOutput pto) {
-//		printExpression(pto, type.toExpression(ff));
-//	}
-//
-//	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);
-//	}
-//
-//	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);
-//		predicate.apply(pv);
-//	}
-//
-//	private static void printAxiomaticDefs(IDeployedTheoryRoot theory,
-//			IPrologTermOutput pto) throws RodinDBException {
-//		FormulaFactory ff = theory.getFormulaFactory();
-//		ITypeEnvironment te = theory.getTypeEnvironment(ff);
-//		pto.openList();
-//		for (final ISCAxiomaticDefinitionsBlock block : theory
-//				.getSCAxiomaticDefinitionsBlocks()) {
-//			printAxiomaticDefBlock(block, ff, te, pto);
-//		}
-//		pto.closeList();
-//	}
-//
-//	private static void printAxiomaticDefBlock(
-//			ISCAxiomaticDefinitionsBlock block, FormulaFactory ff,
-//			ITypeEnvironment te, IPrologTermOutput pto) throws RodinDBException {
-//		pto.openTerm("axiomatic_def_block");
-//		pto.printAtom(block.getLabel());
-//		printIdentifiers(block.getAxiomaticTypeDefinitions(), pto);
-//		printAxiomaticOperators(block.getAxiomaticOperatorDefinitions(), ff,
-//				pto);
-//		printAxioms(block.getAxiomaticDefinitionAxioms(), ff, te, pto);
-//		pto.closeTerm();
-//	}
-//
-//	private static void printAxiomaticOperators(
-//			ISCAxiomaticOperatorDefinition[] axdefs, FormulaFactory ff,
-//			IPrologTermOutput pto) throws RodinDBException {
-//		pto.openList();
-//		for (final ISCAxiomaticOperatorDefinition opdef : axdefs) {
-//			pto.openTerm("opdef");
-//			pto.printAtom(opdef.getLabel()); // The label seems to be the
-//												// operator name
-//			printOperatorArguments(opdef.getOperatorArguments(), pto, ff);
-//			pto.openList();
-//			// WD condition missing
-//			pto.closeList();
-//			pto.closeTerm();
-//		}
-//		pto.closeList();
-//	}
-//
-//	private static void printAxioms(ISCAxiomaticDefinitionAxiom[] axioms,
-//			FormulaFactory ff, ITypeEnvironment te, IPrologTermOutput pto)
-//			throws RodinDBException {
-//		pto.openList();
-//		for (ISCAxiomaticDefinitionAxiom axiom : axioms) {
-//			printPredicate(pto, axiom.getPredicate(ff, te));
-//		}
-//		pto.closeList();
-//	}
-
-	public static void touch() throws NoClassDefFoundError {}
-	
-//	public static void touch() throws NoClassDefFoundError {
-//		// Just some dummy code to check if the theory plugin is installed
-//		@SuppressWarnings("unused")
-//		String extension = DatabaseUtilities.DEPLOYED_THEORY_FILE_EXTENSION;
-//	}
+	private static void savePrintTranslation(IDeployedTheoryRoot theory,
+			IPrologTermOutput opto) throws RodinDBException,
+			TranslationFailedException {
+
+		final StructuredPrologOutput pto = new StructuredPrologOutput();
+		printTranslation(theory, pto);
+		pto.fullstop();
+		final PrologTerm result = pto.getSentences().get(0);
+		opto.printTerm(result);
+	}
+
+	private static void printTranslation(IDeployedTheoryRoot theory,
+			StructuredPrologOutput pto) throws RodinDBException,
+			TranslationFailedException {
+		pto.openTerm("theory");
+		printIdentifiers(theory.getSCTypeParameters(), pto);
+		printDataTypes(theory, pto);
+		printOperatorDefs(theory, pto);
+		printAxiomaticDefs(theory, pto);
+		findProBMappingFile(theory, pto);
+		pto.closeTerm();
+	}
+
+	private static void findProBMappingFile(IDeployedTheoryRoot theory,
+			IPrologTermOutput pto) throws TranslationFailedException {
+		final String theoryName = theory.getComponentName();
+		final IPath path = new Path(theoryName + "."
+				+ PROB_THEORY_MAPPING_SUFFIX);
+		final IProject project = theory.getRodinProject().getProject();
+		final Collection<OperatorMapping> mappings;
+		if (project.exists(path)) {
+			final IFile file = project.getFile(path);
+			mappings = readMappingFile(file, theory);
+		} else {
+			mappings = Collections.emptyList();
+		}
+		printMappings(mappings, pto);
+	}
+
+	private static Collection<OperatorMapping> readMappingFile(IFile file,
+			IDeployedTheoryRoot theory) throws TranslationFailedException {
+		try {
+			final InputStream input = file.getContents();
+			final String name = theory.getComponentName();
+			final Reader reader = new InputStreamReader(input);
+			return TheoryMappingParser.parseTheoryMapping(name, reader);
+		} catch (CoreException e) {
+			throw new TranslationFailedException(e);
+		} catch (TheoryMappingException e) {
+			throw new TranslationFailedException(e);
+		} catch (IOException e) {
+			throw new TranslationFailedException(e);
+		}
+	}
+
+	private static void printMappings(Collection<OperatorMapping> mappings,
+			IPrologTermOutput pto) {
+		pto.openList();
+		// Currently, we support only one kind of operator mapping, just tagging
+		// an operator to indicate that an optimized ProB implementation should
+		// be used. We do not invest any effort in preparing future kinds of
+		// other operator mappings.
+		for (OperatorMapping mapping : mappings) {
+			pto.openTerm("tag");
+			pto.printAtom(mapping.getOperatorName());
+			pto.printAtom(mapping.getSpec());
+			pto.closeTerm();
+		}
+		pto.closeList();
+	}
+
+	private static void printIdentifiers(ISCIdentifierElement[] identifiers,
+			IPrologTermOutput pto) throws RodinDBException {
+		pto.openList();
+		for (ISCIdentifierElement identifier : identifiers) {
+			pto.printAtom(identifier.getIdentifierString());
+		}
+		pto.closeList();
+	}
+
+	private static void printDataTypes(IDeployedTheoryRoot theory,
+			IPrologTermOutput pto) throws RodinDBException {
+		final FormulaFactory ff = theory.getFormulaFactory();
+		pto.openList();
+		for (ISCDatatypeDefinition def : theory.getSCDatatypeDefinitions()) {
+			printDataType(def, ff, pto);
+		}
+		pto.closeList();
+	}
+
+	private static void printDataType(ISCDatatypeDefinition def,
+			FormulaFactory ff, IPrologTermOutput pto) throws RodinDBException {
+		pto.openTerm("datatype");
+		pto.printAtom(def.getIdentifierString());
+		pto.openList();
+		for (ISCTypeArgument arg : def.getTypeArguments()) {
+			printType(arg.getSCGivenType(ff), ff, pto);
+		}
+		pto.closeList();
+		pto.openList();
+		for (ISCDatatypeConstructor cons : def.getConstructors()) {
+			printConstructor(cons, ff, pto);
+		}
+		pto.closeList();
+		pto.closeTerm();
+
+	}
+
+	private static void printConstructor(ISCDatatypeConstructor cons,
+			FormulaFactory ff, IPrologTermOutput pto) throws RodinDBException {
+		pto.openTerm("constructor");
+		pto.printAtom(cons.getIdentifierString());
+		pto.openList();
+		for (ISCConstructorArgument arg : cons.getConstructorArguments()) {
+			printTypedIdentifier("destructor", arg, ff, pto);
+		}
+		pto.closeList();
+		pto.closeTerm();
+
+	}
+
+	private static void printOperatorDefs(IDeployedTheoryRoot theory,
+			IPrologTermOutput pto) throws RodinDBException {
+		pto.openList();
+		for (ISCNewOperatorDefinition opdef : theory
+				.getSCNewOperatorDefinitions()) {
+			printOperator(opdef, theory, pto);
+		}
+		pto.closeList();
+	}
+
+	private static void printOperator(ISCNewOperatorDefinition opDef,
+			IDeployedTheoryRoot theory, IPrologTermOutput prologOutput)
+			throws RodinDBException {
+
+		prologOutput.openTerm("operator");
+		prologOutput.printAtom(opDef.getLabel());
+
+		final FormulaFactory ff = theory.getFormulaFactory();
+		final ITypeEnvironment te = theory.getTypeEnvironment(ff);
+
+		// Arguments
+		printOperatorArguments(opDef.getOperatorArguments(), prologOutput, ff);
+
+		// WD Condition
+		Predicate wdCondition = opDef.getWDCondition(ff, te);
+		printPredicate(prologOutput, wdCondition);
+
+		// Direct Definitions
+		prologOutput.openList();
+		processDefinitions(ff, te, prologOutput,
+				opDef.getDirectOperatorDefinitions());
+		prologOutput.closeList();
+
+		// Recursive Definitions
+		prologOutput.openList();
+		ISCRecursiveOperatorDefinition[] definitions = opDef
+				.getRecursiveOperatorDefinitions();
+		for (ISCRecursiveOperatorDefinition definition : definitions) {
+			ISCRecursiveDefinitionCase[] recursiveDefinitionCases = definition
+					.getRecursiveDefinitionCases();
+			for (ISCRecursiveDefinitionCase c : recursiveDefinitionCases) {
+				Expression ex = c.getExpression(ff, te);
+				printExpression(prologOutput, ex);
+			}
+		}
+		prologOutput.closeList();
+
+		prologOutput.closeTerm();
+	}
+
+	private static void printOperatorArguments(ISCOperatorArgument[] arguments,
+			IPrologTermOutput prologOutput, final FormulaFactory ff)
+			throws RodinDBException {
+		prologOutput.openList();
+		for (ISCOperatorArgument argument : arguments) {
+			printTypedIdentifier("argument", argument, ff, prologOutput);
+		}
+		prologOutput.closeList();
+	}
+
+	private static void processDefinitions(FormulaFactory ff,
+			ITypeEnvironment te, IPrologTermOutput prologOutput,
+			ISCDirectOperatorDefinition[] directOperatorDefinitions)
+			throws RodinDBException {
+		for (ISCDirectOperatorDefinition def : directOperatorDefinitions) {
+			Formula<?> scFormula = def.getSCFormula(ff, te);
+
+			if (scFormula instanceof Predicate) {
+				Predicate pp = (Predicate) scFormula;
+				printPredicate(prologOutput, pp);
+			}
+			if (scFormula instanceof Expression) {
+				Expression pp = (Expression) scFormula;
+				printExpression(prologOutput, pp);
+			}
+
+		}
+	}
+
+	private static void printTypedIdentifier(final String functor,
+			final ISCIdentifierElement id, final FormulaFactory ff,
+			final IPrologTermOutput pto) throws RodinDBException {
+		pto.openTerm(functor);
+		pto.printAtom(id.getIdentifierString());
+		Type type = id.getType(ff);
+		printType(type, ff, pto);
+		pto.closeTerm();
+	}
+
+	private static void printType(final Type type, final FormulaFactory ff,
+			final IPrologTermOutput pto) {
+		printExpression(pto, type.toExpression(ff));
+	}
+
+	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);
+	}
+
+	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);
+		predicate.apply(pv);
+	}
+
+	private static void printAxiomaticDefs(IDeployedTheoryRoot theory,
+			IPrologTermOutput pto) throws RodinDBException {
+		FormulaFactory ff = theory.getFormulaFactory();
+		ITypeEnvironment te = theory.getTypeEnvironment(ff);
+		pto.openList();
+		for (final ISCAxiomaticDefinitionsBlock block : theory
+				.getSCAxiomaticDefinitionsBlocks()) {
+			printAxiomaticDefBlock(block, ff, te, pto);
+		}
+		pto.closeList();
+	}
+
+	private static void printAxiomaticDefBlock(
+			ISCAxiomaticDefinitionsBlock block, FormulaFactory ff,
+			ITypeEnvironment te, IPrologTermOutput pto) throws RodinDBException {
+		pto.openTerm("axiomatic_def_block");
+		pto.printAtom(block.getLabel());
+		printIdentifiers(block.getAxiomaticTypeDefinitions(), pto);
+		printAxiomaticOperators(block.getAxiomaticOperatorDefinitions(), ff,
+				pto);
+		printAxioms(block.getAxiomaticDefinitionAxioms(), ff, te, pto);
+		pto.closeTerm();
+	}
+
+	private static void printAxiomaticOperators(
+			ISCAxiomaticOperatorDefinition[] axdefs, FormulaFactory ff,
+			IPrologTermOutput pto) throws RodinDBException {
+		pto.openList();
+		for (final ISCAxiomaticOperatorDefinition opdef : axdefs) {
+			pto.openTerm("opdef");
+			pto.printAtom(opdef.getLabel()); // The label seems to be the
+												// operator name
+			printOperatorArguments(opdef.getOperatorArguments(), pto, ff);
+			pto.openList();
+			// WD condition missing
+			pto.closeList();
+			pto.closeTerm();
+		}
+		pto.closeList();
+	}
+
+	private static void printAxioms(ISCAxiomaticDefinitionAxiom[] axioms,
+			FormulaFactory ff, ITypeEnvironment te, IPrologTermOutput pto)
+			throws RodinDBException {
+		pto.openList();
+		for (ISCAxiomaticDefinitionAxiom axiom : axioms) {
+			printPredicate(pto, axiom.getPredicate(ff, te));
+		}
+		pto.closeList();
+	}
+
+	public static void touch() throws NoClassDefFoundError {
+		// Just some dummy code to check if the theory plugin is installed
+		@SuppressWarnings("unused")
+		String extension = DatabaseUtilities.DEPLOYED_THEORY_FILE_EXTENSION;
+	}
 }