diff --git a/eraser-base/src/main/jastadd/Location.jrag b/eraser-base/src/main/jastadd/Location.jrag
new file mode 100644
index 0000000000000000000000000000000000000000..b61b260c998e15a89712e00f3e2c2a44eb84759b
--- /dev/null
+++ b/eraser-base/src/main/jastadd/Location.jrag
@@ -0,0 +1,10 @@
+aspect Location {
+  syn Optional<Location> Item.myLocation() {
+    if (this.hasLocation()) {
+      return Optional.of(this.getLocation());
+    } else {
+      return JavaUtils.ifPresentOrElseReturn(linkedThing(),
+          thing -> thing.hasLocation() ? Optional.of(thing.getLocation()) : Optional.empty(), () -> Optional.empty());
+    }
+  }
+}
diff --git a/eraser-base/src/main/jastadd/Location.relast b/eraser-base/src/main/jastadd/Location.relast
new file mode 100644
index 0000000000000000000000000000000000000000..3cdf199776adc6eaa575b31f867a16bae891e8d5
--- /dev/null
+++ b/eraser-base/src/main/jastadd/Location.relast
@@ -0,0 +1,3 @@
+Location ::= <Label:String> SubLocation:Location ;
+rel Location.Thing* <-> Thing.Location? ;
+rel Location.Item* <-> Item.Location? ;
diff --git a/eraser-base/src/main/jastadd/Navigation.jrag b/eraser-base/src/main/jastadd/Navigation.jrag
index e75f39c8fa19496dc362f2f38625024691e01e76..9aadd37e8d5ed064a1b28ede6244f5746030a652 100644
--- a/eraser-base/src/main/jastadd/Navigation.jrag
+++ b/eraser-base/src/main/jastadd/Navigation.jrag
@@ -124,6 +124,16 @@ aspect Navigation {
   inh NeuralNetworkRoot OutputLayer.containingNeuralNetwork();
   eq NeuralNetworkRoot.getOutputLayer().containingNeuralNetwork() = this;
 
+  //--- linkedThing ---
+  syn Optional<Thing> Item.linkedThing() {
+    if (!this.hasChannel()) {
+      return Optional.empty();
+    }
+    Channel channel = this.getChannel();
+    Thing thing = channel.containingThing();
+    return Optional.of(thing);
+  }
+
   //--- getRoot ---
   inh Root ASTNode.getRoot();
   eq Root.getChannelCategory().getRoot() = this;
diff --git a/eraser-base/src/main/jastadd/main.relast b/eraser-base/src/main/jastadd/main.relast
index f9601870ae5ee144306040e355a5bdaf4017fd72..45dd621af675e7233511a2179baeb2fa54c29b25 100644
--- a/eraser-base/src/main/jastadd/main.relast
+++ b/eraser-base/src/main/jastadd/main.relast
@@ -1,6 +1,6 @@
 // ----------------    Main    ------------------------------
 Root ::= Thing* Group* ThingType* ChannelType* ChannelCategory* ItemCategory* User* MqttRoot InfluxRoot
-         MachineLearningRoot Rule* ;
+         MachineLearningRoot Rule* Location* ;
 
 // ----------------    Users   ------------------------------
 User : LabelledModelElement ;