diff --git a/build.gradle b/build.gradle
index d08cf6604c8f8735235920cdb5c190fad7a9c7aa..771bce0c25ba0426750e4ff784145fc3f250b6ea 100644
--- a/build.gradle
+++ b/build.gradle
@@ -72,4 +72,16 @@ jacocoTestReport {
 jar { from sourceSets.main.allJava }
 jar	{
 	from configurations.releaseJars.collect { it.isDirectory() ? it : zipTree(it) }
+}
+
+manifest.mainAttributes("Main-Class" : 'de.tla2b.TLA2B')
+manifest.mainAttributes("Class-Path": './tla/ tlatools.jar')
+
+task tla2b(dependsOn: build) << {
+	copy {
+		from('build/libs/')
+		into('build/tla2b')
+		include('tla2bAST-'+project.version+'.jar')
+		rename('tla2bAST-(.+)', 'TLA2B.jar')
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/tla2b/TLA2B.java b/src/main/java/de/tla2b/TLA2B.java
new file mode 100644
index 0000000000000000000000000000000000000000..4436f6243d1559c369cb7b8cb2702db1788fc50a
--- /dev/null
+++ b/src/main/java/de/tla2b/TLA2B.java
@@ -0,0 +1,67 @@
+/**
+ * @author Dominik Hansen <Dominik.Hansen at hhu.de>
+ **/
+
+package de.tla2b;
+
+import de.tla2b.exceptions.FrontEndException;
+import de.tla2b.exceptions.NotImplementedException;
+import de.tla2b.exceptions.TLA2BException;
+import de.tla2b.global.TranslationGlobals;
+import de.tla2bAst.Translator;
+
+public class TLA2B implements TranslationGlobals {
+	private String mainFile;
+
+	private static boolean error = false;
+
+	public static boolean hasError() {
+		return error;
+	}
+
+	public void handleParameter(String[] args) {
+		int i;
+		for (i = 0; (i < args.length) && (args[i].charAt(0) == '-'); i++) {
+			if (args[i].equals("-version")) {
+				System.out.println("TLA2B version " + VERSION);
+				System.exit(-1);
+			} else {
+				System.err.println("Illegal switch: " + args[i]);
+				System.exit(-1);
+			}
+		}
+
+		if (i == args.length) {
+			System.err.println("Error: expected a module file.");
+			System.exit(-1);
+		}
+		mainFile = args[i];
+	}
+
+	public static void main(String[] args) {
+		// To indicate an error we use the exit code -1
+		TLA2B tla2b = new TLA2B();
+		tla2b.handleParameter(args);
+
+		Translator translator = null;
+		try {
+			translator = new Translator(tla2b.mainFile);
+		} catch (FrontEndException e) {
+			System.exit(-1);
+		}
+		try {
+			translator.translate();
+		} catch (NotImplementedException e) {
+			System.err.print("**** Translation Error ****\n");
+			System.err.print("Not implemented:\n");
+			System.err.println(e.getMessage());
+			System.exit(-1);
+		} catch (TLA2BException e) {
+			System.err.print("**** Translation Error ****\n");
+			System.err.println(e.getMessage());
+			System.exit(-1);
+		}
+		translator.createMachineFile();
+	}
+
+}
diff --git a/src/main/java/de/tla2b/analysis/AbstractASTVisitor.java b/src/main/java/de/tla2b/analysis/AbstractASTVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..6339c0b67522c65e8c20c36ea83b6f99d3a45f41
--- /dev/null
+++ b/src/main/java/de/tla2b/analysis/AbstractASTVisitor.java
@@ -0,0 +1,166 @@
+package de.tla2b.analysis;
+
+import tla2sany.semantic.ASTConstants;
+import tla2sany.semantic.AssumeNode;
+import tla2sany.semantic.AtNode;
+import tla2sany.semantic.ExprNode;
+import tla2sany.semantic.ExprOrOpArgNode;
+import tla2sany.semantic.LetInNode;
+import tla2sany.semantic.ModuleNode;
+import tla2sany.semantic.NumeralNode;
+import tla2sany.semantic.OpApplNode;
+import tla2sany.semantic.OpDefNode;
+import tla2sany.semantic.StringNode;
+import tla2sany.semantic.SubstInNode;
+import tlc2.tool.BuiltInOPs;
+
+public class AbstractASTVisitor extends BuiltInOPs implements ASTConstants {
+
+	public void visitModuleNode(ModuleNode moduleNode) {
+
+		visitDefinitions(moduleNode.getOpDefs());
+
+		visitAssumptions(moduleNode.getAssumptions());
+	}
+
+	public void visitDefinitions(OpDefNode[] opDefs) {
+		for (OpDefNode opDefNode : opDefs) {
+			visitDefinition(opDefNode);
+		}
+	}
+
+	public void visitAssumptions(AssumeNode[] assumptions) {
+		for (AssumeNode assumeNode : assumptions) {
+			visitAssumeNode(assumeNode);
+		}
+	}
+
+	public void visitAssumeNode(AssumeNode assumeNode) {
+		visitExprNode(assumeNode.getAssume());
+	}
+
+	public void visitDefinition(OpDefNode opDefNode) {
+		visitExprNode(opDefNode.getBody());
+	}
+
+	public void visitExprOrOpArgNode(ExprOrOpArgNode n) {
+		if (n instanceof ExprNode) {
+			visitExprNode((ExprNode) n);
+		} else {
+			throw new RuntimeException("Should not appear.");
+		}
+
+	}
+
+	public void visitExprNode(ExprNode n) {
+
+		switch (n.getKind()) {
+		case OpApplKind: {
+			visitOpApplNode((OpApplNode) n);
+			return;
+		}
+
+		case NumeralKind: {
+			visitNumeralNode((NumeralNode) n);
+			return;
+		}
+
+		case StringKind: {
+			visitStringNode((StringNode) n);
+			return;
+		}
+
+		case SubstInKind: {
+			visitStubstInNode((SubstInNode) n);
+			return;
+		}
+		case AtNodeKind: { // @
+			visitAtNode((AtNode) n);
+			return;
+		}
+
+		case LetInKind: {
+			visitLetInNode((LetInNode) n);
+			return;
+		}
+
+		}
+	}
+
+	public void visitOpApplNode(OpApplNode n) {
+		switch (n.getOperator().getKind()) {
+		case VariableDeclKind: {
+			visitVariableNode(n);
+			return;
+		}
+		case ConstantDeclKind: {
+			visitConstantNode(n);
+			return;
+		}
+
+		case FormalParamKind: {
+			visitFormalParamNode(n);
+			return;
+		}
+
+		case BuiltInKind: {
+			visitBuiltInNode(n);
+		}
+
+		case UserDefinedOpKind: {
+			visitUserDefinedNode(n);
+		}
+		}
+
+	}
+
+	public void visitBuiltInNode(OpApplNode n) {
+		ExprOrOpArgNode[] arguments = n.getArgs();
+		for (ExprOrOpArgNode exprOrOpArgNode : arguments) {
+			visitExprOrOpArgNode(exprOrOpArgNode);
+		}
+	}
+
+	public void visitLetInNode(LetInNode n) {
+		OpDefNode[] lets = n.getLets();
+		for (OpDefNode opDefNode : lets) {
+			visitLocalDefinition(opDefNode);
+		}
+		visitExprNode(n.getBody());
+	}
+
+	public void visitLocalDefinition(OpDefNode opDefNode) {
+		visitExprNode(opDefNode.getBody());
+	}
+
+	public void visitAtNode(AtNode n) {
+	}
+
+	public void visitStubstInNode(SubstInNode n) {
+		visitExprNode(n.getBody());
+		return;
+	}
+
+	public void visitUserDefinedNode(OpApplNode n) {
+		ExprOrOpArgNode[] arguments = n.getArgs();
+		for (ExprOrOpArgNode exprOrOpArgNode : arguments) {
+			visitExprOrOpArgNode(exprOrOpArgNode);
+		}
+	}
+
+	public void visitFormalParamNode(OpApplNode n) {
+	}
+
+	public void visitConstantNode(OpApplNode n) {
+	}
+
+	public void visitVariableNode(OpApplNode n) {
+	}
+
+	public void visitStringNode(StringNode n) {
+	}
+
+	public void visitNumeralNode(NumeralNode n) {
+	}
+
+}
diff --git a/src/main/java/de/tla2b/analysis/BOperation.java b/src/main/java/de/tla2b/analysis/BOperation.java
index b3b96183735c4942ae17408960a4b286211e38bb..ee9a4d89c6114338debcb4c70dd27fc1a778dc82 100644
--- a/src/main/java/de/tla2b/analysis/BOperation.java
+++ b/src/main/java/de/tla2b/analysis/BOperation.java
@@ -9,7 +9,6 @@ import java.util.ArrayList;
 
 import de.tla2b.global.BBuiltInOPs;
 import de.tla2b.global.TranslationGlobals;
-
 import tla2sany.semantic.ASTConstants;
 import tla2sany.semantic.ExprNode;
 import tla2sany.semantic.FormalParamNode;
@@ -18,6 +17,7 @@ import tla2sany.semantic.OpApplNode;
 import tla2sany.semantic.OpDefNode;
 import tla2sany.semantic.SemanticNode;
 import tla2sany.semantic.SubstInNode;
+import tla2sany.semantic.SymbolNode;
 import tlc2.tool.BuiltInOPs;
 import tlc2.tool.ToolGlobals;
 
@@ -26,6 +26,7 @@ public class BOperation implements ASTConstants, ToolGlobals, TranslationGlobals
 	private ExprNode node;
 	private ArrayList<OpApplNode> existQuans;
 	private ArrayList<String> opParams;
+	private ArrayList<FormalParamNode> formalParams;
 	private ArrayList<String> unchangedVariables;
 
 	public BOperation(String name, ExprNode n,
@@ -39,17 +40,30 @@ public class BOperation implements ASTConstants, ToolGlobals, TranslationGlobals
 
 	private void evalParams() {
 		opParams = new ArrayList<String>();
+		formalParams = new ArrayList<FormalParamNode>();
 		for (int i = 0; i < existQuans.size(); i++) {
 			OpApplNode n = existQuans.get(i);
 			FormalParamNode[][] params = n.getBdedQuantSymbolLists();
 			for (int k = 0; k < params.length; k++) {
 				for (int j = 0; j < params[k].length; j++) {
+					formalParams.add(params[k][j]);
 					opParams.add(params[k][j].getName().toString());
 				}
 			}
 		}
 	}
 
+	public SymbolNode getSymbolNode(){
+		if(node instanceof OpApplNode){
+			OpApplNode n = ((OpApplNode) node);
+			System.out.println(n.getOperator().getKind());
+			if(n.getOperator().getKind() == UserDefinedOpKind){
+				return ((OpApplNode) node).getOperator();
+			}
+		}
+			return null;
+	}
+	
 	public String getName() {
 		return name;
 	}
@@ -65,6 +79,10 @@ public class BOperation implements ASTConstants, ToolGlobals, TranslationGlobals
 	public ArrayList<String> getOpParams() {
 		return opParams;
 	}
+	
+	public ArrayList<FormalParamNode> getFormalParams(){
+		return formalParams;
+	}
 
 	public ArrayList<String> getUnchangedVariables(){
 		return unchangedVariables;
diff --git a/src/main/java/de/tla2b/analysis/SpecAnalyser.java b/src/main/java/de/tla2b/analysis/SpecAnalyser.java
index 7ca3fb7d4e7ce61f310cda29b0d99d256b7cdf59..45c28d535dd540bcc791114628bcdff714dc703a 100644
--- a/src/main/java/de/tla2b/analysis/SpecAnalyser.java
+++ b/src/main/java/de/tla2b/analysis/SpecAnalyser.java
@@ -232,8 +232,8 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants,
 		if (nextExpr == null)
 			return;
 		bOperations = new ArrayList<BOperation>();
-		ArrayList<OpApplNode> existQuans = new ArrayList<OpApplNode>();
-		findOperationsInSemanticNode(nextExpr, nextName, existQuans);
+		findOperationsInSemanticNode(nextExpr, nextName,
+				new ArrayList<OpApplNode>());
 	}
 
 	/**
@@ -635,9 +635,13 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants,
 	public ArrayList<RecursiveFunktion> getRecursiveFunctions() {
 		return recursiveFunctions;
 	}
-	
-	public ArrayList<RecursiveDefinition> getRecursiveDefinitions(){
+
+	public ArrayList<RecursiveDefinition> getRecursiveDefinitions() {
 		return recursiveDefinitions;
 	}
-	
+
+	public ModuleNode getModuleNode() {
+		return this.moduleNode;
+	}
+
 }
diff --git a/src/main/java/de/tla2b/config/ConfigfileEvaluator.java b/src/main/java/de/tla2b/config/ConfigfileEvaluator.java
index 518788a9bd75a83d55dd5fe50b5d86bfe8d60e83..749d0b164ce77ca6ec4cb59ea128ead768528438 100644
--- a/src/main/java/de/tla2b/config/ConfigfileEvaluator.java
+++ b/src/main/java/de/tla2b/config/ConfigfileEvaluator.java
@@ -10,18 +10,13 @@ import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.Map;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.Map.Entry;
 
 import de.tla2b.exceptions.ConfigFileErrorException;
 import de.tla2b.exceptions.UnificationException;
 import de.tla2b.types.BoolType;
 import de.tla2b.types.EnumType;
 import de.tla2b.types.IntType;
-import de.tla2b.types.ModelValueType;
 import de.tla2b.types.SetType;
 import de.tla2b.types.StringType;
 import de.tla2b.types.TLAType;
diff --git a/src/main/java/de/tla2b/pprint/ASTPrettyPrinter.java b/src/main/java/de/tla2b/output/ASTPrettyPrinter.java
similarity index 94%
rename from src/main/java/de/tla2b/pprint/ASTPrettyPrinter.java
rename to src/main/java/de/tla2b/output/ASTPrettyPrinter.java
index 27f86b256370a5341313673e44d72444e0b235f3..3768be4f6808898ff93eb87e3a24e422c03c0bc5 100644
--- a/src/main/java/de/tla2b/pprint/ASTPrettyPrinter.java
+++ b/src/main/java/de/tla2b/output/ASTPrettyPrinter.java
@@ -1,4 +1,4 @@
-package de.tla2b.pprint;
+package de.tla2b.output;
 
 import java.util.ArrayList;
 import java.util.Hashtable;
@@ -11,8 +11,8 @@ import de.be4.classicalb.core.parser.node.AAnySubstitution;
 import de.be4.classicalb.core.parser.node.ABecomesSuchSubstitution;
 import de.be4.classicalb.core.parser.node.ADefinitionExpression;
 import de.be4.classicalb.core.parser.node.ADefinitionPredicate;
-import de.be4.classicalb.core.parser.node.AEmptySequenceExpression;
 import de.be4.classicalb.core.parser.node.AExpressionDefinitionDefinition;
+import de.be4.classicalb.core.parser.node.AIdentifierExpression;
 import de.be4.classicalb.core.parser.node.ALambdaExpression;
 import de.be4.classicalb.core.parser.node.AOperation;
 import de.be4.classicalb.core.parser.node.AOperationsMachineClause;
@@ -28,6 +28,7 @@ import de.be4.classicalb.core.parser.node.Token;
 public class ASTPrettyPrinter extends ExtendedDFAdapter {
 	private final StringBuilder builder = new StringBuilder();
 	private final StringBuilder sb = new StringBuilder();
+	private Renamer renamer;
 
 	private static final int no = 0;
 	private static final int left = 1;
@@ -36,6 +37,13 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter {
 
 	private final static Hashtable<String, NodeInfo> infoTable = new Hashtable<String, NodeInfo>();
 
+	public ASTPrettyPrinter(Renamer renamer) {
+		this.renamer = renamer;
+	}
+
+	public ASTPrettyPrinter() {
+	}
+
 	private static void putInfixOperator(String nodeName, String symbol,
 			int precedence, int a) {
 		infoTable.put(nodeName, new NodeInfo(null, null, null, null, " "
@@ -198,6 +206,23 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter {
 
 	}
 
+	@Override
+	public void caseAIdentifierExpression(final AIdentifierExpression node) {
+		if (renamer != null) {
+			sb.append(renamer.getNewName(node));
+		} else
+
+		{
+			final List<TIdentifierLiteral> copy = new ArrayList<TIdentifierLiteral>(
+					node.getIdentifier());
+			for (final Iterator<TIdentifierLiteral> iterator = copy.iterator(); iterator
+					.hasNext();) {
+				final TIdentifierLiteral e = iterator.next();
+				e.apply(this);
+			}
+		}
+	}
+
 	@Override
 	public String toString() {
 		return builder.toString();
@@ -240,11 +265,22 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter {
 		return false;
 	}
 
+	@Override
+	public void caseTIdentifierLiteral(TIdentifierLiteral node) {
+		if (renamer != null) {
+			sb.append(renamer.getNewName(node));
+		} else {
+			sb.append(node.getText());
+		}
+
+	}
+
 	@Override
 	public void defaultCase(final Node node) {
 		super.defaultCase(node);
 		if (node instanceof Token) {
 			builder.append(((Token) node).getText());
+
 			sb.append(((Token) node).getText());
 		} else {
 			builder.append(node.toString());
@@ -318,10 +354,14 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter {
 		return string.trim();
 	}
 
-	public String getResult() {
+	public String getResultString() {
 		return sb.toString();
 	}
 
+	public StringBuilder getResultAsStringbuilder() {
+		return sb;
+	}
+
 	@Override
 	public void caseAAbstractMachineParseUnit(AAbstractMachineParseUnit node) {
 		sb.append("MACHINE ");
diff --git a/src/main/java/de/tla2b/output/Renamer.java b/src/main/java/de/tla2b/output/Renamer.java
new file mode 100644
index 0000000000000000000000000000000000000000..7c6e707dc9af2483ff851c2a81c17187982d0ee9
--- /dev/null
+++ b/src/main/java/de/tla2b/output/Renamer.java
@@ -0,0 +1,113 @@
+package de.tla2b.output;
+
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Set;
+
+import de.be4.classicalb.core.parser.Utils;
+import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter;
+import de.be4.classicalb.core.parser.node.AIdentifierExpression;
+import de.be4.classicalb.core.parser.node.Node;
+import de.be4.classicalb.core.parser.node.Start;
+import de.be4.classicalb.core.parser.node.TIdentifierLiteral;
+
+public class Renamer extends DepthFirstAdapter {
+
+	private final java.util.Hashtable<Node, String> namesTables;
+	private final Set<String> globalNames;
+
+	public Renamer(Start start) {
+		this.namesTables = new Hashtable<Node, String>();
+		this.globalNames = new HashSet<String>();
+
+		start.apply(this);
+	}
+
+	private final static Set<String> KEYWORDS = new HashSet<String>();
+	static {
+		KEYWORDS.add("seq");
+		KEYWORDS.add("left");
+		KEYWORDS.add("right");
+		KEYWORDS.add("max");
+		KEYWORDS.add("min");
+		KEYWORDS.add("succ");
+		KEYWORDS.add("pred");
+		KEYWORDS.add("dom");
+		KEYWORDS.add("ran");
+		KEYWORDS.add("fnc");
+		KEYWORDS.add("rel");
+		KEYWORDS.add("id");
+		KEYWORDS.add("card");
+		KEYWORDS.add("POW");
+		KEYWORDS.add("POW1");
+		KEYWORDS.add("FIN");
+		KEYWORDS.add("FIN1");
+		KEYWORDS.add("size");
+		KEYWORDS.add("rev");
+		KEYWORDS.add("first");
+		KEYWORDS.add("last");
+		KEYWORDS.add("front");
+		KEYWORDS.add("tail");
+		KEYWORDS.add("conc");
+		KEYWORDS.add("struct");
+		KEYWORDS.add("rec");
+		KEYWORDS.add("tree");
+		KEYWORDS.add("btree");
+		KEYWORDS.add("skip");
+		KEYWORDS.add("ANY");
+		KEYWORDS.add("WHERE");
+		KEYWORDS.add("END");
+		KEYWORDS.add("BE");
+		KEYWORDS.add("VAR");
+		KEYWORDS.add("ASSERT");
+		KEYWORDS.add("CHOICE");
+		KEYWORDS.add("OR");
+		KEYWORDS.add("SELECT");
+		KEYWORDS.add("EITHER");
+		KEYWORDS.add("WHEN");
+		KEYWORDS.add("BEGIN");
+		KEYWORDS.add("MACHINE");
+		KEYWORDS.add("REFINEMENT");
+		KEYWORDS.add("IMPLEMENTATION");
+		KEYWORDS.add("SETS");
+		KEYWORDS.add("CONSTRAINTS");
+		KEYWORDS.add("MODEL");
+		KEYWORDS.add("SYSTEM");
+		KEYWORDS.add("MACHINE");
+		KEYWORDS.add("EVENTS");
+		KEYWORDS.add("OPERATIONS");
+	}
+
+	@Override
+	public void caseAIdentifierExpression(AIdentifierExpression node) {
+		String name = Utils.getIdentifierAsString(node.getIdentifier());
+		String newName = incName(name, new HashSet<String>());
+		namesTables.put(node, newName);
+	}
+
+	@Override
+	public void caseTIdentifierLiteral(TIdentifierLiteral node){
+		String name = node.getText();
+		String newName = incName(name, new HashSet<String>());
+		namesTables.put(node, newName);
+	}
+	
+	private Boolean existingName(String name) {
+		if (globalNames.contains(name) || KEYWORDS.contains(name)) {
+			return true;
+		} else
+			return false;
+	}
+
+	private String incName(String name, Set<String> tempSet) {
+		String res = name;
+		for (int i = 1; existingName(res) || tempSet.contains(res); i++) {
+			res = name + "_" + i;
+		}
+		return res;
+	}
+
+	public String getNewName(Node node) {
+		return namesTables.get(node);
+	}
+}
diff --git a/src/main/java/de/tla2b/translation/BMacroHandler.java b/src/main/java/de/tla2b/translation/BMacroHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..773309860205ac91fe3339e62d42b55c301eed7e
--- /dev/null
+++ b/src/main/java/de/tla2b/translation/BMacroHandler.java
@@ -0,0 +1,37 @@
+package de.tla2b.translation;
+
+import java.util.ArrayList;
+
+import tla2sany.semantic.ModuleNode;
+import tla2sany.semantic.OpDefNode;
+import de.tla2b.analysis.AbstractASTVisitor;
+import de.tla2b.analysis.SpecAnalyser;
+import de.tla2b.config.ConfigfileEvaluator;
+
+public class BMacroHandler extends AbstractASTVisitor {
+
+	public BMacroHandler(SpecAnalyser specAnalyser, ConfigfileEvaluator conEval) {
+		ModuleNode moduleNode = specAnalyser.getModuleNode();
+		ArrayList<OpDefNode> bDefs = new ArrayList<OpDefNode>();
+		for (int i = 0; i < moduleNode.getOpDefs().length; i++) {
+			OpDefNode def = moduleNode.getOpDefs()[i];
+			if (specAnalyser.getBDefinitions().contains(def)) {
+				if (conEval != null
+						&& conEval.getConstantOverrideTable()
+								.containsValue(def)) {
+					continue;
+				}
+				bDefs.add(def);
+			}
+		}
+		for (OpDefNode opDefNode : bDefs) {
+			visitDefinition(opDefNode);
+		}
+	}
+	
+	@Override
+	public void visitDefinition(OpDefNode def){
+		
+	}
+	
+}
diff --git a/src/main/java/de/tla2bAst/BAstCreator.java b/src/main/java/de/tla2bAst/BAstCreator.java
index 32d9f5f5f9b95dadd5249c94f0e625ba6195a627..1167a2875243d1841865b89912c1938e30730377 100644
--- a/src/main/java/de/tla2bAst/BAstCreator.java
+++ b/src/main/java/de/tla2bAst/BAstCreator.java
@@ -23,6 +23,7 @@ import tla2sany.semantic.OpApplNode;
 import tla2sany.semantic.OpDeclNode;
 import tla2sany.semantic.OpDefNode;
 import tla2sany.semantic.StringNode;
+import tla2sany.semantic.SymbolNode;
 import tlc2.tool.BuiltInOPs;
 import tlc2.value.SetEnumValue;
 import tlc2.value.Value;
@@ -195,8 +196,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 		AAbstractMachineParseUnit aAbstractMachineParseUnit = new AAbstractMachineParseUnit();
 		aAbstractMachineParseUnit.setVariant(new AMachineMachineVariant());
 		AMachineHeader machineHeader = new AMachineHeader();
-		List<TIdentifierLiteral> headerName = createTIdentifierLiteral(moduleNode
-				.getName().toString());
+		List<TIdentifierLiteral> headerName = createTIdentifierLiteral(getName(moduleNode));
 		machineHeader.setName(headerName);
 		aAbstractMachineParseUnit.setHeader(machineHeader);
 
@@ -210,7 +210,6 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 		createOperationsClause();
 
 		aAbstractMachineParseUnit.setMachineClauses(machineClauseList);
-
 		start = new Start(aAbstractMachineParseUnit, new EOF());
 
 	}
@@ -283,21 +282,19 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 			List<PExpression> list = new ArrayList<PExpression>();
 			for (int i = 0; i < opDefNode.getParams().length; i++) {
 				FormalParamNode p = opDefNode.getParams()[i];
-				list.add(createIdentifierNode(p.getName().toString()));
+				list.add(createIdentifierNode(p));
 			}
-
 			// TLAType type = (TLAType) opDefNode.getToolObject(TYPE_ID);
 			// if (opDefNode.level == 2 || type instanceof BoolType) {
 			if (predicateVsExpression.getDefinitionType(opDefNode) == DefinitionType.PREDICATE) {
 				APredicateDefinitionDefinition d = new APredicateDefinitionDefinition();
-				d.setName(new TDefLiteralPredicate(opDefNode.getName()
-						.toString()));
+				d.setName(new TDefLiteralPredicate(getName(opDefNode)));
 				d.setParameters(list);
 				d.setRhs(visitExprNodePredicate(opDefNode.getBody()));
 				defs.add(d);
 			} else {
 				AExpressionDefinitionDefinition d = new AExpressionDefinitionDefinition();
-				d.setName(new TIdentifierLiteral(opDefNode.getName().toString()));
+				d.setName(new TIdentifierLiteral(getName(opDefNode)));
 
 				d.setParameters(list);
 				d.setRhs(visitExprNodeExpression(opDefNode.getBody()));
@@ -361,11 +358,14 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 		List<POperation> opList = new ArrayList<POperation>();
 		for (int i = 0; i < bOperations.size(); i++) {
 			BOperation op = bOperations.get(i);
+
 			String defName = op.getName();
+
 			List<PExpression> paramList = new ArrayList<PExpression>();
 			ArrayList<PPredicate> whereList = new ArrayList<PPredicate>();
-			for (int j = 0; j < op.getOpParams().size(); j++) {
-				paramList.add(createIdentifierNode(op.getOpParams().get(j)));
+			for (int j = 0; j < op.getFormalParams().size(); j++) {
+				paramList
+						.add(createIdentifierNode(op.getFormalParams().get(j)));
 			}
 			for (int j = 0; j < op.getExistQuans().size(); j++) {
 				OpApplNode o = op.getExistQuans().get(j);
@@ -381,7 +381,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 			OpDeclNode[] vars = moduleNode.getVariableDecls();
 			List<PExpression> anyParams = new ArrayList<PExpression>();
 			for (int j = 0; j < vars.length; j++) {
-				String varName = vars[j].getName().toString();
+				String varName = getName(vars[j]);
 				String nextName = varName + "_n";
 				if (op.getUnchangedVariables().contains(varName))
 					continue;
@@ -420,10 +420,11 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 			List<PExpression> varList = new ArrayList<PExpression>();
 			List<PExpression> valueList = new ArrayList<PExpression>();
 			for (int j = 0; j < vars.length; j++) {
-				String varName = vars[j].getName().toString();
+				String varName = getName(vars[j]);
 				if (op.getUnchangedVariables().contains(varName))
 					continue;
-				varList.add(createIdentifierNode(varName));
+				varList.add(createIdentifierNode(vars[j]));
+
 				valueList.add(createIdentifierNode(varName + "_n"));
 			}
 			AAssignSubstitution assign = new AAssignSubstitution(varList,
@@ -443,7 +444,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 			return;
 		List<PExpression> varList = new ArrayList<PExpression>();
 		for (int i = 0; i < vars.length; i++) {
-			varList.add(createIdentifierNode(vars[i].getName().toString()));
+			varList.add(createIdentifierNode(vars[i]));
 		}
 		ABecomesSuchSubstitution becomes = new ABecomesSuchSubstitution();
 		becomes.setIdentifiers(varList);
@@ -465,8 +466,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 			List<PExpression> list = new ArrayList<PExpression>();
 			for (OpDeclNode opDeclNode : bVariables) {
 				AIdentifierExpression id = new AIdentifierExpression(
-						createTIdentifierLiteral(opDeclNode.getName()
-								.toString()));
+						createTIdentifierLiteral(getName(opDeclNode)));
 				list.add(id);
 			}
 			AVariablesMachineClause varClause = new AVariablesMachineClause(
@@ -476,7 +476,6 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 	}
 
 	private void createConstantsClause() {
-
 		List<OpDeclNode> bConstants;
 		if (conEval != null) {
 			bConstants = conEval.getbConstantList();
@@ -487,16 +486,14 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 		List<PExpression> constantsList = new ArrayList<PExpression>();
 		for (OpDeclNode opDeclNode : bConstants) {
 			AIdentifierExpression id = new AIdentifierExpression(
-					createTIdentifierLiteral(opDeclNode.getName().toString()));
+					createTIdentifierLiteral(getName(opDeclNode)));
 			constantsList.add(id);
 		}
 
 		for (RecursiveDefinition recDef : specAnalyser
 				.getRecursiveDefinitions()) {
-
 			AIdentifierExpression id = new AIdentifierExpression(
-					createTIdentifierLiteral(recDef.getOpDefNode().getName()
-							.toString()));
+					createTIdentifierLiteral(getName(recDef.getOpDefNode())));
 			constantsList.add(id);
 		}
 
@@ -508,26 +505,29 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 
 	}
 
+	private AIdentifierExpression createIdentifierNode(SymbolNode symbolNode) {
+		return createIdentifierNode(symbolNode.getName().toString());
+	}
+
 	private void createPropertyClause() {
 		List<PPredicate> propertiesList = new ArrayList<PPredicate>();
 
 		for (RecursiveDefinition recDef : specAnalyser
 				.getRecursiveDefinitions()) {
 			OpDefNode def = recDef.getOpDefNode();
-			TLAType t = (TLAType) def.getToolObject(TYPE_ID);
+			//TLAType t = (TLAType) def.getToolObject(TYPE_ID);
 			// OpApplNode ifThenElse = recDef.getIfThenElse();
 			FormalParamNode[] params = def.getParams();
 			ArrayList<PExpression> paramList1 = new ArrayList<PExpression>();
 			ArrayList<PPredicate> typeList = new ArrayList<PPredicate>();
 			// ArrayList<PExpression> paramList2 = new ArrayList<PExpression>();
 			for (FormalParamNode p : params) {
-				paramList1.add(createIdentifierNode(p.getName().toString()));
+				paramList1.add(createIdentifierNode(p));
 				// paramList2.add(createIdentifierNode(p.getName().toString()));
 				TLAType paramType = (TLAType) p.getToolObject(TYPE_ID);
-				System.out.println(paramType);
+				// System.out.println(paramType);
 				AEqualPredicate equal = new AEqualPredicate(
-						createIdentifierNode(p.getName().toString()),
-						paramType.getBNode());
+						createIdentifierNode(p), paramType.getBNode());
 				typeList.add(equal);
 			}
 			ALambdaExpression lambda1 = new ALambdaExpression();
@@ -546,7 +546,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 			// AUnionExpression union = new AUnionExpression(lambda1, lambda2);
 
 			AEqualPredicate equals = new AEqualPredicate(
-					createIdentifierNode(def.getName().toString()), lambda1);
+					createIdentifierNode(def), lambda1);
 			propertiesList.add(equals);
 		}
 
@@ -569,20 +569,20 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 				}
 				if (isEnum) {
 					AEqualPredicate equal = new AEqualPredicate();
-					equal.setLeft(createIdentifierNode(con.getName().toString()));
+					equal.setLeft(createIdentifierNode(con));
 					equal.setRight(createIdentifierNode(((SetType) t)
 							.getSubType().toString()));
 					propertiesList.add(equal);
 				} else {
 					AEqualPredicate equal = new AEqualPredicate();
-					equal.setLeft(createIdentifierNode(con.getName().toString()));
+					equal.setLeft(createIdentifierNode(con));
 					Value tlcValue = v.getValue();
 					equal.setRight(createTLCValue(tlcValue));
 					propertiesList.add(equal);
 				}
 			} else {
 				AMemberPredicate member = new AMemberPredicate();
-				member.setLeft(createIdentifierNode(con.getName().toString()));
+				member.setLeft(createIdentifierNode(con));
 				TLAType t = (TLAType) con.getToolObject(TYPE_ID);
 				member.setRight(t.getBNode());
 				propertiesList.add(member);
@@ -609,7 +609,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 				}
 
 				AEqualPredicate equal = new AEqualPredicate();
-				equal.setLeft(createIdentifierNode(con.getName().toString()));
+				equal.setLeft(createIdentifierNode(con));
 				equal.setRight(visitExprNodeExpression(def.getBody()));
 				propertiesList.add(equal);
 			}
@@ -631,7 +631,6 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 	private PExpression createTLCValue(Value tlcValue) {
 		switch (tlcValue.getKind()) {
 		case INTVALUE:
-
 			return new AIntegerExpression(new TIntegerLiteral(
 					tlcValue.toString()));
 
@@ -650,7 +649,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 			TLAType varType = (TLAType) vars[i].getToolObject(TYPE_ID);
 
 			AMemberPredicate member = new AMemberPredicate();
-			member.setLeft(createIdentifierNode(vars[i].getName().toString()));
+			member.setLeft(createIdentifierNode(vars[i]));
 			member.setRight(varType.getBNode());
 
 			predList.add(member);
@@ -659,8 +658,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 		if (conEval != null) {
 			for (OpDefNode def : conEval.getInvariants()) {
 				ADefinitionPredicate defPred = new ADefinitionPredicate();
-				defPred.setDefLiteral(new TDefLiteralPredicate(def.getName()
-						.toString()));
+				defPred.setDefLiteral(new TDefLiteralPredicate(getName(def)));
 				predList.add(defPred);
 			}
 		}
@@ -735,7 +733,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 				select.setRecord(visitExprNodeExpression(at.getAtBase()));
 				StringNode stringNode = (StringNode) list.get(0);
 				select.setIdentifier(createIdentifierNode(stringNode.getRep()
-						.toString()));
+						.toString())); // TODO renamed
 				return select;
 			}
 		}
@@ -754,12 +752,12 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 	private PPredicate visitOpApplNodePredicate(OpApplNode n) {
 		switch (n.getOperator().getKind()) {
 		case ConstantDeclKind: {
-			return new AEqualPredicate(createIdentifierNode(n.getOperator()
-					.getName().toString()), new ABooleanTrueExpression());
+			return new AEqualPredicate(createIdentifierNode(n.getOperator()),
+					new ABooleanTrueExpression());
 		}
 		case VariableDeclKind: {
-			return new AEqualPredicate(createIdentifierNode(n.getOperator()
-					.getName().toString()), new ABooleanTrueExpression());
+			return new AEqualPredicate(createIdentifierNode(n.getOperator()),
+					new ABooleanTrueExpression());
 
 		}
 		case BuiltInKind:
@@ -777,10 +775,10 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 	private PExpression visitOpApplNodeExpression(OpApplNode n) {
 		switch (n.getOperator().getKind()) {
 		case ConstantDeclKind: {
-			return createIdentifierNode(n.getOperator().getName().toString());
+			return createIdentifierNode(n.getOperator());
 		}
 		case VariableDeclKind: {
-			return createIdentifierNode(n.getOperator().getName().toString());
+			return createIdentifierNode(n.getOperator());
 		}
 
 		case FormalParamKind: {
@@ -788,8 +786,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 			ExprOrOpArgNode e = (ExprOrOpArgNode) param
 					.getToolObject(SUBSTITUTE_PARAM);
 			if (e == null) {
-				return createIdentifierNode(n.getOperator().getName()
-						.toString());
+				return createIdentifierNode(n.getOperator());
 			} else {
 				return visitExprOrOpArgNodeExpression(e);
 			}
@@ -810,7 +807,6 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 
 	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()
@@ -825,22 +821,23 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 		}
 		if (predicateVsExpression.getDefinitionType(def) == DefinitionType.EXPRESSION) {
 			ADefinitionExpression defCall = new ADefinitionExpression();
-			defCall.setDefLiteral(new TIdentifierLiteral(def.getName()
-					.toString()));
-			;
+			defCall.setDefLiteral(new TIdentifierLiteral(getName(def)));
 			defCall.setParameters(params);
 			return new AEqualPredicate(defCall, new ABooleanTrueExpression());
 
 		} else {
 			ADefinitionPredicate defCall = new ADefinitionPredicate();
-			defCall.setDefLiteral(new TDefLiteralPredicate(def.getName()
-					.toString()));
+			defCall.setDefLiteral(new TDefLiteralPredicate(getName(def)));
 
 			defCall.setParameters(params);
 			return defCall;
 		}
 	}
 
+	private String getName(SymbolNode def) {
+		return def.getName().toString();
+	}
+
 	private PExpression visitUserdefinedOpExpression(OpApplNode n) {
 		OpDefNode def = (OpDefNode) n.getOperator();
 		// Operator is a B built-in operator
@@ -867,7 +864,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 				while (iter.hasNext()) {
 					Entry<OpDeclNode, OpDefNode> entry = iter.next();
 					if (entry.getValue().equals(def)) {
-						name = entry.getKey().getName().toString();
+						name = getName(entry.getKey());
 					}
 				}
 				if (params.size() == 0) {
@@ -880,8 +877,8 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 				}
 			} else {
 				ADefinitionExpression defExpr = new ADefinitionExpression();
-				defExpr.setDefLiteral(new TIdentifierLiteral(n.getOperator()
-						.getName().toString()));
+				defExpr.setDefLiteral(new TIdentifierLiteral(getName(n
+						.getOperator())));
 				defExpr.setParameters(params);
 				return defExpr;
 			}
@@ -1241,18 +1238,18 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 
 		case OPCODE_sso: { // $SubsetOf Represents {x \in S : P}
 			// TODO tuple with more than 2 arguments
-			FormalParamNode[][] params = n.getBdedQuantSymbolLists();
-			ExprNode[] bounds = n.getBdedQuantBounds();
+			//FormalParamNode[][] params = n.getBdedQuantSymbolLists();
+			//ExprNode[] bounds = n.getBdedQuantBounds();
 
 			List<PExpression> list = new ArrayList<PExpression>();
 			FormalParamNode p = n.getBdedQuantSymbolLists()[0][0];
-			list.add(createIdentifierNode(p.getName().toString()));
+			list.add(createIdentifierNode(p));
 
 			AComprehensionSetExpression compre = new AComprehensionSetExpression();
 			compre.setIdentifiers(list);
 
 			AMemberPredicate member = new AMemberPredicate();
-			member.setLeft(createIdentifierNode(p.getName().toString()));
+			member.setLeft(createIdentifierNode(p));
 			ExprNode in = n.getBdedQuantBounds()[0];
 			member.setRight(visitExprNodeExpression(in));
 
@@ -1273,11 +1270,11 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 			for (int i = 0; i < bounds.length; i++) {
 				FormalParamNode p = params[i][0];
 				AMemberPredicate member = new AMemberPredicate();
-				member.setLeft(createIdentifierNode(p.getName().toString()));
+				member.setLeft(createIdentifierNode(p));
 				ExprNode in = n.getBdedQuantBounds()[i];
 				member.setRight(visitExprNodeExpression(in));
 				predList.add(member);
-				idList.add(createIdentifierNode(p.getName().toString()));
+				idList.add(createIdentifierNode(p));
 			}
 			final String nameOfTempVariable = "t_";
 			AEqualPredicate equals = new AEqualPredicate();
@@ -1299,18 +1296,18 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 		case OPCODE_fc: // Represents [x \in S |-> e].
 		case OPCODE_rfs: {
 			FormalParamNode[][] params = n.getBdedQuantSymbolLists();
-			ExprNode[] bounds = n.getBdedQuantBounds();
+			//ExprNode[] bounds = n.getBdedQuantBounds(); TODO
 			List<PExpression> idList = new ArrayList<PExpression>();
 			List<PPredicate> predList = new ArrayList<PPredicate>();
 			for (int i = 0; i < params.length; i++) {
 				for (int j = 0; j < params[i].length; j++) {
 					FormalParamNode p = params[i][j];
 					AMemberPredicate member = new AMemberPredicate();
-					member.setLeft(createIdentifierNode(p.getName().toString()));
+					member.setLeft(createIdentifierNode(p));
 					ExprNode in = n.getBdedQuantBounds()[i];
 					member.setRight(visitExprNodeExpression(in));
 					predList.add(member);
-					idList.add(createIdentifierNode(p.getName().toString()));
+					idList.add(createIdentifierNode(p));
 				}
 			}
 			ALambdaExpression lambda = new ALambdaExpression();
@@ -1386,7 +1383,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 			}
 			List<PRecEntry> recList = new ArrayList<PRecEntry>();
 			for (int i = 0; i < struct.getFields().size(); i++) {
-				String fieldName = struct.getFields().get(i);
+				String fieldName = struct.getFields().get(i); // renamed name
 				AIdentifierExpression field = createIdentifierNode(fieldName);
 				ARecEntry rec = new ARecEntry();
 				rec.setIdentifier(field);
@@ -1433,7 +1430,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 			rcdSelect.setRecord(visitExprOrOpArgNodeExpression(n.getArgs()[0]));
 			StringNode stringNode = (StringNode) n.getArgs()[1];
 			rcdSelect.setIdentifier(createIdentifierNode(stringNode.getRep()
-					.toString()));
+					.toString())); // TODO renamed
 			return rcdSelect;
 		}
 
@@ -1510,7 +1507,8 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 					if (value == null) {
 						value = new ARecordFieldExpression(
 								visitExprOrOpArgNodeExpression(n.getArgs()[0]),
-								createIdentifierNode(fieldName));
+								createIdentifierNode(fieldName)); // TODO
+																	// renamed
 					}
 					entry.setValue(value);
 					list.add(entry);
@@ -1519,7 +1517,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 				return rec;
 
 			} else {
-				FunctionType func = (FunctionType) type;
+				//FunctionType func = (FunctionType) type;
 
 				List<PExpression> list = new ArrayList<PExpression>();
 				for (int i = 1; i < n.getArgs().length; i++) {
@@ -1568,8 +1566,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 		defCall.setDefLiteral(new TIdentifierLiteral("CHOOSE"));
 		AComprehensionSetExpression comprehension = new AComprehensionSetExpression();
 		FormalParamNode x = n.getUnbdedQuantSymbols()[0];
-		comprehension.setIdentifiers(createIdentifierList(x.getName()
-				.toString()));
+		comprehension.setIdentifiers(createIdentifierList(getName(x)));
 		comprehension
 				.setPredicates(visitExprOrOpArgNodePredicate(n.getArgs()[0]));
 		List<PExpression> list = new ArrayList<PExpression>();
@@ -1583,10 +1580,9 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 		defCall.setDefLiteral(new TIdentifierLiteral("CHOOSE"));
 		AComprehensionSetExpression comprehension = new AComprehensionSetExpression();
 		FormalParamNode x = n.getBdedQuantSymbolLists()[0][0];
-		comprehension.setIdentifiers(createIdentifierList(x.getName()
-				.toString()));
+		comprehension.setIdentifiers(createIdentifierList(x));
 		AMemberPredicate member = new AMemberPredicate();
-		member.setLeft(createIdentifierNode(x.getName().toString()));
+		member.setLeft(createIdentifierNode(x));
 		ExprNode in = n.getBdedQuantBounds()[0];
 		member.setRight(visitExprNodeExpression(in));
 		AConjunctPredicate conj = new AConjunctPredicate();
@@ -1638,6 +1634,12 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 		return list;
 	}
 
+	private List<PExpression> createIdentifierList(SymbolNode symbolNode) {
+		ArrayList<PExpression> list = new ArrayList<PExpression>();
+		list.add(createIdentifierNode(getName(symbolNode)));
+		return list;
+	}
+
 	private PPredicate visitBuiltInKindPredicate(OpApplNode n) {
 		switch (getOpCode(n.getOperator().getName())) {
 		case OPCODE_land: // \land
@@ -1693,8 +1695,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 			ArrayList<PExpression> list = new ArrayList<PExpression>();
 			for (int i = 0; i < params.length; i++) {
 				for (int j = 0; j < params[i].length; j++) {
-					list.add(createIdentifierNode(params[i][j].getName()
-							.toString()));
+					list.add(createIdentifierNode(params[i][j]));
 				}
 			}
 			AConjunctPredicate conjunction = new AConjunctPredicate();
@@ -1708,8 +1709,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 			ArrayList<PExpression> list = new ArrayList<PExpression>();
 			for (int i = 0; i < params.length; i++) {
 				for (int j = 0; j < params[i].length; j++) {
-					list.add(createIdentifierNode(params[i][j].getName()
-							.toString()));
+					list.add(createIdentifierNode(params[i][j]));
 				}
 			}
 			AImplicationPredicate implication = new AImplicationPredicate();
@@ -1799,9 +1799,9 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 		case OPCODE_prime: // prime
 		{
 			OpApplNode node = (OpApplNode) n.getArgs()[0];
-			return new AEqualPredicate(createIdentifierNode(node.getOperator()
-					.getName().toString()
-					+ "_n"), new ABooleanTrueExpression());
+			return new AEqualPredicate(
+					createIdentifierNode(getName(node.getOperator()) + "_n"),
+					new ABooleanTrueExpression());
 		}
 
 		case OPCODE_unchanged: {
@@ -1853,8 +1853,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 
 				ArrayList<PExpression> list = new ArrayList<PExpression>();
 				for (int j = 0; j < params[i].length; j++) {
-					list.add(createIdentifierNode(params[i][j].getName()
-							.toString()));
+					list.add(createIdentifierNode(params[i][j]));
 				}
 				AMemberPredicate member = new AMemberPredicate();
 				member.setLeft(new ACoupleExpression(list));
@@ -1863,8 +1862,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals,
 			} else {
 				for (int j = 0; j < params[i].length; j++) {
 					AMemberPredicate member = new AMemberPredicate();
-					member.setLeft(createIdentifierNode(params[i][j].getName()
-							.toString()));
+					member.setLeft(createIdentifierNode(params[i][j]));
 					member.setRight(visitExprNodeExpression(in[i]));
 					predList.add(member);
 				}
diff --git a/src/main/java/de/tla2bAst/Translator.java b/src/main/java/de/tla2bAst/Translator.java
index 6ac6512c95e4f7fa89dcd6c659ccab766527c7b3..fb81ace48886a75b0a82d7a05430200f6e5e24ca 100644
--- a/src/main/java/de/tla2bAst/Translator.java
+++ b/src/main/java/de/tla2bAst/Translator.java
@@ -1,8 +1,12 @@
 package de.tla2bAst;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.io.Writer;
+import java.util.Date;
 
 import de.be4.classicalb.core.parser.Definitions;
 import de.be4.classicalb.core.parser.node.Start;
@@ -17,22 +21,24 @@ import de.tla2b.config.ConfigfileEvaluator;
 import de.tla2b.config.ModuleOverrider;
 import de.tla2b.exceptions.FrontEndException;
 import de.tla2b.exceptions.TLA2BException;
+import de.tla2b.global.TranslationGlobals;
+import de.tla2b.output.ASTPrettyPrinter;
 import de.tla2b.pprint.BMachinePrinter;
 import tla2sany.drivers.SANY;
 import tla2sany.modanalyzer.SpecObj;
 import tla2sany.semantic.ModuleNode;
 import tlc2.tool.ModelConfig;
-import util.FileUtil;
 import util.ToolIO;
 
-public class Translator {
+public class Translator implements TranslationGlobals {
 	private String moduleFileName;
 	private File moduleFile;
 	private File configFile;
+	private Start BAst;
 
 	private Definitions bDefinitions;
 
-	//private String moduleName;
+	// private String moduleName;
 	private ModuleNode moduleNode;
 	private ModelConfig modelConfig;
 
@@ -51,13 +57,11 @@ public class Translator {
 		String configFileName = removeExtention(moduleFile.getAbsolutePath());
 		configFileName = configFileName + ".cfg";
 		configFile = new File(configFileName);
-		if(!configFile.exists()){
+		if (!configFile.exists()) {
 			configFile = null;
 		}
 	}
 
-
-
 	private void findModuleFile() {
 		moduleFile = new File(moduleFileName);
 		if (!moduleFile.exists()) {
@@ -103,11 +107,11 @@ public class Translator {
 		parse();
 	}
 
-
-	public  ModuleNode parseModule2() throws de.tla2b.exceptions.FrontEndException {
+	public ModuleNode parseModule2()
+			throws de.tla2b.exceptions.FrontEndException {
 		String fileName = moduleFile.getName();
 		ToolIO.setUserDir(moduleFile.getParent());
-		
+
 		SpecObj spec = new SpecObj(fileName, null);
 		try {
 			SANY.frontEndMain(spec, fileName, ToolIO.out);
@@ -143,7 +147,7 @@ public class Translator {
 
 		return n;
 	}
-	
+
 	public static String allMessagesToString(String[] allMessages) {
 		StringBuilder sb = new StringBuilder();
 		for (int i = 0; i < allMessages.length - 1; i++) {
@@ -151,10 +155,10 @@ public class Translator {
 		}
 		return sb.toString();
 	}
-	
+
 	private void parse() throws FrontEndException {
 		moduleNode = parseModule2();
-		
+
 		modelConfig = null;
 		if (configFile != null) {
 			modelConfig = new ModelConfig(configFile.getAbsolutePath(),
@@ -206,12 +210,68 @@ public class Translator {
 		UsedExternalFunctions usedExternalFunctions = new UsedExternalFunctions(
 				moduleNode, specAnalyser);
 
+		
+		//BMacroHandler bMacroHandler = new BMacroHandler(specAnalyser, conEval);
 		BAstCreator bAstCreator = new BAstCreator(moduleNode, conEval,
 				specAnalyser, usedExternalFunctions, predicateVsExpression);
-
+		this.BAst = bAstCreator.getStartNode();
 		this.bDefinitions = bAstCreator.getBDefinitions();
-		System.out.println(bDefinitions.getDefinitionNames());
-		return bAstCreator.getStartNode();
+		return BAst;
+	}
+
+	public void createMachineFile() {
+		String bFile = removeExtention(moduleFile.getAbsolutePath());
+		bFile = bFile + "_tla.mch";
+
+		File machineFile;
+		machineFile = new File(bFile);
+		if (machineFile.exists()) {
+			try {
+				BufferedReader in;
+				in = new BufferedReader(new FileReader(machineFile));
+				String firstLine = in.readLine();
+				in.close();
+				if (firstLine != null && !firstLine.startsWith("/*@ generated by TLA2B ")) {
+					System.err.println("Error: File " + machineFile.getName()
+							+ " already exists"
+							+ " and was not generated by TLA2B.\n"
+							+ "Delete or move this file.");
+					System.exit(-1);
+				}
+			} catch (IOException e) {
+				System.err.println(e.getMessage());
+				System.exit(-1);
+			}
+		}
+
+		try {
+			machineFile.createNewFile();
+		} catch (IOException e) {
+			System.err.println(String.format("Could not create File %s.",
+					machineFile.getName()));
+			System.exit(-1);
+		}
+
+		
+		ASTPrettyPrinter aP = new ASTPrettyPrinter();
+		BAst.apply(aP);
+		StringBuilder result = aP.getResultAsStringbuilder();
+		result.insert(0, "/*@ generated by TLA2B " + VERSION + " " + new Date()
+				+ " */\n");
+
+		Writer fw = null;
+		try {
+			fw = new FileWriter(machineFile);
+			fw.write(result.toString());
+			fw.close();
+			System.out.println("B-Machine " + machineFile.getAbsolutePath()
+					+ " created.");
+		} catch (IOException e) {
+			System.err.println("Error while creating file '"
+					+ machineFile.getAbsolutePath() + "'.");
+			System.exit(-1);
+		}
+
 	}
 
 	public static String removeExtention(String filePath) {
@@ -236,7 +296,7 @@ public class Translator {
 			return renamed.getPath();
 		}
 	}
-	
+
 	public Definitions getBDefinitions() {
 		return bDefinitions;
 	}
diff --git a/src/test/java/de/tla2b/main/MainTest.java b/src/test/java/de/tla2b/main/MainTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..08a620042c6b443690e628010a44b0e9e8a0a1dc
--- /dev/null
+++ b/src/test/java/de/tla2b/main/MainTest.java
@@ -0,0 +1,15 @@
+package de.tla2b.main;
+
+import org.junit.Test;
+
+import de.tla2b.TLA2B;
+
+public class MainTest {
+
+	@Test
+	public void testClub() throws Exception {
+		String file = "src/test/resources/examples/Club/Club.tla";
+		TLA2B.main(new String[] { file });
+	}
+	
+}
diff --git a/src/test/java/de/tla2b/main/RenamerTest.java b/src/test/java/de/tla2b/main/RenamerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..daa61456772ddcf0d668158234e1dadfa4766abc
--- /dev/null
+++ b/src/test/java/de/tla2b/main/RenamerTest.java
@@ -0,0 +1,14 @@
+package de.tla2b.main;
+
+import org.junit.Test;
+
+import de.tla2b.util.TestUtil;
+
+public class RenamerTest {
+
+	@Test
+	public void testKeywords() throws Exception {
+		String file = "src/test/resources/renamer/Keywords.tla";
+		TestUtil.renamerTest(file);
+	}
+}
diff --git a/src/test/java/de/tla2b/prettyprintb/RecursiveFunctionTest.java b/src/test/java/de/tla2b/prettyprintb/RecursiveFunctionTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..298c66e94920edef265dd3cd1eec5e746feef9e6
--- /dev/null
+++ b/src/test/java/de/tla2b/prettyprintb/RecursiveFunctionTest.java
@@ -0,0 +1,50 @@
+package de.tla2b.prettyprintb;
+
+import static de.tla2b.util.TestUtil.compare;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class RecursiveFunctionTest {
+
+	@Ignore
+	@Test
+	public void testRecursiveDefinition() throws Exception {
+		final String module = "-------------- MODULE Testing ----------------\n"
+				+ "EXTENDS Naturals \n"
+				+ "RECURSIVE sum(_) \n"
+				+ "sum(S) == IF S = {} THEN 0 ELSE (LET x == CHOOSE a \\in S : TRUE IN x + sum(S \\ {x})) \n"
+				+ "ASSUME sum({1,2,3}) = 6 \n"
+				+ "=================================";
+
+		final String expected = "MACHINE Testing\n" + "ABSTRACT_CONSTANTS k\n"
+				+ "PROPERTIES " 
+				+ " k : BOOL +-> INTEGER "
+				+ "& k = k <+ {TRUE |-> 0, FALSE |-> 0}" + "END";
+		compare(expected, module);
+		
+	}
+	
+	@Ignore
+	@Test
+	public void testRecursiveDefinition2() throws Exception {
+		final String module = "-------------- MODULE Testing ----------------\n"
+				+ "EXTENDS Naturals \n"
+				+ "RECURSIVE Sum(_,_) \n"
+				+ " Sum(f,S) == IF S = {} THEN 0 \n"
+				+ "                       ELSE LET x == CHOOSE x \\in S : TRUE \n"
+				+ "                            IN  f[x] + Sum(f, S \\ {x}) \n"
+				+ "foo[x \\in Nat] == x \n"
+				+ "ASSUME Sum(foo, {1,2,3}) = 6 \n"
+				+ "=================================";
+
+		final String expected = "MACHINE Testing\n" + "ABSTRACT_CONSTANTS k\n"
+				+ "PROPERTIES " 
+				+ " k = k <+ {TRUE |-> 0, FALSE |-> 0}" + "END";
+		compare(expected, module);
+		
+	}
+	
+	
+
+}
diff --git a/src/test/java/de/tla2b/util/TestUtil.java b/src/test/java/de/tla2b/util/TestUtil.java
index 0786923b6c285de7417a788f2ec2fe79c732201d..ff6e2832443034006a81432e967cb36ba4dd840c 100644
--- a/src/test/java/de/tla2b/util/TestUtil.java
+++ b/src/test/java/de/tla2b/util/TestUtil.java
@@ -16,7 +16,8 @@ import de.be4.classicalb.core.parser.node.Node;
 import de.be4.classicalb.core.parser.node.Start;
 import de.tla2b.exceptions.FrontEndException;
 import de.tla2b.exceptions.TLA2BException;
-import de.tla2b.pprint.ASTPrettyPrinter;
+import de.tla2b.output.ASTPrettyPrinter;
+import de.tla2b.output.Renamer;
 import de.tla2b.translation.Tla2BTranslator;
 import de.tla2bAst.Translator;
 import tla2sany.semantic.AbortException;
@@ -49,11 +50,11 @@ public class TestUtil {
 		System.out.println("-------------------");
 		ASTPrettyPrinter aP = new ASTPrettyPrinter();
 		start.apply(aP);
-		System.out.println(aP.getResult());
+		System.out.println(aP.getResultString());
 
 		
 		final BParser parser = new BParser("testcase");
-		final Start ppStart = parser.parse(aP.getResult(), false);
+		final Start ppStart = parser.parse(aP.getResultString(), false);
 		
 		
 		String result = getTreeAsString(start);
@@ -79,9 +80,9 @@ public class TestUtil {
 		ASTPrettyPrinter aP = new ASTPrettyPrinter();
 		resultNode.apply(aP);
 		System.out.println("-------------------");
-		System.out.println(aP.getResult());
+		System.out.println(aP.getResultString());
 		final BParser parser = new BParser("testcase");
-		Start ast = parser.parse(aP.getResult(), false);
+		Start ast = parser.parse(aP.getResultString(), false);
 		//BParser.printASTasProlog(System.out, new BParser(), new File("./test.mch"), resultNode, false, true, null);
 		
 		
@@ -161,6 +162,19 @@ public class TestUtil {
 	}
 	
 	
+	public static void renamerTest(String tlaFile) throws Exception{
+		Translator t = new Translator(tlaFile);
+		Start start = t.translate();
+		Renamer renamer = new Renamer(start);
+		ASTPrettyPrinter aP = new ASTPrettyPrinter(renamer);
+		start.apply(aP);
+		System.out.println(aP.getResultString());
+		
+		final BParser parser = new BParser("testcase");
+		parser.parse(aP.getResultString(), false);
+	}
+	
+	
 	public static TestTypeChecker typeCheckString(String moduleString) throws FrontEndException, TLA2BException{
 		ToolIO.setMode(ToolIO.TOOL);
 		ToolIO.reset();
diff --git a/src/test/resources/renamer/Keywords.tla b/src/test/resources/renamer/Keywords.tla
new file mode 100644
index 0000000000000000000000000000000000000000..72fd514edafec6ab690b596612767b69f76e7fab
--- /dev/null
+++ b/src/test/resources/renamer/Keywords.tla
@@ -0,0 +1,11 @@
+---- MODULE Keywords ----
+min == 1
+ASSUME min = 1
+CONSTANTS max
+ASSUME max = 2
+VARIABLES dom
+Init == dom = 1
+struct == dom' = 2
+
+Next == struct
+=====
\ No newline at end of file