diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f9ac712bd1c2fb00225cd84aa1f5a5eda9fb0ded..94c0923a37b8674c2ca6cefaef579b9223be225e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -92,12 +92,15 @@ spotbugs:
   script:
     - DOCKER_TAG_NAME=$(echo $CI_COMMIT_REF_SLUG- | sed 's/^master-$//')
     - docker build --pull -t $IMAGE_NAME ./$JAVA_PROJECT_NAME
-    - docker tag $IMAGE_NAME $DOCKERHUB_ORG/$IMAGE_NAME:${DOCKER_TAG_NAME}latest
-    - docker tag $IMAGE_NAME $DOCKERHUB_ORG/$IMAGE_NAME:$DOCKER_TAG_NAME$CI_COMMIT_SHORT_SHA
+    - "[ ! $CI_COMMIT_TAG ] && docker tag $IMAGE_NAME $DOCKERHUB_ORG/$IMAGE_NAME:${DOCKER_TAG_NAME}latest"
+    - "[ ! $CI_COMMIT_TAG ] && docker tag $IMAGE_NAME $DOCKERHUB_ORG/$IMAGE_NAME:$DOCKER_TAG_NAME$CI_COMMIT_SHORT_SHA"
+    - "[ $CI_COMMIT_TAG ] && docker tag $IMAGE_NAME $DOCKERHUB_ORG/$IMAGE_NAME:CI_COMMIT_TAG"
     - echo $DOCKERHUB_PW | docker login -u $DOCKERHUB_ID --password-stdin
     - docker push $DOCKERHUB_ORG/$IMAGE_NAME
     - docker logout
   rules:
+    - if: "$DOCKERHUB_ORG && $DOCKERHUB_ID && $DOCKERHUB_PW && $IMAGE_NAME && $JAVA_PROJECT_NAME && $CI_COMMIT_TAG"
+      when: always
     - changes:
       # - $JAVA_PROJECT_NAME/**/* # hope this can be simplified soon, see #51
       - application-kafkastreams-commons/**/*
@@ -113,6 +116,8 @@ deploy-uc1-kstreams-app:
     IMAGE_NAME: "theodolite-uc1-kstreams-app"
     JAVA_PROJECT_NAME: "uc1-application"
   rules: # hope this can be simplified soon, see #51
+    - if: "$DOCKERHUB_ORG && $DOCKERHUB_ID && $DOCKERHUB_PW && $IMAGE_NAME && $JAVA_PROJECT_NAME && $CI_COMMIT_TAG"
+      when: always
     - changes:
       - uc1-application/**/*
       - application-kafkastreams-commons/**/*
@@ -128,6 +133,8 @@ deploy-uc2-kstreams-app:
     IMAGE_NAME: "theodolite-uc2-kstreams-app"
     JAVA_PROJECT_NAME: "uc2-application"
   rules: # hope this can be simplified soon, see #51
+    - if: "$DOCKERHUB_ORG && $DOCKERHUB_ID && $DOCKERHUB_PW && $IMAGE_NAME && $JAVA_PROJECT_NAME && $CI_COMMIT_TAG"
+      when: always
     - changes:
       - uc2-application/**/*
       - application-kafkastreams-commons/**/*
@@ -143,6 +150,8 @@ deploy-uc3-kstreams-app:
     IMAGE_NAME: "theodolite-uc3-kstreams-app"
     JAVA_PROJECT_NAME: "uc3-application"
   rules: # hope this can be simplified soon, see #51
+    - if: "$DOCKERHUB_ORG && $DOCKERHUB_ID && $DOCKERHUB_PW && $IMAGE_NAME && $JAVA_PROJECT_NAME && $CI_COMMIT_TAG"
+      when: always
     - changes:
       - uc3-application/**/*
       - application-kafkastreams-commons/**/*
@@ -158,6 +167,8 @@ deploy-uc4-kstreams-app:
     IMAGE_NAME: "theodolite-uc4-kstreams-app"
     JAVA_PROJECT_NAME: "uc4-application"
   rules: # hope this can be simplified soon, see #51
+    - if: "$DOCKERHUB_ORG && $DOCKERHUB_ID && $DOCKERHUB_PW && $IMAGE_NAME && $JAVA_PROJECT_NAME && $CI_COMMIT_TAG"
+      when: always
     - changes:
       - uc4-application/**/*
       - application-kafkastreams-commons/**/*
@@ -173,6 +184,8 @@ deploy-uc1-workload-generator:
     IMAGE_NAME: "theodolite-uc1-workload-generator"
     JAVA_PROJECT_NAME: "uc1-workload-generator"
   rules: # hope this can be simplified soon, see #51
+    - if: "$DOCKERHUB_ORG && $DOCKERHUB_ID && $DOCKERHUB_PW && $IMAGE_NAME && $JAVA_PROJECT_NAME && $CI_COMMIT_TAG"
+      when: always
     - changes:
       - uc1-workload-generator/**/*
       - application-kafkastreams-commons/**/*
@@ -188,6 +201,8 @@ deploy-uc2-workload-generator:
     IMAGE_NAME: "theodolite-uc2-workload-generator"
     JAVA_PROJECT_NAME: "uc2-workload-generator"
   rules: # hope this can be simplified soon, see #51
+    - if: "$DOCKERHUB_ORG && $DOCKERHUB_ID && $DOCKERHUB_PW && $IMAGE_NAME && $JAVA_PROJECT_NAME && $CI_COMMIT_TAG"
+      when: always
     - changes:
       - uc2-workload-generator/**/*
       - application-kafkastreams-commons/**/*
@@ -203,6 +218,8 @@ deploy-uc3-workload-generator:
     IMAGE_NAME: "theodolite-uc3-workload-generator"
     JAVA_PROJECT_NAME: "uc3-workload-generator"
   rules: # hope this can be simplified soon, see #51
+    - if: "$DOCKERHUB_ORG && $DOCKERHUB_ID && $DOCKERHUB_PW && $IMAGE_NAME && $JAVA_PROJECT_NAME && $CI_COMMIT_TAG"
+      when: always
     - changes:
       - uc3-workload-generator/**/*
       - application-kafkastreams-commons/**/*
@@ -218,6 +235,8 @@ deploy-uc4-workload-generator:
     IMAGE_NAME: "theodolite-uc4-workload-generator"
     JAVA_PROJECT_NAME: "uc4-workload-generator"
   rules: # hope this can be simplified soon, see #51
+    - if: "$DOCKERHUB_ORG && $DOCKERHUB_ID && $DOCKERHUB_PW && $IMAGE_NAME && $JAVA_PROJECT_NAME && $CI_COMMIT_TAG"
+      when: always
     - changes:
       - uc4-workload-generator/**/*
       - application-kafkastreams-commons/**/*
diff --git a/execution/uc1-application/aggregation-deployment.yaml b/execution/uc1-application/aggregation-deployment.yaml
index 519004df32e7853d47b00d44a63652a93363b14c..bcb0a955de0d5ce64fe6bdcba1e537468c833e5b 100644
--- a/execution/uc1-application/aggregation-deployment.yaml
+++ b/execution/uc1-application/aggregation-deployment.yaml
@@ -15,7 +15,7 @@ spec:
       terminationGracePeriodSeconds: 0
       containers:
       - name: uc1-application
-        image: "soerenhenning/uc1-app:latest"
+        image: "theodolite/theodolite-uc1-kstreams-app:latest"
         ports:
         - containerPort: 5555
           name: jmx
diff --git a/execution/uc1-workload-generator/deployment.yaml b/execution/uc1-workload-generator/deployment.yaml
index 0a8b947bd3e901c379dd2ff18f8825c5cedae2eb..ab377d2f5769462d24ff7cd889d330464821c967 100644
--- a/execution/uc1-workload-generator/deployment.yaml
+++ b/execution/uc1-workload-generator/deployment.yaml
@@ -16,7 +16,7 @@ spec:
       terminationGracePeriodSeconds: 0
       containers:
       - name: workload-generator
-        image: soerenhenning/uc1-wg:latest
+        image: theodolite/theodolite-uc1-workload-generator:latest 
         env:
         - name: ZK_HOST
           value: "my-confluent-cp-zookeeper"
diff --git a/execution/uc2-application/aggregation-deployment.yaml b/execution/uc2-application/aggregation-deployment.yaml
index 4804cc7604537b47ea5084b15665c96cf6284ccb..199966a31d0ccac1f5bb8e3b1c0e17e1cae1f8c9 100644
--- a/execution/uc2-application/aggregation-deployment.yaml
+++ b/execution/uc2-application/aggregation-deployment.yaml
@@ -15,7 +15,7 @@ spec:
       terminationGracePeriodSeconds: 0
       containers:
       - name: uc2-application
-        image: "benediktwetzel/uc2-app:latest"
+        image: "theodolite/theodolite-uc2-kstreams-app:latest"
         ports:
         - containerPort: 5555
           name: jmx
diff --git a/execution/uc2-workload-generator/deployment.yaml b/execution/uc2-workload-generator/deployment.yaml
index 8c3b86e0d9497652885a580ce066c13078388c7a..05ac3607c64014547be119f8005c652c5ff9ca8d 100644
--- a/execution/uc2-workload-generator/deployment.yaml
+++ b/execution/uc2-workload-generator/deployment.yaml
@@ -15,7 +15,7 @@ spec:
       terminationGracePeriodSeconds: 0
       containers:
       - name: workload-generator
-        image: benediktwetzel/uc2-wg:latest
+        image: theodolite/theodolite-uc2-workload-generator:latest 
         env:
         - name: ZK_HOST
           value: "my-confluent-cp-zookeeper"
diff --git a/execution/uc3-application/aggregation-deployment.yaml b/execution/uc3-application/aggregation-deployment.yaml
index f6f789381d98362c5287dea85e03a6b4f9856bb6..a535b5b6443e89564d4bb0cbe17593c60dc289dc 100644
--- a/execution/uc3-application/aggregation-deployment.yaml
+++ b/execution/uc3-application/aggregation-deployment.yaml
@@ -15,7 +15,7 @@ spec:
       terminationGracePeriodSeconds: 0
       containers:
       - name: uc3-application
-        image: "soerenhenning/uc3-app:latest"
+        image: "theodolite/theodolite-uc3-kstreams-app:latest"
         ports:
         - containerPort: 5555
           name: jmx
diff --git a/execution/uc3-workload-generator/deployment.yaml b/execution/uc3-workload-generator/deployment.yaml
index 615a437886be7b0153bc6cb950ac3daa3ddce3fa..76eccb4d1d05ec33fc214e000b105b344ae76a80 100644
--- a/execution/uc3-workload-generator/deployment.yaml
+++ b/execution/uc3-workload-generator/deployment.yaml
@@ -16,7 +16,7 @@ spec:
       terminationGracePeriodSeconds: 0
       containers:
       - name: workload-generator
-        image: soerenhenning/uc3-wg:latest
+        image: theodolite/theodolite-uc3-workload-generator:latest 
         env:
         - name: ZK_HOST
           value: "my-confluent-cp-zookeeper"
diff --git a/execution/uc4-application/aggregation-deployment.yaml b/execution/uc4-application/aggregation-deployment.yaml
index 390c17230d0b092534e9c600772e3af04611fb02..5f71737046e12b7f0116d59c4b55f0c0de39bbd2 100644
--- a/execution/uc4-application/aggregation-deployment.yaml
+++ b/execution/uc4-application/aggregation-deployment.yaml
@@ -15,7 +15,7 @@ spec:
       terminationGracePeriodSeconds: 0
       containers:
       - name: uc4-application
-        image: "soerenhenning/uc4-app:latest"
+        image: "theodolite/theodolite-uc4-kstreams-app:latest"
         ports:
         - containerPort: 5555
           name: jmx
diff --git a/execution/uc4-workload-generator/deployment.yaml b/execution/uc4-workload-generator/deployment.yaml
index c6a84f56f3733cb4e8c1e0aa46255c391b290dd0..e3e223fd32a12ae0bd04a1068a0f58af39469de1 100644
--- a/execution/uc4-workload-generator/deployment.yaml
+++ b/execution/uc4-workload-generator/deployment.yaml
@@ -15,7 +15,7 @@ spec:
       terminationGracePeriodSeconds: 0
       containers:
       - name: workload-generator
-        image: soerenhenning/uc4-wg:latest
+        image: theodolite/theodolite-uc4-workload-generator:latest 
         env:
         - name: ZK_HOST
           value: "my-confluent-cp-zookeeper"
diff --git a/uc2-application/src/main/java/theodolite/uc2/streamprocessing/JointRecordParents.java b/uc2-application/src/main/java/theodolite/uc2/streamprocessing/JointRecordParents.java
index fc8c077b0414dc2b4079639bb34c5d966e4de0d3..cba05f1ed8e585d5c31aaa92207e0d2854436736 100644
--- a/uc2-application/src/main/java/theodolite/uc2/streamprocessing/JointRecordParents.java
+++ b/uc2-application/src/main/java/theodolite/uc2/streamprocessing/JointRecordParents.java
@@ -1,5 +1,6 @@
 package theodolite.uc2.streamprocessing;
 
+import java.util.Objects;
 import java.util.Set;
 import titan.ccp.model.records.ActivePowerRecord;
 
@@ -26,6 +27,27 @@ public class JointRecordParents {
     return this.record;
   }
 
+  @Override
+  public String toString() {
+    return "{" + this.parents + ", " + this.record + "}";
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(this.parents, this.record);
+  }
 
+  @Override
+  public boolean equals(final Object obj) {
+    if (obj == this) {
+      return true;
+    }
+    if (obj instanceof JointRecordParents) {
+      final JointRecordParents other = (JointRecordParents) obj;
+      return Objects.equals(this.parents, other.parents)
+          && Objects.equals(this.record, other.record);
+    }
+    return false;
+  }
 
 }
diff --git a/uc2-application/src/main/java/theodolite/uc2/streamprocessing/SensorParentKey.java b/uc2-application/src/main/java/theodolite/uc2/streamprocessing/SensorParentKey.java
index d65c93034a0fc9a801cf5be0c2f7f50e38d9178e..a4fb5b33966882b94d46c96282bdaaed92d67ebd 100644
--- a/uc2-application/src/main/java/theodolite/uc2/streamprocessing/SensorParentKey.java
+++ b/uc2-application/src/main/java/theodolite/uc2/streamprocessing/SensorParentKey.java
@@ -1,5 +1,7 @@
 package theodolite.uc2.streamprocessing;
 
+import java.util.Objects;
+
 /**
  * A key consisting of the identifier of a sensor and an identifier of parent sensor.
  */
@@ -27,4 +29,22 @@ public class SensorParentKey {
     return "{" + this.sensorIdentifier + ", " + this.parentIdentifier + "}";
   }
 
+  @Override
+  public int hashCode() {
+    return Objects.hash(this.sensorIdentifier, this.parentIdentifier);
+  }
+
+  @Override
+  public boolean equals(final Object obj) {
+    if (obj == this) {
+      return true;
+    }
+    if (obj instanceof SensorParentKey) {
+      final SensorParentKey other = (SensorParentKey) obj;
+      return Objects.equals(this.sensorIdentifier, other.sensorIdentifier)
+          && Objects.equals(this.parentIdentifier, other.parentIdentifier);
+    }
+    return false;
+  }
+
 }