diff --git a/trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/Helpers.jrag b/trainbenchmark-tool-jastadd-base/src/main/jastadd/Helpers.jrag
similarity index 99%
rename from trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/Helpers.jrag
rename to trainbenchmark-tool-jastadd-base/src/main/jastadd/Helpers.jrag
index 875161e6dca0b6d14b67a28abaca3ec2224faf5f..d8c6010ab7042bbf451dbd34676624adafa99cea 100644
--- a/trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/Helpers.jrag
+++ b/trainbenchmark-tool-jastadd-base/src/main/jastadd/Helpers.jrag
@@ -24,4 +24,5 @@ aspect Helpers {
   inh RailwayContainer RailwayElement.getRoot();
   eq RailwayContainer.getRoute(int i).getRoot() = this;
   eq RailwayContainer.getRegion(int i).getRoot() = this;
+
 }
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/TrainPrinting.jadd b/trainbenchmark-tool-jastadd-base/src/main/jastadd/TrainPrinting.jadd
similarity index 86%
rename from trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/TrainPrinting.jadd
rename to trainbenchmark-tool-jastadd-base/src/main/jastadd/TrainPrinting.jadd
index 19df865b8dcc6b36b964496fd75990ef8d3e74b1..2e7ffd3ff26e84b1824a03383fdecc45f3d8e98d 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/TrainPrinting.jadd
+++ b/trainbenchmark-tool-jastadd-base/src/main/jastadd/TrainPrinting.jadd
@@ -1,9 +1,5 @@
 aspect TrainPrinting {
 
-  public String Name.getNodeTitle() {
-    return this.getClass().getSimpleName() + " " + getValue();
-  }
-
   public String Segment.getNodeTitle() {
     return this.getClass().getSimpleName() + " with length " + getLength();
   }
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/Helpers.jrag b/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/Helpers.jrag
index 417b3592d1f238248a2aabb8cb120d8c474fe43a..0e02654110fff033dd2162a05872e58aa14207ff 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/Helpers.jrag
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/Helpers.jrag
@@ -1,33 +1,7 @@
 aspect Helpers {
-
-  syn boolean TrackElement.isSwitch();
-  eq Switch.isSwitch() = true;
-  eq Segment.isSwitch() = false;
-
-  syn Switch TrackElement.asSwitch();
-  eq Switch.asSwitch() = this;
-  eq Segment.asSwitch() = null;
-
-  syn boolean TrackElement.isSegment();
-  eq Switch.isSegment() = false;
-  eq Segment.isSegment() = true;
-
-  syn Segment TrackElement.asSegment();
-  eq Switch.asSegment() = null;
-  eq Segment.asSegment() = this;
-
-  inh Region TrackElement.containingRegion();
-  eq Region.getTrackElement(int i).containingRegion() = this;
-
-  syn int RailwayElement.id() = getId().getValue();
-
-  inh RailwayContainer RailwayElement.getRoot();
-  eq RailwayContainer.getRoute(int i).getRoot() = this;
-  eq RailwayContainer.getRegion(int i).getRoot() = this;
-
   inh RailwayContainer Ref.getRoot();
 
   syn boolean Ref.references(RailwayElement node) {
-    return this.getValue() == node.getId().getValue();
+    return this.getValue() == node.getId();
   }
 }
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/References.jadd b/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/References.jadd
new file mode 100644
index 0000000000000000000000000000000000000000..dda89d253afba94b65bdde8f1156a458a9a3306c
--- /dev/null
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/References.jadd
@@ -0,0 +1,17 @@
+aspect RefGenerator {
+  public SensorRef Sensor.createRef() {
+    return new SensorRef(this.id());
+  }
+
+  public SemaphoreRef Semaphore.createRef() {
+    return new SemaphoreRef(this.id());
+  }
+
+  public SwitchRef Switch.createRef() {
+    return new SwitchRef(this.id());
+  }
+
+  public SegmentRef Segment.createRef() {
+    return new SegmentRef(this.id());
+  }
+}
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/TreeNavigation.jrag b/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/TreeNavigation.jrag
index d7056b768b2deea400f5fab201c5b84a4f58b2e5..98f2240d55a8d0ec2714149151e02ca6930a653c 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/TreeNavigation.jrag
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/TreeNavigation.jrag
@@ -53,6 +53,16 @@ aspect TreeNavigation {
     return sensors;
   }
 
+  syn TrackElement TrackElementRef.getTrackElement();
+  eq SwitchRef.getTrackElement() = getSwitch();
+  eq SegmentRef.getTrackElement() = getSegment();
+
+  syn boolean TrackElementRef.isSwitchRef() = false;
+  eq SwitchRef.isSwitchRef() = true;
+
+  syn boolean TrackElementRef.isSegmentRef() = false;
+  eq SegmentRef.isSegmentRef() = true;
+
   // maps from ids to things
 
   syn Map<Integer, Switch> RailwayContainer.switchMap() {
@@ -101,28 +111,19 @@ aspect TreeNavigation {
 
   // reference resolving
 
-  syn TrackElement Ref.asTrackElement() {
-    TrackElement result = getRoot().segmentMap().get(this.getValue());
-    if (result == null) {
-      return getRoot().switchMap().get(this.getValue());
-    } else {
-      return result;
-    }
-  }
-
-  syn Segment Ref.asSegment() {
+  syn Segment TrackElementRef.getSegment() {
     return getRoot().segmentMap().get(this.getValue());
   }
 
-  syn Switch Ref.asSwitch() {
+  syn Switch TrackElementRef.getSwitch() {
     return getRoot().switchMap().get(this.getValue());
   }
 
-  syn Sensor Ref.asSensor() {
+  syn Sensor SensorRef.getSensor() {
     return getRoot().sensorMap().get(this.getValue());
   }
 
-  syn Semaphore Ref.asSemaphore() {
+  syn Semaphore SemaphoreRef.getSemaphore() {
     return getRoot().semaphoreMap().get(this.getValue());
   }
 
@@ -131,16 +132,16 @@ aspect TreeNavigation {
 
   syn Collection<TrackElement> Sensor.monitoredElements() {
     java.util.List<TrackElement> trackElements = new ArrayList<>();
-    for (Ref ref : getMonitoredElementList()) {
-      trackElements.add(ref.asTrackElement());
+    for (TrackElementRef ref : getMonitoredElementList()) {
+      trackElements.add(ref.getTrackElement());
     }
     return trackElements;
   }
 
   syn Collection<Segment> Sensor.monitoredSegments() {
     java.util.List<Segment> segments = new ArrayList<>();
-    for (Ref ref : getMonitoredElementList()) {
-      Segment segment = ref.asSegment();
+    for (TrackElementRef ref : getMonitoredElementList()) {
+      Segment segment = ref.getTrackElement().asSegment();
       if (segment != null) {
         segments.add(segment);
       }
@@ -150,8 +151,8 @@ aspect TreeNavigation {
 
   syn Collection<Switch> Sensor.monitoredSwitches() {
     java.util.List<Switch> switches = new ArrayList<>();
-    for (Ref ref : getMonitoredElementList()) {
-      Switch sw = ref.asSwitch();
+    for (TrackElementRef ref : getMonitoredElementList()) {
+      Switch sw = ref.getTrackElement().asSwitch();
       if (sw != null) {
         switches.add(sw);
       }
@@ -160,25 +161,25 @@ aspect TreeNavigation {
   }
 
   syn TrackElement Sensor.monitoredElement(int i) {
-    return getMonitoredElement(i).asTrackElement();
+    return getMonitoredElement(i).getTrackElement();
   }
 
   syn Sensor Route.requiredSensor(int i) {
-    return getRequiredSensor(i).asSensor();
+    return getRequiredSensor(i).getSensor();
   }
 
   syn Collection<TrackElement> TrackElement.connectsTos() {
     java.util.List<TrackElement> trackElements = new ArrayList<>();
-    for (Ref teRef : getConnectsToList()) {
-      trackElements.add(teRef.asTrackElement());
+    for (TrackElementRef teRef : getConnectedElementList()) {
+      trackElements.add(teRef.getTrackElement());
     }
     return trackElements;
   }
 
   syn Collection<Segment> TrackElement.connectsToSegments() {
     java.util.List<Segment> segments = new ArrayList<>();
-    for (Ref teRef : getConnectsToList()) {
-      Segment segment = teRef.asSegment();
+    for (TrackElementRef teRef : getConnectedElementList()) {
+      Segment segment = teRef.getTrackElement().asSegment();
       if (segment != null) {
         segments.add(segment);
       }
@@ -188,15 +189,15 @@ aspect TreeNavigation {
 
   syn Collection<Sensor> Route.requiredSensors() {
     java.util.List<Sensor> sensors = new ArrayList<>();
-    for (Ref sensorRef : getRequiredSensorList()) {
-      sensors.add(sensorRef.asSensor());
+    for (SensorRef sensorRef : getRequiredSensorList()) {
+      sensors.add(sensorRef.getSensor());
     }
     return sensors;
   }
 
   syn Semaphore Route.entry() {
     if (hasEntry()) {
-      return getEntry().asSemaphore();
+      return getEntry().getSemaphore();
     } else {
       return null;
     }
@@ -204,34 +205,34 @@ aspect TreeNavigation {
 
   syn Semaphore Route.exit() {
     if (hasExit()) {
-      return getExit().asSemaphore();
+      return getExit().getSemaphore();
     } else {
       return null;
     }
   }
 
   syn Switch SwitchPosition.target() {
-    return getTarget().asSwitch();
+    return getTarget().getSwitch();
   }
 
-  syn Collection<Sensor> TrackElement.monitoringSensors() {
-    return getRoot().monitoringSensorsMap().get(this.id());
+  syn Collection<Sensor> TrackElement.monitoredBy() {
+    return getRoot().monitoredByMap().get(this.id());
   }
 
-  syn Map<Integer,Set<Sensor>> RailwayContainer.monitoringSensorsMap() {
-    Map<Integer,Set<Sensor>> sensorMap = new java.util.HashMap<Integer,Set<Sensor>>();
+  syn Map<Integer,Set<Sensor>> RailwayContainer.monitoredByMap() {
+    Map<Integer,Set<Sensor>> sensorMap = new java.util.HashMap<>();
 
     // fill the keys
     for (Region region: getRegionList()) {
       for (TrackElement trackElement: region.getTrackElementList()) {
-        sensorMap.put(trackElement.id(), new java.util.HashSet());
+        sensorMap.put(trackElement.id(), new java.util.HashSet<>());
       }
     }
 
     // update the values
     for (Sensor sensor : sensors()) {
-      for (Ref teRef : sensor.getMonitoredElementList()) {
-        sensorMap.get(teRef.getValue()).add(sensor);
+      for (TrackElementRef trackElementRef : sensor.getMonitoredElementList()) {
+        sensorMap.get(trackElementRef.getValue()).add(sensor);
       }
     }
 
@@ -243,16 +244,16 @@ aspect TreeNavigation {
   }
 
   syn Map<Integer,Set<Route>> RailwayContainer.requiringRoutesMap() {
-    Map<Integer,Set<Route>> routeMap = new java.util.HashMap<Integer,Set<Route>>();
+    Map<Integer,Set<Route>> routeMap = new java.util.HashMap<>();
 
     // fill the keys
     for (Sensor sensor: sensors()) {
-      routeMap.put(sensor.id(), new java.util.HashSet());
+      routeMap.put(sensor.id(), new java.util.HashSet<>());
     }
 
     // update the values
     for (Route route : getRouteList()) {
-      for (Ref sensorRef : route.getRequiredSensorList()) {
+      for (SensorRef sensorRef : route.getRequiredSensorList()) {
         routeMap.get(sensorRef.getValue()).add(route);
       }
     }
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/queries/RouteSensorMatch.jrag b/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/queries/RouteSensorMatch.jrag
index 64c6184a195a161cfb563b937e1497e5a7b01bde..e0218601c07ed21b099eb711e3d377e99f856039 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/queries/RouteSensorMatch.jrag
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/queries/RouteSensorMatch.jrag
@@ -15,8 +15,7 @@ aspect Queries {
     Collection<Sensor> requiredSensors = requiredSensors();
     for (SwitchPosition sp : getSwitchPositionList()) {
       Switch sw = sp.target();
-      java.util.Collection<Sensor> sensors = sw.monitoringSensors();
-      for (Sensor sensor : sensors) {
+      for (Sensor sensor : sw.monitoredBy()) {
         boolean validSensor = false;
         for (Sensor sensor2 : requiredSensors) {
           if (sensor2 == sensor) {
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/queries/SemaphoreNeighbors.jrag b/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/queries/SemaphoreNeighbors.jrag
index e89eedc8ec3efd7e5d734456efbffdada7ff3245..48fde84b69f1af5cf55d8440ad703f64eb81ef42 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/queries/SemaphoreNeighbors.jrag
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/queries/SemaphoreNeighbors.jrag
@@ -21,7 +21,7 @@ aspect Queries {
     for (Sensor sensor1 : this.requiredSensors()) {
       for (TrackElement te1 : sensor1.monitoredElements()) {
         for (TrackElement te2 : te1.connectsTos()) {
-          for (Sensor sensor2 : te2.monitoringSensors()) {
+          for (Sensor sensor2 : te2.monitoredBy()) {
             for (Route route2 : sensor2.requiringRoutes()) {
               if (this != route2) {
                 if (!route2.hasEntry() || route2.getEntry().getValue() != exitRef.getValue()) {
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/train.ast b/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/train.ast
index ee09488a2b30b2a9f1625be3b4cb0d588401344b..e601961e5890b3a308103050506a9429607b5043 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/train.ast
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/train.ast
@@ -1,17 +1,19 @@
-// root:
 RailwayContainer ::= Route* Region* ;
 
-abstract RailwayElement ::= Id ;
-Region:RailwayElement ::= TrackElement* Sensor* ;
-Semaphore:RailwayElement ::= <Signal:Signal> ;
-Route:RailwayElement ::= <Active:boolean> SwitchPosition* RequiredSensor:Ref* [Entry:Ref] [Exit:Ref] ;
-SwitchPosition:RailwayElement ::= <Position:Position> Target:Ref ;
-Sensor:RailwayElement ::= MonitoredElement:Ref* ;
+abstract RailwayElement ::= <Id:int>;
+Region : RailwayElement ::= TrackElement* Sensor*;
+Semaphore : RailwayElement ::= <Signal:Signal>;
+Route : RailwayElement ::= <Active:boolean> SwitchPosition* RequiredSensor:SensorRef* [Entry:SemaphoreRef] [Exit:SemaphoreRef];
+SwitchPosition : RailwayElement ::= <Position:Position> Target:SwitchRef;
+Sensor : RailwayElement ::= MonitoredElement:TrackElementRef*;
 
-abstract TrackElement:RailwayElement ::= ConnectsTo:Ref* ;
-Segment:TrackElement ::= <Length:int> Semaphore* ;
-Switch:TrackElement ::= <CurrentPosition:Position> ;
+abstract TrackElement:RailwayElement ::= ConnectedElement:TrackElementRef*;
+Segment:TrackElement ::= <Length:int> Semaphore*;
+Switch:TrackElement ::= <CurrentPosition:Position>;
 
-abstract Name ::= <Value:int> ;
-Id:Name ;
-Ref:Name ;
+abstract Ref ::= <Value:int> ;
+SensorRef : Ref;
+SemaphoreRef : Ref;
+abstract TrackElementRef : Ref;
+SwitchRef : TrackElementRef;
+SegmentRef : TrackElementRef;
\ No newline at end of file
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/driver/deserializer/ASTNodeDeserializer.java b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/driver/deserializer/ASTNodeDeserializer.java
index 4603893ef5c6aec2cc1c5265ea120136b4653e0f..7ad3c035ed70d4b0ada7135b57a1ed66b94ad0cd 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/driver/deserializer/ASTNodeDeserializer.java
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/driver/deserializer/ASTNodeDeserializer.java
@@ -63,6 +63,7 @@ public class ASTNodeDeserializer extends StdDeserializer<ASTNode> {
 
     // get the type we want to create
     String type = node.get("t").asText();
+
     Class typeClass;
     try {
       typeClass = Class.forName(packageName + "." + type);
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectConnectedSegments.java b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectConnectedSegments.java
index 61b4838c8a500832006ece0550ff62bf84cdc08d..2d5edaa3b1853246e689f72be52dcaf4defbd79f 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectConnectedSegments.java
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectConnectedSegments.java
@@ -19,26 +19,26 @@ public class JastaddTransformationInjectConnectedSegments<TJastaddDriver extends
   public void activate(final Collection<JastaddConnectedSegmentsInjectMatch> matches) {
     for (final JastaddConnectedSegmentsInjectMatch match : matches) {
       // create segment2
-      List<Ref> connectedSegments = new List<>();
-      connectedSegments.add(new Ref(match.getSegment3().id()));
+      List<TrackElementRef> connectedSegments = new List<>();
+      connectedSegments.add(match.getSegment3().createRef());
       List<Semaphore> semaphores = new List<>();
-      Segment segment2 = new Segment(new Id(driver.nextId()), connectedSegments, TrainBenchmarkConstants.DEFAULT_SEGMENT_LENGTH, semaphores);
+      Segment segment2 = new Segment(driver.nextId(), connectedSegments, TrainBenchmarkConstants.DEFAULT_SEGMENT_LENGTH, semaphores);
 
       match.getSegment1().containingRegion().addTrackElement(segment2);
 
       // have the sensor monitor the segment
-      match.getSensor().addMonitoredElement(new Ref(segment2.id()));
+      match.getSensor().addMonitoredElement(segment2.createRef());
 
       // remove the connection of segment1 to segment3
-      for (int i = 0; i < match.getSegment1().getConnectsToList().getNumChild(); i++) {
-        if (match.getSegment1().getConnectsTo(i).getValue() == match.getSegment3().id()) {
-          match.getSegment1().getConnectsToList().removeChild(i);
+      for (int i = 0; i < match.getSegment1().getConnectedElementList().getNumChild(); i++) {
+        if (match.getSegment1().getConnectedElement(i).getValue() == match.getSegment3().id()) {
+          match.getSegment1().getConnectedElementList().removeChild(i);
           break;
         }
       }
 
       // connect segment1 to segment2
-      match.getSegment1().addConnectsTo(new Ref(segment2.id()));
+      match.getSegment1().addConnectedElement(segment2.createRef());
     }
     driver.flushCache();
   }
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectRouteSensor.java b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectRouteSensor.java
index 353357648770f583f35a1c985d6043f29af2f001..4dbfb86bdf6bdaa77032a3599af2a58e6c2df182 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectRouteSensor.java
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectRouteSensor.java
@@ -1,6 +1,6 @@
 package de.tudresden.inf.st.train.jastadd.transformations.inject;
 
-import de.tudresden.inf.st.train.jastadd.ast.Ref;
+import de.tudresden.inf.st.train.jastadd.ast.SensorRef;
 import de.tudresden.inf.st.train.jastadd.ast.Sensor;
 import de.tudresden.inf.st.train.jastadd.ast.List;
 import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver;
@@ -17,32 +17,21 @@ public class JastaddTransformationInjectRouteSensor<TJastaddDriver extends Jasta
 
   public JastaddTransformationInjectRouteSensor(final TJastaddDriver driver) {
     super(driver);
-//    for (int i = 0; i<10; i++) {
-//        try
-//        {
-//          Thread.sleep(1000);
-//        }
-//        catch(InterruptedException ex)
-//        {
-//          Thread.currentThread().interrupt();
-//        }
-//      System.out.println("waiting...");
-//    }
-
   }
 
   @Override
   public void activate(final Collection<JastaddRouteSensorInjectMatch> matches) {
-    java.util.List<Ref> refsToBeRemoved = new ArrayList<>();
+    java.util.List<SensorRef> refsToBeRemoved = new ArrayList<>();
+
     for (final JastaddRouteSensorInjectMatch match : matches) {
-      for (Ref ref : match.getRoute().getRequiredSensors()) {
-        if (ref.asSensor() == match.getSensor()) {
+      for (SensorRef ref : match.getRoute().getRequiredSensors()) {
+        if (ref.getSensor() == match.getSensor()) {
           refsToBeRemoved.add(ref);
         }
       }
     }
 
-    for(Ref ref : refsToBeRemoved) {
+    for(SensorRef ref : refsToBeRemoved) {
       ref.removeSelf();
     }
 
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectSwitchMonitored.java b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectSwitchMonitored.java
index 0c0fe833c53b5f34a83b7cc41d7cc14228004038..af55f7ceb861cb9a201841d63115b46e338302b6 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectSwitchMonitored.java
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectSwitchMonitored.java
@@ -1,8 +1,7 @@
 package de.tudresden.inf.st.train.jastadd.transformations.inject;
 
 import de.tudresden.inf.st.train.jastadd.ast.Sensor;
-import de.tudresden.inf.st.train.jastadd.ast.Switch;
-import de.tudresden.inf.st.train.jastadd.ast.Ref;
+import de.tudresden.inf.st.train.jastadd.ast.TrackElementRef;
 import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver;
 import de.tudresden.inf.st.train.jastadd.matches.JastaddSwitchMonitoredInjectMatch;
 import de.tudresden.inf.st.train.jastadd.transformations.JastaddTransformation;
@@ -19,19 +18,19 @@ public class JastaddTransformationInjectSwitchMonitored<TJastaddDriver extends J
 
   @Override
   public void activate(final Collection<JastaddSwitchMonitoredInjectMatch> matches) {
-    java.util.List<Ref> refsToBeRemoved = new ArrayList<>();
+    java.util.List<TrackElementRef> refsToBeRemoved = new ArrayList<>();
 
     for (final JastaddSwitchMonitoredInjectMatch match : matches) {
-      for (final Sensor sensor : match.getSw().monitoringSensors()) {
-        for (Ref swRef :  sensor.getMonitoredElements()) {
-          if (swRef.asSwitch() == match.getSw()) {
-            refsToBeRemoved.add(swRef);
+      for (final Sensor sensor : match.getSw().monitoredBy()) {
+        for (TrackElementRef trackElementRef : sensor.getMonitoredElements()) {
+          if (trackElementRef.getTrackElement() == match.getSw()) {
+            refsToBeRemoved.add(trackElementRef);
           }
         }
       }
     }
 
-    for(Ref ref : refsToBeRemoved) {
+    for(TrackElementRef ref : refsToBeRemoved) {
       ref.removeSelf();
     }
 
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairConnectedSegments.java b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairConnectedSegments.java
index f7bbd94a5bac55864d75953cbdc5f60b6d11d7c9..929ae4da36a442fadd93990fe19293ad6e604e0c 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairConnectedSegments.java
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairConnectedSegments.java
@@ -31,9 +31,9 @@ public class JastaddTransformationRepairConnectedSegments<TJastaddDriver extends
           }
         }
         for (TrackElement element : region.getTrackElementList()) {
-          for (int i = element.getConnectsToList().getNumChild() - 1; i >= 0; i--) {
-            if (element.getConnectsTo(i).getValue() == segment2.id()) {
-              element.getConnectsTo(i).removeSelf();
+          for (int i = element.getConnectedElementList().getNumChild() - 1; i >= 0; i--) {
+            if (element.getConnectedElement(i).getValue() == segment2.id()) {
+              element.getConnectedElement(i).removeSelf();
             }
           }
         }
@@ -42,7 +42,7 @@ public class JastaddTransformationRepairConnectedSegments<TJastaddDriver extends
       segment2.removeSelf();
 
       // connect segment1 to segment3
-      match.getSegment1().addConnectsTo(new Ref(match.getSegment3().id()));
+      match.getSegment1().addConnectedElement(match.getSegment3().createRef());
     }
     driver.flushCache();
   }
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairRouteSensor.java b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairRouteSensor.java
index cc9b4322609e74d11d877fb7fd57e5adb36f42fe..4cd8687035f7775fd933274cd97cb9759aa44281 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairRouteSensor.java
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairRouteSensor.java
@@ -1,6 +1,6 @@
 package de.tudresden.inf.st.train.jastadd.transformations.repair;
 
-import de.tudresden.inf.st.train.jastadd.ast.Ref;
+import de.tudresden.inf.st.train.jastadd.ast.SensorRef;
 import de.tudresden.inf.st.train.jastadd.ast.Route;
 import de.tudresden.inf.st.train.jastadd.ast.Sensor;
 import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver;
@@ -21,7 +21,7 @@ public class JastaddTransformationRepairRouteSensor<TJastaddDriver extends Jasta
     for (final JastaddRouteSensorMatch rsm : matches) {
       final Route route = rsm.getRoute();
       final Sensor sensor = rsm.getSensor();
-      route.getRequiredSensorList().add(new Ref(sensor.id()));
+      route.getRequiredSensorList().add(sensor.createRef());
       driver.flushCache();
     }
   }
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSemaphoreNeighbor.java b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSemaphoreNeighbor.java
index f49de86b0b06fe78350b1d07c11e97389ac11cfa..35ccd29e3910bb69567fbbe450834d965ffdebb6 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSemaphoreNeighbor.java
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSemaphoreNeighbor.java
@@ -1,6 +1,5 @@
 package de.tudresden.inf.st.train.jastadd.transformations.repair;
 
-import de.tudresden.inf.st.train.jastadd.ast.Ref;
 import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver;
 import de.tudresden.inf.st.train.jastadd.matches.JastaddSemaphoreNeighborMatch;
 import de.tudresden.inf.st.train.jastadd.transformations.JastaddTransformation;
@@ -17,7 +16,7 @@ public class JastaddTransformationRepairSemaphoreNeighbor<TJastaddDriver extends
   @Override
   public void activate(final Collection<JastaddSemaphoreNeighborMatch> matches) {
     for (final JastaddSemaphoreNeighborMatch match : matches) {
-      match.getRoute2().setEntry(new Ref(match.getSemaphore().id()));
+      match.getRoute2().setEntry(match.getSemaphore().createRef());
     }
     driver.flushCache();
   }
diff --git a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSwitchMonitored.java b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSwitchMonitored.java
index 37f77351c3490fc5bfe7b9559ce0d8834280fa22..0e10e69a9c011d9567b85cb4ee0cef3ac8c07675 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSwitchMonitored.java
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSwitchMonitored.java
@@ -1,9 +1,8 @@
 package de.tudresden.inf.st.train.jastadd.transformations.repair;
 
-
-import de.tudresden.inf.st.train.jastadd.ast.Id;
 import de.tudresden.inf.st.train.jastadd.ast.List;
-import de.tudresden.inf.st.train.jastadd.ast.Ref;
+import de.tudresden.inf.st.train.jastadd.ast.SwitchRef;
+import de.tudresden.inf.st.train.jastadd.ast.TrackElementRef;
 import de.tudresden.inf.st.train.jastadd.ast.Sensor;
 import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver;
 import de.tudresden.inf.st.train.jastadd.matches.JastaddSwitchMonitoredMatch;
@@ -23,9 +22,9 @@ public class JastaddTransformationRepairSwitchMonitored<TJastaddDriver extends J
     for (final JastaddSwitchMonitoredMatch ssnm : matches) {
 
       // gather the stuff we need to create a sensor:
-      Id id = new Id(driver.nextId());
-      List<Ref> refList = new List<>();
-      refList.add(new Ref(ssnm.getSw().id()));
+      int id = driver.nextId();
+      List<TrackElementRef> refList = new List<>();
+      refList.add(ssnm.getSw().createRef());
 
       Sensor sensor = new Sensor(id, refList);
 
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/Helpers.jrag b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/Helpers.jrag
index 417b3592d1f238248a2aabb8cb120d8c474fe43a..0e02654110fff033dd2162a05872e58aa14207ff 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/Helpers.jrag
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/Helpers.jrag
@@ -1,33 +1,7 @@
 aspect Helpers {
-
-  syn boolean TrackElement.isSwitch();
-  eq Switch.isSwitch() = true;
-  eq Segment.isSwitch() = false;
-
-  syn Switch TrackElement.asSwitch();
-  eq Switch.asSwitch() = this;
-  eq Segment.asSwitch() = null;
-
-  syn boolean TrackElement.isSegment();
-  eq Switch.isSegment() = false;
-  eq Segment.isSegment() = true;
-
-  syn Segment TrackElement.asSegment();
-  eq Switch.asSegment() = null;
-  eq Segment.asSegment() = this;
-
-  inh Region TrackElement.containingRegion();
-  eq Region.getTrackElement(int i).containingRegion() = this;
-
-  syn int RailwayElement.id() = getId().getValue();
-
-  inh RailwayContainer RailwayElement.getRoot();
-  eq RailwayContainer.getRoute(int i).getRoot() = this;
-  eq RailwayContainer.getRegion(int i).getRoot() = this;
-
   inh RailwayContainer Ref.getRoot();
 
   syn boolean Ref.references(RailwayElement node) {
-    return this.getValue() == node.getId().getValue();
+    return this.getValue() == node.getId();
   }
 }
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/References.jadd b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/References.jadd
new file mode 100644
index 0000000000000000000000000000000000000000..f68ed8f073323925dd540f27eb7cf24150e1a923
--- /dev/null
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/References.jadd
@@ -0,0 +1,17 @@
+aspect RefGenerator {
+  public SensorRef Sensor.createRef() {
+    return new SensorRef(this.id(), this);
+  }
+
+  public SemaphoreRef Semaphore.createRef() {
+    return new SemaphoreRef(this.id(), this);
+  }
+
+  public SwitchRef Switch.createRef() {
+    return new SwitchRef(this.id(), this);
+  }
+
+  public SegmentRef Segment.createRef() {
+    return new SegmentRef(this.id(), this);
+  }
+}
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/TrainPrinting.jadd b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/TrainPrinting.jadd
deleted file mode 100644
index 19df865b8dcc6b36b964496fd75990ef8d3e74b1..0000000000000000000000000000000000000000
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/TrainPrinting.jadd
+++ /dev/null
@@ -1,27 +0,0 @@
-aspect TrainPrinting {
-
-  public String Name.getNodeTitle() {
-    return this.getClass().getSimpleName() + " " + getValue();
-  }
-
-  public String Segment.getNodeTitle() {
-    return this.getClass().getSimpleName() + " with length " + getLength();
-  }
-
-  public String Route.getNodeTitle() {
-    return this.getClass().getSimpleName() + (getActive() ? " is active" : " is inactive");
-  }
-
-  public String Switch.getNodeTitle() {
-    return this.getClass().getSimpleName() + " is in position " + getCurrentPosition().name();
-  }
-
-  public String Semaphore.getNodeTitle() {
-    return this.getClass().getSimpleName() + " is in position " + getSignal().name();
-  }
-
-  public String SwitchPosition.getNodeTitle() {
-    return this.getClass().getSimpleName() + " is " + getPosition().name();
-  }
-
-}
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/TreeNavigation.jrag b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/TreeNavigation.jrag
index 41d9c7c4289b6385df0fd6166c38967896fd6069..d4f1f8f4a180247c2e86e76eb3cbcf01960edce3 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/TreeNavigation.jrag
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/TreeNavigation.jrag
@@ -53,6 +53,16 @@ aspect TreeNavigation {
     return sensors;
   }
 
+  syn TrackElement TrackElementRef.getTrackElement();
+  eq SwitchRef.getTrackElement() = getSwitch();
+  eq SegmentRef.getTrackElement() = getSegment();
+
+  syn boolean TrackElementRef.isSwitchRef() = false;
+  eq SwitchRef.isSwitchRef() = true;
+
+  syn boolean TrackElementRef.isSegmentRef() = false;
+  eq SegmentRef.isSegmentRef() = true;
+
   // more reference resolving
 
   syn Collection<TrackElement> Sensor.monitoredElements() {
@@ -95,7 +105,7 @@ aspect TreeNavigation {
 
   syn Collection<TrackElement> TrackElement.connectsTos() {
     java.util.List<TrackElement> trackElements = new ArrayList<>();
-    for (TrackElementRef teRef : getConnectsToList()) {
+    for (TrackElementRef teRef : getConnectedElementList()) {
       trackElements.add(teRef.getTrackElement());
     }
     return trackElements;
@@ -103,7 +113,7 @@ aspect TreeNavigation {
 
   syn Collection<Segment> TrackElement.connectsToSegments() {
     java.util.List<Segment> segments = new ArrayList<>();
-    for (TrackElementRef teRef : getConnectsToList()) {
+    for (TrackElementRef teRef : getConnectedElementList()) {
       Segment segment = teRef.getTrackElement().asSegment();
       if (segment != null) {
         segments.add(segment);
@@ -140,52 +150,50 @@ aspect TreeNavigation {
     return getTarget().getSwitch();
   }
 
-  syn Collection<Route> Sensor.requiringRoutes() {
-    return getRoot().requiringRoutesMap().get(this.id());
+  syn Collection<Sensor> TrackElement.monitoredBy() {
+    return getRoot().monitoredByMap().get(this.id());
   }
 
-  syn Map<Integer,Set<Route>> RailwayContainer.requiringRoutesMap() {
-    Map<Integer,Set<Route>> routeMap = new java.util.HashMap<>();
+  syn Map<Integer,Set<Sensor>> RailwayContainer.monitoredByMap() {
+    Map<Integer,Set<Sensor>> sensorMap = new java.util.HashMap<>();
 
     // fill the keys
-    for (Sensor sensor: sensors()) {
-      routeMap.put(sensor.id(), new java.util.HashSet<>());
+    for (Region region: getRegionList()) {
+      for (TrackElement trackElement: region.getTrackElementList()) {
+        sensorMap.put(trackElement.id(), new java.util.HashSet<>());
+      }
     }
 
     // update the values
-    for (Route route : getRouteList()) {
-      for (SensorRef sensorRef : route.getRequiredSensorList()) {
-        routeMap.get(sensorRef.getValue()).add(route);
+    for (Sensor sensor : sensors()) {
+      for (TrackElementRef trackElementRef : sensor.getMonitoredElementList()) {
+        sensorMap.get(trackElementRef.getValue()).add(sensor);
       }
     }
 
-    return routeMap;
+    return sensorMap;
   }
 
-  syn Collection<Sensor> TrackElement.monitoredBy() {
-    return getRoot().monitoredByMap().get(this.id());
+  syn Collection<Route> Sensor.requiringRoutes() {
+    return getRoot().requiringRoutesMap().get(this.id());
   }
 
-  syn Map<Integer, Set<Sensor>> RailwayContainer.monitoredByMap() {
-    Map<Integer, Set<Sensor>> result = new java.util.HashMap<>();
+  syn Map<Integer,Set<Route>> RailwayContainer.requiringRoutesMap() {
+    Map<Integer,Set<Route>> routeMap = new java.util.HashMap<>();
 
     // fill the keys
-    for (Region region : getRegionList()) {
-      for (TrackElement trackElement : region.getTrackElementList()) {
-        result.put(trackElement.id(), new java.util.HashSet<>());
-      }
+    for (Sensor sensor: sensors()) {
+      routeMap.put(sensor.id(), new java.util.HashSet<>());
     }
 
     // update the values
-    for (Region region : getRegionList()) {
-      for (Sensor sensor : region.getSensorList()) {
-        for (TrackElementRef trackElementRef : sensor.getMonitoredElementList()) {
-          result.get(trackElementRef.getValue()).add(sensor);
-        }
+    for (Route route : getRouteList()) {
+      for (SensorRef sensorRef : route.getRequiredSensorList()) {
+        routeMap.get(sensorRef.getValue()).add(route);
       }
     }
 
-    return result;
+    return routeMap;
   }
 
 }
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/queries/SwitchMonitoredMatch.jrag b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/queries/SwitchMonitoredMatch.jrag
index b58c43ff7b392593e6aea56984eb5873f34b8772..8ac3cd1763d23bd53ef8c4833ee989ed1c7a026f 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/queries/SwitchMonitoredMatch.jrag
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/queries/SwitchMonitoredMatch.jrag
@@ -1,21 +1,14 @@
 aspect Queries {
 
   syn java.util.Collection<Switch> RailwayContainer.switchMonitoredMatches() {
-    java.util.List<Switch> matches = new java.util.ArrayList<>();
-    for (Region region: getRegionList()) {
-      matches.addAll(region.switchMonitoredMatches());
-    }
-    return matches;
-  }
-
-  syn java.util.Collection<Switch> Region.switchMonitoredMatches() {
-    java.util.List<Switch> matches = new java.util.ArrayList<>();
-    for (Switch sw : switches()) {
-      if (sw.monitoredBy().size() == 0) {
-        matches.add(sw);
+    java.util.Set<Switch> switches = new java.util.HashSet<>();
+    switches.addAll(switches());
+    for (Sensor sensor : sensors()) {
+      for (Switch sw : sensor.monitoredSwitches()) {
+        switches.remove(sw);
       }
     }
-    return matches;
+    return switches;
   }
 
   syn java.util.Collection<Switch> RailwayContainer.switchMonitoredInjectMatches() {
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/train.ast b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/train.ast
index 8ea87e495773e8707610a14e4c213b45a0e16d3b..6d1b86d55402564adac6f9509483b0ae82f7dbb0 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/train.ast
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/train.ast
@@ -1,22 +1,19 @@
-// root:
 RailwayContainer ::= Route* Region* ;
 
-abstract RailwayElement ::= Id ;
-Region:RailwayElement ::= TrackElement* Sensor* ;
-Semaphore:RailwayElement ::= <Signal:Signal> ;
-Route:RailwayElement ::= <Active:boolean> SwitchPosition* RequiredSensor:SensorRef* [Entry:SemaphoreRef] [Exit:SemaphoreRef] ;
-SwitchPosition:RailwayElement ::= <Position:Position> Target:SwitchRef ;
-Sensor:RailwayElement ::= MonitoredElement:TrackElementRef* ;
+abstract RailwayElement ::= <Id:int>;
+Region : RailwayElement ::= TrackElement* Sensor*;
+Semaphore : RailwayElement ::= <Signal:Signal>;
+Route : RailwayElement ::= <Active:boolean> SwitchPosition* RequiredSensor:SensorRef* [Entry:SemaphoreRef] [Exit:SemaphoreRef];
+SwitchPosition : RailwayElement ::= <Position:Position> Target:SwitchRef;
+Sensor : RailwayElement ::= MonitoredElement:TrackElementRef*;
 
-abstract TrackElement:RailwayElement ::= ConnectsTo:TrackElementRef* ;
-Segment:TrackElement ::= <Length:int> Semaphore* ;
-Switch:TrackElement ::= <CurrentPosition:Position> ;
+abstract TrackElement:RailwayElement ::= ConnectedElement:TrackElementRef*;
+Segment:TrackElement ::= <Length:int> Semaphore*;
+Switch:TrackElement ::= <CurrentPosition:Position>;
 
-abstract Name ::= <Value:int> ;
-Id:Name ;
-abstract Ref:Name ;
-SensorRef:Ref ::= <Sensor:Sensor> ;
-SemaphoreRef:Ref ::= <Semaphore:Semaphore> ;
-TrackElementRef:Ref ::= <TrackElement:TrackElement> ;
-SwitchRef:Ref ::= <Switch:Switch> ;
-SegmentRef:Ref ::= <Segment:Segment> ;
+abstract Ref ::= <Value:int> ;
+SensorRef : Ref ::= <Sensor:Sensor>;
+SemaphoreRef : Ref ::= <Semaphore:Semaphore>;
+abstract TrackElementRef : Ref;
+SwitchRef : TrackElementRef ::= <Switch:Switch> ;
+SegmentRef : TrackElementRef ::= <Segment:Segment> ;
\ No newline at end of file
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/driver/JastaddDriver.java b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/driver/JastaddDriver.java
index 2e7648ea8e7aa878de85ead7662c596b7594a03e..47e998c7cc3a2e600696667a54fdade244db0067 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/driver/JastaddDriver.java
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/driver/JastaddDriver.java
@@ -55,7 +55,7 @@ public class JastaddDriver extends Driver {
 
   @Override
   public String getPostfix() {
-    return "-ag-ref.json";
+    return "-ag.json";
   }
 
   public void flushCache() {
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/driver/deserializer/ASTNodeDeserializer.java b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/driver/deserializer/ASTNodeDeserializer.java
index 2e4720e73c1fad09cba6593790aa68352aa1df67..7ab20e193787dbae3768c0273ff34958db9da2b9 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/driver/deserializer/ASTNodeDeserializer.java
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/driver/deserializer/ASTNodeDeserializer.java
@@ -48,9 +48,6 @@ public class ASTNodeDeserializer extends StdDeserializer<ASTNode> {
     for (SemaphoreRef ref : semaphoreRefList) {
       ref.setSemaphore((Semaphore) idMap.get(ref.getValue()));
     }
-    for (TrackElementRef ref : trackElementRefList) {
-      ref.setTrackElement((TrackElement) idMap.get(ref.getValue()));
-    }
     for (SwitchRef ref : switchRefList) {
       ref.setSwitch((Switch) idMap.get(ref.getValue()));
     }
@@ -173,16 +170,13 @@ public class ASTNodeDeserializer extends StdDeserializer<ASTNode> {
     // check if the instance is of type RailwayElement
     if (instance instanceof RailwayElement) {
       RailwayElement re = (RailwayElement) instance;
-      this.idMap.put(re.getId().getValue(), re);
+      this.idMap.put(re.getId(), re);
     } else if (instance instanceof SensorRef) {
       SensorRef r = (SensorRef) instance;
       this.sensorRefList.add(r);
     } else if (instance instanceof SemaphoreRef) {
       SemaphoreRef r = (SemaphoreRef) instance;
       this.semaphoreRefList.add(r);
-    } else if (instance instanceof TrackElementRef) {
-      TrackElementRef r = (TrackElementRef) instance;
-      this.trackElementRefList.add(r);
     } else if (instance instanceof SwitchRef) {
       SwitchRef r = (SwitchRef) instance;
       this.switchRefList.add(r);
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectConnectedSegments.java b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectConnectedSegments.java
index 78eab3ecdbeb304aa45dca7bb1d51947bf97347c..2d5edaa3b1853246e689f72be52dcaf4defbd79f 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectConnectedSegments.java
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectConnectedSegments.java
@@ -20,25 +20,25 @@ public class JastaddTransformationInjectConnectedSegments<TJastaddDriver extends
     for (final JastaddConnectedSegmentsInjectMatch match : matches) {
       // create segment2
       List<TrackElementRef> connectedSegments = new List<>();
-      connectedSegments.add(new TrackElementRef(match.getSegment3().id(), match.getSegment3()));
+      connectedSegments.add(match.getSegment3().createRef());
       List<Semaphore> semaphores = new List<>();
-      Segment segment2 = new Segment(new Id(driver.nextId()), connectedSegments, TrainBenchmarkConstants.DEFAULT_SEGMENT_LENGTH, semaphores);
+      Segment segment2 = new Segment(driver.nextId(), connectedSegments, TrainBenchmarkConstants.DEFAULT_SEGMENT_LENGTH, semaphores);
 
       match.getSegment1().containingRegion().addTrackElement(segment2);
 
       // have the sensor monitor the segment
-      match.getSensor().addMonitoredElement(new TrackElementRef(segment2.id(), segment2));
+      match.getSensor().addMonitoredElement(segment2.createRef());
 
       // remove the connection of segment1 to segment3
-      for (int i = 0; i < match.getSegment1().getConnectsToList().getNumChild(); i++) {
-        if (match.getSegment1().getConnectsTo(i).getValue() == match.getSegment3().id()) {
-          match.getSegment1().getConnectsToList().removeChild(i);
+      for (int i = 0; i < match.getSegment1().getConnectedElementList().getNumChild(); i++) {
+        if (match.getSegment1().getConnectedElement(i).getValue() == match.getSegment3().id()) {
+          match.getSegment1().getConnectedElementList().removeChild(i);
           break;
         }
       }
 
       // connect segment1 to segment2
-      match.getSegment1().addConnectsTo(new TrackElementRef(segment2.id(), segment2));
+      match.getSegment1().addConnectedElement(segment2.createRef());
     }
     driver.flushCache();
   }
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectSwitchMonitored.java b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectSwitchMonitored.java
index 973b4146faa59962163bb8ef2654e34bd5dc2481..af55f7ceb861cb9a201841d63115b46e338302b6 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectSwitchMonitored.java
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectSwitchMonitored.java
@@ -1,6 +1,6 @@
 package de.tudresden.inf.st.train.jastadd.transformations.inject;
 
-import de.tudresden.inf.st.train.jastadd.ast.*;
+import de.tudresden.inf.st.train.jastadd.ast.Sensor;
 import de.tudresden.inf.st.train.jastadd.ast.TrackElementRef;
 import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver;
 import de.tudresden.inf.st.train.jastadd.matches.JastaddSwitchMonitoredInjectMatch;
@@ -34,7 +34,6 @@ public class JastaddTransformationInjectSwitchMonitored<TJastaddDriver extends J
       ref.removeSelf();
     }
 
-
     driver.flushCache();
   }
 
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairConnectedSegments.java b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairConnectedSegments.java
index 44a1ee72a5ab2957bf9db158762c40144ea6ad9f..929ae4da36a442fadd93990fe19293ad6e604e0c 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairConnectedSegments.java
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairConnectedSegments.java
@@ -31,9 +31,9 @@ public class JastaddTransformationRepairConnectedSegments<TJastaddDriver extends
           }
         }
         for (TrackElement element : region.getTrackElementList()) {
-          for (int i = element.getConnectsToList().getNumChild() - 1; i >= 0; i--) {
-            if (element.getConnectsTo(i).getValue() == segment2.id()) {
-              element.getConnectsTo(i).removeSelf();
+          for (int i = element.getConnectedElementList().getNumChild() - 1; i >= 0; i--) {
+            if (element.getConnectedElement(i).getValue() == segment2.id()) {
+              element.getConnectedElement(i).removeSelf();
             }
           }
         }
@@ -42,7 +42,7 @@ public class JastaddTransformationRepairConnectedSegments<TJastaddDriver extends
       segment2.removeSelf();
 
       // connect segment1 to segment3
-      match.getSegment1().addConnectsTo(new TrackElementRef(match.getSegment3().id(), match.getSegment3()));
+      match.getSegment1().addConnectedElement(match.getSegment3().createRef());
     }
     driver.flushCache();
   }
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairRouteSensor.java b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairRouteSensor.java
index 6a62ee4af9f65854e3b632b6747629ab1d395288..4cd8687035f7775fd933274cd97cb9759aa44281 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairRouteSensor.java
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairRouteSensor.java
@@ -21,7 +21,7 @@ public class JastaddTransformationRepairRouteSensor<TJastaddDriver extends Jasta
     for (final JastaddRouteSensorMatch rsm : matches) {
       final Route route = rsm.getRoute();
       final Sensor sensor = rsm.getSensor();
-      route.getRequiredSensorList().add(new SensorRef(sensor.id(), sensor));
+      route.getRequiredSensorList().add(sensor.createRef());
       driver.flushCache();
     }
   }
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSemaphoreNeighbor.java b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSemaphoreNeighbor.java
index 4026ffe81d1d70f5de8d289b80a19f5389b179ba..3e55f70474e284ff15abab1145223e0baedf58f8 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSemaphoreNeighbor.java
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSemaphoreNeighbor.java
@@ -17,7 +17,7 @@ public class JastaddTransformationRepairSemaphoreNeighbor<TJastaddDriver extends
   @Override
   public void activate(final Collection<JastaddSemaphoreNeighborMatch> matches) {
     for (final JastaddSemaphoreNeighborMatch match : matches) {
-      match.getRoute2().setEntry(new SemaphoreRef(match.getSemaphore().id(), match.getSemaphore()));
+      match.getRoute2().setEntry(match.getSemaphore().createRef());
     }
     driver.flushCache();
   }
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSwitchMonitored.java b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSwitchMonitored.java
index 7943e1af32fd1c891f68ac5f7b9f3ec3899666b5..0e10e69a9c011d9567b85cb4ee0cef3ac8c07675 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSwitchMonitored.java
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSwitchMonitored.java
@@ -1,7 +1,9 @@
 package de.tudresden.inf.st.train.jastadd.transformations.repair;
 
-
-import de.tudresden.inf.st.train.jastadd.ast.*;
+import de.tudresden.inf.st.train.jastadd.ast.List;
+import de.tudresden.inf.st.train.jastadd.ast.SwitchRef;
+import de.tudresden.inf.st.train.jastadd.ast.TrackElementRef;
+import de.tudresden.inf.st.train.jastadd.ast.Sensor;
 import de.tudresden.inf.st.train.jastadd.driver.JastaddDriver;
 import de.tudresden.inf.st.train.jastadd.matches.JastaddSwitchMonitoredMatch;
 import de.tudresden.inf.st.train.jastadd.transformations.JastaddTransformation;
@@ -20,9 +22,9 @@ public class JastaddTransformationRepairSwitchMonitored<TJastaddDriver extends J
     for (final JastaddSwitchMonitoredMatch ssnm : matches) {
 
       // gather the stuff we need to create a sensor:
-      Id id = new Id(driver.nextId());
+      int id = driver.nextId();
       List<TrackElementRef> refList = new List<>();
-      refList.add(new TrackElementRef(ssnm.getSw().id(), ssnm.getSw()));
+      refList.add(ssnm.getSw().createRef());
 
       Sensor sensor = new Sensor(id, refList);
 
diff --git a/trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/Train.relast b/trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/Train.relast
new file mode 100644
index 0000000000000000000000000000000000000000..57956fbbbf7ff6fed859535dafc83719e8cb9f5c
--- /dev/null
+++ b/trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/Train.relast
@@ -0,0 +1,19 @@
+RailwayContainer ::= Route* Region*;
+
+abstract RailwayElement ::= <Id:int>;
+Region : RailwayElement ::= TrackElement* Sensor*;
+Semaphore : RailwayElement ::= <Signal:Signal>;
+Route : RailwayElement ::= <Active:boolean> SwitchPosition*;
+SwitchPosition : RailwayElement ::= <Position:Position>;
+Sensor : RailwayElement;
+
+abstract TrackElement : RailwayElement;
+Segment : TrackElement ::= <Length:int> Semaphore*;
+Switch : TrackElement ::= <CurrentPosition:Position>;
+
+rel Route.requires* -> Sensor;
+rel Route.entry? -> Semaphore;
+rel Route.exit? -> Semaphore;
+rel Sensor.monitors* <-> TrackElement.monitoredBy*;
+rel TrackElement.connectsTo* -> TrackElement;
+rel SwitchPosition.target <-> Switch.positions*;
\ No newline at end of file
diff --git a/trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/TreeNavigation.jrag b/trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/TreeNavigation.jrag
index 70f2ee27c1115b158d70cd137825b5eb1f4ce7f0..3265ab429ba2f87290646d3742f03fcee6cc5112 100644
--- a/trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/TreeNavigation.jrag
+++ b/trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/TreeNavigation.jrag
@@ -1,5 +1,18 @@
 aspect TreeNavigation {
 
+  // collections of things
+
+  syn Collection<Segment> RailwayContainer.segments() {
+    java.util.List<Segment> segments = new ArrayList<>();
+    for (Region region : getRegionList()) {
+      for (TrackElement trackElement : region.getTrackElementList()) {
+        Segment segment = trackElement.asSegment();
+        if (segment != null) segments.add(segment);
+      }
+    }
+    return segments;
+  }
+
   syn Collection<Switch> RailwayContainer.switches() {
     java.util.List<Switch> switches = new ArrayList<>();
     for (Region region : getRegionList()) {
@@ -20,6 +33,26 @@ aspect TreeNavigation {
     return switches;
   }
 
+  syn Collection<Semaphore> RailwayContainer.semaphores() {
+    java.util.List<Semaphore> semaphores = new ArrayList<>();
+    for (Segment segment : segments()) {
+      for (Semaphore semaphore : segment.getSemaphoreList()) {
+        semaphores.add(semaphore);
+      }
+    }
+    return semaphores;
+  }
+
+  syn Collection<Sensor> RailwayContainer.sensors() {
+    java.util.List<Sensor> sensors = new ArrayList<>();
+    for (Region region : getRegionList()) {
+      for (Sensor sensor : region.getSensorList()){
+        sensors.add(sensor);
+      }
+    }
+    return sensors;
+  }
+
   syn Collection<Segment> Sensor.monitoredSegments() {
     java.util.List<Segment> segments = new ArrayList<>();
     for (TrackElement trackElement : getMonitoredElementList()) {
diff --git a/trainbenchmark-tool-jastadd-specialized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectConnectedSegments.java b/trainbenchmark-tool-jastadd-specialized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectConnectedSegments.java
index bd762b99b9270fd0af84f763ed0593adc0e07bf5..dbbb435cbcb76e134e9cd041523d2f961fa8f455 100644
--- a/trainbenchmark-tool-jastadd-specialized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectConnectedSegments.java
+++ b/trainbenchmark-tool-jastadd-specialized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/inject/JastaddTransformationInjectConnectedSegments.java
@@ -19,11 +19,10 @@ public class JastaddTransformationInjectConnectedSegments<TJastaddDriver extends
   public void activate(final Collection<JastaddConnectedSegmentsInjectMatch> matches) {
     for (final JastaddConnectedSegmentsInjectMatch match : matches) {
       // create segment2
-      RefList<TrackElement> connectedSegments = new RefList<>();
-      connectedSegments.add(match.getSegment3());
-      RefList<Sensor> monitoredBy = new RefList<>();
-      RefList<Semaphore> semaphores = new RefList<>();
-      Segment segment2 = new Segment(driver.nextId(), monitoredBy, connectedSegments, TrainBenchmarkConstants.DEFAULT_SEGMENT_LENGTH, semaphores);
+      Segment segment2 = new Segment();
+      segment2.setId(driver.nextId());
+      segment2.addConnectsTo(match.getSegment3());
+      segment2.setLength(TrainBenchmarkConstants.DEFAULT_SEGMENT_LENGTH);
 
       match.getSegment1().containingRegion().addTrackElement(segment2);
 
diff --git a/trainbenchmark-tool-jastadd-specialized-incremental/build.gradle b/trainbenchmark-tool-jastadd-specialized-incremental/build.gradle
index 0c0812b98b1b193b96b64efd7fa273c1c0f510e8..e67381f998b77a9a0d1f79a5e477b995899e5b7f 100644
--- a/trainbenchmark-tool-jastadd-specialized-incremental/build.gradle
+++ b/trainbenchmark-tool-jastadd-specialized-incremental/build.gradle
@@ -17,7 +17,7 @@ task jastadd(type: JavaExec) {
             "--package=de.tudresden.inf.st.train.jastadd.ast",
             "--o=src/main/java-gen",
             "--tracing=api",
-    ] + fileTree("../trainbenchmark-tool-jastadd-base/src/main/jastadd/") + fileTree("../trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/") + fileTree("../trainbenchmark-tool-jastadd-specialized-incremental/src/main/jastadd/")
+    ] + fileTree("../trainbenchmark-tool-jastadd-base/src/main/jastadd/") + fileTree("../trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/").matching {exclude "*.relast"} + fileTree("../trainbenchmark-tool-jastadd-specialized-incremental/src/main/jastadd/")
     doFirst {
         delete fileTree('src/main/java-gen')
     }
diff --git a/trainbenchmark-tool-jastadd-specialized/build.gradle b/trainbenchmark-tool-jastadd-specialized/build.gradle
index ee3c32e2ba4cff772dcf525fa31be201f6ff5e30..8d98175b8c8d32ddd1ed897c5d3eaad0680196be 100644
--- a/trainbenchmark-tool-jastadd-specialized/build.gradle
+++ b/trainbenchmark-tool-jastadd-specialized/build.gradle
@@ -15,7 +15,7 @@ task jastadd(type: JavaExec) {
             "--package=de.tudresden.inf.st.train.jastadd.ast",
             "--o=src/main/java-gen",
             "--tracing=api",
-    ] + fileTree("../trainbenchmark-tool-jastadd-base/src/main/jastadd/") + fileTree("../trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/") + fileTree("../trainbenchmark-tool-jastadd-specialized/src/main/jastadd/")
+    ] + fileTree("../trainbenchmark-tool-jastadd-base/src/main/jastadd/") + fileTree("../trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/").matching {exclude "*.relast"} + fileTree("../trainbenchmark-tool-jastadd-specialized/src/main/jastadd/")
     doFirst {
         delete fileTree('src/main/java-gen')
     }