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 1aac01119a383440f0ba891102a809a79bb853bd..ed06174c383f320972bcd7542360bafa60cd4bc5 100644
--- a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java
+++ b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java
@@ -31,6 +31,7 @@ import org.eventb.core.ISCExtendsContext;
 import org.eventb.core.ISCInternalContext;
 import org.eventb.core.ast.FormulaFactory;
 import org.eventb.core.ast.ITypeEnvironment;
+import org.eventb.core.ast.Predicate;
 import org.eventb.core.seqprover.IConfidence;
 import org.rodinp.core.IAttributeType;
 import org.rodinp.core.IInternalElement;
@@ -61,6 +62,7 @@ import de.prob.core.translator.pragmas.UnitPragma;
 import de.prob.eventb.translator.internal.EProofStatus;
 import de.prob.eventb.translator.internal.ProofObligation;
 import de.prob.eventb.translator.internal.SequentSource;
+import de.prob.eventb.translator.internal.TranslationVisitor;
 
 public final class ContextTranslator extends AbstractComponentTranslator {
 
@@ -382,8 +384,10 @@ public final class ContextTranslator extends AbstractComponentTranslator {
 			if (element.isTheorem() == theorems) {
 				final PredicateVisitor visitor = new PredicateVisitor(
 						new LinkedList<String>());
-				element.getPredicate(ff, te).accept(visitor);
+				final Predicate p = element.getPredicate(ff, te);
+				p.accept(visitor);
 				final PPredicate predicate = visitor.getPredicate();
+				TranslationVisitor.checkNewImplementation(p, predicate);
 				list.add(predicate);
 				labelMapping.put(predicate, element);
 				proofspragmas.add(new ClassifiedPragma("discharged", predicate,
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 9677a30929d26b1e35e96b1773a5eb98e29ebbed..5aaacd2ab0b38d194b81fd554751f15f9576ff77 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
@@ -430,6 +430,8 @@ public class ModelTranslator extends AbstractComponentTranslator {
 			// + guardPredicate);
 			guardPredicate.accept(visitor);
 			final PPredicate predicate = visitor.getPredicate();
+			TranslationVisitor
+					.checkNewImplementation(guardPredicate, predicate);
 			if (guard.isTheorem()) {
 				theoremsList.add(predicate);
 			} else {
@@ -533,8 +535,10 @@ public class ModelTranslator extends AbstractComponentTranslator {
 			if (!isDefinedInAbstraction(evPredicate)) {
 				final PredicateVisitor visitor = new PredicateVisitor(
 						new LinkedList<String>());
-				evPredicate.getPredicate(ff, te).accept(visitor);
+				Predicate p = evPredicate.getPredicate(ff, te);
+				p.accept(visitor);
 				final PPredicate predicate = visitor.getPredicate();
+				TranslationVisitor.checkNewImplementation(p, predicate);
 				list.add(predicate);
 				labelMapping.put(predicate, evPredicate);
 			}
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 24f3ab2676b564a37c77b74775797bbc948b834f..29021e9d365248ef5d39e07691ee4e1f1b3b6262 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
@@ -328,8 +328,8 @@ public class TranslationVisitor implements ISimpleVisitor {
 	}
 
 	public void visitBinaryPredicate(final BinaryPredicate predicate) {
-		final PPredicate right = getPredicate(predicate.getLeft());
-		final PPredicate left = getPredicate(predicate.getRight());
+		final PPredicate left = getPredicate(predicate.getLeft());
+		final PPredicate right = getPredicate(predicate.getRight());
 		final PPredicate result;
 		switch (predicate.getTag()) {
 		case Formula.LIMP:
@@ -676,4 +676,39 @@ public class TranslationVisitor implements ISimpleVisitor {
 
 		}
 	}
+
+	public PPredicate getPredicate() {
+		assertExactStacksize(predicates);
+		return predicates.pop();
+	}
+
+	public PExpression getExpression() {
+		assertExactStacksize(expressions);
+		return expressions.pop();
+	}
+
+	public PSubstitution getSubstitution() {
+		assertExactStacksize(substitutions);
+		return substitutions.pop();
+	}
+
+	private void assertExactStacksize(LookupStack<?> stack) {
+		if (stack.size() != 1) {
+			throw new AssertionError(
+					"Exactly one element on the stack expected, but were "
+							+ predicates.size());
+
+		}
+	}
+
+	public static void checkNewImplementation(Predicate p, PPredicate predicate) {
+		TranslationVisitor visitor = new TranslationVisitor();
+		p.accept(visitor);
+		final String expected = predicate.toString();
+		final String actual = visitor.getPredicate().toString();
+		if (!expected.equals(actual)) {
+			throw new AssertionError("Expected:\n" + expected + "\n but was:\n"
+					+ actual);
+		}
+	}
 }