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 6cb544888869d39635447756027d24020ba28bda..40280413a3f223ab92144de483974ff8e420e52a 100644
--- a/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/TreeNavigation.jrag
+++ b/trainbenchmark-tool-jastadd-namelookup-base/src/main/jastadd/TreeNavigation.jrag
@@ -1,5 +1,3 @@
-import java.util.HashSet;
-
 aspect TreeNavigation {
 
   // collections of things
@@ -132,7 +130,7 @@ aspect TreeNavigation {
 
   // more reference resolving
 
-  syn Collection<TrackElement> Sensor.monitoredElements() {
+  syn Collection<TrackElement> Sensor.monitors() {
     java.util.List<TrackElement> trackElements = new ArrayList<>();
     for (TrackElementRef ref : getMonitoredElementList()) {
       trackElements.add(ref.getTrackElement());
@@ -170,7 +168,7 @@ aspect TreeNavigation {
     return getRequiredSensor(i).getSensor();
   }
 
-  syn Collection<TrackElement> TrackElement.connectsTos() {
+  syn Collection<TrackElement> TrackElement.connectsTo() {
     java.util.List<TrackElement> trackElements = new ArrayList<>();
     for (TrackElementRef teRef : getConnectedElementList()) {
       trackElements.add(teRef.getTrackElement());
@@ -189,7 +187,7 @@ aspect TreeNavigation {
     return segments;
   }
 
-  syn Collection<Sensor> Route.requiredSensors() {
+  syn Collection<Sensor> Route.requires() {
     java.util.List<Sensor> sensors = new ArrayList<>();
     for (SensorRef sensorRef : getRequiredSensorList()) {
       sensors.add(sensorRef.getSensor());
@@ -221,7 +219,7 @@ aspect TreeNavigation {
 
   Sensor contributes this
     to TrackElement.monitoredBy()
-    for each monitoredElements();
+    for each monitors();
 
   RailwayContainer contributes {
     // Explicitly traverses regions, skips routes.
@@ -237,26 +235,20 @@ aspect TreeNavigation {
     // Stop at sensor, only contains refs.
   } to TrackElement.monitoredBy();
 
-  syn Collection<Route> Sensor.requiringRoutes() {
-    return getRoot().requiringRoutesMap().get(this.id());
-  }
 
-  syn Map<Integer,Set<Route>> RailwayContainer.requiringRoutesMap() {
-    Map<Integer,Set<Route>> routeMap = new java.util.HashMap<>();
+  coll ArrayList<Route> Sensor.requiredBy() [new ArrayList()] with add;
 
-    // fill the keys
-    for (Sensor sensor: sensors()) {
-      routeMap.put(sensor.id(), new java.util.HashSet<>());
-    }
+  RailwayContainer contributes {
+    // Explicitly traverses routes, skips regions.
+    getRouteList().collectContributions();
+  } to Sensor.requiredBy();
 
-    // update the values
-    for (Route route : getRouteList()) {
-      for (SensorRef sensorRef : route.getRequiredSensorList()) {
-        routeMap.get(sensorRef.getValue()).add(route);
-      }
-    }
+  Route contributes this
+    to Sensor.requiredBy()
+    for each requires();
 
-    return routeMap;
-  }
+  Route contributes {
+    // Stop at route, only contains refs.
+  } to Sensor.requiredBy();
 
 }
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 e0218601c07ed21b099eb711e3d377e99f856039..76c0530c05acb848a589eab0a3c6a3bc16179032 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
@@ -12,12 +12,11 @@ aspect Queries {
     java.util.List<JastaddRouteSensorMatch> matches = new java.util.ArrayList<>();
 
     // if the route follows a switch and this switch has is monitored by a sensor
-    Collection<Sensor> requiredSensors = requiredSensors();
     for (SwitchPosition sp : getSwitchPositionList()) {
       Switch sw = sp.target();
       for (Sensor sensor : sw.monitoredBy()) {
         boolean validSensor = false;
-        for (Sensor sensor2 : requiredSensors) {
+        for (Sensor sensor2 : requires()) {
           if (sensor2 == sensor) {
             validSensor = true;
             break;
@@ -41,7 +40,7 @@ aspect Queries {
 
   syn Collection<JastaddRouteSensorInjectMatch> Route.routeSensorInjectMatches() {
     java.util.List<JastaddRouteSensorInjectMatch> matches = new ArrayList<JastaddRouteSensorInjectMatch>();
-    for (Sensor sensor: requiredSensors()) {
+    for (Sensor sensor: requires()) {
       matches.add(new JastaddRouteSensorInjectMatch(this, sensor));
     }
     return matches;
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 48fde84b69f1af5cf55d8440ad703f64eb81ef42..b7a636080e1e447185dea0afffbcc9b642c9216b 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
@@ -18,11 +18,11 @@ aspect Queries {
     Semaphore exitSemaphore = this.exit();
 
     // get the sensors of the route
-    for (Sensor sensor1 : this.requiredSensors()) {
-      for (TrackElement te1 : sensor1.monitoredElements()) {
-        for (TrackElement te2 : te1.connectsTos()) {
+    for (Sensor sensor1 : this.requires()) {
+      for (TrackElement te1 : sensor1.monitors()) {
+        for (TrackElement te2 : te1.connectsTo()) {
           for (Sensor sensor2 : te2.monitoredBy()) {
-            for (Route route2 : sensor2.requiringRoutes()) {
+            for (Route route2 : sensor2.requiredBy()) {
               if (this != route2) {
                 if (!route2.hasEntry() || route2.getEntry().getValue() != exitRef.getValue()) {
                   matches.add(new JastaddSemaphoreNeighborMatch(exitSemaphore, this, route2, sensor1, sensor2, te1, te2));
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 0e10e69a9c011d9567b85cb4ee0cef3ac8c07675..3621d46226135736b2bf160bd12cdeded253a62e 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
@@ -21,7 +21,6 @@ public class JastaddTransformationRepairSwitchMonitored<TJastaddDriver extends J
   public void activate(final Collection<JastaddSwitchMonitoredMatch> matches) {
     for (final JastaddSwitchMonitoredMatch ssnm : matches) {
 
-      // gather the stuff we need to create a sensor:
       int id = driver.nextId();
       List<TrackElementRef> refList = new List<>();
       refList.add(ssnm.getSw().createRef());
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 d4f1f8f4a180247c2e86e76eb3cbcf01960edce3..f0618c8286b0e780e379d08313c5f1a256b89562 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/TreeNavigation.jrag
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/TreeNavigation.jrag
@@ -65,7 +65,7 @@ aspect TreeNavigation {
 
   // more reference resolving
 
-  syn Collection<TrackElement> Sensor.monitoredElements() {
+  syn Collection<TrackElement> Sensor.monitors() {
     java.util.List<TrackElement> trackElements = new ArrayList<>();
     for (TrackElementRef ref : getMonitoredElementList()) {
       trackElements.add(ref.getTrackElement());
@@ -103,7 +103,7 @@ aspect TreeNavigation {
     return getRequiredSensor(i).getSensor();
   }
 
-  syn Collection<TrackElement> TrackElement.connectsTos() {
+  syn Collection<TrackElement> TrackElement.connectsTo() {
     java.util.List<TrackElement> trackElements = new ArrayList<>();
     for (TrackElementRef teRef : getConnectedElementList()) {
       trackElements.add(teRef.getTrackElement());
@@ -122,7 +122,7 @@ aspect TreeNavigation {
     return segments;
   }
 
-  syn Collection<Sensor> Route.requiredSensors() {
+  syn Collection<Sensor> Route.requires() {
     java.util.List<Sensor> sensors = new ArrayList<>();
     for (SensorRef sensorRef : getRequiredSensorList()) {
       sensors.add(sensorRef.getSensor());
@@ -150,50 +150,39 @@ aspect TreeNavigation {
     return getTarget().getSwitch();
   }
 
-  syn Collection<Sensor> TrackElement.monitoredBy() {
-    return getRoot().monitoredByMap().get(this.id());
-  }
-
-  syn Map<Integer,Set<Sensor>> RailwayContainer.monitoredByMap() {
-    Map<Integer,Set<Sensor>> sensorMap = new java.util.HashMap<>();
+  coll ArrayList<Sensor> TrackElement.monitoredBy() [new ArrayList()] with add;
 
-    // fill the keys
-    for (Region region: getRegionList()) {
-      for (TrackElement trackElement: region.getTrackElementList()) {
-        sensorMap.put(trackElement.id(), new java.util.HashSet<>());
-      }
-    }
+  Sensor contributes this
+    to TrackElement.monitoredBy()
+    for each monitors();
 
-    // update the values
-    for (Sensor sensor : sensors()) {
-      for (TrackElementRef trackElementRef : sensor.getMonitoredElementList()) {
-        sensorMap.get(trackElementRef.getValue()).add(sensor);
-      }
-    }
+  RailwayContainer contributes {
+    // Explicitly traverses regions, skips routes.
+    getRegionList().collectContributions();
+  } to TrackElement.monitoredBy();
 
-    return sensorMap;
-  }
+  Region contributes {
+    // Explicitly traverses sensors, skips elements.
+    getSensorList().collectContributions();
+  } to TrackElement.monitoredBy();
 
-  syn Collection<Route> Sensor.requiringRoutes() {
-    return getRoot().requiringRoutesMap().get(this.id());
-  }
+  Sensor contributes {
+    // Stop at sensor, only contains refs.
+  } to TrackElement.monitoredBy();
 
-  syn Map<Integer,Set<Route>> RailwayContainer.requiringRoutesMap() {
-    Map<Integer,Set<Route>> routeMap = new java.util.HashMap<>();
+  coll ArrayList<Route> Sensor.requiredBy() [new ArrayList()] with add;
 
-    // fill the keys
-    for (Sensor sensor: sensors()) {
-      routeMap.put(sensor.id(), new java.util.HashSet<>());
-    }
+  RailwayContainer contributes {
+    // Explicitly traverses routes, skips regions.
+    getRouteList().collectContributions();
+  } to Sensor.requiredBy();
 
-    // update the values
-    for (Route route : getRouteList()) {
-      for (SensorRef sensorRef : route.getRequiredSensorList()) {
-        routeMap.get(sensorRef.getValue()).add(route);
-      }
-    }
+  Route contributes this
+    to Sensor.requiredBy()
+    for each requires();
 
-    return routeMap;
-  }
+  Route contributes {
+    // Stop at route, only contains refs.
+  } to Sensor.requiredBy();
 
 }
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/queries/RouteSensorMatch.jrag b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/queries/RouteSensorMatch.jrag
index e0218601c07ed21b099eb711e3d377e99f856039..76c0530c05acb848a589eab0a3c6a3bc16179032 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/queries/RouteSensorMatch.jrag
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/queries/RouteSensorMatch.jrag
@@ -12,12 +12,11 @@ aspect Queries {
     java.util.List<JastaddRouteSensorMatch> matches = new java.util.ArrayList<>();
 
     // if the route follows a switch and this switch has is monitored by a sensor
-    Collection<Sensor> requiredSensors = requiredSensors();
     for (SwitchPosition sp : getSwitchPositionList()) {
       Switch sw = sp.target();
       for (Sensor sensor : sw.monitoredBy()) {
         boolean validSensor = false;
-        for (Sensor sensor2 : requiredSensors) {
+        for (Sensor sensor2 : requires()) {
           if (sensor2 == sensor) {
             validSensor = true;
             break;
@@ -41,7 +40,7 @@ aspect Queries {
 
   syn Collection<JastaddRouteSensorInjectMatch> Route.routeSensorInjectMatches() {
     java.util.List<JastaddRouteSensorInjectMatch> matches = new ArrayList<JastaddRouteSensorInjectMatch>();
-    for (Sensor sensor: requiredSensors()) {
+    for (Sensor sensor: requires()) {
       matches.add(new JastaddRouteSensorInjectMatch(this, sensor));
     }
     return matches;
diff --git a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/queries/SemaphoreNeighbors.jrag b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/queries/SemaphoreNeighbors.jrag
index 48fde84b69f1af5cf55d8440ad703f64eb81ef42..b7a636080e1e447185dea0afffbcc9b642c9216b 100644
--- a/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/queries/SemaphoreNeighbors.jrag
+++ b/trainbenchmark-tool-jastadd-optimized-base/src/main/jastadd/queries/SemaphoreNeighbors.jrag
@@ -18,11 +18,11 @@ aspect Queries {
     Semaphore exitSemaphore = this.exit();
 
     // get the sensors of the route
-    for (Sensor sensor1 : this.requiredSensors()) {
-      for (TrackElement te1 : sensor1.monitoredElements()) {
-        for (TrackElement te2 : te1.connectsTos()) {
+    for (Sensor sensor1 : this.requires()) {
+      for (TrackElement te1 : sensor1.monitors()) {
+        for (TrackElement te2 : te1.connectsTo()) {
           for (Sensor sensor2 : te2.monitoredBy()) {
-            for (Route route2 : sensor2.requiringRoutes()) {
+            for (Route route2 : sensor2.requiredBy()) {
               if (this != route2) {
                 if (!route2.hasEntry() || route2.getEntry().getValue() != exitRef.getValue()) {
                   matches.add(new JastaddSemaphoreNeighborMatch(exitSemaphore, this, route2, sensor1, sensor2, te1, te2));
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 3e55f70474e284ff15abab1145223e0baedf58f8..35ccd29e3910bb69567fbbe450834d965ffdebb6 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
@@ -1,6 +1,5 @@
 package de.tudresden.inf.st.train.jastadd.transformations.repair;
 
-import de.tudresden.inf.st.train.jastadd.ast.SemaphoreRef;
 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;
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 0e10e69a9c011d9567b85cb4ee0cef3ac8c07675..3621d46226135736b2bf160bd12cdeded253a62e 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
@@ -21,7 +21,6 @@ public class JastaddTransformationRepairSwitchMonitored<TJastaddDriver extends J
   public void activate(final Collection<JastaddSwitchMonitoredMatch> matches) {
     for (final JastaddSwitchMonitoredMatch ssnm : matches) {
 
-      // gather the stuff we need to create a sensor:
       int id = driver.nextId();
       List<TrackElementRef> refList = new List<>();
       refList.add(ssnm.getSw().createRef());
diff --git a/trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/queries/SemaphoreNeighbors.jrag b/trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/queries/SemaphoreNeighbors.jrag
index a17fcac6cc8de1f448361dd11607739b51f0e323..99549d6f44fbe35a8d321dae589e199756b66df3 100644
--- a/trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/queries/SemaphoreNeighbors.jrag
+++ b/trainbenchmark-tool-jastadd-specialized-base/src/main/jastadd/queries/SemaphoreNeighbors.jrag
@@ -22,7 +22,7 @@ aspect Queries {
           for (Sensor sensor2 : te2.monitoredBy()) {
             for (Route route2 : sensor2.requiredBy()) {
               if (this != route2) {
-                if (route2.entry() == null || route2.entry() != exitSemaphore) {
+                if (!route2.hasEntry() || route2.entry() != exitSemaphore) {
                   matches.add(new JastaddSemaphoreNeighborMatch(exitSemaphore, this, route2, sensor1, sensor2, te1, te2));
                 }
               }
diff --git a/trainbenchmark-tool-jastadd-specialized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSwitchMonitored.java b/trainbenchmark-tool-jastadd-specialized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSwitchMonitored.java
index b1aebc9449b7ed042a58e90a328f99586b7d1ff6..9d73800bfad58383cb5f43a9bd1c2b17b28e800e 100644
--- a/trainbenchmark-tool-jastadd-specialized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSwitchMonitored.java
+++ b/trainbenchmark-tool-jastadd-specialized-base/src/main/java/de/tudresden/inf/st/train/jastadd/transformations/repair/JastaddTransformationRepairSwitchMonitored.java
@@ -1,7 +1,6 @@
 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.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;
@@ -19,8 +18,6 @@ public class JastaddTransformationRepairSwitchMonitored<TJastaddDriver extends J
   public void activate(final Collection<JastaddSwitchMonitoredMatch> matches) {
     for (final JastaddSwitchMonitoredMatch ssnm : matches) {
 
-      // TODO something about the requiring routes?
-
       Sensor sensor = new Sensor();
       sensor.setId(driver.nextId());
       sensor.addToMonitors(ssnm.getSw());