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 7e52b68531f0acf77f3ca1fbb0551158259be442..9b846ee56330d4d8662e6f82a0f9dd8379fb83fb 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
@@ -6,12 +6,50 @@
 
 package de.prob.eventb.translator.internal;
 
-import java.util.*;
-
-import org.eventb.core.ast.*;
+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;
+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.BooleanType;
+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.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.*;
-import de.prob.eventb.translator.*;
 
 /**
  * The global SuppressWarnings annotation is used because the deprecated code is
@@ -26,6 +64,10 @@ import de.prob.eventb.translator.*;
 public class TranslationVisitor implements ISimpleVisitor {
 	private static final String UNCOVERED_PREDICATE = "Uncovered Predicate";
 
+	private static final int[] EXTRA_TYPE_CONSTRUCTS = new int[] {
+			Formula.EMPTYSET, Formula.KPRJ1_GEN, Formula.KPRJ2_GEN,
+			Formula.KID_GEN };
+
 	private final LookupStack<PPredicate> predicates = new LookupStack<PPredicate>();
 	private final LookupStack<PExpression> expressions = new LookupStack<PExpression>();
 	private final LookupStack<PSubstitution> substitutions = new LookupStack<PSubstitution>();
@@ -62,7 +104,67 @@ public class TranslationVisitor implements ISimpleVisitor {
 		default:
 			throw new AssertionError(UNCOVERED_PREDICATE);
 		}
-		expressions.push(result);
+		pushExpression(expression, result);
+	}
+
+	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);
+	}
+
+	private boolean shouldHaveExtraTypeInfo(Expression original) {
+		if (original instanceof ExtendedExpression) {
+			return true;
+		} else {
+			int tag = original.getTag();
+			for (int i = 0; i < EXTRA_TYPE_CONSTRUCTS.length; i++) {
+				if (EXTRA_TYPE_CONSTRUCTS[i] == tag)
+					return true;
+			}
+			return false;
+		}
+	}
+
+	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 UnsupportedOperationException(
+					"Don't know how to handle the Event-B type of class "
+							+ type.getClass().getCanonicalName());
+		}
+		return result;
 	}
 
 	private PExpression recurseFCOMP(final List<PExpression> list) {
@@ -188,7 +290,7 @@ public class TranslationVisitor implements ISimpleVisitor {
 		default:
 			throw new AssertionError("Uncovered Expression " + expression);
 		}
-		expressions.push(result);
+		pushExpression(expression, result);
 	}
 
 	@Override
@@ -313,7 +415,7 @@ public class TranslationVisitor implements ISimpleVisitor {
 		default:
 			throw new AssertionError("Uncovered Expression");
 		}
-		expressions.push(result);
+		pushExpression(expression, result);
 	}
 
 	@Override
@@ -337,7 +439,7 @@ public class TranslationVisitor implements ISimpleVisitor {
 	@Override
 	public void visitBoolExpression(final BoolExpression expression) {
 		final PPredicate pred = getPredicate(expression.getPredicate());
-		expressions.push(new AConvertBoolExpression(pred));
+		pushExpression(expression, new AConvertBoolExpression(pred));
 	}
 
 	@Override
@@ -357,19 +459,20 @@ public class TranslationVisitor implements ISimpleVisitor {
 	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
@@ -413,7 +516,7 @@ public class TranslationVisitor implements ISimpleVisitor {
 		default:
 			throw new AssertionError(UNCOVERED_PREDICATE);
 		}
-		expressions.push(result);
+		pushExpression(expression, result);
 	}
 
 	@Override
@@ -497,7 +600,7 @@ public class TranslationVisitor implements ISimpleVisitor {
 	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
@@ -562,7 +665,7 @@ public class TranslationVisitor implements ISimpleVisitor {
 		default:
 			throw new AssertionError("Uncovered Expression");
 		}
-		expressions.push(result);
+		pushExpression(expression, result);
 	}
 
 	@Override
@@ -601,8 +704,8 @@ public class TranslationVisitor implements ISimpleVisitor {
 				.getChildExpressions());
 		List<PPredicate> childPreds = getSubPredicates(expression
 				.getChildPredicates());
-		expressions.push(new AExtendedExprExpression(new TIdentifierLiteral(
-				symbol), childExprs, childPreds));
+		pushExpression(expression, new AExtendedExprExpression(
+				new TIdentifierLiteral(symbol), childExprs, childPreds));
 	}
 
 	@Override