diff --git a/statemachine.base/src/main/jastadd/Analysis.jrag b/statemachine.base/src/main/jastadd/Analysis.jrag
index 19eb8945fd237ed1fca5a1102179c9cde5182f8d..6bbcf6a8b935f93575a52d5d5509ac94df130161 100644
--- a/statemachine.base/src/main/jastadd/Analysis.jrag
+++ b/statemachine.base/src/main/jastadd/Analysis.jrag
@@ -1,16 +1,4 @@
 aspect Analysis {
-  syn Set<State> State.reachableWithin(int n) {
-    if (n == 0) {
-      return new HashSet<>();
-    }
-    Set<State> result = new HashSet<>();
-    for (State succ : successors()) {
-      result.add(succ);
-      result.addAll(succ.reachableWithin(n - 1));
-    }
-    return result;
-  }
-
   syn Set<State> State.reachable() circular [new HashSet<State>()] {
     Set<State> result = new HashSet<>();
     result.addAll(successors());
@@ -22,34 +10,22 @@ aspect Analysis {
 
   public void StateMachine.printSomeAnalysis() {
     Set<Set<State>> sccs = this.SCC();
-    System.out.println("SCCs found:");
+    System.out.print("SCCs found: ");
     for (Set<State> scc : sccs) {
-      System.out.println(scc);
+      System.out.print(scc + " ");
     }
+    System.out.println();
 
     for (State s : this.states()) {
       System.out.println(s + ": successors() = " + s.successors() + ", reachable() = " + s.reachable());
     }
 
-    Set<State> current;
-    int lastSize = 0;
-    for (int i = 1; i < this.states().size() + 1; i++) {
-      current = this.getInitial().reachableWithin(i);
-      if (current.size() == lastSize) {
-        break;
-      }
-      System.out.println(this.getInitial() + ".reachableWithin(" + i + ") = " + current);
-      lastSize = current.size();
-    }
-
     for (State finalState : this.getFinalList()) {
-      System.out.println("initial state "+ this.getInitial() + " can reach " + finalState + " = " +
-          this.getInitial().reachableWithin(this.states().size()).contains(finalState));
+      System.out.println("initial state "+ this.getInitial() + " to " + finalState + " in " +
+          this.getInitial().minDistTo(finalState) + " step(s)");
     }
   }
 
-  // --- new ---
-
   syn int State.minDistTo(State other) circular [-1] {
     if (this == other) {
       return 0;
diff --git a/statemachine.base/src/main/jastadd/NameAnalysis.jrag b/statemachine.base/src/main/jastadd/NameAnalysis.jrag
index 41cc7f687924158b825faaf6823b611a2cf9822b..a381d9cbbc6a9d273ff019983b88ae79dd40bad7 100644
--- a/statemachine.base/src/main/jastadd/NameAnalysis.jrag
+++ b/statemachine.base/src/main/jastadd/NameAnalysis.jrag
@@ -1,25 +1,25 @@
 aspect NameAnalysis {
-  syn Map<String, State> StateMachine.stateMap() {
-    Map<String, State> map = new HashMap<>();
+  syn State StateMachine.resolveState(String id) {
     for (State s : states()) {
-      map.put(s.getLabel(), s);
+      if (s.getLabel().equals(id)) {
+        return s;
+      }
     }
-    return map;
+    return null;
   }
 
-  syn Map<String, Transition> StateMachine.transitionMap() {
-    Map<String, Transition> map = new HashMap<>();
+  syn Transition StateMachine.resolveTransition(String id) {
     for (Transition t : transitions()) {
-      map.put(t.getLabel(), t);
+      if (t.getLabel().equals(id)) {
+        return t;
+      }
     }
-    return map;
+    return null;
   }
 
-  refine RefResolverStubs eq ASTNode.globallyResolveStateByToken(String id) {
-    return root().stateMap().get(id);
-  }
+  eq StateMachine.globallyResolveStateByToken(String id) = resolveState(id);
+  eq Element.globallyResolveStateByToken(String id) = containingStateMachine().resolveState(id);
 
-  refine RefResolverStubs eq ASTNode.globallyResolveTransitionByToken(String id) {
-    return root().transitionMap().get(id);
-  }
+  eq StateMachine.globallyResolveTransitionByToken(String id) = resolveTransition(id);
+  eq Element.globallyResolveTransitionByToken(String id) = containingStateMachine().resolveTransition(id);
 }
diff --git a/statemachine.base/src/main/jastadd/Navigation.jrag b/statemachine.base/src/main/jastadd/Navigation.jrag
index 8aa18c02438c38ae7e821cff5de792b10fb36204..f06ecb8dcdf0d7682223ae92deb96b5cfe530696 100644
--- a/statemachine.base/src/main/jastadd/Navigation.jrag
+++ b/statemachine.base/src/main/jastadd/Navigation.jrag
@@ -37,12 +37,11 @@ aspect Navigation {
     return transitions;
   }
 
-  syn StateMachine ASTNode.root();
-  eq StateMachine.root() = this;
-  eq ASTNode.root() = getParent().root();
+  inh StateMachine Element.containingStateMachine();
+  eq StateMachine.getElement().containingStateMachine() = this;
 
-  syn boolean State.isInitial() = root().getInitial().equals(this);
-  syn boolean State.isFinal() = root().getFinalList().contains(this);
+  syn boolean State.isInitial() = containingStateMachine().getInitial().equals(this);
+  syn boolean State.isFinal() = containingStateMachine().getFinalList().contains(this);
 
   syn Collection<State> State.successors() = getOutgoingList().stream().map(Transition::getTo).collect(Collectors.toList());
 }
diff --git a/statemachine.base/src/main/java/de/tudresden/inf/st/statemachine/Main.java b/statemachine.base/src/main/java/de/tudresden/inf/st/statemachine/Main.java
index ab27666ea8434cb8b6fca20ca1acfe163eae1e46..d38b8acab43c87957d3b705824934a3f2cfd4444 100644
--- a/statemachine.base/src/main/java/de/tudresden/inf/st/statemachine/Main.java
+++ b/statemachine.base/src/main/java/de/tudresden/inf/st/statemachine/Main.java
@@ -7,62 +7,89 @@ import de.tudresden.inf.st.statemachine.jastadd.model.Transition;
 
 import java.io.IOException;
 import java.nio.file.Paths;
+import java.util.Set;
 
 public class Main {
 
   @SuppressWarnings("WeakerAccess")
   public static Object DrAST_root_node;
 
-  public static void main(String[] args) {
+  public static void main(String[] args) throws IOException, Parser.Exception {
+    StateMachine stateMachine;
     if (args.length == 0) {
-      // manual construction of a simple statemachine
-      // (S) -- 1 --> (B) -- 3 --> (E)
-      //  ^            |
-      //  \            /
-      //  `---- 2 ----*
-      StateMachine stateMachine = new StateMachine();
-      State start = new State();
-      start.setLabel("S");
-      State stateB = new State();
-      stateB.setLabel("B");
-      State end = new State();
-      end.setLabel("E");
-      Transition t1 = new Transition();
-      t1.setLabel("1");
-      Transition t2 = new Transition();
-      t2.setLabel("2");
-      Transition t3 = new Transition();
-      t3.setLabel("3");
-      t1.setFrom(start);
-      t1.setTo(stateB);
-      t2.setFrom(stateB);
-      t2.setTo(start);
-      t3.setFrom(stateB);
-      t3.setTo(end);
-      stateMachine.addElement(start);
-      stateMachine.addElement(stateB);
-      stateMachine.addElement(end);
-      stateMachine.addElement(t1);
-      stateMachine.addElement(t2);
-      stateMachine.addElement(t3);
-      stateMachine.setInitial(start);
-      stateMachine.addFinal(end);
-
-      System.out.println(stateMachine.prettyPrint());
-      stateMachine.printSomeAnalysis();
-      DrAST_root_node = stateMachine;
+      stateMachine = createExample();
     } else {
       // load the file given as first argument
-      try {
-        StateMachine stateMachine = ParserUtils.load(Paths.get(args[0]));
-        stateMachine.treeResolveAll();
-        stateMachine.printSomeAnalysis();
-        System.out.println("> toDotGraph():");
-        System.out.println(stateMachine.toDot());
-        DrAST_root_node = stateMachine;
-      } catch (IOException | Parser.Exception e) {
-        e.printStackTrace();
-      }
+      stateMachine = ParserUtils.load(Paths.get(args[0]));
+    }
+    printHeading("Initial statemachine");
+    System.out.println(stateMachine.prettyPrint());
+
+    stateMachine.printSomeAnalysis();
+
+    Set<Transition> epsilons = stateMachine.epsilonTransitions();
+
+    for (Transition eps : epsilons) {
+      printHeading("Removing epsilon transition " + eps.prettyPrint().trim());
+      System.out.println("Minimal distances before:");
+      initialToFinalDistances(stateMachine);
+      stateMachine.removeEpsilonTransition(eps);
+      System.out.println("Minimal distances after:");
+      initialToFinalDistances(stateMachine);
+      printHeading("StateMachine after");
+      System.out.println(stateMachine.prettyPrint());
+    }
+    printHeading("DotGraph");
+    System.out.println(stateMachine.toDot());
+    DrAST_root_node = stateMachine;
+  }
+
+  private static void printHeading(String s) {
+    System.out.println();
+    System.out.println("========================================");
+    System.out.println("== " + s);
+    System.out.println("========================================");
+  }
+
+  private static StateMachine createExample() {
+    // manual construction of a simple statemachine
+    // (S) -- e --> (B) -- 1 --> (E)
+    //  ^            |
+    //  \            /
+    //  `---- 2 ----*
+    StateMachine stateMachine = new StateMachine();
+    State start = new State();
+    start.setLabel("S");
+    State stateB = new State();
+    stateB.setLabel("B");
+    State end = new State();
+    end.setLabel("E");
+    Transition eps = new Transition();
+    Transition t2 = new Transition();
+    t2.setLabel("2");
+    Transition t1 = new Transition();
+    t1.setLabel("1");
+    eps.setFrom(start);
+    eps.setTo(stateB);
+    t2.setFrom(stateB);
+    t2.setTo(start);
+    t1.setFrom(stateB);
+    t1.setTo(end);
+    stateMachine.addElement(start);
+    stateMachine.addElement(stateB);
+    stateMachine.addElement(end);
+    stateMachine.addElement(eps);
+    stateMachine.addElement(t2);
+    stateMachine.addElement(t1);
+    stateMachine.setInitial(start);
+    stateMachine.addFinal(end);
+    return stateMachine;
+  }
+
+  private static void initialToFinalDistances(StateMachine stateMachine) {
+    for (State finalState : stateMachine.getFinalList()) {
+      System.out.println("initial state "+ stateMachine.getInitial() + " to " + finalState + " in " +
+          stateMachine.getInitial().minDistTo(finalState) + " step(s)");
     }
   }