diff --git a/eraser-base/src/main/jastadd/ExternalHost.jrag b/eraser-base/src/main/jastadd/ExternalHost.jrag
new file mode 100644
index 0000000000000000000000000000000000000000..a72b775358368e67cebe1587e1b5b5c1bb28aae6
--- /dev/null
+++ b/eraser-base/src/main/jastadd/ExternalHost.jrag
@@ -0,0 +1,6 @@
+aspect ExternalHost {
+    syn boolean ExternalHost.exists() = getHostName()!=null && !getHostName().isEmpty();
+    public ExternalHost ExternalHost.copyFrom(ExternalHost host) {
+        return setHostName(host.getHostName()).setPort(host.getPort()).setUserName(host.getUserName()).setPassword(host.getPassword());
+    }
+}
\ No newline at end of file
diff --git a/eraser-base/src/main/jastadd/InfluxRoot.jrag b/eraser-base/src/main/jastadd/InfluxRoot.jrag
new file mode 100644
index 0000000000000000000000000000000000000000..58c6cab74be46d25bf4f0f68945fca51076b3a04
--- /dev/null
+++ b/eraser-base/src/main/jastadd/InfluxRoot.jrag
@@ -0,0 +1,3 @@
+aspect InfluxRoot {
+    syn ExternalHost InfluxRoot.getHost() = new ExternalHost();
+}
\ No newline at end of file
diff --git a/eraser-base/src/main/jastadd/ItemHistory.jrag b/eraser-base/src/main/jastadd/ItemHistory.jrag
index 60d38ad92abbfa758397b0a6880c704ab2968de6..1c256a56aa32bddda86f65a5ce951afdaf87d206 100644
--- a/eraser-base/src/main/jastadd/ItemHistory.jrag
+++ b/eraser-base/src/main/jastadd/ItemHistory.jrag
@@ -8,10 +8,7 @@ aspect ItemHistory {
   public static final InfluxRoot InfluxRoot.createDefault() {
     InfluxRoot result = new InfluxRoot();
 
-    ExternalHost eh = new ExternalHost();
-    eh.setUserName(DEFAULT_USER);
-    eh.setPassword(DEFAULT_PASSWORD);
-    result.setHost(eh);
+    result.getHost().setUserName(DEFAULT_USER).setPassword(DEFAULT_PASSWORD);
 
     result.setDbName(DEFAULT_DB_NAME);
 
@@ -22,7 +19,7 @@ aspect ItemHistory {
   cache InfluxRoot.influxAdapter();
   syn InfluxAdapter InfluxRoot.influxAdapter() {
     InfluxAdapter result;
-    if (hasHost()) {
+    if (getHost().exists()) {
       result = new InfluxAdapterImpl();
     } else {
       result = new InfluxAdapterStub();
@@ -106,6 +103,8 @@ aspect ItemHistory {
     getRoot().getInfluxRoot().influxAdapter().write(pointFromState());
   }
 
+  
+
   //--- pointFromState ---
   protected abstract AbstractItemPoint Item.pointFromState();
   protected AbstractItemPoint ItemWithBooleanState.pointFromState() {
diff --git a/eraser-base/src/main/jastadd/Printing.jrag b/eraser-base/src/main/jastadd/Printing.jrag
index a1f43ee2e435fa99bb008075023234baf5d2b6f3..00f966b85c41f697c26e46696caff3908df2423a 100644
--- a/eraser-base/src/main/jastadd/Printing.jrag
+++ b/eraser-base/src/main/jastadd/Printing.jrag
@@ -195,7 +195,7 @@ aspect Printing {
     return new MemberPrinter("Mqtt")
         .addNonDefault("incoming", getIncomingPrefix())
         .addNonDefault("outgoing", getOutgoingPrefix())
-        .addOptional("host", hasHost() && !host.getHostName().isEmpty(), () -> host.prettyPrint())
+        .addOptional("host", host.exists(), () -> host.prettyPrint())
         .build();
   }
 
@@ -206,7 +206,7 @@ aspect Printing {
         .addNonDefault("user", host.getUserName(), DEFAULT_USER)
         .addNonDefault("password", host.getPassword(), DEFAULT_PASSWORD)
         .addNonDefault("dbName", getDbName(), DEFAULT_DB_NAME)
-        .addOptional("host", hasHost() && !host.getHostName().isEmpty(), () -> host.prettyPrint())
+        .addOptional("host", host.exists(), () -> host.prettyPrint())
         .build();
   }
 
diff --git a/eraser-base/src/main/jastadd/Util.jrag b/eraser-base/src/main/jastadd/Util.jrag
index 4973711b3538887294d15b91b9b09c3cd5247a8b..5dec6c937eb459ea7a5abbc0b26d395a8dd7ce44 100644
--- a/eraser-base/src/main/jastadd/Util.jrag
+++ b/eraser-base/src/main/jastadd/Util.jrag
@@ -4,40 +4,6 @@ aspect Util {
 //  public static ExternalHost ExternalHost.createByName(String hostName) {
 //    return new ExternalHost(hostName, 1883);
 //  }
-  public void MqttRoot.updateHost(String hostName, int port, String username, String password) {
-    if (getHost()==null) {
-      setHost(new ExternalHost());
-    }
-    if (hostName!=null) {
-      getHost().setHostName(hostName);
-    }
-    if (port>0) {
-      getHost().setPort(port);
-    }
-    if (username!=null) {
-      getHost().setUserName(username);
-    }
-    if (password!=null) {
-      getHost().setPassword(password);
-    }
-    flushCache();
-  }
-
-
-  public void InfluxRoot.updateHost(String hostName, String username, String password) {
-    if (getHost()==null) {
-      setHost(new ExternalHost());
-    }
-    if (hostName!=null) {
-      getHost().setHostName(hostName);
-    }
-    if (username!=null) {
-      getHost().setUserName(username);
-    }
-    if (password!=null) {
-      getHost().setPassword(password);
-    }
-  }
 
   public static ExternalHost ExternalHost.of(String hostName, int defaultPort) {
     return ExternalHost.of(hostName,defaultPort,null,null);
diff --git a/eraser-base/src/main/jastadd/eraser.parser b/eraser-base/src/main/jastadd/eraser.parser
index 573db220b47f183800a8a0b434900fd58d0a2735..4ec6b8faf1d8f4ac6c942e4ce77cf750886cc41e 100644
--- a/eraser-base/src/main/jastadd/eraser.parser
+++ b/eraser-base/src/main/jastadd/eraser.parser
@@ -331,9 +331,9 @@ MqttRoot mqtt_root =
 MqttRoot mqtt_root_body =
      INCOMING EQUALS TEXT.n mqtt_root_body.mrb          {: mrb.setIncomingPrefix(ensureTrailingSlash(n)); return mrb; :}
   |  OUTGOING EQUALS TEXT.n mqtt_root_body.mrb          {: mrb.setOutgoingPrefix(ensureTrailingSlash(n)); return mrb; :}
-  |  HOST EQUALS TEXT.n mqtt_root_body.mrb              {: mrb.updateHost(n,0,null,null); return mrb; :}
-  |  USER EQUALS TEXT.n mqtt_root_body.mrb              {: mrb.updateHost(null,0,n,null); return mrb; :}
-  |  PASSWORD EQUALS TEXT.n mqtt_root_body.mrb          {: mrb.updateHost(null,0,null,n); return mrb; :}
+  |  HOST EQUALS TEXT.n mqtt_root_body.mrb              {: mrb.getHost().setHostName(n); return mrb; :}
+  |  USER EQUALS TEXT.n mqtt_root_body.mrb              {: mrb.getHost().setUserName(n); return mrb; :}
+  |  PASSWORD EQUALS TEXT.n mqtt_root_body.mrb          {: mrb.getHost().setPassword(n); return mrb; :}
   |                                                     {: return new MqttRoot(); :}
   ;
 
@@ -345,10 +345,10 @@ InfluxRoot influx_root =
 
 // Influx: user="" password="" dbName="" host="" ;
 InfluxRoot influx_root_body =
-     USER EQUALS TEXT.n influx_root_body.irb         {: irb.updateHost(null,n,null); return irb; :}
-  |  PASSWORD EQUALS TEXT.n influx_root_body.irb     {: irb.updateHost(null,null,n); return irb; :}
+     USER EQUALS TEXT.n influx_root_body.irb         {: irb.getHost().setUserName(n); return irb; :}
+  |  PASSWORD EQUALS TEXT.n influx_root_body.irb     {: irb.getHost().setPassword(n); return irb; :}
   |  DB_NAME EQUALS TEXT.n influx_root_body.irb      {: irb.setDbName(n); return irb; :}
-  |  HOST EQUALS TEXT.n influx_root_body.irb         {: irb.updateHost(n,null,null); return irb; :}
+  |  HOST EQUALS TEXT.n influx_root_body.irb         {: irb.getHost().setHostName(n);; return irb; :}
   |                                                  {: return InfluxRoot.createDefault(); :}
   ;
 
diff --git a/eraser-base/src/main/jastadd/main.relast b/eraser-base/src/main/jastadd/main.relast
index 6573bd4d688f173dd7020147f7db6e0a6cfd4ef3..76476f13ba5ae17824cc2f1a5d1e26a9622f1bfc 100644
--- a/eraser-base/src/main/jastadd/main.relast
+++ b/eraser-base/src/main/jastadd/main.relast
@@ -9,4 +9,4 @@ rel Root.CurrentUser? -> User ;
 ExternalHost ::= <HostName:String> <Port:int> <UserName:String> <Password:String>;
 
 // ----------------    InfluxDB    ------------------------------
-InfluxRoot ::= <DbName:String> [Host:ExternalHost] ;
+InfluxRoot ::= <DbName:String> /Host:ExternalHost/ ;
diff --git a/eraser-base/src/main/jastadd/mqtt.jrag b/eraser-base/src/main/jastadd/mqtt.jrag
index 2741a0550c033d4abb4760c267aafc2426a04604..95dd53770199b461679960acd542f5ed0486681a 100644
--- a/eraser-base/src/main/jastadd/mqtt.jrag
+++ b/eraser-base/src/main/jastadd/mqtt.jrag
@@ -33,6 +33,7 @@ aspect MQTT {
     }
   }
 
+
   //--- getIncomingTopic ---
   syn String MqttTopic.getIncomingTopic() = getMqttRoot().getIncomingPrefix() + getTopicString();
 
@@ -43,7 +44,7 @@ aspect MQTT {
   cache MqttRoot.getMqttSender();
   syn MQTTSender MqttRoot.getMqttSender() {
     MQTTSender result;
-    if (hasHost()) {
+    if (getHost().exists()) {
       result = new MQTTSenderImpl();
     } else {
       result = new MQTTSenderStub();
@@ -80,6 +81,8 @@ aspect MQTT {
     item.setTopic(getRoot().getMqttRoot().getOrCreateMqttTopic(item.getTopic().getTopicString()));
   }
 
+  
+
   public MqttTopic MqttRoot.getOrCreateMqttTopic(String topicString) {
     return resolveTopicSuffix(topicString).orElseGet(() -> {
       MqttTopic result = new MqttTopic();
@@ -89,4 +92,6 @@ aspect MQTT {
     });
   }
 
+syn ExternalHost MqttRoot.getHost() = new ExternalHost();
+
 }
diff --git a/eraser-base/src/main/jastadd/mqtt.relast b/eraser-base/src/main/jastadd/mqtt.relast
index cf477ff72e303415e47f42c939afe26cdfc4ed54..9251c2483448050e25a7bdff4153119b47f212d1 100644
--- a/eraser-base/src/main/jastadd/mqtt.relast
+++ b/eraser-base/src/main/jastadd/mqtt.relast
@@ -1,4 +1,4 @@
 // ----------------    MQTT    ------------------------------
-MqttRoot ::= Topic:MqttTopic* <IncomingPrefix:String> <OutgoingPrefix:String> [Host:ExternalHost] ;
+MqttRoot ::= Topic:MqttTopic* <IncomingPrefix:String> <OutgoingPrefix:String> /Host:ExternalHost/ ;
 MqttTopic ::= <TopicString:String> ;
 rel Item.Topic? <-> MqttTopic.Item* ;
diff --git a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/InfluxTest.java b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/InfluxTest.java
index 53079a7a5728796442f79a52549d584742cbd3cc..a90b4b61ae80dec1e640b4e42170ea877a265301 100644
--- a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/InfluxTest.java
+++ b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/InfluxTest.java
@@ -162,7 +162,6 @@ public class InfluxTest {
     InfluxRoot influxRoot;
     if (useStub) {
       influxRoot = InfluxRoot.createDefault();
-      influxRoot.setHostOpt(new Opt<>());
       // now a SenderStub is being used
       ((InfluxAdapterStub) influxRoot.influxAdapter()).setCallback(
           point -> points.add((DoubleStatePoint) point));
@@ -170,7 +169,7 @@ public class InfluxTest {
       influxRoot = InfluxRoot.createDefault();
       // use container running influx
       influxRoot.setDbName(InfluxTest.class.getSimpleName());
-      influxRoot.setHost(new ExternalHost().setHostName(getInfluxHost()));
+      influxRoot.getHost().setHostName(getInfluxHost());
     }
     mai.model.getRoot().setInfluxRoot(influxRoot);
     assumeTrue(influxRoot.influxAdapter().isConnected());
diff --git a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/MqttTests.java b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/MqttTests.java
index 04ffc791882a6218d6293de112f5dd4c4beb7616..7bfe873c38cfa72d907ab98d0eb28f2ba4edc195 100644
--- a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/MqttTests.java
+++ b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/MqttTests.java
@@ -175,11 +175,11 @@ public class MqttTests {
     mqttRoot.setIncomingPrefix("inc");
     mqttRoot.setOutgoingPrefix(outgoingPrefix);
     if (useStub) {
-      mqttRoot.setHostOpt(new Opt<>());
+      
       // now a SenderStub is being used
       ((MQTTSenderStub) mqttRoot.getMqttSender()).setCallback(((topic, message, qos) -> messages.add(message)));
     } else {
-      mqttRoot.setHost(ExternalHost.of(getMqttHost(), 1883));
+      mqttRoot.getHost().setHostName(getMqttHost()).setPort(1883);
     }
     MqttTopic a = createAndAddMqttTopic(mqttRoot, firstPart);
     MqttTopic ab = createAndAddMqttTopic(mqttRoot, firstPart + "/" + secondPart);
diff --git a/integration/src/main/java/de/tudresden/inf/st/eraser/integration/IntegrationMain.java b/integration/src/main/java/de/tudresden/inf/st/eraser/integration/IntegrationMain.java
index eda55f454f27382f3c97d105eafa9a14f9861e9d..3d16a465d8bb2e67e47b4a7ae3fea0f3122791db 100644
--- a/integration/src/main/java/de/tudresden/inf/st/eraser/integration/IntegrationMain.java
+++ b/integration/src/main/java/de/tudresden/inf/st/eraser/integration/IntegrationMain.java
@@ -47,7 +47,7 @@ public class IntegrationMain {
       InputStream inputStream = IntegrationMain.class.getResourceAsStream(filename);
       String host = "localhost";
       MqttRoot mqttRoot = new MqttRoot();
-      mqttRoot.setHost(new ExternalHost().setHostName(host));
+      mqttRoot.getHost().setHostName(host);
       // columns: time,topic,qos,message
       try (InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            CSVReader reader = new CSVReaderBuilder(inputStreamReader)
@@ -90,7 +90,7 @@ public class IntegrationMain {
 //      Root model = importFromLocalFile();
       logger.debug("Got model: {}", model.getSmartHomeEntityModel().description());
       MqttRoot mqttRoot = new MqttRoot();
-      mqttRoot.updateHost("localhost",-1,null,null);
+      mqttRoot.getHost().setHostName("localhost");
       mqttRoot.setIncomingPrefix("oh2/out/");
       MqttTopic irisStateTopic = new MqttTopic();
       irisStateTopic.setTopicString("iris1_item/state");