diff --git a/eraser-base/src/main/jastadd/ItemHistory.jrag b/eraser-base/src/main/jastadd/ItemHistory.jrag
index 02f226f8d2a7c59ed7ad5d2d383609096af9d049..60d38ad92abbfa758397b0a6880c704ab2968de6 100644
--- a/eraser-base/src/main/jastadd/ItemHistory.jrag
+++ b/eraser-base/src/main/jastadd/ItemHistory.jrag
@@ -7,9 +7,14 @@ aspect ItemHistory {
 
   public static final InfluxRoot InfluxRoot.createDefault() {
     InfluxRoot result = new InfluxRoot();
-    result.setUser(DEFAULT_USER);
-    result.setPassword(DEFAULT_PASSWORD);
+
+    ExternalHost eh = new ExternalHost();
+    eh.setUserName(DEFAULT_USER);
+    eh.setPassword(DEFAULT_PASSWORD);
+    result.setHost(eh);
+
     result.setDbName(DEFAULT_DB_NAME);
+
     return result;
   }
 
diff --git a/eraser-base/src/main/jastadd/Printing.jrag b/eraser-base/src/main/jastadd/Printing.jrag
index ba63b98b78dfeaaa99a4df1fbcdc117ac05ec7ff..a1f43ee2e435fa99bb008075023234baf5d2b6f3 100644
--- a/eraser-base/src/main/jastadd/Printing.jrag
+++ b/eraser-base/src/main/jastadd/Printing.jrag
@@ -182,30 +182,31 @@ aspect Printing {
   }
 
   // ExternalHost: "hostName:port"
-  syn String ExternalHost.prettyPrint(int defaultPort) {
-    if (getPort() == defaultPort) {
-      // default port, do not add
+  syn String ExternalHost.prettyPrint() {
+    if (getHostName().contains(":")) {
       return getHostName();
-    } // otherwise specify port
-    return getHostName() + ":" + getPort();
+    }
+    return getHostName() + (getPort()>0 ? ":" + getPort() : "");
   }
 
   // Mqtt: incoming="" outgoing="" host="";
   eq MqttRoot.prettyPrint() {
+    ExternalHost host = getHost();
     return new MemberPrinter("Mqtt")
         .addNonDefault("incoming", getIncomingPrefix())
         .addNonDefault("outgoing", getOutgoingPrefix())
-        .addOptional("host", hasHost(), () -> getHost().prettyPrint(DEFAULT_PORT))
+        .addOptional("host", hasHost() && !host.getHostName().isEmpty(), () -> host.prettyPrint())
         .build();
   }
 
   // Influx: user="" password="" dbName="" host="" ;
   eq InfluxRoot.prettyPrint() {
+    ExternalHost host = getHost();
     return new MemberPrinter("Influx")
-        .addNonDefault("user", getUser(), DEFAULT_USER)
-        .addNonDefault("password", getPassword(), DEFAULT_PASSWORD)
+        .addNonDefault("user", host.getUserName(), DEFAULT_USER)
+        .addNonDefault("password", host.getPassword(), DEFAULT_PASSWORD)
         .addNonDefault("dbName", getDbName(), DEFAULT_DB_NAME)
-        .addOptional("host", hasHost(), () -> getHost().prettyPrint(DEFAULT_PORT))
+        .addOptional("host", hasHost() && !host.getHostName().isEmpty(), () -> host.prettyPrint())
         .build();
   }
 
diff --git a/eraser-base/src/main/jastadd/Util.jrag b/eraser-base/src/main/jastadd/Util.jrag
index 201582e3b9facf3029ffe799a4f69c66c3671174..4973711b3538887294d15b91b9b09c3cd5247a8b 100644
--- a/eraser-base/src/main/jastadd/Util.jrag
+++ b/eraser-base/src/main/jastadd/Util.jrag
@@ -4,16 +4,47 @@ aspect Util {
 //  public static ExternalHost ExternalHost.createByName(String hostName) {
 //    return new ExternalHost(hostName, 1883);
 //  }
-  public void MqttRoot.setHostByName(String hostName) {
-    setHost(ExternalHost.of(hostName, DEFAULT_PORT));
+  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.setHostByName(String hostName) {
-    setHost(ExternalHost.of(hostName, DEFAULT_PORT));
+
+  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);
+  }
+
+
+  public static ExternalHost ExternalHost.of(String hostName, int defaultPort, String username, String password) {
     String host = hostName;
     int port = defaultPort;
     if (hostName.contains(":")) {
@@ -21,10 +52,18 @@ aspect Util {
       host = parts[0];
       port = Integer.parseInt(parts[1]);
     }
-    return new ExternalHost(host, port);
+    ExternalHost eh = new ExternalHost();
+    eh.setHostName(host);
+    eh.setPort(port);
+    if (username!=null)
+      eh.setUserName(username);
+    if (password!=null)
+      eh.setPassword(password);
+
+    return eh;
   }
 
-  syn String ExternalHost.urlAsString() = String.format("http://%s:%s", getHostName(), getPort());
+  syn String ExternalHost.urlAsString() = String.format("http://%s", getHostName()).concat(getPort()>0 ? ""+getPort() : "");
 
   public static Root Root.createEmptyRoot() {
     Root model = new Root();
diff --git a/eraser-base/src/main/jastadd/eraser.parser b/eraser-base/src/main/jastadd/eraser.parser
index 019e0c309eba8f991dc5749da407be5261a7a7ea..573db220b47f183800a8a0b434900fd58d0a2735 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.setHostByName(n); return mrb; :}
-  |  USER EQUALS TEXT.n mqtt_root_body.mrb              {: mrb.setUser(n); return mrb; :}
-  |  PASSWORD EQUALS TEXT.n mqtt_root_body.mrb          {: mrb.setPassword(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; :}
   |                                                     {: 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.setUser(n); return irb; :}
-  |  PASSWORD EQUALS TEXT.n influx_root_body.irb     {: irb.setPassword(n); return irb; :}
+     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; :}
   |  DB_NAME EQUALS TEXT.n influx_root_body.irb      {: irb.setDbName(n); return irb; :}
-  |  HOST EQUALS TEXT.n influx_root_body.irb         {: irb.setHostByName(n); return irb; :}
+  |  HOST EQUALS TEXT.n influx_root_body.irb         {: irb.updateHost(n,null,null); return irb; :}
   |                                                  {: return InfluxRoot.createDefault(); :}
   ;
 
diff --git a/eraser-base/src/main/jastadd/main.relast b/eraser-base/src/main/jastadd/main.relast
index e12d23dc7185d244d079e3aa5d712a4290c8a2f4..6573bd4d688f173dd7020147f7db6e0a6cfd4ef3 100644
--- a/eraser-base/src/main/jastadd/main.relast
+++ b/eraser-base/src/main/jastadd/main.relast
@@ -6,7 +6,7 @@ User : LabelledModelElement ;
 rel Root.CurrentUser? -> User ;
 
 // ----------------    Util    ------------------------------
-ExternalHost ::= <HostName:String> <Port:int> ;
+ExternalHost ::= <HostName:String> <Port:int> <UserName:String> <Password:String>;
 
 // ----------------    InfluxDB    ------------------------------
-InfluxRoot ::= <User:String> <Password:String> <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 a33f024b510ce0b3fb642a3a2fcae98cf43eb29b..2741a0550c033d4abb4760c267aafc2426a04604 100644
--- a/eraser-base/src/main/jastadd/mqtt.jrag
+++ b/eraser-base/src/main/jastadd/mqtt.jrag
@@ -48,7 +48,7 @@ aspect MQTT {
     } else {
       result = new MQTTSenderStub();
     }
-    return result.setHost(getHost(), getUser(), getPassword());
+    return result.setHost(getHost());
   }
 
   //--- getMqttRoot ---
diff --git a/eraser-base/src/main/jastadd/mqtt.relast b/eraser-base/src/main/jastadd/mqtt.relast
index 845149403b3576e7503f59eef2a4e59ca1411485..cf477ff72e303415e47f42c939afe26cdfc4ed54 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> <User:String> <Password: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/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSender.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSender.java
index 5a8d3bd9788728ee9b746347bb8da5da66e5c67b..34d06fe31302b49a46bf920541ab9d849b70d07f 100644
--- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSender.java
+++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSender.java
@@ -15,17 +15,7 @@ public interface MQTTSender extends AutoCloseable {
    * Sets the host running the MQTT broker (no username/password set).
    * @param host host name (IP address or domain name) and port
    */
-  default MQTTSender setHost(ExternalHost host) {
-    return setHost(host, null, null);
-  }
-
-  /**
-   * Sets the host, username and password running the MQTT broker.
-   * @param host     host name (IP address or domain name) and port
-   * @param username username for authentication
-   * @param password password for authentication
-   */
-  MQTTSender setHost(ExternalHost host, String username, String password);
+  MQTTSender setHost(ExternalHost host);
 
 
   /**
diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderImpl.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderImpl.java
index a181424f24826736fe4b3730ae4bc6390a24be7f..9fecbe6913f798a530c29b45be7af793df56e3b1 100644
--- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderImpl.java
+++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderImpl.java
@@ -29,11 +29,13 @@ public class MQTTSenderImpl implements MQTTSender {
   private TimeUnit publishTimeoutUnit;
 
   @Override
-  public MQTTSender setHost(ExternalHost host, String username, String password) {
+  public MQTTSender setHost(ExternalHost host) {
     /* The host running the MQTT broker. */
     URI hostUri = URI.create("tcp://" + host.getHostName() + ":" + host.getPort());
     logger.debug("Host is {}", hostUri);
     MQTT mqtt = new MQTT();
+    String username = host.getUserName();
+    String password = host.getPassword();
     if (username != null && !username.isEmpty()) {
       mqtt.setUserName(username);
     }
diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderStub.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderStub.java
index 745bfcc3c97d485da1b9f3ac3df3bb2a800e47ff..2694b85f8232bb6cb83e20eef9bcd349fa63d63b 100644
--- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderStub.java
+++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderStub.java
@@ -20,10 +20,12 @@ public class MQTTSenderStub implements MQTTSender {
   private Logger logger = LogManager.getLogger(MQTTSenderStub.class);
   private PublishCallback callback;
 
-  public MQTTSender setHost(ExternalHost host, String username, String password) {
+  @Override
+  public MQTTSender setHost(ExternalHost host) {
     return this;
   }
 
+
   public void setCallback(PublishCallback callback) {
     this.callback = callback;
   }
diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/openhab2/mqtt/MQTTUpdater.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/openhab2/mqtt/MQTTUpdater.java
index 79d19c6d146d8800062da40016f06199aeaf4b51..0952d3c333a06256c3a0fb97181854e43f6a077f 100644
--- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/openhab2/mqtt/MQTTUpdater.java
+++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/openhab2/mqtt/MQTTUpdater.java
@@ -39,9 +39,7 @@ public class MQTTUpdater implements AutoCloseable {
    */
   public void setRoot(Root root) {
     ExternalHost host = root.getMqttRoot().getHost();
-    delegatee.setHost(host.getHostName(), host.getPort());
-    delegatee.setUsername(root.getMqttRoot().getUser());
-    delegatee.setPassword(root.getMqttRoot().getPassword());
+    delegatee.setHost(host);
     delegatee.setOnMessage((topicString, message)->
         root.getMqttRoot().resolveTopic(topicString).ifPresent(topic ->
             topic.getItems().forEach(
diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/MqttReceiver.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/MqttReceiver.java
index 4c448c27b2751190048a15e527c4a15b4da6ee6a..161cbaf16025d56ad5a4f9189ecde65203108051 100644
--- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/MqttReceiver.java
+++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/MqttReceiver.java
@@ -1,5 +1,6 @@
 package de.tudresden.inf.st.eraser.util;
 
+import de.tudresden.inf.st.eraser.jastadd.model.ExternalHost;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.fusesource.hawtbuf.Buffer;
@@ -51,18 +52,11 @@ public class MqttReceiver implements AutoCloseable {
   /**
    * Sets the host to receive messages from
    */
-  public void setHost(String host, int port) {
-    this.host = URI.create("tcp://" + host + ":" + port);
-    logger.debug("Host is {}", this.host);
+  public void setHost(ExternalHost externalHost) {
+    this.host = URI.create("tcp://" + externalHost.getHostName() + ":" + externalHost.getPort());
+    logger.debug("Host is {}", externalHost.getHostName());
   }
 
-  public void setUsername(String username) {
-    this.username = username;
-  }
-
-  public void setPassword(String password) {
-    this.password = password;
-  }
 
   public void setOnMessage(BiConsumer<String, String> callback) {
     this.onMessageCallback = callback;
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 a5647fe4ee23ee8825a17ec5d59de80fb94dd9c7..53079a7a5728796442f79a52549d584742cbd3cc 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
@@ -170,7 +170,7 @@ public class InfluxTest {
       influxRoot = InfluxRoot.createDefault();
       // use container running influx
       influxRoot.setDbName(InfluxTest.class.getSimpleName());
-      influxRoot.setHostByName(getInfluxHost());
+      influxRoot.setHost(new ExternalHost().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 9b6a4ab492036278416ef1d2e2ff8d435a68d39e..04ffc791882a6218d6293de112f5dd4c4beb7616 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
@@ -158,7 +158,7 @@ public class MqttTests {
     }
     MqttReceiver receiver = new MqttReceiver();
     List<String> expectedTopicList = Arrays.asList(expectedTopics);
-    receiver.setHost(getMqttHost(), 1883);
+    receiver.setHost(ExternalHost.of(getMqttHost(),1883));
     receiver.setTopicsForSubscription(expectedTopics);
     receiver.setOnMessage((topic, message) -> {
       assertThat(expectedTopicList).contains(topic);
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 af8462acfc90e56d0b596b2bde2322478510aa5c..eda55f454f27382f3c97d105eafa9a14f9861e9d 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.setHostByName(host);
+      mqttRoot.setHost(new ExternalHost().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.setHostByName("localhost");
+      mqttRoot.updateHost("localhost",-1,null,null);
       mqttRoot.setIncomingPrefix("oh2/out/");
       MqttTopic irisStateTopic = new MqttTopic();
       irisStateTopic.setTopicString("iris1_item/state");