diff --git a/src/main/java/de/tla2bAst/BAstCreator.java b/src/main/java/de/tla2bAst/BAstCreator.java
index 52e3a8ceeab5675d516e0cccb39169e485ab526b..3ea5f27586fb112bc4291333eb544ecf9a7973dd 100644
--- a/src/main/java/de/tla2bAst/BAstCreator.java
+++ b/src/main/java/de/tla2bAst/BAstCreator.java
@@ -26,6 +26,8 @@ import java.util.*;
 import java.util.Map.Entry;
 import java.util.stream.Collectors;
 
+import static de.tla2b.analysis.TypeChecker.getType;
+
 public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuildIns, ValueConstants {
 
 	private List<PMachineClause> machineClauseList;
@@ -436,7 +438,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 	private PExpression createTLCValue(Value tlcValue) {
 		switch (tlcValue.getKind()) {
 			case INTVALUE:
-				return new AIntegerExpression(new TIntegerLiteral(tlcValue.toString()));
+				return createIntegerNode(tlcValue.toString());
 			case REALVALUE:
 				return new ARealExpression(new TRealLiteral(tlcValue.toString()));
 			case SETENUMVALUE:
@@ -452,12 +454,9 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 	}
 
 	private void createInvariantClause() {
-		OpDeclNode[] vars = moduleNode.getVariableDecls();
-
 		List<PPredicate> predList = new ArrayList<>();
-		for (OpDeclNode var : vars) {
-			TLAType varType = (TLAType) var.getToolObject(TYPE_ID);
-			predList.add(new AMemberPredicate(createIdentifierNode(var), varType.getBNode()));
+		for (OpDeclNode var : moduleNode.getVariableDecls()) {
+			predList.add(new AMemberPredicate(createIdentifierNode(var), getType(var).getBNode()));
 		}
 
 		for (OpDefNode def : specAnalyser.getInvariants()) {
@@ -493,8 +492,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 				return visitExprNodePredicate(((LetInNode) exprNode).getBody());
 			case NumeralKind:
 			case DecimalKind:
-				// TODO: description
-				throw new RuntimeException();
+				throw new RuntimeException("Expected a predicate " + exprNode);
 			default:
 				throw new NotImplementedException(exprNode.getClass().toString());
 		}
@@ -507,7 +505,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 			case NumeralKind: {
 				NumeralNode node = (NumeralNode) exprNode;
 				String number = String.valueOf(node.useVal() ? node.val() : node.bigVal());
-				return createPositionedNode(new AIntegerExpression(new TIntegerLiteral(number)), exprNode);
+				return createPositionedNode(createIntegerNode(number), exprNode);
 			}
 			case DecimalKind: {
 				DecimalNode node = (DecimalNode) exprNode;
@@ -524,7 +522,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 				// PExpression base = visitExprNodeExpression(at.getAtBase());
 				return evalAtNode(
 						new LinkedList<>(Arrays.asList(at.getAtModifier().getArgs())), // seq
-						(TLAType) at.getExceptRef().getToolObject(TYPE_ID),
+						getType(at.getExceptRef()),
 						((PExpression) at.getExceptComponentRef().getToolObject(EXCEPT_BASE)).clone()
 				);
 			}
@@ -556,9 +554,10 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 			case VariableDeclKind:
 			case ConstantDeclKind:
 			case FormalParamKind:
-				return createPositionedNode(
-					new AEqualPredicate(createIdentifierNode(opApplNode.getOperator()), new ABooleanTrueExpression()),
-					opApplNode);
+				return createPositionedNode(new AEqualPredicate(
+							createIdentifierNode(opApplNode.getOperator()),
+							new ABooleanTrueExpression()),
+						opApplNode);
 			case BuiltInKind:
 				return visitBuiltInKindPredicate(opApplNode);
 			case UserDefinedOpKind:
@@ -566,7 +565,6 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 			default:
 				throw new NotImplementedException(opApplNode.getClass().toString());
 		}
-
 	}
 
 	private PExpression visitOpApplNodeExpression(OpApplNode n) {
@@ -594,18 +592,18 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 				FormalParamNode[] tuple = (FormalParamNode[]) param.getToolObject(TUPLE);
 				if (tuple != null) {
 					if (tuple.length == 1) {
-						List<PExpression> paramList = new ArrayList<>();
-						paramList.add(new AIntegerExpression(new TIntegerLiteral("1")));
-						return new AFunctionExpression(createIdentifierNode(n.getOperator()), paramList);
+						return new AFunctionExpression(
+								createIdentifierNode(n.getOperator()),
+								Collections.singletonList(createIntegerNode("1"))
+						);
 					} else {
 						StringBuilder sb = new StringBuilder();
 						List<TLAType> typeList = new ArrayList<>();
 						int number = -1;
 						for (int j = 0; j < tuple.length; j++) {
 							FormalParamNode p = tuple[j];
-							sb.append(p.getName().toString());
-							TLAType type = (TLAType) p.getToolObject(TYPE_ID);
-							typeList.add(type);
+							sb.append(p.getName());
+							typeList.add(getType(p));
 							if (p == param) {
 								number = j + 1;
 							}
@@ -634,20 +632,13 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 			return new AEqualPredicate(createIdentifierNode(def), new ABooleanTrueExpression());
 		}
 		if (Arrays.asList(moduleNode.getOpDefs()).contains(def)) {
-			List<PExpression> params = new ArrayList<>();
-			for (int i = 0; i < n.getArgs().length; i++) {
-				params.add(visitExprOrOpArgNodeExpression(n.getArgs()[i]));
-			}
 			if (predicateVsExpression.getDefinitionType(def) == DefinitionType.EXPRESSION) {
-				ADefinitionExpression defCall = new ADefinitionExpression();
-				defCall.setDefLiteral(new TIdentifierLiteral(getName(def)));
-				defCall.setParameters(params);
-				return new AEqualPredicate(defCall, new ABooleanTrueExpression());
+				return new AEqualPredicate(
+						new ADefinitionExpression(new TIdentifierLiteral(getName(def)), visitArgs(n)),
+						new ABooleanTrueExpression()
+				);
 			} else {
-				ADefinitionPredicate defCall = new ADefinitionPredicate();
-				defCall.setDefLiteral(new TDefLiteralPredicate(getName(def)));
-				defCall.setParameters(params);
-				return defCall;
+				return new ADefinitionPredicate(new TDefLiteralPredicate(getName(def)), visitArgs(n));
 			}
 		} else {
 			FormalParamNode[] params = def.getParams();
@@ -671,26 +662,19 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 		}
 
 		if (specAnalyser.getRecursiveFunctions().contains(def)) {
-			List<SymbolNode> list = recursiveFunctionHandler.getAdditionalParams(def);
-			if (!list.isEmpty()) {
-				AFunctionExpression call = new AFunctionExpression();
-				call.setIdentifier(createIdentifierNode(def));
-				List<PExpression> params = new ArrayList<>();
-				for (SymbolNode symbolNode : list) {
-					params.add(createIdentifierNode(symbolNode));
-				}
-				call.setParameters(params);
-				return call;
-			} else {
+			List<SymbolNode> params = recursiveFunctionHandler.getAdditionalParams(def);
+			if (params.isEmpty()) {
 				return createIdentifierNode(def);
+			} else {
+				return new AFunctionExpression(
+						createIdentifierNode(def),
+						params.stream().map(this::createIdentifierNode).collect(Collectors.toList())
+				);
 			}
 		}
 
 		if (Arrays.asList(moduleNode.getOpDefs()).contains(def)) {
-			List<PExpression> params = new ArrayList<>();
-			for (int i = 0; i < n.getArgs().length; i++) {
-				params.add(visitExprOrOpArgNodeExpression(n.getArgs()[i]));
-			}
+			List<PExpression> params = visitArgs(n);
 
 			if (conEval != null && conEval.getConstantOverrides().containsValue(def)) {
 				// used constants name instead of the definition overriding the
@@ -2173,6 +2157,15 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 		return disjunction;
 	}
 
+	/*
+	 * Utility methods
+	 */
+	private List<PExpression> visitArgs(OpApplNode n) {
+		return Arrays.stream(n.getArgs())
+				.map(this::visitExprOrOpArgNodeExpression)
+				.collect(Collectors.toList());
+	}
+
 	public static List<TIdentifierLiteral> createTIdentifierLiteral(String name) {
 		return Collections.singletonList(new TIdentifierLiteral(name));
 	}