diff --git a/.gitignore b/.gitignore
index 7bb96ee5219bb6cb62d854d63ba142e84e7b423d..25afa1e8010584cbbae9191e70e3a8f583cfc8ac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,4 +5,4 @@ venv/
 */out/
 */build/
 logs/
-datasets
+datasets/
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..0b9ebffff43e580646bacbaa5971d138201bc33f
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 OpenLicht
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index 3ab02d7e0b68f64729a7cf6973befaa8bfe7fd87..be3f3b866e5a966523c8fa8f54b086a1ae181049 100644
--- a/README.md
+++ b/README.md
@@ -1,28 +1,29 @@
-[![pipeline status](/../badges/dev/pipeline.svg)](/../pipelines)
-[![pipeline status](/../badges/dev/coverage.svg)](/../pipelines)
-
 # ERASER - OpenLicht Knowledge Base
 
 ## Overview
 
-There are a few subprojects in this repository:
+There are the following subprojects in this repository:
 
 - Base
-	- **eraser-base**: The core part of the framework containing the [grammar](/../blob/dev/eraser-base/src/main/jastadd/main.relast), various attributes, the [parser](/../blob/dev/eraser-base/src/main/jastadd/eraser.parser) for model specification files, and Java classes for the [openHAB communication](/../tree/dev/eraser-base/src/main/java/de/tudresden/inf/st/eraser/openhab2) via [MQTT](/../blob/dev/eraser-base/src/main/java/de/tudresden/inf/st/eraser/openhab2/mqtt/MQTTUpdater.java)
+	- **eraser-base**: The core part of the framework containing the [grammar](/../../blob/master/eraser-base/src/main/jastadd/main.relast), various attributes, the [parser](/../../blob/master/eraser-base/src/main/jastadd/eraser.parser) for model specification files, and Java classes for the [openHAB communication](/../../tree/master/eraser-base/src/main/java/de/tudresden/inf/st/eraser/openhab2) via [MQTT](/../../blob/master/eraser-base/src/main/java/de/tudresden/inf/st/eraser/openhab2/mqtt/MQTTUpdater.java)
 - Utility
 	- **commons.color**: Utilities for converting color spaces (XYZ, RGB, HSB)
+	- **eraser.rest** and **eraser.spark**: REST-API to communicate with the framework
+	- **eraser.starter**: The main entry point to start the application
+	- **feedbackloop.\***: Component specification and implementation of the MAPE-K feedback loop
 	- **project-template**: Template to quickly create new subprojects used by `make-new-project.py`
 - Demos
 	- **integration** and **openhab-mock**: Playground projects testing some features
 	- **skywriter-hue-integration**: The first real demonstrator integrating the [Skywriter gesture recogintion](http://docs.pimoroni.com/skywriter) with a [Hue](http://www.meethue.com/) using a simple rule
-- Machine Learning Integration
-	- **org.openhab.action.machinelearn**: openHAB connector of the Machine Learning Part (implemented by Kay)
-	- **org.openlicht.action.reinforcementlearning**: Reinforcement-Learning of preferences (implemented by Kay)
-	- **stub.org.openhab.core.scriptengine.action**: Stub to make the other two projects build
+	- **benchmark**: Small benchmark to replay previously recoreded sensor events
+- Machine Learning Integration (deprecated)
+	- org.openhab.action.machinelearn: openHAB connector of the Machine Learning Part
+	- org.openlicht.action.reinforcementlearning: Reinforcement-Learning of preferences
+	- stub.org.openhab.core.scriptengine.action: Stub to make the other two projects build
 
 ## Setup and Building
 
-This project uses Gradle as the build tool. For detailed information, see [setup guidelines](/../wikis/setup)
+This project uses Gradle as the build tool. For detailed information, see [setup guidelines](/../../wikis/setup)
 
 ## Running the demo
 
diff --git a/eraser-base/src/main/jastadd/eraser.parser b/eraser-base/src/main/jastadd/eraser.parser
index 0cc98445f2d2ad28c4288ed20435c5e1dea6acc4..5c275fa8c16d8a694608581b08640ae8a9db5451 100644
--- a/eraser-base/src/main/jastadd/eraser.parser
+++ b/eraser-base/src/main/jastadd/eraser.parser
@@ -227,6 +227,8 @@ MqttRoot mqtt_root_body =
      INCOMING EQUALS TEXT.n mqtt_root_body.mrb          {: mrb.setIncomingPrefix(n); return mrb; :}
   |  OUTGOING EQUALS TEXT.n mqtt_root_body.mrb          {: mrb.setOutgoingPrefix(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; :}
   |                                                     {: return new MqttRoot(); :}
   ;
 
diff --git a/eraser-base/src/main/jastadd/mqtt.jrag b/eraser-base/src/main/jastadd/mqtt.jrag
index 2d3f6fceefc39d47b1fae782aa4d2f2fbba94b88..93e11442e9f277455b8b2a62e32375fd091c94e8 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());
+    return result.setHost(getHost(), getUser(), getPassword());
   }
 
   //--- getMqttRoot ---
diff --git a/eraser-base/src/main/jastadd/mqtt.relast b/eraser-base/src/main/jastadd/mqtt.relast
index cf477ff72e303415e47f42c939afe26cdfc4ed54..845149403b3576e7503f59eef2a4e59ca1411485 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> <User:String> <Password: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 0f26efbec7f853e183ae4999468ee47e9542d542..5a8d3bd9788728ee9b746347bb8da5da66e5c67b 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
@@ -12,10 +12,21 @@ import java.util.concurrent.TimeUnit;
 public interface MQTTSender extends AutoCloseable {
 
   /**
-   * Sets the host running the MQTT broker.
+   * Sets the host running the MQTT broker (no username/password set).
    * @param host host name (IP address or domain name) and port
    */
-  MQTTSender setHost(ExternalHost host);
+  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);
+
 
   /**
    * Set the timeout used for connecting and disconnecting.
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 496d2a1c317d067b64f1823ff57b637ea307719c..a181424f24826736fe4b3730ae4bc6390a24be7f 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,17 @@ public class MQTTSenderImpl implements MQTTSender {
   private TimeUnit publishTimeoutUnit;
 
   @Override
-  public MQTTSender setHost(ExternalHost host) {
+  public MQTTSender setHost(ExternalHost host, String username, String password) {
     /* The host running the MQTT broker. */
     URI hostUri = URI.create("tcp://" + host.getHostName() + ":" + host.getPort());
     logger.debug("Host is {}", hostUri);
     MQTT mqtt = new MQTT();
+    if (username != null && !username.isEmpty()) {
+      mqtt.setUserName(username);
+    }
+    if (password != null && !password.isEmpty()) {
+      mqtt.setPassword(password);
+    }
     mqtt.setHost(hostUri);
     connection = mqtt.futureConnection();
     setConnectTimeout(2, TimeUnit.SECONDS);
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 2673e60679a5749405c6e8b3fcaccdda4763750b..745bfcc3c97d485da1b9f3ac3df3bb2a800e47ff 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,7 +20,7 @@ public class MQTTSenderStub implements MQTTSender {
   private Logger logger = LogManager.getLogger(MQTTSenderStub.class);
   private PublishCallback callback;
 
-  public MQTTSender setHost(ExternalHost host) {
+  public MQTTSender setHost(ExternalHost host, String username, String password) {
     return this;
   }