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 ;