diff --git a/src/main/java/de/tla2bAst/BAstCreator.java b/src/main/java/de/tla2bAst/BAstCreator.java
index 2bf34e08c5398dd1d03eed696f8943cdc4a774f0..9f4281672f21a4f309b796932e9f2daaad922404 100644
--- a/src/main/java/de/tla2bAst/BAstCreator.java
+++ b/src/main/java/de/tla2bAst/BAstCreator.java
@@ -503,7 +503,6 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 			default:
 				throw new NotImplementedException(exprNode.getClass().toString());
 		}
-
 	}
 
 	private PExpression visitExprNodeExpression(ExprNode exprNode) {
@@ -527,21 +526,18 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 			}
 			case AtNodeKind: { // @
 				AtNode at = (AtNode) exprNode;
-				TLAType type = (TLAType) at.getExceptRef().getToolObject(TYPE_ID);
-				OpApplNode seq = at.getAtModifier();
-				LinkedList<ExprOrOpArgNode> list = new LinkedList<>(Arrays.asList(seq.getArgs()));
 				// PExpression base = visitExprNodeExpression(at.getAtBase());
-				PExpression base = (PExpression) at.getExceptComponentRef().getToolObject(EXCEPT_BASE);
-				return evalAtNode(list, type, base.clone());
-			}
-			case LetInKind: {
-				LetInNode letInNode = (LetInNode) exprNode;
-				return visitExprNodeExpression(letInNode.getBody());
+				return evalAtNode(
+						new LinkedList<>(Arrays.asList(at.getAtModifier().getArgs())), // seq
+						(TLAType) at.getExceptRef().getToolObject(TYPE_ID),
+						((PExpression) at.getExceptComponentRef().getToolObject(EXCEPT_BASE)).clone()
+				);
 			}
+			case LetInKind:
+				return visitExprNodeExpression(((LetInNode) exprNode).getBody());
 			default:
 				throw new NotImplementedException(exprNode.getClass().toString());
 		}
-
 	}
 
 	private PExpression evalAtNode(LinkedList<ExprOrOpArgNode> list, TLAType type, PExpression base) {
@@ -549,23 +545,14 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 			return base;
 		}
 		if (type instanceof FunctionType) {
-			FunctionType funcType = (FunctionType) type;
-			PExpression param = visitExprOrOpArgNodeExpression(list.poll());
-			List<PExpression> params = new ArrayList<>();
-			params.add(param);
-			AFunctionExpression funCall = new AFunctionExpression();
-			funCall.setIdentifier(base);
-			funCall.setParameters(params);
-			return evalAtNode(list, funcType.getRange(), funCall);
+			return evalAtNode(list, ((FunctionType) type).getRange(),
+					new AFunctionExpression(base, Collections.singletonList(visitExprOrOpArgNodeExpression(list.poll()))));
 		} else {
-			StructType structType = (StructType) type;
-			ARecordFieldExpression select = new ARecordFieldExpression();
-			select.setRecord(base);
 			StringNode stringNode = (StringNode) list.poll();
 			// TODO rename field name
 			String fieldName = stringNode.getRep().toString();
-			select.setIdentifier(new TIdentifierLiteral(fieldName));
-			return evalAtNode(list, structType.getType(fieldName), select);
+			return evalAtNode(list, ((StructType) type).getType(fieldName),
+					new ARecordFieldExpression(base, new TIdentifierLiteral(fieldName)));
 		}
 	}
 
@@ -573,17 +560,14 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 		switch (opApplNode.getOperator().getKind()) {
 			case VariableDeclKind:
 			case ConstantDeclKind:
-			case FormalParamKind: {
+			case FormalParamKind:
 				return createPositionedNode(
 					new AEqualPredicate(createIdentifierNode(opApplNode.getOperator()), new ABooleanTrueExpression()),
 					opApplNode);
-			}
 			case BuiltInKind:
 				return visitBuiltInKindPredicate(opApplNode);
-
-			case UserDefinedOpKind: {
+			case UserDefinedOpKind:
 				return visitUserdefinedOpPredicate(opApplNode);
-			}
 			default:
 				throw new NotImplementedException(opApplNode.getClass().toString());
 		}
@@ -593,9 +577,8 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 	private PExpression visitOpApplNodeExpression(OpApplNode n) {
 		switch (n.getOperator().getKind()) {
 			case ConstantDeclKind:
-			case VariableDeclKind: {
+			case VariableDeclKind:
 				return createIdentifierNode(n.getOperator());
-			}
 			case FormalParamKind: {
 				FormalParamNode param = (FormalParamNode) n.getOperator();
 				ExprOrOpArgNode e = (ExprOrOpArgNode) param.getToolObject(SUBSTITUTE_PARAM);
@@ -604,29 +587,22 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 				}
 
 				if (recursiveFunctionHandler.isRecursiveFunction(param)) {
-					ArrayList<SymbolNode> list = recursiveFunctionHandler.getAdditionalParams(param);
+					List<SymbolNode> list = recursiveFunctionHandler.getAdditionalParams(param);
 					if (!list.isEmpty()) {
-						AFunctionExpression call = new AFunctionExpression();
-						call.setIdentifier(createIdentifierNode(param));
-						ArrayList<PExpression> params = new ArrayList<>();
+						List<PExpression> params = new ArrayList<>();
 						for (SymbolNode symbolNode : list) {
 							params.add(createIdentifierNode(symbolNode));
 						}
-						call.setParameters(params);
-						return call;
+						return new AFunctionExpression(createIdentifierNode(param), params);
 					}
 				}
 				FormalParamNode[] tuple = (FormalParamNode[]) param.getToolObject(TUPLE);
 				if (tuple != null) {
 					if (tuple.length == 1) {
-						AFunctionExpression functionCall = new AFunctionExpression();
-						functionCall.setIdentifier(createIdentifierNode(n.getOperator()));
 						List<PExpression> paramList = new ArrayList<>();
 						paramList.add(new AIntegerExpression(new TIntegerLiteral("1")));
-						functionCall.setParameters(paramList);
-						return functionCall;
+						return new AFunctionExpression(createIdentifierNode(n.getOperator()), paramList);
 					} else {
-
 						StringBuilder sb = new StringBuilder();
 						List<TLAType> typeList = new ArrayList<>();
 						int number = -1;
@@ -639,19 +615,15 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 								number = j + 1;
 							}
 						}
-						TupleType tupleType = new TupleType(typeList);
-						PExpression id = createIdentifierNode(sb.toString());
-						return createProjectionFunction(id, number, tupleType);
+						return createProjectionFunction(createIdentifierNode(sb.toString()), number, new TupleType(typeList));
 					}
 				}
 				return createIdentifierNode(n.getOperator());
 			}
 			case BuiltInKind:
 				return visitBuiltInKindExpression(n);
-
-			case UserDefinedOpKind: {
+			case UserDefinedOpKind:
 				return visitUserdefinedOpExpression(n);
-			}
 			default:
 				throw new NotImplementedException(n.getOperator().getName().toString());
 		}
@@ -659,9 +631,8 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 
 	private PPredicate visitUserdefinedOpPredicate(OpApplNode n) {
 		OpDefNode def = (OpDefNode) n.getOperator();
-		if (BBuiltInOPs.contains(def.getName()) // Operator is a B built-in
-			// operator
-			&& STANDARD_MODULES.contains(def.getSource().getOriginallyDefinedInModuleNode().getName().toString())) {
+		if (BBuiltInOPs.contains(def.getName()) // Operator is a B built-in operator
+				&& STANDARD_MODULES.contains(def.getSource().getOriginallyDefinedInModuleNode().getName().toString())) {
 			return visitBBuiltInsPredicate(n);
 		}
 		if (specAnalyser.getRecursiveFunctions().contains(def)) {
@@ -1080,128 +1051,101 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
 		switch (getOpCode(n.getOperator().getName())) {
 
 			case OPCODE_land: // \land
-			{
-				AConjunctPredicate conjunction = new AConjunctPredicate();
-				conjunction.setLeft(visitExprOrOpArgNodePredicate(n.getArgs()[0]));
-				conjunction.setRight(visitExprOrOpArgNodePredicate(n.getArgs()[1]));
-				return new AConvertBoolExpression(conjunction);
-			}
+				return new AConvertBoolExpression(new AConjunctPredicate(
+						visitExprOrOpArgNodePredicate(n.getArgs()[0]),
+						visitExprOrOpArgNodePredicate(n.getArgs()[1])
+				));
 
 			case OPCODE_equiv: // \equiv
-				AEquivalencePredicate equiv = new AEquivalencePredicate(visitExprOrOpArgNodePredicate(n.getArgs()[0]),
-					visitExprOrOpArgNodePredicate(n.getArgs()[1]));
-				return new AConvertBoolExpression(equiv);
+				return new AConvertBoolExpression(new AEquivalencePredicate(
+						visitExprOrOpArgNodePredicate(n.getArgs()[0]),
+						visitExprOrOpArgNodePredicate(n.getArgs()[1])
+				));
 
 			case OPCODE_implies: // =>
-				AImplicationPredicate impl = new AImplicationPredicate(visitExprOrOpArgNodePredicate(n.getArgs()[0]),
-					visitExprOrOpArgNodePredicate(n.getArgs()[1]));
-				new AConvertBoolExpression(impl);
+				new AConvertBoolExpression(new AImplicationPredicate(
+						visitExprOrOpArgNodePredicate(n.getArgs()[0]),
+						visitExprOrOpArgNodePredicate(n.getArgs()[1])
+				));
 
 			case OPCODE_cl: // $ConjList
-			{
-				List<PPredicate> list = new ArrayList<>();
-				for (int i = 0; i < n.getArgs().length; i++) {
-					list.add(visitExprOrOpArgNodePredicate(n.getArgs()[i]));
-				}
-				return new AConvertBoolExpression(createConjunction(list));
-			}
+				return new AConvertBoolExpression(createConjunction(Arrays.stream(n.getArgs())
+						.map(this::visitExprOrOpArgNodePredicate)
+						.collect(Collectors.toList())
+				));
 
 			case OPCODE_dl: // $DisjList
-			{
-				List<PPredicate> list = new ArrayList<>();
-				for (int i = 0; i < n.getArgs().length; i++) {
-					list.add(visitExprOrOpArgNodePredicate(n.getArgs()[i]));
-				}
-				return new AConvertBoolExpression(createDisjunction(list));
-			}
+				return new AConvertBoolExpression(createDisjunction(Arrays.stream(n.getArgs())
+						.map(this::visitExprOrOpArgNodePredicate)
+						.collect(Collectors.toList())));
 
 			case OPCODE_lor: // \/
-			{
-				ADisjunctPredicate disjunction = new ADisjunctPredicate();
-				disjunction.setLeft(visitExprOrOpArgNodePredicate(n.getArgs()[0]));
-				disjunction.setRight(visitExprOrOpArgNodePredicate(n.getArgs()[1]));
-				return new AConvertBoolExpression(disjunction);
-			}
+				return new AConvertBoolExpression(new ADisjunctPredicate(
+						visitExprOrOpArgNodePredicate(n.getArgs()[0]),
+						visitExprOrOpArgNodePredicate(n.getArgs()[1])
+				));
 
 			case OPCODE_lnot: // \lnot
 				return new AConvertBoolExpression(new ANegationPredicate(visitExprOrOpArgNodePredicate(n.getArgs()[0])));
 
 			case OPCODE_in: // \in
-			{
-				AMemberPredicate memberPredicate = new AMemberPredicate();
-				memberPredicate.setLeft(visitExprOrOpArgNodeExpression(n.getArgs()[0]));
-				memberPredicate.setRight(visitExprOrOpArgNodeExpression(n.getArgs()[1]));
-				return new AConvertBoolExpression(memberPredicate);
-			}
+				return new AConvertBoolExpression(new AMemberPredicate(
+						visitExprOrOpArgNodeExpression(n.getArgs()[0]),
+						visitExprOrOpArgNodeExpression(n.getArgs()[1])
+				));
 
 			case OPCODE_notin: // \notin
-			{
-				ANotMemberPredicate notMemberPredicate = new ANotMemberPredicate();
-				notMemberPredicate.setLeft(visitExprOrOpArgNodeExpression(n.getArgs()[0]));
-				notMemberPredicate.setRight(visitExprOrOpArgNodeExpression(n.getArgs()[1]));
-				return new AConvertBoolExpression(notMemberPredicate);
-			}
+				return new AConvertBoolExpression(new ANotMemberPredicate(
+						visitExprOrOpArgNodeExpression(n.getArgs()[0]),
+						visitExprOrOpArgNodeExpression(n.getArgs()[1])
+				));
 
-			case OPCODE_eq: { // =
-				AEqualPredicate equal = new AEqualPredicate();
-				equal.setLeft(visitExprOrOpArgNodeExpression(n.getArgs()[0]));
-				equal.setRight(visitExprOrOpArgNodeExpression(n.getArgs()[1]));
-				return new AConvertBoolExpression(equal);
-			}
+			case OPCODE_eq: // =
+				return new AConvertBoolExpression(new AEqualPredicate(
+						visitExprOrOpArgNodeExpression(n.getArgs()[0]),
+						visitExprOrOpArgNodeExpression(n.getArgs()[1])
+				));
 
 			case OPCODE_noteq: // /=
-			{
-				ANotEqualPredicate notEqual = new ANotEqualPredicate();
-				notEqual.setLeft(visitExprOrOpArgNodeExpression(n.getArgs()[0]));
-				notEqual.setRight(visitExprOrOpArgNodeExpression(n.getArgs()[1]));
-				return new AConvertBoolExpression(notEqual);
-			}
+				return new AConvertBoolExpression(new ANotEqualPredicate(
+						visitExprOrOpArgNodeExpression(n.getArgs()[0]),
+						visitExprOrOpArgNodeExpression(n.getArgs()[1])
+				));
 
 			/*
 			 * Set Operators
 			 */
 
 			case OPCODE_se: // SetEnumeration {..}
-			{
 				if (n.getArgs().length == 0) {
 					return new AEmptySetExpression();
 				} else {
-					List<PExpression> list = new ArrayList<>();
-
-					for (int i = 0; i < n.getArgs().length; i++) {
-						list.add(visitExprOrOpArgNodeExpression(n.getArgs()[i]));
-					}
-					return new ASetExtensionExpression(list);
+					return new ASetExtensionExpression(Arrays.stream(n.getArgs())
+							.map(this::visitExprOrOpArgNodeExpression)
+							.collect(Collectors.toList()));
 				}
-			}
 
 			case 0: {
 				return visitBBuiltInsExpression(n);
 			}
 
 			case OPCODE_setdiff: // set difference
-			{
-				AMinusOrSetSubtractExpression minus = new AMinusOrSetSubtractExpression();
-				minus.setLeft(visitExprOrOpArgNodeExpression(n.getArgs()[0]));
-				minus.setRight(visitExprOrOpArgNodeExpression(n.getArgs()[1]));
-				return minus;
-			}
+				return new AMinusOrSetSubtractExpression(
+						visitExprOrOpArgNodeExpression(n.getArgs()[0]),
+						visitExprOrOpArgNodeExpression(n.getArgs()[1])
+				);
 
 			case OPCODE_cup: // set union
-			{
-				AUnionExpression union = new AUnionExpression();
-				union.setLeft(visitExprOrOpArgNodeExpression(n.getArgs()[0]));
-				union.setRight(visitExprOrOpArgNodeExpression(n.getArgs()[1]));
-				return union;
-			}
+				return new AUnionExpression(
+						visitExprOrOpArgNodeExpression(n.getArgs()[0]),
+						visitExprOrOpArgNodeExpression(n.getArgs()[1])
+				);
 
 			case OPCODE_cap: // set intersection
-			{
-				AIntersectionExpression inter = new AIntersectionExpression();
-				inter.setLeft(visitExprOrOpArgNodeExpression(n.getArgs()[0]));
-				inter.setRight(visitExprOrOpArgNodeExpression(n.getArgs()[1]));
-				return inter;
-			}
+				return new AIntersectionExpression(
+						visitExprOrOpArgNodeExpression(n.getArgs()[0]),
+						visitExprOrOpArgNodeExpression(n.getArgs()[1])
+				);
 
 			case OPCODE_subset: // SUBSET
 			{