diff --git a/src/main/java/de/tlc4b/TLC4B.java b/src/main/java/de/tlc4b/TLC4B.java
index 89610f7bf341b3f93738699f49726790f0233c53..134a48edb34ad731647c6e9f1196e57ccffdd6a2 100644
--- a/src/main/java/de/tlc4b/TLC4B.java
+++ b/src/main/java/de/tlc4b/TLC4B.java
@@ -154,6 +154,7 @@ public class TLC4B {
 
 	public static void test(String[] args, boolean deleteFiles)
 			throws Exception {
+		System.setProperty("apple.awt.UIElement", "true"); // avoiding pop up windows
 		TLC4BGlobals.resetGlobals();
 		TLC4BGlobals.setDeleteOnExit(deleteFiles);
 		TLC4BGlobals.setCreateTraceFile(false);
diff --git a/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java b/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java
index e7283719de7900fbd94a9a14f40cb3e530cbcb6d..2e755f3ed54e4a987e1213e5ad17ed9fdf4df8c1 100644
--- a/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java
+++ b/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java
@@ -26,15 +26,24 @@ public class SeesEliminator extends DepthFirstAdapter {
 
 	private final Start main;
 	private final Map<String, Start> parsedMachines;
+	private final ArrayList<String> resolvedMachines;
 
 	public static void eliminateSeesClauses(Start start,
 			Map<String, Start> parsedMachines) {
-		new SeesEliminator(start, parsedMachines);
+		new SeesEliminator(start, parsedMachines, new ArrayList<String>());
 	}
 
-	private SeesEliminator(Start start, Map<String, Start> parsedMachines) {
+	private void eliminateSeenMachinesRecursively(Start start,
+			Map<String, Start> parsedMachines,
+			ArrayList<String> resolvedMachines) {
+		new SeesEliminator(start, parsedMachines, resolvedMachines);
+	}
+
+	private SeesEliminator(Start start, Map<String, Start> parsedMachines,
+			ArrayList<String> resolvedMachines) {
 		this.main = start;
 		this.parsedMachines = parsedMachines;
+		this.resolvedMachines = resolvedMachines;
 		MachineClauseSorter.sortMachineClauses(start);
 		start.apply(this);
 	}
@@ -43,14 +52,17 @@ public class SeesEliminator extends DepthFirstAdapter {
 		LinkedList<PExpression> machineNames = node.getMachineNames();
 		for (PExpression pExpression : machineNames) {
 			AIdentifierExpression id = (AIdentifierExpression) pExpression;
-			String identifierAsString = Utils.getIdentifierAsString(id
+			String machineName = Utils.getIdentifierAsString(id
 					.getIdentifier());
-			Start start = parsedMachines.get(identifierAsString);
-			DefinitionsEliminator.eliminateDefinitions(start);
-			eliminateSeesClauses(start, parsedMachines);
-			new MachineClauseAdder(main, start);
-			if(node.parent() != null){
-				node.replaceBy(null);
+			if(!resolvedMachines.contains(machineName)){
+				resolvedMachines.add(machineName);
+				Start start = parsedMachines.get(machineName);
+				DefinitionsEliminator.eliminateDefinitions(start);
+				eliminateSeenMachinesRecursively(start, parsedMachines, resolvedMachines);
+				new MachineClauseAdder(main, start);
+				if (node.parent() != null) {
+					node.replaceBy(null);
+				}
 			}
 		}
 	}
@@ -60,13 +72,14 @@ public class SeesEliminator extends DepthFirstAdapter {
 		private final HashMap<Class<? extends PMachineClause>, PMachineClause> machineClauseHashMap;
 		private final LinkedList<PMachineClause> additionalMachineClauseList;
 
-		public MachineClauseAdder(Start main, Start start) {
+		public MachineClauseAdder(Start main, Start seenMachineStart) {
 			this.machineClausesList = new ArrayList<PMachineClause>();
 			this.machineClauseHashMap = new LinkedHashMap<Class<? extends PMachineClause>, PMachineClause>();
 			this.additionalMachineClauseList = new LinkedList<PMachineClause>();
 
 			PParseUnit pParseUnit = main.getPParseUnit();
 			AAbstractMachineParseUnit machineParseUnit = (AAbstractMachineParseUnit) pParseUnit;
+			System.out.println(machineParseUnit.getHeader());
 
 			for (PMachineClause machineClause : machineParseUnit
 					.getMachineClauses()) {
@@ -75,9 +88,8 @@ public class SeesEliminator extends DepthFirstAdapter {
 						machineClause);
 			}
 
-			start.apply(this);
-			
-			
+			seenMachineStart.apply(this);
+
 			LinkedList<PMachineClause> newMachineClauseList = new LinkedList<PMachineClause>();
 			for (PMachineClause pMachineClause : machineClausesList) {
 				pMachineClause.replaceBy(null); // delete parent of clause
@@ -92,7 +104,9 @@ public class SeesEliminator extends DepthFirstAdapter {
 			AConstantsMachineClause main = (AConstantsMachineClause) machineClauseHashMap
 					.get(node.getClass());
 
-			if (main != null) {
+			if (main == null) {
+				additionalMachineClauseList.add(node);
+			} else {
 				ArrayList<PExpression> oldConstantsList = new ArrayList<PExpression>(
 						main.getIdentifiers());
 				ArrayList<PExpression> newConstantsList = new ArrayList<PExpression>();
@@ -109,8 +123,6 @@ public class SeesEliminator extends DepthFirstAdapter {
 
 				}
 				main.setIdentifiers(newConstantsList);
-			} else {
-				additionalMachineClauseList.add(node);
 			}
 		}
 
@@ -144,34 +156,27 @@ public class SeesEliminator extends DepthFirstAdapter {
 
 		@Override
 		public void caseAPropertiesMachineClause(APropertiesMachineClause node) {
-			APropertiesMachineClause main = null;
-			for (PMachineClause clause : machineClausesList) {
-				if (clause instanceof APropertiesMachineClause) {
-					main = (APropertiesMachineClause) clause;
-				}
-			}
-
-			if (main != null) {
+			APropertiesMachineClause main = (APropertiesMachineClause) machineClauseHashMap
+					.get(node.getClass());
+			if (main == null) {
+				additionalMachineClauseList.add(node);
+			} else {
 				AConjunctPredicate con = new AConjunctPredicate();
 				con.setLeft(main.getPredicates());
 				con.setRight(node.getPredicates());
 				main.setPredicates(con);
-			} else {
-				additionalMachineClauseList.add(node);
 			}
 
 		}
 
 		@Override
 		public void caseADefinitionsMachineClause(ADefinitionsMachineClause node) {
-			ADefinitionsMachineClause main = null;
-			for (PMachineClause clause : machineClausesList) {
-				if (clause instanceof ADefinitionsMachineClause) {
-					main = (ADefinitionsMachineClause) clause;
-				}
-			}
+			ADefinitionsMachineClause main = (ADefinitionsMachineClause) machineClauseHashMap
+					.get(node.getClass());
 
-			if (main != null) {
+			if (main == null) {
+				additionalMachineClauseList.add(node);
+			} else {
 				ArrayList<PDefinition> oldDefinitions = new ArrayList<PDefinition>(
 						main.getDefinitions());
 				ArrayList<PDefinition> newDefinitionsList = new ArrayList<PDefinition>();
@@ -190,8 +195,6 @@ public class SeesEliminator extends DepthFirstAdapter {
 
 				}
 				main.setDefinitions(newDefinitionsList);
-			} else {
-				additionalMachineClauseList.add(node);
 			}
 		}
 
diff --git a/src/test/java/de/tlc4b/tlc/integration/BasicTest.java b/src/test/java/de/tlc4b/tlc/integration/BasicTest.java
index 743559e754f9877a34aac5247472c71c8729261b..b3fe17567887f460a9e6a327ec87f407da99c078 100644
--- a/src/test/java/de/tlc4b/tlc/integration/BasicTest.java
+++ b/src/test/java/de/tlc4b/tlc/integration/BasicTest.java
@@ -38,6 +38,7 @@ public class BasicTest extends AbstractParseMachineTest {
 	public static Configuration getConfig() {
 		final ArrayList<TestPair> list = new ArrayList<TestPair>();
 		list.add(new TestPair(NoError, "./src/test/resources/composition/sees"));
+		list.add(new TestPair(NoError, "./src/test/resources/composition/sees2"));
 		list.add(new TestPair(NoError, "./src/test/resources/basics"));
 		list.add(new TestPair(NoError, "./src/test/resources/laws"));
 		return getConfiguration(list);
diff --git a/src/test/resources/composition/sees2/M1.mch b/src/test/resources/composition/sees2/M1.mch
new file mode 100644
index 0000000000000000000000000000000000000000..a8d6a056b9ca6ed69e929821bfab0cf797385f0e
--- /dev/null
+++ b/src/test/resources/composition/sees2/M1.mch
@@ -0,0 +1,3 @@
+MACHINE M1
+SEES M2, M4
+END
diff --git a/src/test/resources/composition/sees2/M2.mch b/src/test/resources/composition/sees2/M2.mch
new file mode 100644
index 0000000000000000000000000000000000000000..8d955de80bb2e06b138d295e0a8a1d0dac8dab85
--- /dev/null
+++ b/src/test/resources/composition/sees2/M2.mch
@@ -0,0 +1,7 @@
+MACHINE M2
+SEES M3
+CONSTANTS
+  k2
+PROPERTIES
+  k2 = k3 + 1
+END
diff --git a/src/test/resources/composition/sees2/M3.mch b/src/test/resources/composition/sees2/M3.mch
new file mode 100644
index 0000000000000000000000000000000000000000..f383a5af8d141311c169f03e3efc068adc2baa70
--- /dev/null
+++ b/src/test/resources/composition/sees2/M3.mch
@@ -0,0 +1,7 @@
+MACHINE M3
+SEES M4
+CONSTANTS
+  k3
+PROPERTIES
+  k3 = 3
+END
diff --git a/src/test/resources/composition/sees2/M4.mch b/src/test/resources/composition/sees2/M4.mch
new file mode 100644
index 0000000000000000000000000000000000000000..36ba47cf46c4056979631cdcf411125e2aba7a28
--- /dev/null
+++ b/src/test/resources/composition/sees2/M4.mch
@@ -0,0 +1,6 @@
+MACHINE M4
+CONSTANTS
+ k4
+PROPERTIES
+  k4 = 4
+END