From f5476716fa6aa1c2ce82a4cd116b8e80f2d30896 Mon Sep 17 00:00:00 2001
From: Felix Kehrer <felix.kehrer@gmail.com>
Date: Wed, 30 May 2018 21:38:48 +0200
Subject: fixed "actual" and "expected" values being mixed up

---
 .../java/at/ac/tuwien/sepm/assignment/groupphase/util/JdbcTestCase.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/JdbcTestCase.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/JdbcTestCase.java
index c509a1f..fb9c6f7 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/JdbcTestCase.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/JdbcTestCase.java
@@ -130,7 +130,7 @@ public abstract class JdbcTestCase {
         IDataSet expected = new FlatXmlDataSetBuilder().build(res);
 
         for (String table : tables) {
-            assertEquals(actual.getTable(table), expected.getTable(table));
+            assertEquals(expected.getTable(table), actual.getTable(table));
         }
     }
 
-- 
cgit v1.2.3-70-g09d2


From 1611596f6b644ae54a5f1aa6172ebe28397ebc34 Mon Sep 17 00:00:00 2001
From: Felix Kehrer <felix.kehrer@gmail.com>
Date: Sat, 2 Jun 2018 23:20:07 +0200
Subject: added handling for "timestamp with time zone" #27844

---
 .../sepm/assignment/groupphase/util/JdbcTestCase.java   | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/JdbcTestCase.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/JdbcTestCase.java
index fb9c6f7..e419ab0 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/JdbcTestCase.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/JdbcTestCase.java
@@ -19,7 +19,7 @@ import org.dbunit.dataset.IDataSet;
 import org.dbunit.dataset.datatype.DataType;
 import org.dbunit.dataset.datatype.DataTypeException;
 import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
-import org.dbunit.ext.postgresql.PostgresqlDataTypeFactory;
+import org.dbunit.ext.h2.H2DataTypeFactory;
 import org.dbunit.operation.DatabaseOperation;
 import org.junit.After;
 import org.junit.Before;
@@ -96,13 +96,14 @@ public abstract class JdbcTestCase {
 
     // override DBUnit's enum handling
     private void setUpDatabaseConfig(DatabaseConfig config) {
-        PostgresqlDataTypeFactory factory =
-                new PostgresqlDataTypeFactory() {
-                    @Override
-                    public boolean isEnumType(String sqlTypeName) {
-                        if (sqlTypeName.equalsIgnoreCase("enum")) return true;
+        H2DataTypeFactory factory =
+                new H2DataTypeFactory() {
+                    boolean isEnumType(String sqlTypeName) {
+                        return sqlTypeName.equalsIgnoreCase("enum");
+                    }
 
-                        return super.isEnumType(sqlTypeName);
+                    boolean isTimestampWithTimeZoneType(String sqlTypeName) {
+                        return sqlTypeName.equalsIgnoreCase("timestamp with time zone");
                     }
 
                     @Override
@@ -110,6 +111,8 @@ public abstract class JdbcTestCase {
                             throws DataTypeException {
                         if (isEnumType(sqlTypeName)) {
                             sqlType = Types.VARCHAR;
+                        } else if (isTimestampWithTimeZoneType(sqlTypeName)) {
+                            sqlType = Types.VARCHAR;
                         }
 
                         return super.createDataType(sqlType, sqlTypeName);
-- 
cgit v1.2.3-70-g09d2


From 2e854482e3e894e3f5925ca37a95e56202cef1fa Mon Sep 17 00:00:00 2001
From: Felix Kehrer <felix.kehrer@gmail.com>
Date: Wed, 30 May 2018 21:49:11 +0200
Subject: added logging before throwing ServiceException #27033

---
 .../groupphase/einsatzverwaltung/dao/OperationDAOTest.java          | 6 +++---
 src/test/resources/operationDAOUpdateNormal.xml                     | 2 +-
 src/test/resources/operationDAOUpdateRemoveVehicles.xml             | 2 +-
 src/test/resources/operationDAOUpdateSetup.xml                      | 2 +-
 4 files changed, 6 insertions(+), 6 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
index f173376..d34cf80 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
@@ -56,9 +56,9 @@ public class OperationDAOTest extends JdbcTestCase {
                         .severity(Severity.B)
                         .status(Status.ACTIVE)
                         .vehicles(Set.of(v1, v2, v3))
-                        .created(Instant.now())
-                        .destination("New description")
-                        .additionalInfo("Test")
+                        .created(Instant.ofEpochSecond(1514764800)) // 2018-01-01 00:00:00.0
+                        .destination("New destination")
+                        .additionalInfo("New information")
                         .build();
     }
 
diff --git a/src/test/resources/operationDAOUpdateNormal.xml b/src/test/resources/operationDAOUpdateNormal.xml
index 025cdc2..6fa87e6 100644
--- a/src/test/resources/operationDAOUpdateNormal.xml
+++ b/src/test/resources/operationDAOUpdateNormal.xml
@@ -1,6 +1,6 @@
 <dataset>
   <Operation id="1" opCode="RD-2B0M" severity="B" created="2000-01-01"
-    destination="New description" status="ACTIVE" additionalInfo="Test"/>
+    destination="New destination" additionalInfo="New information" status="ACTIVE"/>
 
   <VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
   <VehicleVersion id="2" name="KTW-1" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
diff --git a/src/test/resources/operationDAOUpdateRemoveVehicles.xml b/src/test/resources/operationDAOUpdateRemoveVehicles.xml
index 6f171b4..97de699 100644
--- a/src/test/resources/operationDAOUpdateRemoveVehicles.xml
+++ b/src/test/resources/operationDAOUpdateRemoveVehicles.xml
@@ -1,6 +1,6 @@
 <dataset>
   <Operation id="1" opCode="RD-2B0M" severity="B" created="2000-01-01"
-    destination="New description" status="ACTIVE" additionalInfo="Test"/>
+    destination="New destination" status="ACTIVE" additionalInfo="New information"/>
 
   <VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
   <VehicleVersion id="2" name="KTW-1" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
diff --git a/src/test/resources/operationDAOUpdateSetup.xml b/src/test/resources/operationDAOUpdateSetup.xml
index 23d1a25..4d91e4a 100644
--- a/src/test/resources/operationDAOUpdateSetup.xml
+++ b/src/test/resources/operationDAOUpdateSetup.xml
@@ -1,6 +1,6 @@
 <dataset>
   <Operation id="1" opCode="ALP-95E7" severity="E" created="2000-01-01"
-    destination="Wiedner Hauptstraße 35, Wien" status="ACTIVE"/>
+    destination="Wiedner Hauptstraße 35, Wien" additionalInfo="Additional information" status="ACTIVE"/>
 
   <VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
   <VehicleVersion id="2" name="KTW-1" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
-- 
cgit v1.2.3-70-g09d2


From ed4281ad525eea6bb6ae5e4d468b26f42f2cdaf5 Mon Sep 17 00:00:00 2001
From: Felix Kehrer <felix.kehrer@gmail.com>
Date: Wed, 30 May 2018 21:50:16 +0200
Subject: implement working test case for .add() #27303

---
 .../einsatzverwaltung/dao/OperationDAOTest.java     |  7 +++++--
 src/test/resources/operationDAOAddOperation.xml     | 21 +++++++++++++++++++++
 2 files changed, 26 insertions(+), 2 deletions(-)
 create mode 100644 src/test/resources/operationDAOAddOperation.xml

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
index d34cf80..bebb5d9 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
@@ -1,5 +1,7 @@
 package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
 
+import static org.junit.Assert.assertEquals;
+
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Severity;
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
@@ -100,10 +102,11 @@ public class OperationDAOTest extends JdbcTestCase {
 
     @Test
     public void testAddOperation() throws Exception {
-        operationDAO.add(o);
+        long id = operationDAO.add(o);
 
+        assertEquals(2, id);
         // TODO: won't work because id won't match
-        // compareWith("operationDAOUpdateNormal.xml", COMPARE_TABLES);
+        compareWith("operationDAOAddOperation.xml", COMPARE_TABLES);
     }
 
     @Test(expected = PersistenceException.class)
diff --git a/src/test/resources/operationDAOAddOperation.xml b/src/test/resources/operationDAOAddOperation.xml
new file mode 100644
index 0000000..d08bb78
--- /dev/null
+++ b/src/test/resources/operationDAOAddOperation.xml
@@ -0,0 +1,21 @@
+<dataset>
+  <Operation id="1" opCode="ALP-95E7" severity="E" created="2000-01-01"
+    destination="Wiedner Hauptstraße 35, Wien" additionalInfo="Additional information" status="ACTIVE"/>
+  <Operation id="2" opCode="RD-2B0M" severity="B" created="2018-01-01 00:00:00.0"
+    destination="New destination" additionalInfo="New information" status="ACTIVE"/>
+
+  <VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
+  <VehicleVersion id="2" name="KTW-1" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
+  <VehicleVersion id="3" name="KTW-2" constructionType="MITTELHOCHDACH" type="KTW_B" hasNef="false"/>
+  <VehicleVersion id="4" name="BKTW-2" constructionType="HOCHDACH" type="BKTW" hasNef="false"/>
+  <VehicleVersion id="5" name="NEF-1" constructionType="NORMAL" type="NEF" hasNef="true"/>
+
+  <Vehicle id="1" version="1" status="FREI_FUNK"/>
+  <Vehicle id="2" version="2" status="FREI_WACHE"/>
+  <Vehicle id="3" version="3" status="FREI_FUNK"/>
+  <Vehicle id="4" version="4" status="FREI_WACHE"/>
+
+  <VehicleOperation vehicleId="1" operationId="2"/>
+  <VehicleOperation vehicleId="2" operationId="2"/>
+  <VehicleOperation vehicleId="3" operationId="2"/>
+</dataset>
-- 
cgit v1.2.3-70-g09d2


From 82edecf036265c936bea6b2554761cc975e90837 Mon Sep 17 00:00:00 2001
From: Felix Kehrer <felix.kehrer@gmail.com>
Date: Sat, 2 Jun 2018 23:14:05 +0200
Subject: adapt tests to changed behaviour due to bugfix (#27844) #27303

---
 .../assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java | 1 +
 src/test/resources/operationDAOAddOperation.xml                       | 4 ++--
 src/test/resources/operationDAOUpdateNormal.xml                       | 2 +-
 src/test/resources/operationDAOUpdateRemoveVehicles.xml               | 2 +-
 src/test/resources/operationDAOUpdateSetup.xml                        | 2 +-
 5 files changed, 6 insertions(+), 5 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
index bebb5d9..d40c825 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
@@ -102,6 +102,7 @@ public class OperationDAOTest extends JdbcTestCase {
 
     @Test
     public void testAddOperation() throws Exception {
+        // ASSUMES YOUR TIME ZONE IS +01 !!!
         long id = operationDAO.add(o);
 
         assertEquals(2, id);
diff --git a/src/test/resources/operationDAOAddOperation.xml b/src/test/resources/operationDAOAddOperation.xml
index d08bb78..73fa735 100644
--- a/src/test/resources/operationDAOAddOperation.xml
+++ b/src/test/resources/operationDAOAddOperation.xml
@@ -1,7 +1,7 @@
 <dataset>
-  <Operation id="1" opCode="ALP-95E7" severity="E" created="2000-01-01"
+  <Operation id="1" opCode="ALP-95E7" severity="E" created="2000-01-01 00:00:00.0+00"
     destination="Wiedner Hauptstraße 35, Wien" additionalInfo="Additional information" status="ACTIVE"/>
-  <Operation id="2" opCode="RD-2B0M" severity="B" created="2018-01-01 00:00:00.0"
+  <Operation id="2" opCode="RD-2B0M" severity="B" created="2018-01-01 01:00:00.0+01"
     destination="New destination" additionalInfo="New information" status="ACTIVE"/>
 
   <VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
diff --git a/src/test/resources/operationDAOUpdateNormal.xml b/src/test/resources/operationDAOUpdateNormal.xml
index 6fa87e6..795f44e 100644
--- a/src/test/resources/operationDAOUpdateNormal.xml
+++ b/src/test/resources/operationDAOUpdateNormal.xml
@@ -1,5 +1,5 @@
 <dataset>
-  <Operation id="1" opCode="RD-2B0M" severity="B" created="2000-01-01"
+  <Operation id="1" opCode="RD-2B0M" severity="B" created="2000-01-01 00:00:00.0+00"
     destination="New destination" additionalInfo="New information" status="ACTIVE"/>
 
   <VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
diff --git a/src/test/resources/operationDAOUpdateRemoveVehicles.xml b/src/test/resources/operationDAOUpdateRemoveVehicles.xml
index 97de699..462bfc1 100644
--- a/src/test/resources/operationDAOUpdateRemoveVehicles.xml
+++ b/src/test/resources/operationDAOUpdateRemoveVehicles.xml
@@ -1,5 +1,5 @@
 <dataset>
-  <Operation id="1" opCode="RD-2B0M" severity="B" created="2000-01-01"
+  <Operation id="1" opCode="RD-2B0M" severity="B" created="2000-01-01 00:00:00.0+00"
     destination="New destination" status="ACTIVE" additionalInfo="New information"/>
 
   <VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
diff --git a/src/test/resources/operationDAOUpdateSetup.xml b/src/test/resources/operationDAOUpdateSetup.xml
index 4d91e4a..999a12e 100644
--- a/src/test/resources/operationDAOUpdateSetup.xml
+++ b/src/test/resources/operationDAOUpdateSetup.xml
@@ -1,5 +1,5 @@
 <dataset>
-  <Operation id="1" opCode="ALP-95E7" severity="E" created="2000-01-01"
+  <Operation id="1" opCode="ALP-95E7" severity="E" created="2000-01-01 00:00:00.0+00"
     destination="Wiedner Hauptstraße 35, Wien" additionalInfo="Additional information" status="ACTIVE"/>
 
   <VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
-- 
cgit v1.2.3-70-g09d2


From 51a6f4810ac3f996e8f5222dad66660efd4a808e Mon Sep 17 00:00:00 2001
From: Felix Kehrer <felix.kehrer@gmail.com>
Date: Sun, 3 Jun 2018 20:50:29 +0200
Subject: change tests to always run in UTC #27844

---
 .../groupphase/einsatzverwaltung/dao/OperationDAOTest.java         | 7 +++++++
 src/test/resources/operationDAOAddOperation.xml                    | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
index d40c825..9ca125a 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
@@ -16,8 +16,10 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.Set;
+import java.util.TimeZone;
 import org.dbunit.dataset.DataSetException;
 import org.dbunit.dataset.IDataSet;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 public class OperationDAOTest extends JdbcTestCase {
@@ -64,6 +66,11 @@ public class OperationDAOTest extends JdbcTestCase {
                         .build();
     }
 
+    @BeforeClass
+    public static void before() {
+        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+    }
+
     @Override
     protected IDataSet getDataSet() throws DataSetException {
         return getDataSet("operationDAOUpdateSetup.xml");
diff --git a/src/test/resources/operationDAOAddOperation.xml b/src/test/resources/operationDAOAddOperation.xml
index 73fa735..35a24af 100644
--- a/src/test/resources/operationDAOAddOperation.xml
+++ b/src/test/resources/operationDAOAddOperation.xml
@@ -1,7 +1,7 @@
 <dataset>
   <Operation id="1" opCode="ALP-95E7" severity="E" created="2000-01-01 00:00:00.0+00"
     destination="Wiedner Hauptstraße 35, Wien" additionalInfo="Additional information" status="ACTIVE"/>
-  <Operation id="2" opCode="RD-2B0M" severity="B" created="2018-01-01 01:00:00.0+01"
+  <Operation id="2" opCode="RD-2B0M" severity="B" created="2018-01-01 00:00:00.0+00"
     destination="New destination" additionalInfo="New information" status="ACTIVE"/>
 
   <VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
-- 
cgit v1.2.3-70-g09d2


From 8f234aca42fd885e324c8d18f41d0da6186b11f6 Mon Sep 17 00:00:00 2001
From: Felix Kehrer <felix.kehrer@gmail.com>
Date: Mon, 4 Jun 2018 22:27:28 +0200
Subject: removed obsolete comments #27844

---
 .../assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java  | 3 ---
 1 file changed, 3 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
index 9ca125a..d59b299 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
@@ -109,11 +109,8 @@ public class OperationDAOTest extends JdbcTestCase {
 
     @Test
     public void testAddOperation() throws Exception {
-        // ASSUMES YOUR TIME ZONE IS +01 !!!
         long id = operationDAO.add(o);
-
         assertEquals(2, id);
-        // TODO: won't work because id won't match
         compareWith("operationDAOAddOperation.xml", COMPARE_TABLES);
     }
 
-- 
cgit v1.2.3-70-g09d2


From 6dbab1351c559661e60dc3d710fee01fb1620437 Mon Sep 17 00:00:00 2001
From: Felix Kehrer <felix.kehrer@gmail.com>
Date: Mon, 4 Jun 2018 22:29:01 +0200
Subject: implemented working testListOperations() #27844

---
 .../einsatzverwaltung/dao/OperationDAOTest.java    | 26 ++++++++++++++++++++--
 src/test/resources/operationDAOAddOperation.xml    |  3 ++-
 src/test/resources/operationDAOUpdateNormal.xml    |  2 +-
 .../resources/operationDAOUpdateRemoveVehicles.xml |  2 +-
 src/test/resources/operationDAOUpdateSetup.xml     |  4 ++--
 5 files changed, 30 insertions(+), 7 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
index d59b299..ede2613 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
@@ -15,6 +15,7 @@ import java.time.Instant;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.EnumSet;
+import java.util.LinkedList;
 import java.util.Set;
 import java.util.TimeZone;
 import org.dbunit.dataset.DataSetException;
@@ -103,8 +104,29 @@ public class OperationDAOTest extends JdbcTestCase {
     public void testListOperations() throws Exception {
         Set<Operation> operationSet = operationDAO.list(EnumSet.allOf(Status.class));
 
-        // TODO: operations.list() currently doesn't set the vehicles set
-        // assertEquals(Set.of(o), operationSet);
+        Vehicle vehicle =
+                Vehicle.builder()
+                        .id(4)
+                        .name("BKTW-2")
+                        .constructionType(ConstructionType.HOCHDACH)
+                        .type(VehicleType.BKTW)
+                        .hasNef(false)
+                        .status(Vehicle.Status.ZUM_BERUFUNGSORT)
+                        .registrations(new LinkedList<>())
+                        .build();
+        Operation operation =
+                Operation.builder()
+                        .id(1)
+                        .opCode("ALP-95E7")
+                        .severity(Severity.E)
+                        .created(Instant.parse("2000-01-01T00:00:00.0Z"))
+                        .destination("Wiedner Hauptstraße 35, Wien")
+                        .additionalInfo("Additional information")
+                        .status(Status.ACTIVE)
+                        .vehicles(Set.of(vehicle))
+                        .build();
+
+        assertEquals(Set.of(operation), operationSet);
     }
 
     @Test
diff --git a/src/test/resources/operationDAOAddOperation.xml b/src/test/resources/operationDAOAddOperation.xml
index 35a24af..fad04ce 100644
--- a/src/test/resources/operationDAOAddOperation.xml
+++ b/src/test/resources/operationDAOAddOperation.xml
@@ -13,9 +13,10 @@
   <Vehicle id="1" version="1" status="FREI_FUNK"/>
   <Vehicle id="2" version="2" status="FREI_WACHE"/>
   <Vehicle id="3" version="3" status="FREI_FUNK"/>
-  <Vehicle id="4" version="4" status="FREI_WACHE"/>
+  <Vehicle id="4" version="4" status="ZUM_BERUFUNGSORT"/>
 
   <VehicleOperation vehicleId="1" operationId="2"/>
   <VehicleOperation vehicleId="2" operationId="2"/>
   <VehicleOperation vehicleId="3" operationId="2"/>
+  <VehicleOperation vehicleId="4" operationId="1"/>
 </dataset>
diff --git a/src/test/resources/operationDAOUpdateNormal.xml b/src/test/resources/operationDAOUpdateNormal.xml
index 795f44e..a02f495 100644
--- a/src/test/resources/operationDAOUpdateNormal.xml
+++ b/src/test/resources/operationDAOUpdateNormal.xml
@@ -11,7 +11,7 @@
   <Vehicle id="1" version="1" status="FREI_FUNK"/>
   <Vehicle id="2" version="2" status="FREI_WACHE"/>
   <Vehicle id="3" version="3" status="FREI_FUNK"/>
-  <Vehicle id="4" version="4" status="FREI_WACHE"/>
+  <Vehicle id="4" version="4" status="ZUM_BERUFUNGSORT"/>
 
   <VehicleOperation vehicleId="1" operationId="1"/>
   <VehicleOperation vehicleId="2" operationId="1"/>
diff --git a/src/test/resources/operationDAOUpdateRemoveVehicles.xml b/src/test/resources/operationDAOUpdateRemoveVehicles.xml
index 462bfc1..1fcce62 100644
--- a/src/test/resources/operationDAOUpdateRemoveVehicles.xml
+++ b/src/test/resources/operationDAOUpdateRemoveVehicles.xml
@@ -11,7 +11,7 @@
   <Vehicle id="1" version="1" status="FREI_FUNK"/>
   <Vehicle id="2" version="2" status="FREI_WACHE"/>
   <Vehicle id="3" version="3" status="FREI_FUNK"/>
-  <Vehicle id="4" version="4" status="FREI_WACHE"/>
+  <Vehicle id="4" version="4" status="ZUM_BERUFUNGSORT"/>
 
   <VehicleOperation />
 </dataset>
diff --git a/src/test/resources/operationDAOUpdateSetup.xml b/src/test/resources/operationDAOUpdateSetup.xml
index 999a12e..82ef238 100644
--- a/src/test/resources/operationDAOUpdateSetup.xml
+++ b/src/test/resources/operationDAOUpdateSetup.xml
@@ -11,7 +11,7 @@
   <Vehicle id="1" version="1" status="FREI_FUNK"/>
   <Vehicle id="2" version="2" status="FREI_WACHE"/>
   <Vehicle id="3" version="3" status="FREI_FUNK"/>
-  <Vehicle id="4" version="4" status="FREI_WACHE"/>
+  <Vehicle id="4" version="4" status="ZUM_BERUFUNGSORT"/>
 
-  <VehicleOperation />
+  <VehicleOperation vehicleId="4" operationId="1"/>
 </dataset>
-- 
cgit v1.2.3-70-g09d2


From 875de2750b4fa6065eb41aeb6323e8a29ec416ad Mon Sep 17 00:00:00 2001
From: Dominic Rogetzer <e1627756@student.tuwien.ac.at>
Date: Tue, 5 Jun 2018 11:42:01 +0200
Subject: Refactor Spring-Configuration for GUI-Tests [#27302]

Merge EmployeeServiceTestConfiguration and VehicleServiceTestConfiguration into GuiTestConfiguration
---
 .../controller/GuiTestConfiguration.java           | 43 ++++++++++++++++++++++
 .../service/EmployeeServiceTestConfiguration.java  | 17 ---------
 .../service/VehicleServiceTestConfiguration.java   | 17 ---------
 3 files changed, 43 insertions(+), 34 deletions(-)
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestConfiguration.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceTestConfiguration.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceTestConfiguration.java

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestConfiguration.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestConfiguration.java
new file mode 100644
index 0000000..c4e4517
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestConfiguration.java
@@ -0,0 +1,43 @@
+package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
+
+import static org.mockito.Mockito.mock;
+
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeService;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeServiceImpl;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationService;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationServiceImpl;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.RegistrationService;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.RegistrationServiceImpl;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleServiceImpl;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+@Configuration
+public class GuiTestConfiguration {
+
+    @Bean
+    @Primary
+    public EmployeeService employeeService() {
+        return mock(EmployeeServiceImpl.class);
+    }
+
+    @Bean
+    @Primary
+    public VehicleService vehicleService() {
+        return mock(VehicleServiceImpl.class);
+    }
+
+    @Bean
+    @Primary
+    public OperationService operationService() {
+        return mock(OperationServiceImpl.class);
+    }
+
+    @Bean
+    @Primary
+    public RegistrationService registrationService() {
+        return mock(RegistrationServiceImpl.class);
+    }
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceTestConfiguration.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceTestConfiguration.java
deleted file mode 100644
index 6bf2275..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceTestConfiguration.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import static org.mockito.Mockito.mock;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-
-@Configuration
-public class EmployeeServiceTestConfiguration {
-
-    @Bean
-    @Primary
-    public EmployeeService employeeService() {
-        return mock(EmployeeServiceImpl.class);
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceTestConfiguration.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceTestConfiguration.java
deleted file mode 100644
index 895973a..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceTestConfiguration.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import static org.mockito.Mockito.mock;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-
-@Configuration
-public class VehicleServiceTestConfiguration {
-
-    @Bean
-    @Primary
-    public VehicleService vehicleService() {
-        return mock(VehicleServiceImpl.class);
-    }
-}
-- 
cgit v1.2.3-70-g09d2


From 31f3d6dd0efdbff5960dc4193bb08566bcb79d1a Mon Sep 17 00:00:00 2001
From: Dominic Rogetzer <e1627756@student.tuwien.ac.at>
Date: Tue, 5 Jun 2018 12:15:09 +0200
Subject: Remove duplicate code by creating a general GuiTestApplication
 [#27302]

Extract code from CreateNewEmployeeApplication, CreateNewVehicleApplication and RegistrationWindowApplication into GuiTestApplication, which allows to specify a fxml file name in launch-arguments. Adjust ControllerTest-classes
---
 .../controller/CreateNewEmployeeApplication.java   | 53 ----------------
 .../CreateNewEmployeeControllerTest.java           |  5 +-
 .../controller/CreateNewVehicleApplication.java    | 51 ---------------
 .../controller/CreateNewVehicleControllerTest.java |  5 +-
 .../controller/GuiTestApplication.java             | 73 ++++++++++++++++++++++
 .../controller/RegistrationControllerTest.java     | 22 +++++++
 .../controller/RegistrationWindowApplication.java  | 53 ----------------
 7 files changed, 99 insertions(+), 163 deletions(-)
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeApplication.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleApplication.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestApplication.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationControllerTest.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowApplication.java

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeApplication.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeApplication.java
deleted file mode 100644
index e1b3714..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeApplication.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
-import java.lang.invoke.MethodHandles;
-import javafx.application.Application;
-import javafx.scene.Parent;
-import javafx.scene.Scene;
-import javafx.stage.Stage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.AnnotationConfigApplicationContext;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.stereotype.Component;
-
-@Component
-@ComponentScan("at.ac.tuwien.sepm.assignment.groupphase")
-public final class CreateNewEmployeeApplication extends Application {
-
-    private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
-    public static AnnotationConfigApplicationContext context;
-
-    @Override
-    public void start(Stage primaryStage) throws Exception {
-        // setup application
-        primaryStage.setTitle("Person anlegen");
-        primaryStage.setWidth(1366);
-        primaryStage.setHeight(768);
-        primaryStage.centerOnScreen();
-        primaryStage.setOnCloseRequest(event -> LOG.debug("Application shutdown initiated"));
-
-        context = new AnnotationConfigApplicationContext(CreateNewEmployeeApplication.class);
-        final var fxmlLoader = context.getBean(SpringFXMLLoader.class);
-        primaryStage.setScene(
-                new Scene(
-                        (Parent)
-                                fxmlLoader.load(
-                                        getClass()
-                                                .getResourceAsStream(
-                                                        "/fxml/createNewEmployee.fxml"))));
-
-        // show application
-        primaryStage.show();
-        primaryStage.toFront();
-        LOG.debug("Application startup complete");
-    }
-
-    @Override
-    public void stop() {
-        LOG.debug("Stopping application");
-        context.close();
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeControllerTest.java
index 7f95950..ea09fb7 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeControllerTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeControllerTest.java
@@ -24,10 +24,9 @@ public class CreateNewEmployeeControllerTest extends HighDpiAwareApplicationTest
 
     @Before
     public void setup() throws Exception {
-        // TODO: check if testfx can be run in headless mode on Jenkins
         FxToolkit.registerPrimaryStage();
-        FxToolkit.setupApplication(CreateNewEmployeeApplication.class);
-        employeeService = CreateNewEmployeeApplication.context.getBean(EmployeeService.class);
+        FxToolkit.setupApplication(GuiTestApplication.class, "createNewEmployee.fxml");
+        employeeService = GuiTestApplication.context.getBean(EmployeeService.class);
     }
 
     @After
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleApplication.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleApplication.java
deleted file mode 100644
index ff46938..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleApplication.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
-import java.lang.invoke.MethodHandles;
-import javafx.application.Application;
-import javafx.scene.Parent;
-import javafx.scene.Scene;
-import javafx.stage.Stage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.AnnotationConfigApplicationContext;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.stereotype.Component;
-
-@Component
-@ComponentScan("at.ac.tuwien.sepm.assignment.groupphase")
-public class CreateNewVehicleApplication extends Application {
-
-    private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
-    public static AnnotationConfigApplicationContext context;
-
-    @Override
-    public void start(Stage primaryStage) throws Exception {
-        // setup application
-        primaryStage.setTitle("Fahrzeug anlegen");
-        primaryStage.setWidth(1366);
-        primaryStage.setHeight(768);
-        primaryStage.centerOnScreen();
-        primaryStage.setOnCloseRequest(event -> LOG.debug("Application shutdown initiated"));
-
-        context = new AnnotationConfigApplicationContext(CreateNewVehicleApplication.class);
-        final var fxmlLoader = context.getBean(SpringFXMLLoader.class);
-        primaryStage.setScene(
-                new Scene(
-                        (Parent)
-                                fxmlLoader.load(
-                                        getClass().getResourceAsStream("/fxml/createCar.fxml"))));
-
-        // show application
-        primaryStage.show();
-        primaryStage.toFront();
-        LOG.debug("Application startup complete");
-    }
-
-    @Override
-    public void stop() {
-        LOG.debug("Stopping application");
-        context.close();
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java
index 08e3fde..a9fbcf0 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java
@@ -24,10 +24,9 @@ public class CreateNewVehicleControllerTest extends HighDpiAwareApplicationTest
 
     @Before
     public void setup() throws Exception {
-        // TODO: check if testfx can be run in headless mode on Jenkins
         FxToolkit.registerPrimaryStage();
-        FxToolkit.setupApplication(CreateNewVehicleApplication.class);
-        vehicleService = CreateNewVehicleApplication.context.getBean(VehicleService.class);
+        FxToolkit.setupApplication(GuiTestApplication.class, "createCar.fxml");
+        vehicleService = GuiTestApplication.context.getBean(VehicleService.class);
     }
 
     @After
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestApplication.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestApplication.java
new file mode 100644
index 0000000..6cb91c9
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestApplication.java
@@ -0,0 +1,73 @@
+package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
+
+import static org.mockito.Mockito.mock;
+
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeService;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeServiceImpl;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationService;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationServiceImpl;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.RegistrationService;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.RegistrationServiceImpl;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleServiceImpl;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
+import java.lang.invoke.MethodHandles;
+import javafx.application.Application;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.stage.Stage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Component;
+
+@Component
+@ComponentScan("at.ac.tuwien.sepm.assignment.groupphase")
+public class GuiTestApplication extends Application {
+
+    private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
+    public static AnnotationConfigApplicationContext context;
+
+    @Override
+    public void start(Stage primaryStage) throws Exception {
+        // setup application
+        primaryStage.setTitle("Test window");
+        primaryStage.setWidth(1366);
+        primaryStage.setHeight(768);
+        primaryStage.centerOnScreen();
+        primaryStage.setOnCloseRequest(event -> LOG.debug("Application shutdown initiated"));
+
+        if (getParameters().getRaw().size() < 1) {
+            throw new UnsupportedOperationException("FXML file not set");
+        }
+
+        context = new AnnotationConfigApplicationContext(GuiTestApplication.class);
+        final var fxmlLoader = context.getBean(SpringFXMLLoader.class);
+        primaryStage.setScene(
+                new Scene(
+                        (Parent)
+                                fxmlLoader.load(
+                                        getClass()
+                                                .getResourceAsStream(
+                                                        "/fxml/"
+                                                                + getParameters()
+                                                                        .getRaw()
+                                                                        .get(0)))));
+
+        // show application
+        primaryStage.show();
+        primaryStage.toFront();
+        LOG.debug("Application startup complete");
+    }
+
+    @Override
+    public void stop() {
+        LOG.debug("Stopping application");
+        context.close();
+    }
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationControllerTest.java
new file mode 100644
index 0000000..560032e
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationControllerTest.java
@@ -0,0 +1,22 @@
+package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
+
+import at.ac.tuwien.sepm.assignment.groupphase.util.HighDpiAwareApplicationTest;
+import org.junit.After;
+import org.junit.Before;
+import org.testfx.api.FxToolkit;
+
+public class RegistrationControllerTest extends HighDpiAwareApplicationTest {
+
+    @Before
+    public void setup() throws Exception {
+        FxToolkit.registerPrimaryStage();
+        FxToolkit.setupApplication(GuiTestApplication.class, "RegistrationWindow.fxml");
+    }
+
+    @After
+    public void cleanup() throws Exception {
+        FxToolkit.cleanupStages();
+    }
+
+    // TODO: implement GUI Tests
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowApplication.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowApplication.java
deleted file mode 100644
index 3293ae9..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowApplication.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
-import java.lang.invoke.MethodHandles;
-import javafx.application.Application;
-import javafx.scene.Parent;
-import javafx.scene.Scene;
-import javafx.stage.Stage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.AnnotationConfigApplicationContext;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.stereotype.Component;
-
-@Component
-@ComponentScan("at.ac.tuwien.sepm.assignment.groupphase")
-public class RegistrationWindowApplication extends Application {
-
-    private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
-    public static AnnotationConfigApplicationContext context;
-
-    @Override
-    public void start(Stage primaryStage) throws Exception {
-        // setup application
-        primaryStage.setTitle("Person anlegen");
-        // primaryStage.setWidth(1366);
-        // primaryStage.setHeight(768);
-        primaryStage.centerOnScreen();
-        primaryStage.setOnCloseRequest(event -> LOG.debug("Application shutdown initiated"));
-
-        context = new AnnotationConfigApplicationContext(RegistrationWindowApplication.class);
-        final var fxmlLoader = context.getBean(SpringFXMLLoader.class);
-        primaryStage.setScene(
-                new Scene(
-                        (Parent)
-                                fxmlLoader.load(
-                                        getClass()
-                                                .getResourceAsStream(
-                                                        "/fxml/RegistrationWindow.fxml"))));
-
-        // show application
-        primaryStage.show();
-        primaryStage.toFront();
-        LOG.debug("Application startup complete");
-    }
-
-    @Override
-    public void stop() {
-        LOG.debug("Stopping application");
-        context.close();
-    }
-}
-- 
cgit v1.2.3-70-g09d2


From e0aea4fb3240fb54f85e5fd5088a75e8cd515790 Mon Sep 17 00:00:00 2001
From: Dominic Rogetzer <e1627756@student.tuwien.ac.at>
Date: Tue, 5 Jun 2018 12:16:02 +0200
Subject: Move GuiTestConfiguration to inner class of GuiTestApplication
 [#27302]

---
 .../controller/GuiTestApplication.java             | 28 ++++++++++++++
 .../controller/GuiTestConfiguration.java           | 43 ----------------------
 2 files changed, 28 insertions(+), 43 deletions(-)
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestConfiguration.java

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestApplication.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestApplication.java
index 6cb91c9..cec2da0 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestApplication.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestApplication.java
@@ -33,6 +33,34 @@ public class GuiTestApplication extends Application {
 
     public static AnnotationConfigApplicationContext context;
 
+    @Configuration
+    public static class ContextConfiguration {
+
+        @Bean
+        @Primary
+        public EmployeeService employeeService() {
+            return mock(EmployeeServiceImpl.class);
+        }
+
+        @Bean
+        @Primary
+        public VehicleService vehicleService() {
+            return mock(VehicleServiceImpl.class);
+        }
+
+        @Bean
+        @Primary
+        public OperationService operationService() {
+            return mock(OperationServiceImpl.class);
+        }
+
+        @Bean
+        @Primary
+        public RegistrationService registrationService() {
+            return mock(RegistrationServiceImpl.class);
+        }
+    }
+
     @Override
     public void start(Stage primaryStage) throws Exception {
         // setup application
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestConfiguration.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestConfiguration.java
deleted file mode 100644
index c4e4517..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestConfiguration.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import static org.mockito.Mockito.mock;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeService;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeServiceImpl;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationService;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationServiceImpl;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.RegistrationService;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.RegistrationServiceImpl;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleServiceImpl;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-
-@Configuration
-public class GuiTestConfiguration {
-
-    @Bean
-    @Primary
-    public EmployeeService employeeService() {
-        return mock(EmployeeServiceImpl.class);
-    }
-
-    @Bean
-    @Primary
-    public VehicleService vehicleService() {
-        return mock(VehicleServiceImpl.class);
-    }
-
-    @Bean
-    @Primary
-    public OperationService operationService() {
-        return mock(OperationServiceImpl.class);
-    }
-
-    @Bean
-    @Primary
-    public RegistrationService registrationService() {
-        return mock(RegistrationServiceImpl.class);
-    }
-}
-- 
cgit v1.2.3-70-g09d2


From 0aa0eb12a6b96f5fe4cb8b21582799e233e9788c Mon Sep 17 00:00:00 2001
From: Dominic Rogetzer <e1627756@student.tuwien.ac.at>
Date: Mon, 11 Jun 2018 13:58:28 +0200
Subject: Make HighDpiAwareApplicationTest abstract [#25963]

---
 .../sepm/assignment/groupphase/util/HighDpiAwareApplicationTest.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/HighDpiAwareApplicationTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/HighDpiAwareApplicationTest.java
index c9816a1..2924b3f 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/HighDpiAwareApplicationTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/HighDpiAwareApplicationTest.java
@@ -7,7 +7,7 @@ import org.testfx.framework.junit.ApplicationTest;
 import org.testfx.service.locator.impl.BoundsLocatorImpl;
 import org.testfx.service.locator.impl.PointLocatorImpl;
 
-public class HighDpiAwareApplicationTest extends ApplicationTest {
+public abstract class HighDpiAwareApplicationTest extends ApplicationTest {
 
     public HighDpiAwareApplicationTest() {
         FxRobotContext context = robotContext();
-- 
cgit v1.2.3-70-g09d2


From 31abe77439c1424c1ea290d55df0a6c54a5d7724 Mon Sep 17 00:00:00 2001
From: Dominic Rogetzer <e1627756@student.tuwien.ac.at>
Date: Mon, 11 Jun 2018 15:03:15 +0200
Subject: Refactor RegistrationDAOTest to make use of DB-unit [#27302]

---
 .../einsatzverwaltung/dao/RegistrationDAOTest.java | 73 +++-------------------
 1 file changed, 8 insertions(+), 65 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAOTest.java
index e8ea809..289a0ae 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAOTest.java
@@ -6,77 +6,30 @@ import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel;
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
-import java.nio.charset.Charset;
-import java.sql.SQLException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.util.HashSet;
 import java.util.Set;
-import org.h2.tools.RunScript;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
+import org.dbunit.dataset.IDataSet;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
-public class RegistrationDAOTest {
-
-    // Base taken from EmployeeDAOTest
-
-    private static final String JDBC_DRIVER = org.h2.Driver.class.getName();
-    private static final String JDBC_URL = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1";
-    private static final String USER = "";
-    private static final String PASSWORD = "";
+public class RegistrationDAOTest extends JdbcTestCase {
 
     private RegistrationDAO registrationDAO;
 
     public RegistrationDAOTest() throws PersistenceException {
-        JDBCConnectionManager jdbcConnectionManager = new JDBCConnectionManager(JDBC_URL);
         this.registrationDAO =
                 new RegistrationDatabaseDAO(
-                        jdbcConnectionManager, new EmployeeDatabaseDAO(jdbcConnectionManager));
-        // TODO: Use Spring Dependency Injection here!
+                        getJdbcConnectionManager(),
+                        new EmployeeDatabaseDAO(getJdbcConnectionManager()));
     }
 
-    @BeforeClass
-    public static void setupDatabase() throws SQLException {
-        RunScript.execute(
-                JDBC_URL,
-                USER,
-                PASSWORD,
-                "classpath:sql/database.sql",
-                Charset.forName("UTF8"),
-                false);
-        RunScript.execute(
-                JDBC_URL,
-                USER,
-                PASSWORD,
-                "classpath:sql/H2RegistrationDAOTest_populate.sql",
-                Charset.forName("UTF8"),
-                false);
-    }
-    /*
-        @Before
-        public void setUp() throws SQLException {
-            RunScript.execute(
-                    JDBC_URL,
-                    USER,
-                    PASSWORD,
-                    "classpath:sql/H2RegistrationDAOTest_populate.sql",
-                    Charset.forName("UTF8"),
-                    false);
-        }
-    */
-    @AfterClass
-    public static void tearDown() throws SQLException {
-        RunScript.execute(
-                JDBC_URL,
-                USER,
-                PASSWORD,
-                "classpath:sql/H2RegistrationDAOTest_depopulate.sql",
-                Charset.forName("UTF8"),
-                false);
+    @Override
+    protected IDataSet getDataSet() throws Exception {
+        return getDataSet("registrationTestBaseData.xml");
     }
 
     @Rule public ExpectedException thrown = ExpectedException.none();
@@ -84,16 +37,6 @@ public class RegistrationDAOTest {
     @Test
     public void addRegistrationsShouldSucceed() throws PersistenceException {
         Set<Registration> registrations = new HashSet<>();
-        /*
-        Vehicle vehicle = Vehicle.builder()
-                .id(1)
-                .name("RTW-1")
-                .constructionType(ConstructionType.HOCHDACH)
-                .type(VehicleType.RTW)
-                .status(Status.ABGEMELDET)
-                .hasNef(true)
-                .build();
-        */
         Employee employee1 =
                 Employee.builder()
                         .id(1)
-- 
cgit v1.2.3-70-g09d2


From 2dcc2e6be5a4d4f04e23f7fc2c5250697b11a05f Mon Sep 17 00:00:00 2001
From: Dominic Rogetzer <e1627756@student.tuwien.ac.at>
Date: Mon, 11 Jun 2018 15:05:52 +0200
Subject: Extract two methods in RegistrationServiceTest for later use [#27302]

methods are addValidRegistrations and addOnlyOnePersonToRTW. Extracted in order to avoid duplicate code, as the same code is used in integration test later on
---
 .../service/RegistrationServiceTest.java                | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceTest.java
index 4d3a251..c6af300 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceTest.java
@@ -58,6 +58,17 @@ public class RegistrationServiceTest {
     @Test
     public void addValidRegistrationsShouldSucceed()
             throws InvalidRegistrationException, ServiceException, InvalidVehicleException {
+        addValidRegistrations(registrationDAO, vehicleDAO);
+    }
+
+    @Test
+    public void addOnlyOnePersonToRTWShouldFail()
+            throws InvalidRegistrationException, ServiceException, InvalidVehicleException {
+        addOnlyOnePersonToRTW(thrown, registrationDAO, vehicleDAO);
+    }
+
+    static void addValidRegistrations(RegistrationDAO registrationDAO, VehicleDAO vehicleDAO)
+            throws InvalidVehicleException, InvalidRegistrationException, ServiceException {
         RegistrationService registrationService =
                 new RegistrationServiceImpl(registrationDAO, vehicleDAO);
         Set<Registration> registrations = new HashSet<>();
@@ -111,9 +122,9 @@ public class RegistrationServiceTest {
         registrationService.add(vehicle.id(), registrations);
     }
 
-    @Test
-    public void addOnlyOnePersonToRTWShouldFail()
-            throws InvalidRegistrationException, ServiceException, InvalidVehicleException {
+    static void addOnlyOnePersonToRTW(
+            ExpectedException thrown, RegistrationDAO registrationDAO, VehicleDAO vehicleDAO)
+            throws InvalidVehicleException, InvalidRegistrationException, ServiceException {
         thrown.expect(InvalidRegistrationException.class);
         RegistrationService registrationService =
                 new RegistrationServiceImpl(registrationDAO, vehicleDAO);
-- 
cgit v1.2.3-70-g09d2


From ec26b62447689d501d7e4ba1d289b6739c694235 Mon Sep 17 00:00:00 2001
From: Dominic Rogetzer <e1627756@student.tuwien.ac.at>
Date: Mon, 11 Jun 2018 15:10:14 +0200
Subject: Add integration tests for registration- service/dao [#27302]

---
 .../RegistrationServiceIntegrationTest.java        | 53 ++++++++++++++++++++++
 1 file changed, 53 insertions(+)
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceIntegrationTest.java

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceIntegrationTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceIntegrationTest.java
new file mode 100644
index 0000000..0e8004c
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceIntegrationTest.java
@@ -0,0 +1,53 @@
+package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
+
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
+import org.dbunit.dataset.IDataSet;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class RegistrationServiceIntegrationTest extends JdbcTestCase {
+
+    private RegistrationDAO registrationDAO;
+    private VehicleDAO vehicleDAO;
+
+    @Rule public ExpectedException thrown = ExpectedException.none();
+
+    @Override
+    protected IDataSet getDataSet() throws Exception {
+        return getDataSet("registrationTestBaseData.xml");
+    }
+
+    @Before
+    public void prepare() throws PersistenceException {
+
+        EmployeeDAO employeeDAO = new EmployeeDatabaseDAO(getJdbcConnectionManager());
+        registrationDAO = new RegistrationDatabaseDAO(getJdbcConnectionManager(), employeeDAO);
+        vehicleDAO =
+                new VehicleDatabaseDAO(
+                        getJdbcConnectionManager(), (RegistrationDatabaseDAO) registrationDAO);
+    }
+
+    @Test
+    public void addValidRegistrationsShouldSucceed()
+            throws InvalidRegistrationException, ServiceException, InvalidVehicleException {
+        RegistrationServiceTest.addValidRegistrations(registrationDAO, vehicleDAO);
+    }
+
+    @Test
+    public void addOnlyOnePersonToRTWShouldFail()
+            throws InvalidRegistrationException, ServiceException, InvalidVehicleException {
+        RegistrationServiceTest.addOnlyOnePersonToRTW(thrown, registrationDAO, vehicleDAO);
+    }
+}
-- 
cgit v1.2.3-70-g09d2


From f1ec6a222ac82275fb2aaaaa7e93764fa9500b38 Mon Sep 17 00:00:00 2001
From: Dominic Rogetzer <e1627756@student.tuwien.ac.at>
Date: Tue, 12 Jun 2018 19:19:46 +0200
Subject: Add TODO comments as feedback which occurred during JourFixe [#28535]

---
 .../sepm/assignment/groupphase/application/MainApplication.java     | 2 ++
 .../einsatzverwaltung/controller/CreateCarController.java           | 3 ++-
 .../einsatzverwaltung/controller/CreateNewEmployeeController.java   | 6 ++++--
 .../groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java       | 3 +++
 .../groupphase/einsatzverwaltung/service/EmployeeServiceImpl.java   | 1 +
 .../groupphase/einsatzverwaltung/service/VehicleServiceImpl.java    | 1 +
 .../service/RegistrationServiceIntegrationTest.java                 | 2 ++
 7 files changed, 15 insertions(+), 3 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/application/MainApplication.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/application/MainApplication.java
index d8365a7..d1569f6 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/application/MainApplication.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/application/MainApplication.java
@@ -27,6 +27,8 @@ public class MainApplication extends Application {
         primaryStage.centerOnScreen();
         primaryStage.setOnCloseRequest(event -> Platform.exit());
 
+        // TODO: close connection on program exit (feedback)
+
         configApplicationContext = new AnnotationConfigApplicationContext(MainApplication.class);
         final var fxmlLoader = configApplicationContext.getBean(SpringFXMLLoader.class);
         primaryStage.setScene(
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateCarController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateCarController.java
index 7e964cb..bc6b0bc 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateCarController.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateCarController.java
@@ -128,7 +128,8 @@ public class CreateCarController {
                 vehicleService.update(vehicle);
                 setToStart();
             } catch (InvalidVehicleException e) {
-                LOG.error("Invalid Vehicle: {}", e);
+                // TODO: Validation-Errors should be logged with log level debug only (like here)
+                LOG.debug("Invalid Vehicle: {}", e);
                 createComplete(AlertType.ERROR, "Ungültige Eingabe", e.getMessage());
                 setToStart();
                 return;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeController.java
index 15282cc..ecca44b 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeController.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeController.java
@@ -104,7 +104,8 @@ public class CreateNewEmployeeController {
                 employeeService.add(employee);
             }
         } catch (InvalidEmployeeException e) {
-            LOG.error("Invalid Employee: {}", e);
+            // TODO: on validation errors, only log at debug level (feedback)
+            LOG.debug("Invalid Employee: {}", e);
 
             showModalDialogWithOkButton(
                     AlertType.ERROR,
@@ -112,7 +113,8 @@ public class CreateNewEmployeeController {
                     "Mindestens eines der Eingabefelder haben einen ungültigen Wert!");
             return;
         } catch (ServiceException e) {
-            LOG.error("Employee could not be saved: {}", e);
+            // TODO: when errors occur, exceptions should be logged. Do not use "{}" (feedback)
+            LOG.error("Employee could not be saved: ", e);
 
             showModalDialogWithOkButton(
                     AlertType.ERROR,
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java
index b9f2079..8c8d8b2 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java
@@ -19,6 +19,9 @@ import org.springframework.stereotype.Repository;
 @Repository
 public class EmployeeDatabaseDAO implements EmployeeDAO {
 
+    // TODO [optional] either implement own interface or use spring disposable
+    // bean to close prepared statements (feedback)
+
     private static final String INSERT_EMPLOYEE_VERSION =
             "INSERT INTO EmployeeVersion(name, birthday, educationLevel, isDriver, isPilot) "
                     + "VALUES(?, ?, ?, ?, ?)";
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceImpl.java
index 700a5de..81261ee 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceImpl.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceImpl.java
@@ -30,6 +30,7 @@ public class EmployeeServiceImpl implements EmployeeService {
         try {
             return employeePersistence.add(employee);
         } catch (PersistenceException e) {
+            // TODO: Do not practice "log and rethrow"! (feedback)
             LOG.error("PersistenceException while adding Employee. Message: {}", e.getMessage());
             throw new ServiceException(e);
         }
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceImpl.java
index 026bca6..527825e 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceImpl.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceImpl.java
@@ -93,6 +93,7 @@ public class VehicleServiceImpl implements VehicleService {
                 break;
             case NAH:
                 if (vehicle.constructionType() == ConstructionType.MITTELHOCHDACH) {
+                    // TODO: eventually change to LOG.debug (feedback)
                     LOG.info("Invalid Vehicle: NAH cannot have a medium roof");
                     throw new InvalidVehicleException("NEF darf kein Mittelhochdach haben");
                 } else if (vehicle.constructionType() == ConstructionType.HOCHDACH) {
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceIntegrationTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceIntegrationTest.java
index 0e8004c..51b7621 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceIntegrationTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceIntegrationTest.java
@@ -50,4 +50,6 @@ public class RegistrationServiceIntegrationTest extends JdbcTestCase {
             throws InvalidRegistrationException, ServiceException, InvalidVehicleException {
         RegistrationServiceTest.addOnlyOnePersonToRTW(thrown, registrationDAO, vehicleDAO);
     }
+
+    // TODO: also test real integration, e.g. add registration and delete afterwards (feedback)
 }
-- 
cgit v1.2.3-70-g09d2


From 600080d4fa34d1e9e41928db6e28e7c3331eba2a Mon Sep 17 00:00:00 2001
From: Felix Kehrer <felix.kehrer@gmail.com>
Date: Mon, 11 Jun 2018 23:57:49 +0200
Subject: move original operation so it can be used multiple times #27303

---
 .../einsatzverwaltung/dao/OperationDAOTest.java    | 49 ++++++++++++----------
 1 file changed, 26 insertions(+), 23 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
index ede2613..c7f5b46 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
@@ -32,6 +32,8 @@ public class OperationDAOTest extends JdbcTestCase {
 
     private final Operation o;
 
+    private final Operation originalOperation;
+
     public OperationDAOTest() throws PersistenceException {
         // TODO: fix once everything properly uses dependency injection
         EmployeeDAO employeeDAO = new EmployeeDatabaseDAO(getJdbcConnectionManager());
@@ -65,6 +67,29 @@ public class OperationDAOTest extends JdbcTestCase {
                         .destination("New destination")
                         .additionalInfo("New information")
                         .build();
+
+        Vehicle vehicle =
+                Vehicle.builder()
+                        .id(4)
+                        .name("BKTW-2")
+                        .constructionType(ConstructionType.HOCHDACH)
+                        .type(VehicleType.BKTW)
+                        .hasNef(false)
+                        .status(Vehicle.Status.ZUM_BERUFUNGSORT)
+                        .registrations(new LinkedList<>())
+                        .build();
+
+        originalOperation =
+                Operation.builder()
+                        .id(1)
+                        .opCode("ALP-95E7")
+                        .severity(Severity.E)
+                        .created(Instant.parse("2000-01-01T00:00:00.0Z"))
+                        .destination("Wiedner Hauptstraße 35, Wien")
+                        .additionalInfo("Additional information")
+                        .status(Status.ACTIVE)
+                        .vehicles(Set.of(vehicle))
+                        .build();
     }
 
     @BeforeClass
@@ -104,29 +129,7 @@ public class OperationDAOTest extends JdbcTestCase {
     public void testListOperations() throws Exception {
         Set<Operation> operationSet = operationDAO.list(EnumSet.allOf(Status.class));
 
-        Vehicle vehicle =
-                Vehicle.builder()
-                        .id(4)
-                        .name("BKTW-2")
-                        .constructionType(ConstructionType.HOCHDACH)
-                        .type(VehicleType.BKTW)
-                        .hasNef(false)
-                        .status(Vehicle.Status.ZUM_BERUFUNGSORT)
-                        .registrations(new LinkedList<>())
-                        .build();
-        Operation operation =
-                Operation.builder()
-                        .id(1)
-                        .opCode("ALP-95E7")
-                        .severity(Severity.E)
-                        .created(Instant.parse("2000-01-01T00:00:00.0Z"))
-                        .destination("Wiedner Hauptstraße 35, Wien")
-                        .additionalInfo("Additional information")
-                        .status(Status.ACTIVE)
-                        .vehicles(Set.of(vehicle))
-                        .build();
-
-        assertEquals(Set.of(operation), operationSet);
+        assertEquals(Set.of(originalOperation), operationSet);
     }
 
     @Test
-- 
cgit v1.2.3-70-g09d2


From 0405dca473b3c531d0c0e61b31bd1b4a9fa7e824 Mon Sep 17 00:00:00 2001
From: Felix Kehrer <felix.kehrer@gmail.com>
Date: Mon, 11 Jun 2018 23:58:25 +0200
Subject: add simple test for .get() #27303

---
 .../groupphase/einsatzverwaltung/dao/OperationDAOTest.java         | 7 +++++++
 1 file changed, 7 insertions(+)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
index c7f5b46..dbe3c36 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
@@ -132,6 +132,13 @@ public class OperationDAOTest extends JdbcTestCase {
         assertEquals(Set.of(originalOperation), operationSet);
     }
 
+    @Test
+    public void testGetOperations() throws Exception {
+        Operation gotOperation = operationDAO.get(originalOperation.id());
+
+        assertEquals(originalOperation, gotOperation);
+    }
+
     @Test
     public void testAddOperation() throws Exception {
         long id = operationDAO.add(o);
-- 
cgit v1.2.3-70-g09d2


From e3617c496b4d0a03713d037b01f1228ebccc2b30 Mon Sep 17 00:00:00 2001
From: Martin Weick <e1627760@student.tuwien.ac.at>
Date: Thu, 14 Jun 2018 15:15:18 +0200
Subject: change Vehicle Gui Test #27301

---
 .../controller/CreateNewVehicleControllerTest.java                  | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java
index a9fbcf0..9e6c470 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java
@@ -39,7 +39,7 @@ public class CreateNewVehicleControllerTest extends HighDpiAwareApplicationTest
 
         when(vehicleService.add(any())).thenReturn(1L);
 
-        clickOn("#btn_create", Motion.DIRECT, MouseButton.PRIMARY);
+        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
 
         Stage alertDialog = Helper.getTopModalStage(robotContext());
         Assert.assertNotNull(alertDialog);
@@ -53,7 +53,7 @@ public class CreateNewVehicleControllerTest extends HighDpiAwareApplicationTest
 
         when(vehicleService.add(any())).thenThrow(InvalidVehicleException.class);
 
-        clickOn("#btn_create", Motion.DIRECT, MouseButton.PRIMARY);
+        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
 
         Stage alertDialog = Helper.getTopModalStage(robotContext());
         Assert.assertNotNull(alertDialog);
@@ -67,7 +67,7 @@ public class CreateNewVehicleControllerTest extends HighDpiAwareApplicationTest
 
         when(vehicleService.add(any())).thenThrow(ServiceException.class);
 
-        clickOn("#btn_create", Motion.DIRECT, MouseButton.PRIMARY);
+        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
 
         Stage alertDialog = Helper.getTopModalStage(robotContext());
         Assert.assertNotNull(alertDialog);
-- 
cgit v1.2.3-70-g09d2


From 612a96e961f9944c2031b457ff246fe234274fa8 Mon Sep 17 00:00:00 2001
From: Viktoria Pundy <viktoria.pundy@aon.at>
Date: Mon, 11 Jun 2018 20:07:59 +0200
Subject: Started adding tests [#27303]

---
 .../service/OperationIntegrationTests.java         | 73 ++++++++++++++++++++++
 .../resources/operationIntegrationVehicles.xml     | 12 ++++
 2 files changed, 85 insertions(+)
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationIntegrationTests.java
 create mode 100644 src/test/resources/operationIntegrationVehicles.xml

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationIntegrationTests.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationIntegrationTests.java
new file mode 100644
index 0000000..2d01093
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationIntegrationTests.java
@@ -0,0 +1,73 @@
+package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
+
+import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
+import org.dbunit.dataset.IDataSet;
+
+public class OperationIntegrationTests extends JdbcTestCase {
+
+    @Override
+    protected IDataSet getDataSet() throws Exception {
+        return null;
+    }
+
+    /*private OperationDAO operationDAO;
+    private OperationService operationService;
+
+    public OperationIntegrationTests() throws PersistenceException {
+        operationDAO = new OperationDatabaseDAO(getJdbcConnectionManager());
+    }
+
+    @Override
+    protected IDataSet getDataSet() throws Exception {
+        InputStream res =
+                getClass()
+                        .getClassLoader()
+                        .getResourceAsStream("operationIntegrationVehicles.xml");
+        return new FlatXmlDataSetBuilder().build(res);
+    }
+
+    protected JDBCConnectionManager getJdbcConnectionManager() {
+        return jdbcConnectionManager;
+    }
+
+    @Test
+    public void addOperation() throws Exception {
+        LocalDateTime localDateTime = LocalDateTime.of(2018, 6, 4, 10, 44, 30);
+        Vehicle vehicle = Vehicle.builder()
+                .type(VehicleType.RTW)
+                .hasNef(true)
+                .name("RTW-1")
+                .constructionType(ConstructionType.HOCHDACH)
+                .id(1).build();
+        Operation operation = Operation.builder().additionalInfo("hellgrünes Haus")
+                .status(Status.ACTIVE)
+                .destination("Favoritenstraße 99, Wien")
+                .created(localDateTime.toInstant(ZoneOffset.UTC))
+                .severity(Severity.B)
+                .opCode("RD-8A34")
+                .vehicles(Set.of(vehicle)).build();
+        operationDAO.add(operation);
+
+
+        String[] excludedColummns = new String[] {"ID"};
+        String tableOITestVersion = "OIVERSION";
+
+        IDataSet actualDataSet = getConnection().createDataSet();
+        IDataSet expectedDataSet =
+                new FlatXmlDataFileLoader().load("/testAddValidOperation_expected.xml");
+
+        ITable actualEmployeeVersionTable = actualDataSet.getTable(tableOITestVersion);
+        ITable expectedEmployeeVersionTable = expectedDataSet.getTable(tableOITestVersion);
+
+        ITable actualFilteredTable =
+                DefaultColumnFilter.excludedColumnsTable(
+                        actualEmployeeVersionTable, excludedColummns);
+        ITable expectedFilteredTable =
+                DefaultColumnFilter.excludedColumnsTable(
+                        expectedEmployeeVersionTable, excludedColummns);
+
+        Assertion.assertEquals(expectedFilteredTable, actualFilteredTable);
+
+    }*/
+
+}
diff --git a/src/test/resources/operationIntegrationVehicles.xml b/src/test/resources/operationIntegrationVehicles.xml
new file mode 100644
index 0000000..45475a4
--- /dev/null
+++ b/src/test/resources/operationIntegrationVehicles.xml
@@ -0,0 +1,12 @@
+<dataset>
+<VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
+<VehicleVersion id="2" name="KTW-1" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
+<VehicleVersion id="3" name="KTW-2" constructionType="MITTELHOCHDACH" type="KTW_B" hasNef="false"/>
+<VehicleVersion id="4" name="BKTW-2" constructionType="HOCHDACH" type="BKTW" hasNef="false"/>
+<VehicleVersion id="5" name="NEF-1" constructionType="NORMAL" type="NEF" hasNef="true"/>
+
+<Vehicle id="1" version="1" status="FREI_FUNK"/>
+<Vehicle id="2" version="2" status="FREI_WACHE"/>
+<Vehicle id="3" version="3" status="FREI_FUNK"/>
+<Vehicle id="4" version="4" status="ZUM_BERUFUNGSORT"/>
+</dataset>
\ No newline at end of file
-- 
cgit v1.2.3-70-g09d2


From 174ede688c45d2a294527433f0bf23d57f9246b7 Mon Sep 17 00:00:00 2001
From: Dominic Rogetzer <e1627756@student.tuwien.ac.at>
Date: Sat, 16 Jun 2018 11:53:01 +0200
Subject: Add integration test for adding operation [#27302]

---
 .../service/OperationIntegrationTests.java         | 123 ++++++++++++---------
 1 file changed, 70 insertions(+), 53 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationIntegrationTests.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationIntegrationTests.java
index 2d01093..7ac0685 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationIntegrationTests.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationIntegrationTests.java
@@ -1,73 +1,90 @@
 package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
 
+import static org.junit.Assert.assertEquals;
+
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
 import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
+import java.util.Set;
+import org.dbunit.Assertion;
 import org.dbunit.dataset.IDataSet;
+import org.dbunit.dataset.ITable;
+import org.junit.Test;
 
 public class OperationIntegrationTests extends JdbcTestCase {
 
-    @Override
-    protected IDataSet getDataSet() throws Exception {
-        return null;
-    }
-
-    /*private OperationDAO operationDAO;
     private OperationService operationService;
 
+    private Operation o;
+
     public OperationIntegrationTests() throws PersistenceException {
-        operationDAO = new OperationDatabaseDAO(getJdbcConnectionManager());
+        EmployeeDAO employeeDAO = new EmployeeDatabaseDAO(getJdbcConnectionManager());
+        RegistrationDAO registrationDAO =
+                new RegistrationDatabaseDAO(getJdbcConnectionManager(), employeeDAO);
+        VehicleDAO vehicleDAO =
+                new VehicleDatabaseDAO(
+                        getJdbcConnectionManager(), (RegistrationDatabaseDAO) registrationDAO);
+        OperationDAO operationDAO =
+                new OperationDatabaseDAO(getJdbcConnectionManager(), vehicleDAO);
+
+        VehicleService vehicleService = new VehicleServiceImpl(vehicleDAO);
+
+        operationService = new OperationServiceImpl(operationDAO, vehicleDAO, vehicleService);
+
+        Vehicle v1 =
+                Vehicle.builder()
+                        .id(1)
+                        .name("RTW-1")
+                        .constructionType(Vehicle.ConstructionType.HOCHDACH)
+                        .type(Vehicle.VehicleType.RTW)
+                        .status(Vehicle.Status.FREI_FUNK)
+                        .hasNef(true)
+                        .build();
+
+        Vehicle v2 = v1.toBuilder().id(2).build();
+        Vehicle v3 = v1.toBuilder().id(3).build();
+
+        o =
+                Operation.builder()
+                        .opCode("RD-2B0M")
+                        .status(Status.ACTIVE)
+                        .vehicles(Set.of(v1, v2, v3))
+                        .destination("New destination")
+                        .additionalInfo("New information")
+                        .build();
     }
 
     @Override
     protected IDataSet getDataSet() throws Exception {
-        InputStream res =
-                getClass()
-                        .getClassLoader()
-                        .getResourceAsStream("operationIntegrationVehicles.xml");
-        return new FlatXmlDataSetBuilder().build(res);
-    }
-
-    protected JDBCConnectionManager getJdbcConnectionManager() {
-        return jdbcConnectionManager;
+        return getDataSet("operationDAOUpdateSetup.xml");
     }
 
     @Test
     public void addOperation() throws Exception {
-        LocalDateTime localDateTime = LocalDateTime.of(2018, 6, 4, 10, 44, 30);
-        Vehicle vehicle = Vehicle.builder()
-                .type(VehicleType.RTW)
-                .hasNef(true)
-                .name("RTW-1")
-                .constructionType(ConstructionType.HOCHDACH)
-                .id(1).build();
-        Operation operation = Operation.builder().additionalInfo("hellgrünes Haus")
-                .status(Status.ACTIVE)
-                .destination("Favoritenstraße 99, Wien")
-                .created(localDateTime.toInstant(ZoneOffset.UTC))
-                .severity(Severity.B)
-                .opCode("RD-8A34")
-                .vehicles(Set.of(vehicle)).build();
-        operationDAO.add(operation);
-
-
-        String[] excludedColummns = new String[] {"ID"};
-        String tableOITestVersion = "OIVERSION";
-
-        IDataSet actualDataSet = getConnection().createDataSet();
-        IDataSet expectedDataSet =
-                new FlatXmlDataFileLoader().load("/testAddValidOperation_expected.xml");
-
-        ITable actualEmployeeVersionTable = actualDataSet.getTable(tableOITestVersion);
-        ITable expectedEmployeeVersionTable = expectedDataSet.getTable(tableOITestVersion);
-
-        ITable actualFilteredTable =
-                DefaultColumnFilter.excludedColumnsTable(
-                        actualEmployeeVersionTable, excludedColummns);
-        ITable expectedFilteredTable =
-                DefaultColumnFilter.excludedColumnsTable(
-                        expectedEmployeeVersionTable, excludedColummns);
-
-        Assertion.assertEquals(expectedFilteredTable, actualFilteredTable);
-
-    }*/
 
+        long id = operationService.add(o);
+        assertEquals(2, id);
+
+        String tableName = "Operation";
+        String[] excludedColumns = new String[] {"created"};
+
+        ITable actual =
+                Helper.getActualFilteredTableData(getConnection(), tableName, excludedColumns);
+        ITable expected =
+                Helper.getExpectedFilteredTableData(
+                        tableName, excludedColumns, "operationDAOAddOperation.xml");
+
+        Assertion.assertEquals(expected, actual);
+    }
 }
-- 
cgit v1.2.3-70-g09d2


From e1c281212924aecf2b266ef99cc7c6795600d747 Mon Sep 17 00:00:00 2001
From: Dominic Rogetzer <e1627756@student.tuwien.ac.at>
Date: Sat, 16 Jun 2018 12:05:30 +0200
Subject: Rename OperationServiceIntegrationTest, add another test case
 [#27302]

rename file to OperationServiceIntegrationTest
implement addInvalidOperation
---
 .../service/OperationIntegrationTests.java         | 90 --------------------
 .../service/OperationServiceIntegrationTest.java   | 97 ++++++++++++++++++++++
 2 files changed, 97 insertions(+), 90 deletions(-)
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationIntegrationTests.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceIntegrationTest.java

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationIntegrationTests.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationIntegrationTests.java
deleted file mode 100644
index 7ac0685..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationIntegrationTests.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import static org.junit.Assert.assertEquals;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDatabaseDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDatabaseDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDatabaseDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDatabaseDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
-import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
-import java.util.Set;
-import org.dbunit.Assertion;
-import org.dbunit.dataset.IDataSet;
-import org.dbunit.dataset.ITable;
-import org.junit.Test;
-
-public class OperationIntegrationTests extends JdbcTestCase {
-
-    private OperationService operationService;
-
-    private Operation o;
-
-    public OperationIntegrationTests() throws PersistenceException {
-        EmployeeDAO employeeDAO = new EmployeeDatabaseDAO(getJdbcConnectionManager());
-        RegistrationDAO registrationDAO =
-                new RegistrationDatabaseDAO(getJdbcConnectionManager(), employeeDAO);
-        VehicleDAO vehicleDAO =
-                new VehicleDatabaseDAO(
-                        getJdbcConnectionManager(), (RegistrationDatabaseDAO) registrationDAO);
-        OperationDAO operationDAO =
-                new OperationDatabaseDAO(getJdbcConnectionManager(), vehicleDAO);
-
-        VehicleService vehicleService = new VehicleServiceImpl(vehicleDAO);
-
-        operationService = new OperationServiceImpl(operationDAO, vehicleDAO, vehicleService);
-
-        Vehicle v1 =
-                Vehicle.builder()
-                        .id(1)
-                        .name("RTW-1")
-                        .constructionType(Vehicle.ConstructionType.HOCHDACH)
-                        .type(Vehicle.VehicleType.RTW)
-                        .status(Vehicle.Status.FREI_FUNK)
-                        .hasNef(true)
-                        .build();
-
-        Vehicle v2 = v1.toBuilder().id(2).build();
-        Vehicle v3 = v1.toBuilder().id(3).build();
-
-        o =
-                Operation.builder()
-                        .opCode("RD-2B0M")
-                        .status(Status.ACTIVE)
-                        .vehicles(Set.of(v1, v2, v3))
-                        .destination("New destination")
-                        .additionalInfo("New information")
-                        .build();
-    }
-
-    @Override
-    protected IDataSet getDataSet() throws Exception {
-        return getDataSet("operationDAOUpdateSetup.xml");
-    }
-
-    @Test
-    public void addOperation() throws Exception {
-
-        long id = operationService.add(o);
-        assertEquals(2, id);
-
-        String tableName = "Operation";
-        String[] excludedColumns = new String[] {"created"};
-
-        ITable actual =
-                Helper.getActualFilteredTableData(getConnection(), tableName, excludedColumns);
-        ITable expected =
-                Helper.getExpectedFilteredTableData(
-                        tableName, excludedColumns, "operationDAOAddOperation.xml");
-
-        Assertion.assertEquals(expected, actual);
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceIntegrationTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceIntegrationTest.java
new file mode 100644
index 0000000..1928eff
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceIntegrationTest.java
@@ -0,0 +1,97 @@
+package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
+
+import static org.junit.Assert.assertEquals;
+
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
+import java.util.Set;
+import org.dbunit.Assertion;
+import org.dbunit.dataset.IDataSet;
+import org.dbunit.dataset.ITable;
+import org.junit.Test;
+
+public class OperationServiceIntegrationTest extends JdbcTestCase {
+
+    private OperationService operationService;
+
+    private Operation o;
+
+    public OperationServiceIntegrationTest() throws PersistenceException {
+        EmployeeDAO employeeDAO = new EmployeeDatabaseDAO(getJdbcConnectionManager());
+        RegistrationDAO registrationDAO =
+                new RegistrationDatabaseDAO(getJdbcConnectionManager(), employeeDAO);
+        VehicleDAO vehicleDAO =
+                new VehicleDatabaseDAO(
+                        getJdbcConnectionManager(), (RegistrationDatabaseDAO) registrationDAO);
+        OperationDAO operationDAO =
+                new OperationDatabaseDAO(getJdbcConnectionManager(), vehicleDAO);
+
+        VehicleService vehicleService = new VehicleServiceImpl(vehicleDAO);
+
+        operationService = new OperationServiceImpl(operationDAO, vehicleDAO, vehicleService);
+
+        Vehicle v1 =
+                Vehicle.builder()
+                        .id(1)
+                        .name("RTW-1")
+                        .constructionType(Vehicle.ConstructionType.HOCHDACH)
+                        .type(Vehicle.VehicleType.RTW)
+                        .status(Vehicle.Status.FREI_FUNK)
+                        .hasNef(true)
+                        .build();
+
+        Vehicle v2 = v1.toBuilder().id(2).build();
+        Vehicle v3 = v1.toBuilder().id(3).build();
+
+        o =
+                Operation.builder()
+                        .opCode("RD-2B0M")
+                        .status(Status.ACTIVE)
+                        .vehicles(Set.of(v1, v2, v3))
+                        .destination("New destination")
+                        .additionalInfo("New information")
+                        .build();
+    }
+
+    @Override
+    protected IDataSet getDataSet() throws Exception {
+        return getDataSet("operationDAOUpdateSetup.xml");
+    }
+
+    @Test
+    public void addValidOperation() throws Exception {
+
+        long id = operationService.add(o);
+        assertEquals(2, id);
+
+        String tableName = "Operation";
+        String[] excludedColumns = new String[] {"created"};
+
+        ITable actual =
+                Helper.getActualFilteredTableData(getConnection(), tableName, excludedColumns);
+        ITable expected =
+                Helper.getExpectedFilteredTableData(
+                        tableName, excludedColumns, "operationDAOAddOperation.xml");
+
+        Assertion.assertEquals(expected, actual);
+    }
+
+    @Test(expected = InvalidOperationException.class)
+    public void addInvalidOperation() throws InvalidOperationException, ServiceException {
+        operationService.add(o.toBuilder().opCode("").build());
+    }
+}
-- 
cgit v1.2.3-70-g09d2


From f80a69e941f0949dbec476755abfd373c26846ce Mon Sep 17 00:00:00 2001
From: Tharre <tharre3@gmail.com>
Date: Sat, 16 Jun 2018 20:18:14 +0200
Subject: Rework EmployeeDao to use pstmts directly #27305

---
 .../einsatzverwaltung/dao/EmployeeDatabaseDAO.java | 193 ++++++++-------------
 .../einsatzverwaltung/dao/EmployeeDAOTest.java     |   3 +-
 2 files changed, 71 insertions(+), 125 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java
index 74e407f..f384937 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java
@@ -9,9 +9,8 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.sql.Savepoint;
 import java.sql.Statement;
-import java.sql.Timestamp;
+import java.time.LocalDate;
 import java.util.HashSet;
 import java.util.Set;
 import org.springframework.stereotype.Repository;
@@ -19,164 +18,112 @@ import org.springframework.stereotype.Repository;
 @Repository
 public class EmployeeDatabaseDAO implements EmployeeDAO {
 
-    // TODO [optional] either implement own interface or use spring disposable
-    // bean to close prepared statements (feedback)
+    private JDBCConnectionManager jdbcConnectionManager;
 
-    private static final String INSERT_EMPLOYEE_VERSION =
-            "INSERT INTO EmployeeVersion(name, birthday, educationLevel, isDriver, isPilot) "
-                    + "VALUES(?, ?, ?, ?, ?)";
-    private static final String INSERT_EMPLOYEE = "INSERT INTO Employee(version) VALUES(?)";
-    private static final String LIST_EMPLOYEE =
-            "SELECT emp.id, v.name, v.birthday, v.educationLevel, v.isDriver, v.isPilot "
-                    + "FROM employee emp "
-                    + "JOIN EmployeeVersion v ON v.id = emp.version";
-    private static final String UPDATE_EMPLOYEE = "UPDATE Employee SET version = ? WHERE id = ?";
-
-    private final PreparedStatement insertEmployeeVersion,
-            insertEmployee,
-            listEmployee,
-            updateEmployee;
-
-    private final Connection connection;
-
-    public EmployeeDatabaseDAO(JDBCConnectionManager connectionManager)
-            throws PersistenceException {
-
-        try {
+    public EmployeeDatabaseDAO(JDBCConnectionManager jdbcConnectionManager) {
+        this.jdbcConnectionManager = jdbcConnectionManager;
+    }
 
-            connection = connectionManager.getConnection();
-            insertEmployeeVersion =
-                    connection.prepareStatement(
-                            INSERT_EMPLOYEE_VERSION, Statement.RETURN_GENERATED_KEYS);
-            insertEmployee =
-                    connection.prepareStatement(INSERT_EMPLOYEE, Statement.RETURN_GENERATED_KEYS);
+    private long createEmployeeVersion(Connection con, Employee e)
+            throws PersistenceException, SQLException {
+        String sql =
+                "INSERT INTO EmployeeVersion(name, birthday, educationLevel, isDriver, isPilot) "
+                        + "VALUES(?, ?, ?, ?, ?)";
 
-            listEmployee = connection.prepareStatement(LIST_EMPLOYEE);
+        try (PreparedStatement pstmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
+            pstmt.setString(1, e.name());
+            pstmt.setObject(2, e.birthday());
+            pstmt.setInt(3, e.educationLevel().ordinal());
+            pstmt.setBoolean(4, e.isDriver());
+            pstmt.setBoolean(5, e.isPilot());
+            pstmt.executeUpdate();
 
-            updateEmployee = connection.prepareStatement(UPDATE_EMPLOYEE);
+            try (ResultSet rs = pstmt.getGeneratedKeys()) {
+                if (!rs.next()) throw new PersistenceException("Failed to insert EmployeeVersion");
 
-        } catch (SQLException e) {
-            throw new PersistenceException(e);
+                return rs.getLong(1);
+            }
         }
     }
 
     @Override
     public long add(Employee employee) throws PersistenceException {
+        String sql = "INSERT INTO Employee(version) VALUES(?)";
 
-        // Assumption: the given employee is already validated (from service)
-        Savepoint savepoint = null;
         try {
-            savepoint = connection.setSavepoint();
-            connection.setAutoCommit(false);
-            insertEmployeeVersion.setString(1, employee.name());
-            insertEmployeeVersion.setTimestamp(
-                    2, Timestamp.valueOf(employee.birthday().atStartOfDay()));
-            insertEmployeeVersion.setString(3, employee.educationLevel().toString());
-            insertEmployeeVersion.setBoolean(4, employee.isDriver());
-            insertEmployeeVersion.setBoolean(5, employee.isPilot());
-            insertEmployeeVersion.executeUpdate();
-            try (ResultSet resultSetEmployeeVersion = insertEmployeeVersion.getGeneratedKeys()) {
-                if (resultSetEmployeeVersion.next()) {
-                    long versionId = resultSetEmployeeVersion.getLong(1);
-
-                    insertEmployee.setLong(1, versionId);
-                    insertEmployee.executeUpdate();
-
-                    try (ResultSet resultSetEmployee = insertEmployee.getGeneratedKeys()) {
-                        if (resultSetEmployee.next()) {
-                            connection.commit();
-                            connection.setAutoCommit(true);
-                            return resultSetEmployee.getLong(1);
-                        }
-                    }
-                }
-            }
+            Connection con = jdbcConnectionManager.getConnection();
+            con.setAutoCommit(false);
+
+            long versionId = createEmployeeVersion(con, employee);
+
+            try (PreparedStatement pstmt =
+                    con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
+                pstmt.setLong(1, versionId);
+                pstmt.executeUpdate();
 
-            throw new PersistenceException("Employee was not updated");
+                try (ResultSet rs = pstmt.getGeneratedKeys()) {
+                    if (!rs.next()) throw new PersistenceException("Failed to insert Employee");
 
+                    con.commit();
+                    con.setAutoCommit(true);
+                    return rs.getLong(1);
+                }
+            }
         } catch (SQLException e) {
-            rollbackAndEnableAutoCommit(savepoint);
             throw new PersistenceException(e);
         }
     }
 
     @Override
     public void update(Employee employee) throws ElementNotFoundException, PersistenceException {
+        String sql = "UPDATE Employee SET version = ? WHERE id = ?";
 
-        Savepoint savepoint = null;
         try {
-            savepoint = connection.setSavepoint();
-            connection.setAutoCommit(false);
-
-            insertEmployeeVersion.setString(1, employee.name());
-            insertEmployeeVersion.setTimestamp(
-                    2, Timestamp.valueOf(employee.birthday().atStartOfDay()));
-            insertEmployeeVersion.setString(3, employee.educationLevel().toString());
-            insertEmployeeVersion.setBoolean(4, employee.isDriver());
-            insertEmployeeVersion.setBoolean(5, employee.isPilot());
-            insertEmployeeVersion.executeUpdate();
-            try (ResultSet resultSetEmployeeVersion = insertEmployeeVersion.getGeneratedKeys()) {
-
-                if (resultSetEmployeeVersion.next()) {
-                    long versionId = resultSetEmployeeVersion.getLong(1);
-
-                    updateEmployee.setLong(1, versionId);
-                    updateEmployee.setLong(2, employee.id());
-                    int affectedRows = updateEmployee.executeUpdate();
-
-                    if (affectedRows == 1) {
-                        connection.commit();
-                        connection.setAutoCommit(true);
-                    } else {
-                        throw new ElementNotFoundException(
-                                "element not found with id: " + employee.id());
-                    }
-                }
-            }
+            Connection con = jdbcConnectionManager.getConnection();
+            con.setAutoCommit(false);
 
-        } catch (SQLException e) {
-            rollbackAndEnableAutoCommit(savepoint);
-            throw new PersistenceException(e);
-        }
-    }
+            long versionId = createEmployeeVersion(con, employee);
 
-    private void rollbackAndEnableAutoCommit(Savepoint savepoint) throws PersistenceException {
-        if (savepoint != null) {
-            try {
-                connection.rollback(savepoint);
-                connection.setAutoCommit(true);
-            } catch (SQLException e) {
-                throw new PersistenceException(e);
+            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
+                pstmt.setLong(1, versionId);
+                pstmt.setLong(2, employee.id());
+
+                if (pstmt.executeUpdate() != 1)
+                    throw new ElementNotFoundException("No such employeeId exists");
             }
+        } catch (SQLException e) {
+            throw new PersistenceException(e);
         }
     }
 
     @Override
     public Set<Employee> list() throws PersistenceException {
+        String sql =
+                "SELECT emp.id, v.name, v.birthday, v.educationLevel, v.isDriver, v.isPilot "
+                        + "FROM employee emp "
+                        + "JOIN EmployeeVersion v ON v.id = emp.version";
 
         try {
-            Set<Employee> employees;
-            try (ResultSet rs = listEmployee.executeQuery()) {
-
-                employees = new HashSet<>();
-                while (rs.next()) {
-
-                    Employee employee =
-                            Employee.builder()
-                                    .id(rs.getLong(1))
-                                    .name(rs.getString(2))
-                                    .birthday(rs.getTimestamp(3).toLocalDateTime().toLocalDate())
-                                    .educationLevel(EducationLevel.valueOf(rs.getString(4)))
-                                    .isDriver(rs.getBoolean(5))
-                                    .isPilot(rs.getBoolean(6))
-                                    .build();
-
-                    employees.add(employee);
+            Connection con = jdbcConnectionManager.getConnection();
+            Set<Employee> employees = new HashSet<>();
+
+            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
+                try (ResultSet rs = pstmt.executeQuery()) {
+                    while (rs.next()) {
+                        employees.add(
+                                Employee.builder()
+                                        .id(rs.getLong(1))
+                                        .name(rs.getString(2))
+                                        .birthday(rs.getObject(3, LocalDate.class))
+                                        .educationLevel(EducationLevel.valueOf(rs.getString(4)))
+                                        .isDriver(rs.getBoolean(5))
+                                        .isPilot(rs.getBoolean(6))
+                                        .build());
+                    }
                 }
             }
 
             return employees;
-
         } catch (SQLException e) {
             throw new PersistenceException(e);
         }
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAOTest.java
index 585e5ea..dfee5f0 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAOTest.java
@@ -23,7 +23,7 @@ public class EmployeeDAOTest extends JdbcTestCase {
 
     private EmployeeDAO employeePersistence;
 
-    public EmployeeDAOTest() throws PersistenceException {
+    public EmployeeDAOTest() {
         employeePersistence = new EmployeeDatabaseDAO(getJdbcConnectionManager());
     }
 
@@ -40,7 +40,6 @@ public class EmployeeDAOTest extends JdbcTestCase {
     public void testListEmployees() throws PersistenceException {
         Set<Employee> employees = employeePersistence.list();
 
-        System.out.println(LocalDate.parse("2010-10-10"));
         Employee empOne =
                 Employee.builder()
                         .id(1)
-- 
cgit v1.2.3-70-g09d2


From b676355ab04479864d9c0e57b8149c567928da26 Mon Sep 17 00:00:00 2001
From: Tharre <tharre3@gmail.com>
Date: Sat, 16 Jun 2018 22:46:08 +0200
Subject: Rework RegistrationDatabaseDAO #27305

---
 .../dao/RegistrationDatabaseDAO.java               | 148 ++++++++++-----------
 src/main/resources/sql/database.sql                |   4 +-
 .../einsatzverwaltung/dao/RegistrationDAOTest.java |   4 +-
 3 files changed, 73 insertions(+), 83 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDatabaseDAO.java
index c3b1227..ed458d6 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDatabaseDAO.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDatabaseDAO.java
@@ -10,88 +10,70 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
-import java.sql.Timestamp;
+import java.time.OffsetDateTime;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 
 @Repository
 public class RegistrationDatabaseDAO implements RegistrationDAO {
 
-    private static final Logger LOG = LoggerFactory.getLogger(RegistrationDatabaseDAO.class);
-
-    private static final String ADD_REGISTRATION =
-            "INSERT INTO Registration (vehicleId, employeeId, start, end, active) VALUES (?,?,?,?,?);";
-    private static final String UPDATE_VEHICLE =
-            "UPDATE Vehicle SET status = 'FREI_WACHE' WHERE id = ?;";
-    private static final String FETCH_REGISTRATIONS =
-            "SELECT * FROM Registration WHERE vehicleId = ?";
-
-    private PreparedStatement addRegistration;
-    private PreparedStatement updateVehicle;
-    private PreparedStatement fetchRegistrations;
-
-    private Connection connection;
+    private JDBCConnectionManager jdbcConnectionManager;
     private EmployeeDAO employeePersistence;
 
     @Autowired
     public RegistrationDatabaseDAO(
-            JDBCConnectionManager connectionManager, EmployeeDAO employeePersistence)
-            throws PersistenceException {
+            JDBCConnectionManager jdbcConnectionManager, EmployeeDAO employeePersistence) {
+        this.jdbcConnectionManager = jdbcConnectionManager;
         this.employeePersistence = employeePersistence;
-        try {
-            connection = connectionManager.getConnection();
-            addRegistration =
-                    connection.prepareStatement(ADD_REGISTRATION, Statement.RETURN_GENERATED_KEYS);
-            updateVehicle = connection.prepareStatement(UPDATE_VEHICLE);
-            fetchRegistrations = connection.prepareStatement(FETCH_REGISTRATIONS);
-        } catch (SQLException e) {
-            throw new PersistenceException(e);
-        }
     }
 
     @Override
     public Set<Long> add(long vehicleId, Set<Registration> registrations)
             throws PersistenceException {
-        Set<Long> returnValues = new HashSet<>();
+        String sql =
+                "INSERT INTO Registration (vehicleId, employeeId, start, end, active) VALUES (?,?,?,?,?)";
+        String sql2 = "UPDATE Vehicle SET status = 'FREI_WACHE' WHERE id = ?;";
+
+        Set<Long> vehicleIds = new HashSet<>();
+
         try {
-            connection.setAutoCommit(false);
-            for (Registration registration : registrations) {
-                addRegistration.setLong(1, vehicleId);
-                addRegistration.setLong(2, registration.employee().id());
-                addRegistration.setTimestamp(3, Timestamp.from(registration.start()));
-                addRegistration.setTimestamp(4, Timestamp.from(registration.end()));
-                addRegistration.setBoolean(
-                        5, true); // ASSUMPTION: Registration gets created as active
-                addRegistration.executeUpdate();
-                try (ResultSet rs = addRegistration.getGeneratedKeys()) {
-                    if (rs.next()) {
-                        returnValues.add(rs.getLong(1));
-                    } else {
-                        throw new PersistenceException(
-                                "Anmeldung konnte nicht gespeichert werden.");
-                    }
+            Connection con = jdbcConnectionManager.getConnection();
+            con.setAutoCommit(false);
+
+            try (PreparedStatement pstmt =
+                    con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
+                pstmt.setLong(1, vehicleId);
+
+                for (Registration r : registrations) {
+                    pstmt.setLong(2, r.employee().id());
+                    pstmt.setObject(3, OffsetDateTime.ofInstant(r.start(), ZoneId.systemDefault()));
+                    pstmt.setObject(4, OffsetDateTime.ofInstant(r.end(), ZoneId.systemDefault()));
+                    pstmt.setBoolean(5, true);
+                    pstmt.addBatch();
+                }
+
+                pstmt.executeBatch();
+
+                try (ResultSet rs = pstmt.getGeneratedKeys()) {
+                    while (rs.next()) vehicleIds.add(rs.getLong(1));
                 }
             }
 
-            updateVehicle.setLong(1, vehicleId);
-            updateVehicle.executeUpdate();
+            try (PreparedStatement pstmt = con.prepareStatement(sql2)) {
+                pstmt.setLong(1, vehicleId);
+                if (pstmt.executeUpdate() != 1)
+                    throw new PersistenceException("Failed to persist registration");
+            }
 
-            connection.commit();
-            connection.setAutoCommit(true);
-            return returnValues;
+            con.commit();
+            return vehicleIds;
         } catch (SQLException e) {
-            try {
-                connection.rollback();
-                connection.setAutoCommit(true);
-            } catch (SQLException e1) {
-                LOG.error("Rollback failed! Error message: {}", e.getMessage());
-            }
+            jdbcConnectionManager.rollbackConnection();
             throw new PersistenceException(e);
         }
     }
@@ -101,34 +83,42 @@ public class RegistrationDatabaseDAO implements RegistrationDAO {
         throw new UnsupportedOperationException();
     }
 
-    public List<Registration> list(long vehicleId) throws PersistenceException {
+    protected List<Registration> list(long vehicleId) throws PersistenceException {
+        String sql = "SELECT * FROM Registration WHERE vehicleId = ?";
+
         List<Registration> registrationList = new ArrayList<>();
         try {
-            fetchRegistrations.setLong(1, vehicleId);
-            ResultSet rs = fetchRegistrations.executeQuery();
-            while (rs.next()) {
-                long employeeId = rs.getLong("employeeId");
-                // TODO: replace the following with employeePersistence.get once implemented
-                Employee emp =
-                        employeePersistence
-                                .list()
-                                .stream()
-                                .filter(employee -> employee.id() == employeeId)
-                                .findAny()
-                                .orElse(null);
-                Registration registration =
-                        Registration.builder()
-                                .id(rs.getLong("id"))
-                                .start(rs.getTimestamp("start").toInstant())
-                                .end(rs.getTimestamp("end").toInstant())
-                                .employee(emp)
-                                .build();
-                registrationList.add(registration);
+            Connection con = jdbcConnectionManager.getConnection();
+
+            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
+                pstmt.setLong(1, vehicleId);
+
+                try (ResultSet rs = pstmt.executeQuery()) {
+                    while (rs.next()) {
+                        long employeeId = rs.getLong("employeeId");
+                        // TODO: replace the following with employeePersistence.get once implemented
+                        Employee emp =
+                                employeePersistence
+                                        .list()
+                                        .stream()
+                                        .filter(employee -> employee.id() == employeeId)
+                                        .findAny()
+                                        .orElse(null);
+                        Registration registration =
+                                Registration.builder()
+                                        .id(rs.getLong("id"))
+                                        .start(rs.getTimestamp("start").toInstant())
+                                        .end(rs.getTimestamp("end").toInstant())
+                                        .employee(emp)
+                                        .build();
+                        registrationList.add(registration);
+                    }
+                }
             }
+
+            return registrationList;
         } catch (SQLException e) {
             throw new PersistenceException(e);
         }
-
-        return registrationList;
     }
 }
diff --git a/src/main/resources/sql/database.sql b/src/main/resources/sql/database.sql
index 3d382d1..c7a99b5 100644
--- a/src/main/resources/sql/database.sql
+++ b/src/main/resources/sql/database.sql
@@ -33,8 +33,8 @@ CREATE TABLE IF NOT EXISTS Registration (
   id BIGINT AUTO_INCREMENT PRIMARY KEY,
   vehicleId BIGINT NOT NULL,
   employeeId BIGINT NOT NULL,
-  start TIMESTAMP NOT NULL,
-  end TIMESTAMP NOT NULL,
+  start TIMESTAMP WITH TIME ZONE NOT NULL,
+  end TIMESTAMP WITH TIME ZONE NOT NULL,
   active BOOLEAN NOT NULL,
   FOREIGN KEY (vehicleId) REFERENCES VehicleVersion(id),
   FOREIGN KEY (employeeId) REFERENCES EmployeeVersion(id),
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAOTest.java
index 289a0ae..2fb578b 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAOTest.java
@@ -105,8 +105,8 @@ public class RegistrationDAOTest extends JdbcTestCase {
                         .build();
         Registration registration =
                 Registration.builder()
-                        .start(Instant.MIN)
-                        .end(Instant.MAX)
+                        .start(Instant.now())
+                        .end(Instant.now())
                         .employee(employee)
                         .build();
         registrations.add(registration);
-- 
cgit v1.2.3-70-g09d2


From 8207c1773aa144793cb42ae37104a836a4df6df4 Mon Sep 17 00:00:00 2001
From: Dominic Rogetzer <e1627756@student.tuwien.ac.at>
Date: Sun, 17 Jun 2018 16:59:12 +0200
Subject: Fix employee&vehicle-dao-tests to use correct alert headers [#25963]

---
 .../groupphase/einsatzverwaltung/controller/Helper.java          | 8 ++++----
 .../controller/CreateNewEmployeeControllerTest.java              | 9 ++++++---
 .../controller/CreateNewVehicleControllerTest.java               | 9 ++++++---
 3 files changed, 16 insertions(+), 10 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/Helper.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/Helper.java
index a4e85dd..694c804 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/Helper.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/Helper.java
@@ -4,11 +4,11 @@ import javafx.scene.control.Alert;
 import javafx.scene.control.Alert.AlertType;
 import javafx.scene.control.ButtonType;
 
-class Helper {
+public class Helper {
 
-    private static final String ALERT_TITLE_VALIDATION_ERROR = "Validierungsfehler";
-    private static final String ALERT_TITLE_SERVICE_EXCEPTION = "Fehler";
-    private static final String ALERT_TITLE_SUCCESS = "Erfolg";
+    static final String ALERT_TITLE_VALIDATION_ERROR = "Validierungsfehler";
+    static final String ALERT_TITLE_SERVICE_EXCEPTION = "Fehler";
+    static final String ALERT_TITLE_SUCCESS = "Erfolg";
 
     private Helper() {} // SonarLint insisted to create a private constructor to hide the public one
 
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeControllerTest.java
index ea09fb7..3273593 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeControllerTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeControllerTest.java
@@ -1,5 +1,8 @@
 package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
 
+import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.ALERT_TITLE_SERVICE_EXCEPTION;
+import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.ALERT_TITLE_SUCCESS;
+import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.ALERT_TITLE_VALIDATION_ERROR;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.when;
 
@@ -47,7 +50,7 @@ public class CreateNewEmployeeControllerTest extends HighDpiAwareApplicationTest
         Assert.assertNotNull(alertDialog);
 
         DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
-        Assert.assertEquals("Erfolgreich angelegt", dialogPane.getHeaderText());
+        Assert.assertEquals(ALERT_TITLE_SUCCESS, dialogPane.getHeaderText());
     }
 
     @Test
@@ -62,7 +65,7 @@ public class CreateNewEmployeeControllerTest extends HighDpiAwareApplicationTest
         Assert.assertNotNull(alertDialog);
 
         DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
-        Assert.assertEquals("Ungültige Eingabe", dialogPane.getHeaderText());
+        Assert.assertEquals(ALERT_TITLE_VALIDATION_ERROR, dialogPane.getHeaderText());
     }
 
     @Test
@@ -79,6 +82,6 @@ public class CreateNewEmployeeControllerTest extends HighDpiAwareApplicationTest
         Assert.assertNotNull(alertDialog);
 
         DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
-        Assert.assertEquals("Speicherfehler", dialogPane.getHeaderText());
+        Assert.assertEquals(ALERT_TITLE_SERVICE_EXCEPTION, dialogPane.getHeaderText());
     }
 }
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java
index 9e6c470..f5f4b57 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java
@@ -1,5 +1,8 @@
 package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
 
+import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.ALERT_TITLE_SERVICE_EXCEPTION;
+import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.ALERT_TITLE_SUCCESS;
+import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.ALERT_TITLE_VALIDATION_ERROR;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.when;
 
@@ -45,7 +48,7 @@ public class CreateNewVehicleControllerTest extends HighDpiAwareApplicationTest
         Assert.assertNotNull(alertDialog);
 
         DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
-        Assert.assertEquals("Speichern Erfolgreich", dialogPane.getHeaderText());
+        Assert.assertEquals(ALERT_TITLE_SUCCESS, dialogPane.getHeaderText());
     }
 
     @Test
@@ -59,7 +62,7 @@ public class CreateNewVehicleControllerTest extends HighDpiAwareApplicationTest
         Assert.assertNotNull(alertDialog);
 
         DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
-        Assert.assertEquals("Ungültige Eingabe", dialogPane.getHeaderText());
+        Assert.assertEquals(ALERT_TITLE_VALIDATION_ERROR, dialogPane.getHeaderText());
     }
 
     @Test
@@ -73,6 +76,6 @@ public class CreateNewVehicleControllerTest extends HighDpiAwareApplicationTest
         Assert.assertNotNull(alertDialog);
 
         DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
-        Assert.assertEquals("Fehler", dialogPane.getHeaderText());
+        Assert.assertEquals(ALERT_TITLE_SERVICE_EXCEPTION, dialogPane.getHeaderText());
     }
 }
-- 
cgit v1.2.3-70-g09d2


From 17556e5701442e9c2a7e219c5d93734812344ebe Mon Sep 17 00:00:00 2001
From: Dominic Rogetzer <e1627756@student.tuwien.ac.at>
Date: Mon, 18 Jun 2018 20:13:05 +0200
Subject: Rename 'einsatzverwaltung' to 'missioncontrol' + remove TODO [#25963]

---
 .../groupphase/application/MainApplication.java    |   4 +-
 .../controller/ArchiveOperationController.java     | 213 ------------
 .../controller/CreateCarController.java            | 231 -------------
 .../controller/CreateNewEmployeeController.java    | 174 ----------
 .../controller/CreateOperationController.java      | 371 ---------------------
 .../controller/CustomListItemController.java       |  24 --
 .../DetailArchiveOperationController.java          |  77 -----
 .../controller/EmployeeListController.java         | 133 --------
 .../controller/EmployeeListItemController.java     |  87 -----
 .../controller/FilterEmployeesController.java      |  65 ----
 .../einsatzverwaltung/controller/Helper.java       |  34 --
 .../controller/ManageEmployeesController.java      | 120 -------
 .../controller/OperationDetailsController.java     | 169 ----------
 .../controller/OperationInArchiveController.java   |  65 ----
 .../controller/RegistrationWindowController.java   | 279 ----------------
 .../controller/VehiclePaneController.java          | 118 -------
 .../einsatzverwaltung/dao/EmployeeDAO.java         |  44 ---
 .../einsatzverwaltung/dao/EmployeeDatabaseDAO.java | 144 --------
 .../einsatzverwaltung/dao/OperationDAO.java        |  48 ---
 .../dao/OperationDatabaseDAO.java                  | 221 ------------
 .../einsatzverwaltung/dao/RegistrationDAO.java     |  28 --
 .../dao/RegistrationDatabaseDAO.java               | 130 --------
 .../einsatzverwaltung/dao/VehicleDAO.java          |  54 ---
 .../einsatzverwaltung/dao/VehicleDatabaseDAO.java  | 211 ------------
 .../groupphase/einsatzverwaltung/dto/Employee.java |  51 ---
 .../einsatzverwaltung/dto/EmployeeValidator.java   |  23 --
 .../einsatzverwaltung/dto/Operation.java           |  70 ----
 .../einsatzverwaltung/dto/Registration.java        |  34 --
 .../dto/RegistrationValidator.java                 | 174 ----------
 .../groupphase/einsatzverwaltung/dto/Vehicle.java  |  73 ----
 .../einsatzverwaltung/service/EmployeeService.java |  46 ---
 .../service/EmployeeServiceImpl.java               |  59 ----
 .../service/OperationService.java                  |  70 ----
 .../service/OperationServiceImpl.java              | 286 ----------------
 .../service/RegistrationService.java               |  32 --
 .../service/RegistrationServiceImpl.java           |  52 ---
 .../einsatzverwaltung/service/VehicleService.java  |  49 ---
 .../service/VehicleServiceImpl.java                | 116 -------
 .../controller/ArchiveOperationController.java     | 213 ++++++++++++
 .../controller/CreateCarController.java            | 231 +++++++++++++
 .../controller/CreateNewEmployeeController.java    | 174 ++++++++++
 .../controller/CreateOperationController.java      | 371 +++++++++++++++++++++
 .../controller/CustomListItemController.java       |  24 ++
 .../DetailArchiveOperationController.java          |  77 +++++
 .../controller/EmployeeListController.java         | 133 ++++++++
 .../controller/EmployeeListItemController.java     |  87 +++++
 .../controller/FilterEmployeesController.java      |  65 ++++
 .../missioncontrol/controller/Helper.java          |  34 ++
 .../controller/ManageEmployeesController.java      | 120 +++++++
 .../controller/OperationDetailsController.java     | 169 ++++++++++
 .../controller/OperationInArchiveController.java   |  65 ++++
 .../controller/RegistrationWindowController.java   | 279 ++++++++++++++++
 .../controller/VehiclePaneController.java          | 118 +++++++
 .../groupphase/missioncontrol/dao/EmployeeDAO.java |  44 +++
 .../missioncontrol/dao/EmployeeDatabaseDAO.java    | 144 ++++++++
 .../missioncontrol/dao/OperationDAO.java           |  48 +++
 .../missioncontrol/dao/OperationDatabaseDAO.java   | 221 ++++++++++++
 .../missioncontrol/dao/RegistrationDAO.java        |  28 ++
 .../dao/RegistrationDatabaseDAO.java               | 130 ++++++++
 .../groupphase/missioncontrol/dao/VehicleDAO.java  |  54 +++
 .../missioncontrol/dao/VehicleDatabaseDAO.java     | 211 ++++++++++++
 .../groupphase/missioncontrol/dto/Employee.java    |  51 +++
 .../missioncontrol/dto/EmployeeValidator.java      |  23 ++
 .../groupphase/missioncontrol/dto/Operation.java   |  70 ++++
 .../missioncontrol/dto/Registration.java           |  34 ++
 .../missioncontrol/dto/RegistrationValidator.java  | 174 ++++++++++
 .../groupphase/missioncontrol/dto/Vehicle.java     |  73 ++++
 .../missioncontrol/service/EmployeeService.java    |  46 +++
 .../service/EmployeeServiceImpl.java               |  59 ++++
 .../missioncontrol/service/OperationService.java   |  70 ++++
 .../service/OperationServiceImpl.java              | 286 ++++++++++++++++
 .../service/RegistrationService.java               |  32 ++
 .../service/RegistrationServiceImpl.java           |  52 +++
 .../missioncontrol/service/VehicleService.java     |  49 +++
 .../missioncontrol/service/VehicleServiceImpl.java | 116 +++++++
 src/main/resources/fxml/ArchiveOperation.fxml      |   2 +-
 .../resources/fxml/CreateOperationController.fxml  |   2 +-
 .../resources/fxml/DetailArchiveOperation.fxml     |   2 +-
 src/main/resources/fxml/OperationDetails.fxml      |   2 +-
 src/main/resources/fxml/OperationInArchive.fxml    |   2 +-
 src/main/resources/fxml/RegistrationWindow.fxml    |   2 +-
 src/main/resources/fxml/createCar.fxml             |   2 +-
 src/main/resources/fxml/createNewEmployee.fxml     |   2 +-
 src/main/resources/fxml/employeeList.fxml          |   2 +-
 src/main/resources/fxml/employeeListItem.fxml      |   2 +-
 .../resources/fxml/filterEmployeesControl.fxml     |   2 +-
 src/main/resources/fxml/manageEmployees.fxml       |   2 +-
 src/main/resources/fxml/vehiclePane.fxml           |   2 +-
 .../CreateNewEmployeeControllerTest.java           |  87 -----
 .../controller/CreateNewVehicleControllerTest.java |  81 -----
 .../controller/GuiTestApplication.java             | 101 ------
 .../controller/RegistrationControllerTest.java     |  22 --
 .../einsatzverwaltung/dao/EmployeeDAOTest.java     | 253 --------------
 .../einsatzverwaltung/dao/OperationDAOTest.java    | 197 -----------
 .../einsatzverwaltung/dao/RegistrationDAOTest.java | 115 -------
 .../einsatzverwaltung/dao/VehicleDAOTest.java      | 161 ---------
 .../service/EmployeeServiceTest.java               |  67 ----
 .../service/OperationServiceIntegrationTest.java   |  97 ------
 .../service/OperationServiceTest.java              | 205 ------------
 .../RegistrationServiceIntegrationTest.java        |  55 ---
 .../service/RegistrationServiceTest.java           | 159 ---------
 .../CreateNewEmployeeControllerTest.java           |  87 +++++
 .../controller/CreateNewVehicleControllerTest.java |  81 +++++
 .../controller/GuiTestApplication.java             | 101 ++++++
 .../controller/RegistrationControllerTest.java     |  22 ++
 .../missioncontrol/dao/EmployeeDAOTest.java        | 253 ++++++++++++++
 .../missioncontrol/dao/OperationDAOTest.java       | 197 +++++++++++
 .../missioncontrol/dao/RegistrationDAOTest.java    | 115 +++++++
 .../missioncontrol/dao/VehicleDAOTest.java         | 161 +++++++++
 .../service/EmployeeServiceTest.java               |  67 ++++
 .../service/OperationServiceIntegrationTest.java   |  97 ++++++
 .../service/OperationServiceTest.java              | 205 ++++++++++++
 .../RegistrationServiceIntegrationTest.java        |  55 +++
 .../service/RegistrationServiceTest.java           | 159 +++++++++
 114 files changed, 5789 insertions(+), 5791 deletions(-)
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ArchiveOperationController.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateCarController.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeController.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateOperationController.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CustomListItemController.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/DetailArchiveOperationController.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListController.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListItemController.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/FilterEmployeesController.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/Helper.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ManageEmployeesController.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/OperationDetailsController.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/OperationInArchiveController.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowController.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/VehiclePaneController.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAO.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAO.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDatabaseDAO.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAO.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDatabaseDAO.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDAO.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDatabaseDAO.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Employee.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/EmployeeValidator.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Operation.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Registration.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/RegistrationValidator.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Vehicle.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeService.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceImpl.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationService.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceImpl.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationService.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceImpl.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleService.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceImpl.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ArchiveOperationController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateCarController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateOperationController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CustomListItemController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/DetailArchiveOperationController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/EmployeeListController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/EmployeeListItemController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/FilterEmployeesController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/Helper.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ManageEmployeesController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationDetailsController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationInArchiveController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/RegistrationWindowController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/VehiclePaneController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAO.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDatabaseDAO.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAO.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDatabaseDAO.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAO.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDatabaseDAO.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAO.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDatabaseDAO.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Employee.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/EmployeeValidator.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Operation.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Registration.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/RegistrationValidator.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Vehicle.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeService.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceImpl.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationService.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceImpl.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationService.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceImpl.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleService.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleServiceImpl.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeControllerTest.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestApplication.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationControllerTest.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAOTest.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAOTest.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDAOTest.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceTest.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceIntegrationTest.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceTest.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceIntegrationTest.java
 delete mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceTest.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeControllerTest.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewVehicleControllerTest.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/GuiTestApplication.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/RegistrationControllerTest.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAOTest.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAOTest.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAOTest.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAOTest.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceTest.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceIntegrationTest.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceTest.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceIntegrationTest.java
 create mode 100644 src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceTest.java

(limited to 'src/test/java/at')

diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/application/MainApplication.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/application/MainApplication.java
index 87daea4..a6c0566 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/application/MainApplication.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/application/MainApplication.java
@@ -1,6 +1,6 @@
 package at.ac.tuwien.sepm.assignment.groupphase.application;
 
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.CreateOperationController;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.CreateOperationController;
 import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
 import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
 import javafx.application.Application;
@@ -34,8 +34,6 @@ public class MainApplication extends Application {
                     Platform.exit();
                 });
 
-        // TODO: close connection on program exit (feedback)
-
         configApplicationContext = new AnnotationConfigApplicationContext(MainApplication.class);
         final var fxmlLoader = configApplicationContext.getBean(SpringFXMLLoader.class);
         primaryStage.setScene(
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ArchiveOperationController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ArchiveOperationController.java
deleted file mode 100644
index 9ac6a1a..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ArchiveOperationController.java
+++ /dev/null
@@ -1,213 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showServiceExceptionAlertAndWait;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
-import java.io.IOException;
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
-import javafx.fxml.FXML;
-import javafx.scene.control.Label;
-import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
-import javafx.scene.layout.AnchorPane;
-import javafx.scene.layout.FlowPane;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class ArchiveOperationController {
-
-    private static final Logger LOG = LoggerFactory.getLogger(ArchiveOperationController.class);
-
-    @FXML private ImageView imvVehicleDetail;
-    @FXML private Label lblStatus;
-    @FXML private AnchorPane apMainDetails;
-    @FXML private Label lblOperations;
-    @FXML private Label lblCompleted;
-    @FXML private Label lblCancelled;
-    @FXML private AnchorPane backApMain;
-    @FXML private AnchorPane backApDetails;
-    @FXML private AnchorPane archiveOperationAP;
-    @FXML private AnchorPane apDetails;
-    @FXML private Label lblCodeHeader;
-    @FXML private Label lblOpCode;
-    @FXML private Label lblVehicles;
-    @FXML private Label lblDate;
-    @FXML private Label lblAddress;
-    @FXML private FlowPane fpVehicles;
-    private final OperationService operationService;
-    @FXML private FlowPane archiveOperationFlowPane;
-    private final CreateOperationController createOperationController;
-    private Set<Operation> list = new HashSet<>();
-    private final SpringFXMLLoader fxmlLoader;
-
-    public ArchiveOperationController(
-            OperationService operationService,
-            CreateOperationController createOperationController,
-            SpringFXMLLoader fxmlLoader) {
-        this.operationService = operationService;
-        this.createOperationController = createOperationController;
-        this.fxmlLoader = fxmlLoader;
-    }
-
-    @FXML
-    private void initialize() {
-        update();
-    }
-
-    public void update() {
-        archiveOperationFlowPane.getChildren().clear();
-        list.clear();
-        try {
-            list.addAll(operationService.list(EnumSet.of(Status.CANCELLED, Status.COMPLETED)));
-            long cancelledAmount = 0;
-            long completedAmount = 0;
-            for (Operation operation : list) {
-                if (operation.status() == Status.CANCELLED) cancelledAmount++;
-                else completedAmount++;
-            }
-            lblCancelled.setText("storniert: " + cancelledAmount);
-            lblCompleted.setText("abgeschlossen: " + completedAmount);
-            lblOperations.setText("Einsätze: " + list.size());
-        } catch (ServiceException e) {
-            LOG.error("ServiceException in update().", e);
-            showServiceExceptionAlertAndWait("Die Einsätze konnten nicht geladen werden!");
-            ;
-        }
-        setFlowPane();
-    }
-
-    private void setFlowPane() {
-        try {
-            archiveOperationFlowPane.getChildren().clear();
-            for (Operation operation : sortSet(list)) {
-                OperationInArchiveController opInAController =
-                        OperationInArchiveController.create();
-                opInAController.set(operation);
-                opInAController
-                        .getRoot()
-                        .setOnMouseClicked(
-                                event -> {
-                                    detailOperation = operation;
-                                    backApMain.setVisible(false);
-                                    apMainDetails.setVisible(false);
-                                    backApDetails.setVisible(true);
-                                    setOperation();
-                                    setDetailsVisible(true);
-                                    imvVehicleDetail.setImage(new Image("/images/Vehicle.png"));
-                                });
-                archiveOperationFlowPane.getChildren().add(opInAController.getRoot());
-            }
-        } catch (IOException e) {
-            LOG.error("IOException in setFlowPane(). ", e);
-            showServiceExceptionAlertAndWait("Die Elemente konnten nicht geladen werden!");
-        }
-    }
-
-    private Operation detailOperation;
-
-    private List<Operation> sortSet(Set<Operation> operationsSet) {
-        Operation[] array = operationsSet.toArray(new Operation[operationsSet.size()]);
-        for (int i = array.length - 1; i > 0; i--) {
-            for (int j = 0; j < i; j++) {
-                LocalDateTime first =
-                        LocalDateTime.ofInstant(
-                                Objects.requireNonNull(array[j].created()), ZoneOffset.UTC);
-                LocalDateTime second =
-                        LocalDateTime.ofInstant(
-                                Objects.requireNonNull(array[j + 1].created()), ZoneOffset.UTC);
-                if (first.isBefore(second)) {
-                    Operation help = array[j];
-                    array[j] = array[j + 1];
-                    array[j + 1] = help;
-                }
-            }
-        }
-        return Arrays.asList(array);
-    }
-
-    private void setOperation() {
-        lblCodeHeader.setText(detailOperation.opCode());
-        if (detailOperation.created() != null) {
-            LocalDateTime dateTime =
-                    LocalDateTime.ofInstant(
-                            Objects.requireNonNull(detailOperation.created()), ZoneOffset.UTC);
-            lblDate.setText(
-                    "am "
-                            + dateTime.getDayOfMonth()
-                            + "."
-                            + dateTime.getMonth().getValue()
-                            + "."
-                            + dateTime.getYear());
-        } else {
-            lblDate.setText("---");
-        }
-        lblStatus.setText(
-                "Status: "
-                        + (detailOperation.status() == Status.CANCELLED
-                                ? "storniert"
-                                : "abgeschlossen"));
-        lblOpCode.setText(detailOperation.opCode());
-        Collection<String> elements =
-                detailOperation.vehicles().stream().map(Vehicle::name).collect(Collectors.toList());
-        String result = String.join(", ", elements);
-
-        lblVehicles.setText(result);
-        lblAddress.setText(detailOperation.destination());
-
-        fpVehicles.getChildren().clear();
-        try {
-            for (Vehicle vehicle : detailOperation.vehicles()) {
-                DetailArchiveOperationController controller = null;
-
-                controller = DetailArchiveOperationController.create(fxmlLoader);
-
-                controller.set(vehicle);
-                fpVehicles.getChildren().add(controller.getRoot());
-            }
-        } catch (IOException e) {
-            LOG.error("IOException in setOperation(). ", e);
-            showServiceExceptionAlertAndWait("Die Element konnte nicht geladen werden!");
-        }
-    }
-
-    private void setDetailsVisible(boolean b) {
-        apDetails.setVisible(b);
-    }
-
-    public void backClicked() {
-        LOG.debug("Hyperlink \"Zurück\" in archive detail view clicked.");
-        fpVehicles.getChildren().clear();
-        setDetailsVisible(false);
-        backApDetails.setVisible(false);
-        apMainDetails.setVisible(true);
-        backApMain.setVisible(true);
-    }
-
-    public void backToMain() {
-        LOG.debug("Hyperlink \"Zurück\" in archive main view clicked.");
-        this.setVisible(false);
-        createOperationController.setVisible(true);
-    }
-
-    void setVisible(boolean b) {
-        archiveOperationAP.setVisible(b);
-        backApMain.setVisible(b);
-        apMainDetails.setVisible(b);
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateCarController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateCarController.java
deleted file mode 100644
index 0734820..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateCarController.java
+++ /dev/null
@@ -1,231 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showServiceExceptionAlertAndWait;
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showSuccessAlertAndWait;
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showValidationErrorAlertAndWait;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.ConstructionType;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import java.io.IOException;
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import javafx.collections.FXCollections;
-import javafx.event.ActionEvent;
-import javafx.fxml.FXML;
-import javafx.scene.control.Button;
-import javafx.scene.control.CheckBox;
-import javafx.scene.control.ChoiceBox;
-import javafx.scene.input.MouseButton;
-import javafx.scene.layout.AnchorPane;
-import javafx.scene.layout.FlowPane;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class CreateCarController {
-
-    @FXML private AnchorPane createCarAP;
-    @FXML private ChoiceBox<String> cmbCtype;
-    @FXML private ChoiceBox<String> cmbTyp;
-
-    @FXML private Button btnCreate;
-    @FXML private CheckBox cbxNEF;
-    @FXML private FlowPane fpVehicleList;
-    private final CreateOperationController createOperationController;
-
-    private static final Logger LOG = LoggerFactory.getLogger(CreateCarController.class);
-    private final VehicleService vehicleService;
-    private boolean update = false;
-    private long vid = -1;
-
-    private Vehicle chooseVehicle;
-
-    public CreateCarController(
-            CreateOperationController createOperationController, VehicleService vehicleService) {
-        this.createOperationController = createOperationController;
-        this.vehicleService = vehicleService;
-    }
-
-    @FXML
-    private void initialize() {
-        fpVehicleList.setHgap(5);
-        fpVehicleList.setVgap(5);
-
-        cmbCtype.setItems(
-                FXCollections.observableArrayList(
-                        Stream.of(
-                                        ConstructionType.NORMAL,
-                                        ConstructionType.MITTELHOCHDACH,
-                                        ConstructionType.HOCHDACH)
-                                .map(Enum::toString)
-                                .collect(Collectors.toList())));
-        cmbCtype.setValue(ConstructionType.NORMAL.toString());
-        cmbTyp.setItems(
-                FXCollections.observableArrayList(
-                        Stream.of(
-                                        VehicleType.BKTW,
-                                        VehicleType.KTW_B,
-                                        VehicleType.KTW,
-                                        VehicleType.RTW,
-                                        VehicleType.NEF,
-                                        VehicleType.NAH)
-                                .map(Enum::toString)
-                                .collect(Collectors.toList())));
-        cmbTyp.setValue(VehicleType.BKTW.toString());
-
-        updateVehiclePane();
-    }
-
-    @FXML
-    private void createCar(ActionEvent actionEvent) {
-
-        if (!update) {
-            LOG.debug("Button \"Erstellen\" clicked.");
-            Vehicle vehicle =
-                    Vehicle.builder()
-                            .constructionType(parseConstructionType())
-                            .type(parseType())
-                            .name("")
-                            .status(Status.ABGEMELDET)
-                            .hasNef(cbxNEF.isSelected())
-                            .build();
-            try {
-                vehicleService.add(vehicle);
-                setToStart();
-            } catch (InvalidVehicleException e) {
-                LOG.debug("Validation of Vehicle failed");
-                showValidationErrorAlertAndWait(e.getMessage());
-                setToStart();
-                return;
-            } catch (ServiceException e) {
-                LOG.error("ServiceException in createCar(). ", e);
-                showServiceExceptionAlertAndWait(
-                        "Ein Fehler beim Erstellen des Fahrzeuges ist aufgetreten.");
-                setToStart();
-                return;
-            }
-            showSuccessAlertAndWait("Auto wurde erfolgreich angelegt.");
-        } else {
-            LOG.debug("Button \"Speichern\" clicked.");
-            try {
-                Vehicle vehicle =
-                        Vehicle.builder()
-                                .id(vid)
-                                .constructionType(parseConstructionType())
-                                .type(parseType())
-                                .name("")
-                                .status(Status.ABGEMELDET)
-                                .hasNef(cbxNEF.isSelected())
-                                .build();
-                vehicleService.update(vehicle);
-                setToStart();
-                chooseVehicle = null;
-            } catch (InvalidVehicleException e) {
-                LOG.debug("Validation of Vehicle failed");
-                showValidationErrorAlertAndWait(e.getMessage());
-                setToStart();
-                return;
-            } catch (ServiceException e) {
-                LOG.error("ServiceException in createCar(). ", e);
-                showServiceExceptionAlertAndWait(e.getMessage());
-                setToStart();
-                return;
-            }
-            showSuccessAlertAndWait("Auto wurde erfolgreich bearbeitet.");
-        }
-
-        updateVehiclePane();
-    }
-
-    private ConstructionType parseConstructionType() {
-        if (cmbCtype.getSelectionModel().getSelectedItem() == null) {
-            return ConstructionType.NORMAL;
-        }
-        return ConstructionType.valueOf(cmbCtype.getSelectionModel().getSelectedItem());
-    }
-
-    private VehicleType parseType() {
-        if (cmbTyp.getSelectionModel().getSelectedItem() == null) {
-            return VehicleType.BKTW;
-        }
-        return VehicleType.valueOf(cmbTyp.getSelectionModel().getSelectedItem());
-    }
-
-    private void setToStart() {
-        btnCreate.setText("Erstellen");
-        cbxNEF.setSelected(false);
-        cmbTyp.setValue(VehicleType.BKTW.name());
-        cmbCtype.setValue(ConstructionType.NORMAL.name());
-        update = false;
-    }
-
-    private void updateVehicle(Vehicle vehicle) {
-
-        cmbCtype.setValue(vehicle.constructionType().name());
-        cmbTyp.setValue(vehicle.type().name());
-        cbxNEF.setSelected(vehicle.hasNef());
-        btnCreate.setText("Speichern");
-        vid = vehicle.id();
-        update = true;
-        chooseVehicle = vehicle;
-    }
-
-    public void setVisible(boolean b) {
-        createCarAP.setVisible(b);
-    }
-
-    @FXML
-    private void backToMain() {
-        LOG.debug("Hyperlink \"zurück\" clicked.");
-        this.setVisible(false);
-        createOperationController.setVisible(true);
-    }
-
-    private void updateVehiclePane() {
-        try {
-            fpVehicleList.getChildren().clear();
-
-            Set<Vehicle> vehicles;
-
-            vehicles = vehicleService.list(EnumSet.of(Status.ABGEMELDET));
-
-            for (Vehicle vehicle : vehicles) {
-                VehiclePaneController controller = VehiclePaneController.createVehiclePane();
-
-                controller.setData(vehicle, false, false);
-                controller
-                        .getRootElement()
-                        .setOnMouseClicked(
-                                event -> {
-                                    if (event.getButton().equals(MouseButton.PRIMARY)) {
-                                        if (chooseVehicle == null || vehicle == chooseVehicle) {
-                                            if (update == false) {
-                                                chooseVehicle = vehicle;
-                                                updateVehicle(vehicle);
-                                                controller.setSelected(true);
-                                            } else {
-                                                setToStart();
-                                                controller.setSelected(false);
-
-                                                chooseVehicle = null;
-                                            }
-                                        }
-                                    }
-                                });
-
-                fpVehicleList.getChildren().add(controller.getRootElement());
-            }
-        } catch (ServiceException | IOException e) {
-            LOG.error("Exception in updateVehiclePane(). ", e);
-            showServiceExceptionAlertAndWait(e.getMessage());
-        }
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeController.java
deleted file mode 100644
index 5f0a8b2..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeController.java
+++ /dev/null
@@ -1,174 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showServiceExceptionAlertAndWait;
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showSuccessAlertAndWait;
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showValidationErrorAlertAndWait;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper;
-import java.io.IOException;
-import java.time.LocalDate;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import javafx.collections.FXCollections;
-import javafx.fxml.FXML;
-import javafx.scene.Node;
-import javafx.scene.control.Button;
-import javafx.scene.control.CheckBox;
-import javafx.scene.control.ChoiceBox;
-import javafx.scene.control.Label;
-import javafx.scene.control.TextField;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Controller;
-
-@Controller
-@Scope("prototype")
-public class CreateNewEmployeeController {
-
-    private static final Logger LOG = LoggerFactory.getLogger(CreateNewEmployeeController.class);
-    private final EmployeeService employeeService;
-
-    @FXML private Label lblHeader;
-    @FXML private CheckBox inputIsDriver;
-    @FXML private CheckBox inputIsPilot;
-    @FXML private TextField inputName;
-    @FXML private ChoiceBox<String> inputQualification;
-    @FXML private Button btnCreate;
-
-    private Node rootElement;
-    private Employee employee;
-    private boolean isEdit;
-
-    private Runnable consumerCancelClicked;
-    private Runnable consumerCreateClicked;
-
-    public CreateNewEmployeeController(EmployeeService employeeService) {
-        this.employeeService = employeeService;
-    }
-
-    @FXML
-    private void initialize() {
-        inputQualification.setItems(
-                FXCollections.observableArrayList(
-                        Stream.of(
-                                        EducationLevel.RS,
-                                        EducationLevel.NFS,
-                                        EducationLevel.NKV,
-                                        EducationLevel.NKA,
-                                        EducationLevel.NKI,
-                                        EducationLevel.NA)
-                                .map(Enum::toString)
-                                .collect(Collectors.toList())));
-
-        inputQualification.setValue(EducationLevel.RS.toString());
-        employee =
-                Employee.builder()
-                        .name("")
-                        .educationLevel(EducationLevel.RS)
-                        .isDriver(false)
-                        .isPilot(false)
-                        .birthday(LocalDate.MIN)
-                        .build();
-    }
-
-    @FXML
-    private void onCancelClicked() {
-        LOG.debug("Hyperlink \"abbrechen\" clicked.");
-        if (consumerCancelClicked != null) {
-            consumerCancelClicked.run();
-        }
-    }
-
-    @FXML
-    private void onCreateClicked() {
-        LOG.debug("Button {} clicked.", btnCreate.getText());
-
-        employee =
-                employee.toBuilder()
-                        .name(inputName.getText())
-                        .educationLevel(parseEducationLevel())
-                        .birthday(LocalDate.MIN) // TODO: change UI to include birthday field
-                        .isDriver(inputIsDriver.isSelected())
-                        .isPilot(inputIsPilot.isSelected())
-                        .build();
-
-        try {
-            if (isEdit) {
-                employeeService.update(employee);
-            } else {
-                employeeService.add(employee);
-            }
-        } catch (InvalidEmployeeException e) {
-            LOG.debug("Validation for Employee failed");
-            showValidationErrorAlertAndWait(e.getMessage());
-            return;
-        } catch (ServiceException e) {
-            LOG.error("ServiceException in onCreateClicked(). ", e);
-            showServiceExceptionAlertAndWait(
-                    "Der Eintrag konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.");
-            return;
-        }
-
-        showSuccessAlertAndWait(
-                "Der/die MitarbeiterIn wurde erfolgreich angelegt und gespeichert!");
-
-        if (consumerCreateClicked != null) {
-            consumerCreateClicked.run();
-        }
-    }
-
-    private EducationLevel parseEducationLevel() {
-        if (inputQualification.getSelectionModel().getSelectedItem() == null) {
-            return EducationLevel.RS;
-        }
-        return EducationLevel.valueOf(inputQualification.getSelectionModel().getSelectedItem());
-    }
-
-    private void setData(Employee employee) {
-        isEdit = true;
-        this.employee = employee;
-        inputName.setText(employee.name());
-        inputQualification.setValue(employee.educationLevel().name());
-        inputIsDriver.setSelected(employee.isDriver());
-        inputIsPilot.setSelected(employee.isPilot());
-        lblHeader.setText("Person bearbeiten");
-        btnCreate.setText("Speichern");
-    }
-
-    public static CreateNewEmployeeController createCreateNewEmployeeController(
-            SpringFXMLLoader fxmlLoader, Employee employee) throws IOException {
-        CreateNewEmployeeController controller = createCreateNewEmployeeController(fxmlLoader);
-        controller.setData(employee);
-        return controller;
-    }
-
-    public static CreateNewEmployeeController createCreateNewEmployeeController(
-            SpringFXMLLoader fxmlLoader) throws IOException {
-        FXMLWrapper<Object, CreateNewEmployeeController> wrapper =
-                fxmlLoader.loadAndWrap(
-                        "/fxml/createNewEmployee.fxml", CreateNewEmployeeController.class);
-        Node root = (Node) wrapper.getLoadedObject();
-        CreateNewEmployeeController controller = wrapper.getController();
-        controller.rootElement = root;
-        return controller;
-    }
-
-    public Node getRootElement() {
-        return rootElement;
-    }
-
-    public void setConsumerCancelClicked(Runnable consumerCancelClicked) {
-        this.consumerCancelClicked = consumerCancelClicked;
-    }
-
-    public void setConsumerCreateClicked(Runnable consumerCreateClicked) {
-        this.consumerCreateClicked = consumerCreateClicked;
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateOperationController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateOperationController.java
deleted file mode 100644
index 19ed7bf..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateOperationController.java
+++ /dev/null
@@ -1,371 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showServiceExceptionAlertAndWait;
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showSuccessAlertAndWait;
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showValidationErrorAlertAndWait;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationService;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import java.io.IOException;
-import java.time.Instant;
-import java.time.temporal.ChronoUnit;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import javafx.collections.FXCollections;
-import javafx.fxml.FXML;
-import javafx.scene.control.Button;
-import javafx.scene.control.ContextMenu;
-import javafx.scene.control.Label;
-import javafx.scene.control.ListCell;
-import javafx.scene.control.ListView;
-import javafx.scene.control.MenuItem;
-import javafx.scene.control.TextField;
-import javafx.scene.input.KeyCode;
-import javafx.scene.input.KeyEvent;
-import javafx.scene.input.MouseButton;
-import javafx.scene.layout.AnchorPane;
-import javafx.scene.layout.FlowPane;
-import javafx.scene.layout.GridPane;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class CreateOperationController {
-
-    private static final Logger LOG = LoggerFactory.getLogger(CreateOperationController.class);
-
-    public AnchorPane apCreateOperation;
-    @FXML private GridPane grdWindowContainer;
-    @FXML private TextField txtCode;
-    @FXML private TextField txtAddress;
-    @FXML private TextField txtNote;
-    @FXML private Button btnCreateOperation;
-    @FXML private ListView<Vehicle> lvVehicles;
-    @FXML private ListView<Operation> lvActiveOperations;
-    @FXML private Label lblChosenVehicles;
-    @FXML private AnchorPane apInvisible;
-    @FXML private OperationDetailsController operationDetailsController;
-    @FXML private ManageEmployeesController manageEmployeesController;
-    @FXML private CreateCarController createCarController;
-    @FXML private RegistrationWindowController registrationWindowController;
-    @FXML private ArchiveOperationController archiveOperationController;
-    @FXML private FlowPane fpVehicles;
-
-    private LinkedList<Vehicle> chosenVehicles = new LinkedList<>();
-
-    private final OperationService operationService;
-    private final VehicleService vehicleService;
-
-    public CreateOperationController(
-            OperationService operationService, VehicleService vehicleService) {
-        this.operationService = operationService;
-        this.vehicleService = vehicleService;
-    }
-
-    @FXML
-    private void initialize() {
-
-        lblChosenVehicles.setText("keine ausgewählt");
-        lvActiveOperations.setCellFactory(param -> generateOpCodeListItem());
-
-        lvActiveOperations.setOnMouseClicked(
-                event -> {
-                    if (event.getClickCount() == 2) {
-                        if (lvActiveOperations.getSelectionModel().getSelectedItem() == null) {
-                            return;
-                        }
-                        openDetailsWindow(lvActiveOperations.getSelectionModel().getSelectedItem());
-                    }
-                });
-
-        setVisible(true);
-        createCarController.setVisible(false);
-        registrationWindowController.setVisible(false);
-    }
-
-    public void updateList() {
-        try {
-            fpVehicles.getChildren().clear();
-
-            // TODO: this should probably be handled differently
-            Set<Vehicle> vehicles;
-            if (txtCode.getText().isEmpty()) {
-                vehicles =
-                        vehicleService.list(
-                                EnumSet.complementOf(EnumSet.of(Vehicle.Status.ABGEMELDET)));
-            } else {
-                vehicles = operationService.rankVehicles(txtCode.getText());
-            }
-
-            for (Vehicle vehicle : vehicles) {
-                VehiclePaneController controller = VehiclePaneController.createVehiclePane();
-
-                controller.setData(vehicle, true, false);
-                controller
-                        .getRootElement()
-                        .setOnMouseClicked(
-                                event -> {
-                                    if (event.getButton().equals(MouseButton.SECONDARY)) {
-                                        createContextMenu(vehicle, vehicleService)
-                                                .show(
-                                                        controller.getRootElement(),
-                                                        event.getScreenX(),
-                                                        event.getScreenY());
-                                    } else {
-                                        if (chosenVehicles.contains(vehicle)) {
-                                            chosenVehicles.remove(vehicle);
-                                            controller.setSelected(false);
-                                        } else {
-                                            chosenVehicles.add(vehicle);
-                                            controller.setSelected(true);
-                                        }
-
-                                        StringBuilder result = new StringBuilder();
-                                        for (int i = 0; i < chosenVehicles.size(); i++) {
-                                            if (i == chosenVehicles.size() - 1) {
-                                                result.append(chosenVehicles.get(i).name());
-                                            } else {
-                                                result.append(chosenVehicles.get(i).name())
-                                                        .append(", ");
-                                            }
-                                        }
-                                        if (result.toString().equals("")) {
-                                            lblChosenVehicles.setText("keine ausgewählt");
-                                        } else {
-                                            lblChosenVehicles.setText(result.toString());
-                                        }
-                                    }
-                                });
-
-                if (chosenVehicles.stream().anyMatch(v -> v.id() == vehicle.id()))
-                    controller.setSelected(true);
-
-                fpVehicles.getChildren().add(controller.getRootElement());
-            }
-        } catch (ServiceException | IOException e) {
-            LOG.error("Exception in updateList(). ", e);
-            showServiceExceptionAlertAndWait(
-                    "Beim Erstellen des Ranking ist ein Fehler aufgetreten.");
-        } catch (InvalidOperationException e) {
-            LOG.debug("Validation error in updateList(). ", e);
-            showValidationErrorAlertAndWait(e.getMessage());
-        }
-        try {
-            lvActiveOperations.setItems(
-                    FXCollections.observableArrayList(
-                            operationService.list(EnumSet.of(Status.ACTIVE))));
-        } catch (ServiceException e) {
-            LOG.error("ServiceException in updateList(). ", e);
-            showServiceExceptionAlertAndWait(
-                    "Beim Holen der aktiven Einsätze ist ein Fehler aufgetreten");
-        }
-    }
-
-    private ContextMenu createContextMenu(Vehicle data, VehicleService vehicleService) {
-        ContextMenu menu = new ContextMenu();
-
-        for (Vehicle.Status status : Vehicle.Status.values()) {
-            if (status == Vehicle.Status.ABGEMELDET) {
-                continue;
-            }
-
-            MenuItem mi = new MenuItem(status.name());
-
-            if (status == Vehicle.Status.FREI_FUNK || status == Vehicle.Status.FREI_WACHE) {
-                mi.getStyleClass().add("mi-free");
-            } else {
-                mi.getStyleClass().add("mi-other");
-            }
-
-            mi.setOnAction(
-                    event -> {
-                        try {
-                            vehicleService.update(data.toBuilder().status(status).build());
-                            this.updateList();
-                        } catch (InvalidVehicleException e) {
-                            LOG.debug(
-                                    "Validation error in createContextMenu(). (mi.setOnAction) ",
-                                    e);
-                            showValidationErrorAlertAndWait(e.getMessage());
-                        } catch (ServiceException e) {
-                            LOG.error("Exception in createContextMenu(). (mi.setOnAction) ", e);
-                            showServiceExceptionAlertAndWait(
-                                    "Beim Aktualisieren der Fahrzeuge ist ein Fehler aufgetreten.");
-                        }
-                    });
-
-            menu.getItems().add(mi);
-        }
-
-        MenuItem abmelden = new MenuItem("abmelden");
-
-        abmelden.setOnAction(
-                event -> {
-                    try {
-                        List<Registration> registrations = data.registrations();
-                        assert registrations
-                                != null; // Otherwise the element shouldn't be in the list.
-
-                        List<Registration> newRegistrations = new ArrayList<>();
-                        Instant now = Instant.now();
-
-                        for (Registration registration : registrations) {
-                            if (registration.start().isBefore(now)
-                                    && registration.end().isAfter(now)) {
-                                newRegistrations.add(
-                                        registration
-                                                .toBuilder()
-                                                .end(Instant.now().minus(1, ChronoUnit.SECONDS))
-                                                .build());
-                            } else newRegistrations.add(registration);
-                        }
-
-                        vehicleService.update(
-                                data.toBuilder()
-                                        .registrations(newRegistrations)
-                                        .status(Vehicle.Status.ABGEMELDET)
-                                        .build());
-
-                        this.updateList();
-                    } catch (InvalidVehicleException e) {
-                        LOG.debug(
-                                "Validation error in createContextMenu(). (abmelden.setOnAction) ",
-                                e);
-                        showValidationErrorAlertAndWait(e.getMessage());
-                    } catch (ServiceException e) {
-                        LOG.error("Exception in createContextMenu(). (abmelden.setOnAction) ", e);
-                        showServiceExceptionAlertAndWait(
-                                "Beim Aktualisieren der Fahrzeuge ist ein Fehler aufgetreten.");
-                    }
-                });
-
-        menu.getItems().add(abmelden);
-        return menu;
-    }
-
-    @FXML
-    protected void createOperationClicked() {
-        LOG.debug("Button \"Erstellen\" clicked.");
-        Vehicle[] vehicles = new Vehicle[chosenVehicles.size()];
-        for (int i = 0; i < chosenVehicles.size(); i++) {
-            vehicles[i] = chosenVehicles.get(i);
-        }
-        Operation operation =
-                Operation.builder()
-                        .additionalInfo(txtNote.getText())
-                        .destination(txtAddress.getText())
-                        .opCode(txtCode.getText())
-                        .status(Status.ACTIVE)
-                        .vehicles(Set.of(vehicles))
-                        .build();
-        try {
-            operationService.add(operation);
-        } catch (ServiceException e) {
-            LOG.error("Exception in createOperationClicked(). ", e);
-            showServiceExceptionAlertAndWait(
-                    "Beim Erstellen des Einsatzes ist ein Fehler aufgetreten.");
-            return;
-        } catch (InvalidOperationException e) {
-            LOG.debug("Validation error in createOperationClicked(). ", e);
-            showValidationErrorAlertAndWait(e.getMessage());
-            return;
-        }
-        showSuccessAlertAndWait("Der Einsatz wurde erfolgreich gespeichert.");
-        updateList();
-        lblChosenVehicles.setText("keine ausgewählt");
-        txtAddress.setText("");
-        txtCode.setText("");
-        txtNote.setText("");
-        chosenVehicles = new LinkedList<>();
-    }
-
-    @FXML
-    private void onRegistrationLinkClicked() {
-        LOG.debug("Hyperlink \"Anmeldungen\" clicked.");
-        openRegistrationWindow();
-    }
-
-    @FXML
-    private void onEmployeeLinkClicked() {
-        LOG.debug("Hyperlink \"Personen\" clicked.");
-        openCreateNewEmployeeWindow();
-    }
-
-    @FXML
-    private void onVehicleLinkClicked() {
-        LOG.debug("Hyperlink \"Fahrzeuge\" clicked.");
-        openCreateCarWindow();
-    }
-
-    @FXML
-    private void onArchivLinkClicked() {
-        LOG.debug("Hyperlink \"Archiv\" clicked.");
-        archiveOperationController.update();
-        openArchivWindow();
-    }
-
-    private void openArchivWindow() {
-        archiveOperationController.setVisible(true);
-        this.setVisible(false);
-    }
-
-    void setVisible(boolean b) {
-        apInvisible.setVisible(!b);
-        grdWindowContainer.setVisible(!b);
-
-        updateList();
-    }
-
-    private void openDetailsWindow(Operation operation) {
-        operationDetailsController.initOperation(operation);
-        this.setVisible(false);
-    }
-
-    private void openCreateNewEmployeeWindow() {
-        this.setVisible(false);
-        manageEmployeesController.setVisible(true);
-    }
-
-    private void openCreateCarWindow() {
-        this.setVisible(false);
-        createCarController.setVisible(true);
-    }
-
-    private void openRegistrationWindow() {
-        this.setVisible(false);
-        registrationWindowController.setVisible(true);
-    }
-
-    @FXML
-    private void onOperationCodeChanged(KeyEvent keyEvent) {
-        if (keyEvent.getCode() == KeyCode.ENTER) {
-            updateList();
-        }
-    }
-
-    static ListCell<Operation> generateOpCodeListItem() {
-        return new ListCell<>() {
-            @Override
-            protected void updateItem(Operation item, boolean empty) {
-                super.updateItem(item, empty);
-
-                if (empty || item == null || item.opCode() == null) {
-                    setText(null);
-                } else {
-                    setText(item.opCode());
-                }
-            }
-        };
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CustomListItemController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CustomListItemController.java
deleted file mode 100644
index 79cf243..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CustomListItemController.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import javafx.scene.Node;
-
-public abstract class CustomListItemController {
-
-    protected Node rootElement;
-
-    public Node getRootElement() {
-        return rootElement;
-    }
-
-    public void setSelected(boolean selected) {
-        rootElement.getStyleClass().clear();
-
-        if (selected) {
-            rootElement.getStyleClass().add("bg-yellow");
-            rootElement.getStyleClass().add("shadowed");
-        } else {
-            rootElement.getStyleClass().add("bg-white");
-            rootElement.getStyleClass().add("shadowed");
-        }
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/DetailArchiveOperationController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/DetailArchiveOperationController.java
deleted file mode 100644
index 41bd2a6..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/DetailArchiveOperationController.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showServiceExceptionAlertAndWait;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper;
-import java.io.IOException;
-import java.util.Objects;
-import javafx.fxml.FXML;
-import javafx.scene.Node;
-import javafx.scene.layout.VBox;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class DetailArchiveOperationController {
-    private static final Logger LOG =
-            LoggerFactory.getLogger(DetailArchiveOperationController.class);
-
-    @FXML private VBox vBoxVehicle;
-    @FXML private VBox vBoxPeople;
-    private final SpringFXMLLoader fxmlLoader;
-
-    public DetailArchiveOperationController(SpringFXMLLoader fxmlLoader) {
-        this.fxmlLoader = fxmlLoader;
-    }
-
-    static DetailArchiveOperationController create(SpringFXMLLoader fxmlLoader) throws IOException {
-        FXMLWrapper<Object, DetailArchiveOperationController> wrapper =
-                fxmlLoader.loadAndWrap(
-                        "/fxml/DetailArchiveOperation.fxml",
-                        DetailArchiveOperationController.class);
-
-        Node root = (Node) wrapper.getLoadedObject();
-        DetailArchiveOperationController result = wrapper.getController();
-        result.rootElement = root;
-
-        return result;
-    }
-
-    public Node getRoot() {
-        return rootElement;
-    }
-
-    private Node rootElement;
-
-    public void set(Vehicle vehicle) {
-        VehiclePaneController controller;
-        try {
-            controller = VehiclePaneController.createVehiclePane();
-            controller.setData(vehicle, false, false);
-            vBoxVehicle.getChildren().add(controller.getRootElement());
-        } catch (IOException e) {
-            LOG.error("IOException in set(Vehicle). (vBoxVehicle) ", e);
-            showServiceExceptionAlertAndWait(
-                    "Ein interner Fehler ist aufgetreten. Bitte wenden Sie sich an den/die SystemadministratorIn.");
-        }
-        try {
-            for (int i = 0; i < Objects.requireNonNull(vehicle.registrations()).size(); i++) {
-                Employee employee =
-                        Objects.requireNonNull(vehicle.registrations()).get(i).employee();
-
-                EmployeeListItemController employeeListItemController =
-                        EmployeeListItemController.createEmployeeListItemController(
-                                fxmlLoader, employee);
-                vBoxPeople.getChildren().add(employeeListItemController.getRootElement());
-            }
-        } catch (IOException e) {
-            LOG.error("IOException in set(Vehicle). (vBoxPeople) ", e);
-            showServiceExceptionAlertAndWait(
-                    "Ein interner Fehler ist aufgetreten. Bitte wenden Sie sich an den/die SystemadministratorIn.");
-        }
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListController.java
deleted file mode 100644
index 6e1159a..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListController.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.function.Consumer;
-import javafx.fxml.FXML;
-import javafx.geometry.Insets;
-import javafx.scene.Node;
-import javafx.scene.layout.FlowPane;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Controller;
-
-@Controller
-@Scope("prototype")
-public class EmployeeListController {
-
-    private static final Logger LOG = LoggerFactory.getLogger(EmployeeListController.class);
-
-    @FXML private FlowPane flowPaneEmployeeList;
-
-    private Consumer<Employee> onEmployeeClicked;
-
-    private final SpringFXMLLoader fxmlLoader;
-    private Node rootElement;
-    private List<EmployeeListItemController> employeeListItemControllers;
-    private Insets listItemMargins = new Insets(10, 5, 0, 5);
-
-    public EmployeeListController(SpringFXMLLoader fxmlLoader) {
-        this.fxmlLoader = fxmlLoader;
-        this.employeeListItemControllers = new ArrayList<>();
-    }
-
-    public void setListItemMargins(Insets value) {
-        this.listItemMargins = value;
-    }
-
-    public void setData(Set<Employee> employeeList) {
-        setData(employeeList, null, null);
-    }
-
-    public void setData(Set<Employee> employeeList, Consumer<Employee> onEmployeeClicked) {
-        setData(employeeList, onEmployeeClicked, null);
-    }
-
-    public void setData(
-            Set<Employee> employeeList,
-            Consumer<Employee> onEmployeeClicked,
-            Consumer<EmployeeListItemController> onEmployeeListItemClicked) {
-
-        flowPaneEmployeeList.getChildren().clear();
-        employeeListItemControllers.clear();
-        employeeList.forEach(
-                employee ->
-                        addEmployeeToFlowPane(
-                                employee, onEmployeeClicked, onEmployeeListItemClicked));
-    }
-
-    private void addEmployeeToFlowPane(
-            Employee employee,
-            Consumer<Employee> onEmployeeClicked,
-            Consumer<EmployeeListItemController> onEmployeeListItemClicked) {
-
-        try {
-            EmployeeListItemController controller =
-                    EmployeeListItemController.createEmployeeListItemController(
-                            fxmlLoader, employee);
-            Node rootElement = controller.getRootElement();
-            flowPaneEmployeeList.getChildren().add(rootElement);
-            employeeListItemControllers.add(controller);
-            FlowPane.setMargin(rootElement, listItemMargins);
-            if (onEmployeeClicked != null) {
-                controller.setConsumerEmployeeClicked(onEmployeeClicked);
-            }
-            if (onEmployeeListItemClicked != null) {
-                controller.setConsumerEmployeeListItemClicked(
-                        employeeListItemController -> {
-                            onEmployeeListItemClicked.accept(employeeListItemController);
-                            if (this.onEmployeeClicked != null) {
-                                this.onEmployeeClicked.accept(
-                                        employeeListItemController.getEmployee());
-                            }
-                        });
-            }
-        } catch (IOException e) {
-            LOG.error("IOException in addEmployeeToFlowPane. ", e);
-        }
-    }
-
-    private void setEmployeeSelected(Employee employee, boolean selected) {
-        employeeListItemControllers
-                .stream()
-                .filter(controller -> controller.getEmployee().equals(employee))
-                .forEach(controller -> controller.setSelected(selected));
-    }
-
-    public void selectEmployee(Employee employee) {
-        setEmployeeSelected(employee, true);
-    }
-
-    public void deselectEmployee(Employee employee) {
-        setEmployeeSelected(employee, false);
-    }
-
-    public void deselectAllEmployees() {
-        employeeListItemControllers.forEach(
-                employeeListItemController -> employeeListItemController.setSelected(false));
-    }
-
-    public static EmployeeListController createEmployeeListController(SpringFXMLLoader loader)
-            throws IOException {
-        FXMLWrapper<Object, EmployeeListController> wrapper =
-                loader.loadAndWrap("/fxml/employeeList.fxml", EmployeeListController.class);
-        Node root = (Node) wrapper.getLoadedObject();
-        EmployeeListController controller = wrapper.getController();
-        controller.rootElement = root;
-        return controller;
-    }
-
-    public Node getRootElement() {
-        return rootElement;
-    }
-
-    public void setOnEmployeeClicked(Consumer<Employee> onEmployeeClicked) {
-        this.onEmployeeClicked = onEmployeeClicked;
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListItemController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListItemController.java
deleted file mode 100644
index 7b5910a..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListItemController.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper;
-import java.io.IOException;
-import java.util.function.Consumer;
-import javafx.fxml.FXML;
-import javafx.scene.Node;
-import javafx.scene.control.Label;
-import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Controller;
-
-@Controller
-@Scope("prototype")
-public class EmployeeListItemController extends CustomListItemController {
-
-    @FXML private Label lblName;
-    @FXML private Label lblQualification;
-    @FXML private Label lblPilot;
-    @FXML private Label lblDriver;
-    @FXML private ImageView imgPilot;
-    @FXML private ImageView imgDriver;
-    @FXML private ImageView imgQualification;
-
-    private Employee employee;
-
-    private Consumer<Employee> consumerEmployeeClicked;
-    private Consumer<EmployeeListItemController> consumerEmployeeListItemClicked;
-
-    @FXML
-    private void onEmployeeClicked() {
-        if (consumerEmployeeClicked != null) {
-            consumerEmployeeClicked.accept(employee);
-        }
-        if (consumerEmployeeListItemClicked != null) {
-            consumerEmployeeListItemClicked.accept(this);
-        }
-    }
-
-    private void setData(Employee employee) {
-        this.employee = employee;
-        lblName.setText(employee.name());
-        lblQualification.setText(employee.educationLevel().name());
-        lblPilot.setText(String.format("%s Pilot", employee.isPilot() ? "ist" : "nicht"));
-        lblDriver.setText(String.format("%s Fahrer", employee.isDriver() ? "ist" : "nicht"));
-        imgQualification.setImage(new Image("/images/Qualification.png"));
-        String imgSrcPilot =
-                String.format("/images/%s", employee.isPilot() ? "Pilot.png" : "NotPilot.png");
-        imgPilot.setImage(new Image(imgSrcPilot));
-        String imgSrcDriver =
-                String.format("/images/%s", employee.isDriver() ? "Driver.png" : "NotDriver.png");
-        imgDriver.setImage(new Image(imgSrcDriver));
-    }
-
-    public static EmployeeListItemController createEmployeeListItemController(
-            SpringFXMLLoader fxmlLoader, Employee employee) throws IOException {
-        EmployeeListItemController controller = createEmployeeListItemController(fxmlLoader);
-        controller.setData(employee);
-        return controller;
-    }
-
-    public static EmployeeListItemController createEmployeeListItemController(
-            SpringFXMLLoader loader) throws IOException {
-        FXMLWrapper<Object, EmployeeListItemController> wrapper =
-                loader.loadAndWrap("/fxml/employeeListItem.fxml", EmployeeListItemController.class);
-        Node root = (Node) wrapper.getLoadedObject();
-        EmployeeListItemController controller = wrapper.getController();
-        controller.rootElement = root;
-        return controller;
-    }
-
-    public Employee getEmployee() {
-        return employee;
-    }
-
-    public void setConsumerEmployeeClicked(Consumer<Employee> consumerEmployeeClicked) {
-        this.consumerEmployeeClicked = consumerEmployeeClicked;
-    }
-
-    public void setConsumerEmployeeListItemClicked(
-            Consumer<EmployeeListItemController> consumerEmployeeListItemClicked) {
-        this.consumerEmployeeListItemClicked = consumerEmployeeListItemClicked;
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/FilterEmployeesController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/FilterEmployeesController.java
deleted file mode 100644
index a1d1f70..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/FilterEmployeesController.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper;
-import java.io.IOException;
-import java.util.function.Consumer;
-import javafx.fxml.FXML;
-import javafx.scene.Node;
-import javafx.scene.control.TextField;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Controller;
-
-@Controller
-@Scope("prototype")
-public class FilterEmployeesController {
-    private static final Logger LOG = LoggerFactory.getLogger(FilterEmployeesController.class);
-
-    @FXML private TextField inputFilterString;
-
-    private Consumer<String> consumerFilterTextChanged;
-    private Runnable consumerAddEmployeeClicked;
-
-    private Node rootElement;
-
-    @FXML
-    private void onAddEmployeeClicked() {
-        LOG.debug("Button \"Person hinzufügen\" clicked.");
-        if (consumerAddEmployeeClicked != null) {
-            consumerAddEmployeeClicked.run();
-        }
-    }
-
-    @FXML
-    private void onFilterTextChanged() {
-        LOG.debug("Filter text changed.");
-        if (consumerFilterTextChanged != null) {
-            consumerFilterTextChanged.accept(inputFilterString.getText());
-        }
-    }
-
-    public void setOnFilterTextChangedListener(Consumer<String> callback) {
-        this.consumerFilterTextChanged = callback;
-    }
-
-    public void setOnAddEmployeeClickedListener(Runnable callback) {
-        this.consumerAddEmployeeClicked = callback;
-    }
-
-    public static FilterEmployeesController createFilterEmployeesController(
-            SpringFXMLLoader fxmlLoader) throws IOException {
-        FXMLWrapper<Object, FilterEmployeesController> wrapper =
-                fxmlLoader.loadAndWrap(
-                        "/fxml/filterEmployeesControl.fxml", FilterEmployeesController.class);
-        Node root = (Node) wrapper.getLoadedObject();
-        FilterEmployeesController controller = wrapper.getController();
-        controller.rootElement = root;
-        return controller;
-    }
-
-    public Node getRootElement() {
-        return rootElement;
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/Helper.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/Helper.java
deleted file mode 100644
index 694c804..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/Helper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import javafx.scene.control.Alert;
-import javafx.scene.control.Alert.AlertType;
-import javafx.scene.control.ButtonType;
-
-public class Helper {
-
-    static final String ALERT_TITLE_VALIDATION_ERROR = "Validierungsfehler";
-    static final String ALERT_TITLE_SERVICE_EXCEPTION = "Fehler";
-    static final String ALERT_TITLE_SUCCESS = "Erfolg";
-
-    private Helper() {} // SonarLint insisted to create a private constructor to hide the public one
-
-    static void showValidationErrorAlertAndWait(String message) {
-        showAlertWithOkButtonAndWait(AlertType.ERROR, ALERT_TITLE_VALIDATION_ERROR, message);
-    }
-
-    static void showServiceExceptionAlertAndWait(String message) {
-        showAlertWithOkButtonAndWait(AlertType.ERROR, ALERT_TITLE_SERVICE_EXCEPTION, message);
-    }
-
-    static void showSuccessAlertAndWait(String message) {
-        showAlertWithOkButtonAndWait(AlertType.INFORMATION, ALERT_TITLE_SUCCESS, message);
-    }
-
-    static void showAlertWithOkButtonAndWait(
-            AlertType alertType, String headerText, String contentText) {
-        Alert alert = new Alert(alertType, contentText, ButtonType.OK);
-        alert.setTitle(headerText);
-        alert.setHeaderText(headerText);
-        alert.showAndWait();
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ManageEmployeesController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ManageEmployeesController.java
deleted file mode 100644
index 3aaf040..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ManageEmployeesController.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.stream.Collectors;
-import javafx.fxml.FXML;
-import javafx.scene.layout.AnchorPane;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class ManageEmployeesController {
-
-    private static final Logger LOG = LoggerFactory.getLogger(ManageEmployeesController.class);
-    @FXML private AnchorPane listEmployeesAP;
-    @FXML private AnchorPane containerHeader;
-    @FXML private EmployeeListController employeeListController;
-
-    private final EmployeeService employeeService;
-    private final SpringFXMLLoader fxmlLoader;
-
-    private final CreateOperationController createOperationController;
-
-    public ManageEmployeesController(
-            EmployeeService employeeService,
-            SpringFXMLLoader fxmlLoader,
-            CreateOperationController createOperationController) {
-        this.employeeService = employeeService;
-        this.fxmlLoader = fxmlLoader;
-        this.createOperationController = createOperationController;
-    }
-
-    @FXML
-    private void initialize() {
-        openFilter();
-    }
-
-    private void openFilter() {
-        try {
-            FilterEmployeesController filterEmployeesController =
-                    FilterEmployeesController.createFilterEmployeesController(fxmlLoader);
-            containerHeader.getChildren().clear();
-            containerHeader.getChildren().add(filterEmployeesController.getRootElement());
-            filterEmployeesController.setOnFilterTextChangedListener(this::updateEmployeeList);
-            filterEmployeesController.setOnAddEmployeeClickedListener(this::openAddEmployee);
-            updateEmployeeList();
-
-        } catch (IOException e) {
-            LOG.error("IOException in openFilter().", e);
-        }
-    }
-
-    private void openAddEmployee() {
-        employeeListController.deselectAllEmployees();
-        openEmployee(null);
-    }
-
-    private void openEditEmployee(Employee employee) {
-        employeeListController.deselectAllEmployees();
-        employeeListController.selectEmployee(employee);
-        openEmployee(employee);
-    }
-
-    private void openEmployee(Employee employee) {
-        try {
-            CreateNewEmployeeController createNewEmployeeController =
-                    employee == null
-                            ? CreateNewEmployeeController.createCreateNewEmployeeController(
-                                    fxmlLoader)
-                            : CreateNewEmployeeController.createCreateNewEmployeeController(
-                                    fxmlLoader, employee);
-            containerHeader.getChildren().clear();
-            containerHeader.getChildren().add(createNewEmployeeController.getRootElement());
-            createNewEmployeeController.setConsumerCancelClicked(this::openFilter);
-            createNewEmployeeController.setConsumerCreateClicked(this::openFilter);
-        } catch (IOException e) {
-            LOG.error("IOException in openEmployee(). ", e);
-        }
-    }
-
-    private void updateEmployeeList() {
-        updateEmployeeList("");
-    }
-
-    private void updateEmployeeList(String searchString) {
-
-        try {
-            employeeListController.setData(
-                    employeeService
-                            .list()
-                            .stream()
-                            .filter(
-                                    employee ->
-                                            searchString.trim().isEmpty()
-                                                    || employee.name()
-                                                            .toLowerCase()
-                                                            .contains(searchString.toLowerCase()))
-                            .collect(Collectors.toCollection(HashSet::new)),
-                    this::openEditEmployee);
-
-        } catch (ServiceException e) {
-            LOG.error("ServiceException in updateEmployeeList(). ", e);
-        }
-    }
-
-    public void setVisible(boolean b) {
-        listEmployeesAP.setVisible(b);
-    }
-
-    public void backToMain() {
-        LOG.debug("Hyperlink \"Zurück\" clicked.");
-        this.setVisible(false);
-        createOperationController.setVisible(true);
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/OperationDetailsController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/OperationDetailsController.java
deleted file mode 100644
index c0c68f3..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/OperationDetailsController.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showAlertWithOkButtonAndWait;
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showServiceExceptionAlertAndWait;
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showSuccessAlertAndWait;
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showValidationErrorAlertAndWait;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationService;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.stream.Collectors;
-import javafx.collections.FXCollections;
-import javafx.fxml.FXML;
-import javafx.scene.control.Alert.AlertType;
-import javafx.scene.control.Button;
-import javafx.scene.control.Label;
-import javafx.scene.control.ListView;
-import javafx.scene.layout.AnchorPane;
-import javafx.scene.layout.FlowPane;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class OperationDetailsController {
-    private static final Logger LOG = LoggerFactory.getLogger(OperationDetailsController.class);
-
-    public Operation operation;
-    private final OperationService operationService;
-    private final VehicleService vehicleService;
-    private final CreateOperationController createOperationController;
-    @FXML private FlowPane fpVehicles;
-    @FXML private ListView<Operation> lvActiveOperations;
-    @FXML private Label lblChosenVehicles;
-    @FXML private Button btnCloseOperation;
-    @FXML private Button btnCancelOperation;
-    @FXML private Label lblCode, lblAdditionalInfo, lblAddress;
-    @FXML private AnchorPane operationDetailsAP;
-
-    public OperationDetailsController(
-            OperationService operationService,
-            VehicleService vehicleService,
-            CreateOperationController createOperationController) {
-        this.operationService = operationService;
-        this.vehicleService = vehicleService;
-        this.createOperationController = createOperationController;
-    }
-
-    @FXML
-    private void initialize() {
-        lvActiveOperations.setCellFactory(
-                param -> CreateOperationController.generateOpCodeListItem());
-        lvActiveOperations.setOnMouseClicked(
-                event -> {
-                    if (event.getClickCount() == 2) {
-                        if (lvActiveOperations.getSelectionModel().getSelectedItem() == null) {
-                            return;
-                        }
-                        initOperation(lvActiveOperations.getSelectionModel().getSelectedItem());
-                    }
-                });
-    }
-
-    private void updateFlowPane() {
-        try {
-            fpVehicles.getChildren().clear();
-            for (Vehicle vehicle : operation.vehicles()) {
-                VehiclePaneController controller = VehiclePaneController.createVehiclePane();
-                controller.setData(vehicle, true, true);
-                controller.getBtnRequest().setOnAction(e -> requestVehicleClicked(controller));
-                fpVehicles.getChildren().add(controller.getRootElement());
-            }
-        } catch (IOException e) {
-            LOG.error("Error while updating list.", e);
-            showServiceExceptionAlertAndWait("Error while updating list.");
-        }
-    }
-
-    void initOperation(Operation operation) {
-        fillActiveList();
-        this.operation = operation;
-        lblCode.setText(operation.opCode());
-        Collection<String> vehicleNames =
-                operation.vehicles().stream().map(Vehicle::name).collect(Collectors.toList());
-        String result = String.join(", ", vehicleNames);
-        lblChosenVehicles.setText(result.toString());
-        lblAdditionalInfo.setText(operation.additionalInfo());
-        lblAddress.setText(operation.destination());
-        updateFlowPane();
-        operationDetailsAP.setVisible(true);
-    }
-
-    private void fillActiveList() {
-        try {
-            lvActiveOperations.setItems(
-                    FXCollections.observableArrayList(
-                            operationService.list(EnumSet.of(Status.ACTIVE))));
-        } catch (ServiceException e) {
-            LOG.error("ServiceException in fillActiveList(). ", e);
-            showServiceExceptionAlertAndWait(e.getMessage());
-        }
-    }
-
-    @FXML
-    public void closeOperationClicked() {
-        LOG.debug("Button \"Abschließen\" clicked.");
-        try {
-            operationService.complete(operation.id(), Status.COMPLETED);
-        } catch (InvalidOperationException e) {
-            LOG.debug("Validation error in closeOperationClicked(). ", e);
-            showAlertWithOkButtonAndWait(AlertType.ERROR, "Validierungsfehler", e.getMessage());
-            return;
-        } catch (ServiceException e) {
-            LOG.error("Exception in closeOperationClicked(). ", e);
-            showServiceExceptionAlertAndWait(e.getMessage());
-            return;
-        }
-        showSuccessAlertAndWait("Der Einsatz wurde erfolgreich aktualisiert");
-        createOperationController.updateList();
-        closeWindow();
-    }
-
-    public void cancelOperationClicked() {
-        LOG.debug("Button \"Stornieren\" clicked.");
-        try {
-            operationService.complete(operation.id(), Status.CANCELLED);
-        } catch (InvalidOperationException e) {
-            LOG.debug("Validation error in cancelOperationClicked(). ", e);
-            showValidationErrorAlertAndWait(e.getMessage());
-            return;
-        } catch (ServiceException e) {
-            LOG.error("Exception in cancelOperationClicked(). ", e);
-            showServiceExceptionAlertAndWait(e.getMessage());
-            return;
-        }
-        showSuccessAlertAndWait("Der Einsatz wurde erfolgreich aktualisiert");
-        createOperationController.updateList();
-        closeWindow();
-    }
-
-    private void requestVehicleClicked(VehiclePaneController v) {
-        LOG.debug("Button \"Nachfordern\" clicked.");
-
-        try {
-            operationService.requestVehicles(operation.id(), Set.of(v.getData().id()));
-        } catch (ServiceException | InvalidOperationException | InvalidVehicleException e) {
-            LOG.error("Exception in requestVehicleClicked()", e);
-            showServiceExceptionAlertAndWait(e.getMessage());
-            return;
-        }
-        showSuccessAlertAndWait("Das Fahrzeug wurde erfolgreich angefordert");
-        createOperationController.updateList();
-    }
-
-    public void closeWindow() {
-        LOG.debug("Hyperlink \"Zurück\" clicked.");
-        operationDetailsAP.setVisible(false);
-        this.createOperationController.setVisible(true);
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/OperationInArchiveController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/OperationInArchiveController.java
deleted file mode 100644
index d1b325c..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/OperationInArchiveController.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import java.io.IOException;
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
-import java.util.Collection;
-import java.util.Objects;
-import java.util.stream.Collectors;
-import javafx.fxml.FXML;
-import javafx.fxml.FXMLLoader;
-import javafx.scene.Node;
-import javafx.scene.text.Text;
-
-public class OperationInArchiveController {
-
-    @FXML private Text txtAddress;
-    @FXML private Text txtVehicles;
-    @FXML private Text txtDate;
-    @FXML private Text txtOpCode;
-
-    static OperationInArchiveController create() throws IOException {
-        FXMLLoader fxmlLoader =
-                new FXMLLoader(
-                        OperationInArchiveController.class.getResource(
-                                "/fxml/OperationInArchive.fxml"));
-        Node root = fxmlLoader.load();
-        OperationInArchiveController result = fxmlLoader.getController();
-        result.rootElement = root;
-
-        return result;
-    }
-
-    public Node getRoot() {
-        return rootElement;
-    }
-
-    private Node rootElement;
-
-    public void set(Operation operation) {
-        txtAddress.setText(operation.destination());
-        String date = "am ";
-        if (operation.created() != null) {
-            LocalDateTime myDateTime =
-                    LocalDateTime.ofInstant(
-                            Objects.requireNonNull(operation.created()), ZoneOffset.UTC);
-            date +=
-                    myDateTime.getDayOfMonth()
-                            + "."
-                            + myDateTime.getMonth().getValue()
-                            + "."
-                            + myDateTime.getYear();
-            txtDate.setText(date);
-        } else {
-            txtDate.setText("---");
-        }
-        txtOpCode.setText(operation.opCode());
-        Collection<String> elements =
-                operation.vehicles().stream().map(Vehicle::name).collect(Collectors.toList());
-        String result = String.join(", ", elements);
-
-        txtVehicles.setText(result);
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowController.java
deleted file mode 100644
index ed5a12d..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowController.java
+++ /dev/null
@@ -1,279 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showServiceExceptionAlertAndWait;
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.showValidationErrorAlertAndWait;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeService;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.RegistrationService;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
-import java.io.IOException;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.OffsetDateTime;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-import javafx.collections.FXCollections;
-import javafx.collections.ObservableList;
-import javafx.fxml.FXML;
-import javafx.geometry.Insets;
-import javafx.scene.Node;
-import javafx.scene.control.ChoiceBox;
-import javafx.scene.control.Label;
-import javafx.scene.control.ScrollPane;
-import javafx.scene.control.TextField;
-import javafx.scene.input.KeyEvent;
-import javafx.scene.input.MouseButton;
-import javafx.scene.layout.GridPane;
-import javafx.scene.layout.VBox;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class RegistrationWindowController {
-
-    private static final Logger LOG = LoggerFactory.getLogger(RegistrationWindowController.class);
-
-    private final EmployeeService employeeService;
-    private final VehicleService vehicleService;
-    private final RegistrationService registrationService;
-    private final CreateOperationController createOperationController;
-    private final SpringFXMLLoader fxmlLoader;
-
-    @FXML private GridPane root;
-    @FXML private VBox vbVehicles;
-    @FXML private ScrollPane listEmployee;
-    @FXML private ChoiceBox<Integer> cbStart;
-    @FXML private ChoiceBox<Integer> cbEnd;
-    @FXML private Label lVehicles;
-    @FXML private Label lEmployees;
-    @FXML private TextField tfVehicleSearch;
-    @FXML private TextField tfEmployeeSearch;
-    private EmployeeListController employeeListController;
-
-    private Vehicle chosenVehicle;
-    private List<Employee> chosenEmployees = new LinkedList<>();
-
-    public RegistrationWindowController(
-            EmployeeService employeeService,
-            VehicleService vehicleService,
-            CreateOperationController createOperationController,
-            RegistrationService registrationService,
-            SpringFXMLLoader fxmlLoader) {
-        this.employeeService = employeeService;
-        this.vehicleService = vehicleService;
-        this.createOperationController = createOperationController;
-        this.registrationService = registrationService;
-        this.fxmlLoader = fxmlLoader;
-    }
-
-    @FXML
-    private void initialize() throws IOException {
-        employeeListController = EmployeeListController.createEmployeeListController(fxmlLoader);
-        employeeListController.setListItemMargins(new Insets(10, 6, 0, 6));
-        //        listEmployee. .getChildren().add(employeeListController.getRootElement());
-        Node emplList = employeeListController.getRootElement();
-        //        emplList.(360);
-        listEmployee.setContent(emplList);
-
-        ObservableList<Integer> hours =
-                FXCollections.observableArrayList(
-                        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
-                        21, 22, 23);
-        cbStart.setItems(hours);
-        cbStart.setValue(0);
-        cbEnd.setItems(hours);
-        cbEnd.setValue(12);
-
-        reset();
-    }
-
-    private void updateEmplList() {
-        employeeListController.deselectAllEmployees();
-
-        try {
-            Set<Employee> employees =
-                    employeeService
-                            .list()
-                            .stream()
-                            .filter(
-                                    e ->
-                                            e.name()
-                                                    .toLowerCase()
-                                                    .contains(
-                                                            tfEmployeeSearch
-                                                                    .getText()
-                                                                    .toLowerCase()))
-                            .collect(Collectors.toCollection(HashSet::new));
-            employeeListController.setData(
-                    employees,
-                    selection -> {
-                        if (selection == null) {
-                            return;
-                        } else if (chosenEmployees.contains(selection)) {
-                            chosenEmployees.remove(selection);
-                        } else {
-                            chosenEmployees.add(selection);
-                        }
-
-                        StringBuilder text = new StringBuilder();
-                        boolean first = true;
-                        for (Employee employee : chosenEmployees) {
-                            if (!first) {
-                                text.append(", ");
-                            }
-                            text.append(employee.name());
-                            first = false;
-                        }
-                        lEmployees.setText(text.toString());
-                    },
-                    contr -> contr.setSelected(chosenEmployees.contains(contr.getEmployee())));
-
-            employees.forEach(
-                    e -> {
-                        if (chosenEmployees.contains(e)) employeeListController.selectEmployee(e);
-                    });
-        } catch (ServiceException e) {
-            LOG.error("ServiceException in updateEmplList(). ", e);
-            showServiceExceptionAlertAndWait(
-                    "Beim Auflisten des Personals ist ein Fehler aufgetreten.");
-        }
-    }
-
-    private void updateVehList() {
-        vbVehicles.getChildren().clear();
-
-        try {
-            Set<Vehicle> vehicles = vehicleService.list(EnumSet.of(Status.ABGEMELDET));
-
-            boolean anyMatch = false;
-
-            for (Vehicle vehicle : vehicles) {
-                if (!vehicle.name().toLowerCase().contains(tfVehicleSearch.getText().toLowerCase()))
-                    continue;
-
-                anyMatch = true;
-
-                VehiclePaneController vp = VehiclePaneController.createVehiclePane();
-                vp.setData(vehicle, false, false);
-                vbVehicles.getChildren().add(vp.getRootElement());
-
-                vp.getRootElement()
-                        .setOnMouseClicked(
-                                event -> {
-                                    if (event.getButton() == MouseButton.PRIMARY) {
-                                        chosenVehicle = vehicle;
-                                        lVehicles.setText(chosenVehicle.name());
-                                        updateVehList();
-                                    }
-                                });
-                if (chosenVehicle != null && chosenVehicle.id() == vehicle.id())
-                    vp.setSelected(true);
-            }
-
-            if (!anyMatch) {
-                // Kind of ugly, but best way to get the size of a VehiclePane
-                VehiclePaneController vp = VehiclePaneController.createVehiclePane();
-                vp.getRootElement().setVisible(false);
-                vbVehicles.getChildren().add(vp.getRootElement());
-            }
-        } catch (ServiceException e) {
-            LOG.error("ServiceException in updateVehList(). ", e);
-            showServiceExceptionAlertAndWait(
-                    "Beim Auflisten der Fahrzeuge ist ein Fehler aufgetreten");
-        } catch (IOException e) {
-            LOG.error("IOException in updateVehList(). ", e);
-            showServiceExceptionAlertAndWait("Beim Laden der Fahrzeuge ist ein Fehler aufgetreten");
-        }
-    }
-
-    public void cancel() {
-        LOG.debug("Hyperlink \"schließen\" clicked");
-        reset();
-        this.setVisible(false);
-        createOperationController.setVisible(true);
-    }
-
-    private void reset() {
-        chosenEmployees.clear();
-        chosenVehicle = null;
-        tfEmployeeSearch.setText("");
-        tfVehicleSearch.setText("");
-        lEmployees.setText("-");
-        lVehicles.setText("-");
-        updateVehList();
-        updateEmplList();
-    }
-
-    public void create() {
-        LOG.debug("Button \"ERSTELLEN\" clicked");
-
-        Set<Registration> registrations = new HashSet<>();
-        try {
-            if (chosenVehicle == null) {
-                throw new InvalidVehicleException("no Vehicle");
-            }
-            for (Employee employee : chosenEmployees) {
-                registrations.add(
-                        Registration.builder()
-                                .id(chosenVehicle.id())
-                                .employee(employee)
-                                .start(
-                                        LocalDateTime.of(
-                                                        LocalDate.now(),
-                                                        LocalTime.of(cbStart.getValue(), 0))
-                                                .toInstant(OffsetDateTime.now().getOffset()))
-                                .end(
-                                        LocalDateTime.of(
-                                                        LocalDate.now(),
-                                                        LocalTime.of(cbEnd.getValue(), 0))
-                                                .toInstant(OffsetDateTime.now().getOffset()))
-                                .build());
-            }
-
-            registrationService.add(chosenVehicle.id(), registrations);
-            chosenEmployees.clear();
-            // ((Stage) lVehicles.getScene().getWindow()).close();
-            this.setVisible(false);
-            createOperationController.setVisible(true);
-            reset();
-        } catch (InvalidVehicleException e) {
-            LOG.debug("Validation of Vehicle in Registration failed.");
-            showValidationErrorAlertAndWait("Das spezifizierte Fahrzeug ist nicht gültig.");
-        } catch (ServiceException e) {
-            LOG.error("ServiceException in create(). ", e);
-            showServiceExceptionAlertAndWait(
-                    "Beim Erstellen der Anmeldung ist ein Fehler aufgetreten.");
-        } catch (InvalidRegistrationException e) {
-            LOG.debug("Validation of Registration failed.");
-            showValidationErrorAlertAndWait(
-                    "Die gewählte Kombination von Fahrzeug und Personal ist nicht gültig!");
-        }
-    }
-
-    public void setVisible(boolean b) {
-        root.setVisible(b);
-        reset();
-    }
-
-    public void tfVehicleSearch_TextChanged(KeyEvent keyEvent) {
-        updateVehList();
-    }
-
-    public void tfEmployeeSearch_TextChanged(KeyEvent keyEvent) {
-        updateEmplList();
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/VehiclePaneController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/VehiclePaneController.java
deleted file mode 100644
index b31228d..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/VehiclePaneController.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.Status;
-import java.io.IOException;
-import java.time.Instant;
-import java.util.List;
-import java.util.Optional;
-import javafx.fxml.FXML;
-import javafx.fxml.FXMLLoader;
-import javafx.scene.Node;
-import javafx.scene.control.Button;
-import javafx.scene.control.Label;
-import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
-import javafx.scene.text.Text;
-
-public class VehiclePaneController extends CustomListItemController {
-
-    public static VehiclePaneController createVehiclePane() throws IOException {
-        FXMLLoader fxmlLoader =
-                new FXMLLoader(VehiclePaneController.class.getResource("/fxml/vehiclePane.fxml"));
-        Node root = fxmlLoader.load();
-        VehiclePaneController result = fxmlLoader.getController();
-        result.rootElement = root;
-
-        return result;
-    }
-
-    @FXML private Label txtStatus;
-    @FXML private Text txtType;
-    @FXML private Text txtNumber;
-    @FXML private ImageView ivNEF;
-    @FXML private Text txtNEF;
-    @FXML private ImageView ivQualification;
-    @FXML private Text txtQualification;
-    @FXML private Text txtRooftype;
-    @FXML private Button btnRequest;
-
-    private Vehicle data;
-
-    public Vehicle getData() {
-        return data;
-    }
-
-    /**
-     * * Set the displayed data of this VehiclePane.
-     *
-     * @param vehicle The data to display.
-     * @param showStatusInfo If true, the highest qualification of the vehicle's active registration
-     *     and the vehicle's status will be shown.
-     */
-    public void setData(Vehicle vehicle, boolean showStatusInfo, boolean showRequestVehicle) {
-        txtType.setText(vehicle.type().name());
-        String constrType = vehicle.constructionType().name();
-        txtRooftype.setText(
-                constrType.substring(0, 1).toUpperCase() + constrType.substring(1).toLowerCase());
-        txtNumber.setText("-" + vehicle.id());
-        if (vehicle.hasNef()) {
-            ivNEF.setImage(new Image("images/NEF.png"));
-            txtNEF.setText("hat NEF-Halterung");
-        } else {
-            ivNEF.setImage(new Image("images/NotNEF.png"));
-            txtNEF.setText("keine NEF-Halterung");
-        }
-
-        if (showRequestVehicle) {
-            btnRequest.setVisible(true);
-            btnRequest.setManaged(true);
-        } else {
-            btnRequest.setVisible(false);
-            btnRequest.setManaged(false);
-        }
-
-        if (showStatusInfo) {
-            txtStatus.setText(vehicle.status().name());
-            if (vehicle.status() == Status.FREI_FUNK || vehicle.status() == Status.FREI_WACHE) {
-                txtStatus.getStyleClass().add("bg-status-green");
-            } else {
-                txtStatus.getStyleClass().add("bg-status-orange");
-            }
-
-            Instant now = Instant.now();
-            List<Registration> regs = vehicle.registrations();
-
-            if (regs == null) {
-                return;
-            }
-
-            Optional<EducationLevel> edu =
-                    regs.stream()
-                            .filter(reg -> reg.start().isBefore(now) && reg.end().isAfter(now))
-                            .map(reg -> reg.employee().educationLevel())
-                            .max(EducationLevel::compareTo);
-
-            if (!edu.isPresent()) {
-                return;
-            }
-
-            txtQualification.setText(edu.get().name());
-        } else {
-            txtQualification.setVisible(false);
-            txtQualification.setManaged(false);
-            ivQualification.setVisible(false);
-            ivQualification.setManaged(false);
-
-            txtStatus.setVisible(false);
-        }
-
-        this.data = vehicle;
-    }
-
-    public Button getBtnRequest() {
-        return btnRequest;
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAO.java
deleted file mode 100644
index 539a8e5..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAO.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import java.util.Set;
-
-public interface EmployeeDAO {
-
-    /**
-     * Persist the given employee.
-     *
-     * @param employee that should be stored
-     * @return the id that was assigned
-     * @throws PersistenceException if the employee could not be persisted
-     */
-    long add(Employee employee) throws PersistenceException;
-
-    /**
-     * Update the given employee.
-     *
-     * @param employee that should be updated
-     * @throws ElementNotFoundException if no employee with the given id exists
-     * @throws PersistenceException if the employee could not be updated
-     */
-    void update(Employee employee) throws ElementNotFoundException, PersistenceException;
-
-    /**
-     * Get all stored employees.
-     *
-     * @return list containing all stored employees
-     * @throws PersistenceException if loading the stored employees failed
-     */
-    Set<Employee> list() throws PersistenceException;
-
-    /**
-     * Remove employee with the given id from the store.
-     *
-     * @param id of the employee that should be removed
-     * @throws ElementNotFoundException if no employee with the given id exists
-     * @throws PersistenceException if the employee could not be removed
-     */
-    void remove(long id) throws ElementNotFoundException, PersistenceException;
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java
deleted file mode 100644
index 1d8286b..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.time.LocalDate;
-import java.util.HashSet;
-import java.util.Set;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public class EmployeeDatabaseDAO implements EmployeeDAO {
-
-    private JDBCConnectionManager jdbcConnectionManager;
-
-    public EmployeeDatabaseDAO(JDBCConnectionManager jdbcConnectionManager) {
-        this.jdbcConnectionManager = jdbcConnectionManager;
-    }
-
-    private long createEmployeeVersion(Connection con, Employee e)
-            throws PersistenceException, SQLException {
-        String sql =
-                "INSERT INTO EmployeeVersion(name, birthday, educationLevel, isDriver, isPilot) "
-                        + "VALUES(?, ?, ?, ?, ?)";
-
-        try (PreparedStatement pstmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
-            pstmt.setString(1, e.name());
-            pstmt.setObject(2, e.birthday());
-            pstmt.setInt(3, e.educationLevel().ordinal());
-            pstmt.setBoolean(4, e.isDriver());
-            pstmt.setBoolean(5, e.isPilot());
-            pstmt.executeUpdate();
-
-            try (ResultSet rs = pstmt.getGeneratedKeys()) {
-                if (!rs.next()) throw new PersistenceException("Failed to insert EmployeeVersion");
-
-                return rs.getLong(1);
-            }
-        }
-    }
-
-    @Override
-    public long add(Employee employee) throws PersistenceException {
-        String sql = "INSERT INTO Employee(version) VALUES(?)";
-
-        try {
-            Connection con = jdbcConnectionManager.getConnection();
-            con.setAutoCommit(false);
-
-            long versionId = createEmployeeVersion(con, employee);
-
-            try (PreparedStatement pstmt =
-                    con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
-                pstmt.setLong(1, versionId);
-                pstmt.executeUpdate();
-
-                try (ResultSet rs = pstmt.getGeneratedKeys()) {
-                    if (!rs.next()) {
-                        con.rollback();
-                        throw new PersistenceException("Failed to insert Employee");
-                    }
-
-                    con.commit();
-                    return rs.getLong(1);
-                }
-            }
-        } catch (SQLException e) {
-            jdbcConnectionManager.rollbackConnection();
-            throw new PersistenceException(e);
-        }
-    }
-
-    @Override
-    public void update(Employee employee) throws ElementNotFoundException, PersistenceException {
-        String sql = "UPDATE Employee SET version = ? WHERE id = ?";
-
-        try {
-            Connection con = jdbcConnectionManager.getConnection();
-            con.setAutoCommit(false);
-
-            long versionId = createEmployeeVersion(con, employee);
-
-            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
-                pstmt.setLong(1, versionId);
-                pstmt.setLong(2, employee.id());
-
-                if (pstmt.executeUpdate() != 1) {
-                    con.rollback();
-                    throw new ElementNotFoundException("No such employeeId exists");
-                }
-            }
-
-            con.commit();
-        } catch (SQLException e) {
-            jdbcConnectionManager.rollbackConnection();
-            throw new PersistenceException(e);
-        }
-    }
-
-    @Override
-    public Set<Employee> list() throws PersistenceException {
-        String sql =
-                "SELECT emp.id, v.name, v.birthday, v.educationLevel, v.isDriver, v.isPilot "
-                        + "FROM employee emp "
-                        + "JOIN EmployeeVersion v ON v.id = emp.version";
-
-        try {
-            Connection con = jdbcConnectionManager.getConnection();
-            Set<Employee> employees = new HashSet<>();
-
-            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
-                try (ResultSet rs = pstmt.executeQuery()) {
-                    while (rs.next()) {
-                        employees.add(
-                                Employee.builder()
-                                        .id(rs.getLong(1))
-                                        .name(rs.getString(2))
-                                        .birthday(rs.getObject(3, LocalDate.class))
-                                        .educationLevel(EducationLevel.valueOf(rs.getString(4)))
-                                        .isDriver(rs.getBoolean(5))
-                                        .isPilot(rs.getBoolean(6))
-                                        .build());
-                    }
-                }
-            }
-
-            return employees;
-        } catch (SQLException e) {
-            throw new PersistenceException(e);
-        }
-    }
-
-    @Override
-    public void remove(long id) throws ElementNotFoundException, PersistenceException {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAO.java
deleted file mode 100644
index d82f768..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAO.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import java.util.EnumSet;
-import java.util.Set;
-
-public interface OperationDAO {
-
-    /**
-     * Persist the given operation.
-     *
-     * @param operation that should be stored
-     * @return the id that was assigned
-     * @throws PersistenceException if the operation could not be persisted
-     */
-    long add(Operation operation) throws PersistenceException;
-
-    /**
-     * Update the given operation.
-     *
-     * @param operation that should be updated
-     * @throws ElementNotFoundException if no operation with the given id exists
-     * @throws PersistenceException if the operation could not be updated
-     */
-    void update(Operation operation) throws ElementNotFoundException, PersistenceException;
-
-    /**
-     * Returns the operation with the given id.
-     *
-     * @param operationId id of the operation that should be returned
-     * @return operation with the given id
-     * @throws ElementNotFoundException if no operation with the given id exists
-     * @throws PersistenceException if the operation could not be loaded
-     */
-    Operation get(long operationId) throws ElementNotFoundException, PersistenceException;
-
-    /**
-     * Get all stored operations with matching status.
-     *
-     * @param statuses set containing all statuses that should be matched
-     * @return list containing all matched operations
-     * @throws PersistenceException if loading the stored operations failed
-     */
-    Set<Operation> list(EnumSet<Status> statuses) throws PersistenceException;
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDatabaseDAO.java
deleted file mode 100644
index 0b6ce08..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDatabaseDAO.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Severity;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.time.OffsetDateTime;
-import java.time.ZoneId;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.stream.Collectors;
-import org.springframework.lang.NonNull;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public class OperationDatabaseDAO implements OperationDAO {
-
-    private JDBCConnectionManager jdbcConnectionManager;
-    private VehicleDAO vehicleDAO;
-
-    public OperationDatabaseDAO(
-            JDBCConnectionManager jdbcConnectionManager, VehicleDAO vehicleDAO) {
-        this.jdbcConnectionManager = jdbcConnectionManager;
-        this.vehicleDAO = vehicleDAO;
-    }
-
-    @Override
-    public long add(@NonNull Operation o) throws PersistenceException {
-        String sql =
-                "INSERT INTO Operation(opCode, severity, created, destination, additionalInfo,"
-                        + "            status) VALUES (?, ?, ?, ?, ?, ?)";
-        String sql2 = "INSERT INTO VehicleOperation(vehicleId, operationId) VALUES (?, ?)";
-        long operationId;
-
-        try {
-            Connection con = jdbcConnectionManager.getConnection();
-            con.setAutoCommit(false);
-            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
-                pstmt.setString(1, o.opCode());
-                pstmt.setInt(2, o.severity().ordinal());
-                pstmt.setObject(3, OffsetDateTime.ofInstant(o.created(), ZoneId.systemDefault()));
-                pstmt.setString(4, o.destination());
-                pstmt.setString(5, o.additionalInfo());
-                pstmt.setInt(6, o.status().ordinal());
-                pstmt.executeUpdate();
-
-                try (ResultSet rs = pstmt.getGeneratedKeys()) {
-                    if (!rs.next()) throw new PersistenceException("Failed to persist operation");
-
-                    operationId = rs.getLong(1);
-                }
-            }
-
-            try (PreparedStatement pstmt = con.prepareStatement(sql2)) {
-                pstmt.setLong(2, operationId);
-
-                for (long id : (Iterable<Long>) o.vehicles().stream().map(Vehicle::id)::iterator) {
-                    pstmt.setLong(1, id);
-                    pstmt.addBatch();
-                }
-
-                pstmt.executeBatch();
-            }
-            con.commit();
-            return operationId;
-        } catch (SQLException e) {
-            jdbcConnectionManager.rollbackConnection();
-            throw new PersistenceException(e);
-        }
-    }
-
-    @Override
-    public void update(@NonNull Operation o) throws ElementNotFoundException, PersistenceException {
-        // Note this will, by design, not update created
-        String sql =
-                "UPDATE Operation SET opCode = ?, severity = ?, destination = ?,"
-                        + " additionalInfo = ?, status = ? WHERE id = ?";
-        String sql2 = "DELETE FROM VehicleOperation WHERE operationId = ?";
-        String sql3 = "INSERT INTO VehicleOperation(vehicleId, operationId) VALUES (?, ?)";
-
-        try {
-            Connection con = jdbcConnectionManager.getConnection();
-            con.setAutoCommit(false);
-            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
-                pstmt.setString(1, o.opCode());
-                pstmt.setInt(2, o.severity().ordinal());
-                pstmt.setString(3, o.destination());
-                pstmt.setString(4, o.additionalInfo());
-                pstmt.setInt(5, o.status().ordinal());
-                pstmt.setLong(6, o.id());
-
-                if (pstmt.executeUpdate() != 1)
-                    throw new ElementNotFoundException("No such operationId exists");
-            }
-
-            try (PreparedStatement pstmt = con.prepareStatement(sql2)) {
-                pstmt.setLong(1, o.id());
-                pstmt.executeUpdate();
-            }
-
-            try (PreparedStatement pstmt = con.prepareStatement(sql3)) {
-                pstmt.setLong(2, o.id());
-
-                for (long id : (Iterable<Long>) o.vehicles().stream().map(Vehicle::id)::iterator) {
-                    pstmt.setLong(1, id);
-                    pstmt.addBatch();
-                }
-
-                pstmt.executeBatch();
-            }
-            con.commit();
-        } catch (SQLException e) {
-            jdbcConnectionManager.rollbackConnection();
-            throw new PersistenceException(e);
-        }
-    }
-
-    @Override
-    public Operation get(long operationId) throws ElementNotFoundException, PersistenceException {
-        String sql = "Select * from operation where id = ?";
-
-        try {
-            Connection con = jdbcConnectionManager.getConnection();
-            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
-                pstmt.setLong(1, operationId);
-                pstmt.execute();
-
-                try (ResultSet rs = pstmt.getResultSet()) {
-                    if (!rs.next())
-                        throw new ElementNotFoundException("No such element could be found");
-
-                    return operationFromRS(rs);
-                }
-            }
-        } catch (SQLException e) {
-            throw new PersistenceException(e);
-        }
-    }
-
-    @Override
-    public Set<Operation> list(EnumSet<Status> statuses) throws PersistenceException {
-        // This hack exists because H2 currently has a bug that prevents IN (?) with an array of
-        // ids, i.e. pstmt.setArray(1, con.createArrayOf("INT", intarray) from working. See
-        // commented code below.
-
-        // SELECT * FROM Operation WHERE status IN ('COMPLETED', 'CANCELLED') is BUGGED on H2!
-        // for this reason we use the ordinal values instead
-        String str =
-                statuses.stream()
-                        .map(e -> Integer.toString(e.ordinal()))
-                        .collect(Collectors.joining(","));
-
-        String sql = "SELECT * FROM Operation WHERE status IN (" + str + ")";
-        Set<Operation> operations = new HashSet<>();
-
-        try {
-            Connection con = jdbcConnectionManager.getConnection();
-
-            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
-                // Object[] arr = statuses.stream().map(Enum::ordinal).toArray();
-                // pstmt.setArray(1, con.createArrayOf("INT", arr));
-
-                try (ResultSet rs = pstmt.executeQuery()) {
-                    while (rs.next()) operations.add(operationFromRS(rs));
-                }
-            }
-
-            return operations;
-        } catch (SQLException e) {
-            throw new PersistenceException(e);
-        }
-    }
-
-    private Operation operationFromRS(ResultSet rs) throws PersistenceException, SQLException {
-        Long operationId = rs.getLong("id");
-
-        return Operation.builder()
-                .id(operationId)
-                .opCode(rs.getString("opCode"))
-                .severity(Severity.valueOf(rs.getString("severity")))
-                .status(Status.valueOf(rs.getString("status")))
-                .vehicles(getVehiclesFromOperationId(operationId))
-                .created((rs.getObject("created", OffsetDateTime.class)).toInstant())
-                .destination(rs.getString("destination"))
-                .additionalInfo(rs.getString("additionalInfo"))
-                .build();
-    }
-
-    private Set<Vehicle> getVehiclesFromOperationId(long operationId) throws PersistenceException {
-        String sql = "SELECT vehicleId FROM VehicleOperation WHERE operationId = ?";
-        Set<Vehicle> vehicles = new HashSet<>();
-
-        try {
-            Connection con = jdbcConnectionManager.getConnection();
-            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
-                pstmt.setLong(1, operationId);
-                pstmt.execute();
-
-                try (ResultSet rs = pstmt.getResultSet()) {
-                    while (rs.next()) {
-                        vehicles.add(vehicleDAO.get(rs.getLong("vehicleId")));
-                    }
-                }
-            }
-        } catch (SQLException e) {
-            throw new PersistenceException(e);
-        } catch (ElementNotFoundException e) {
-            throw new PersistenceException("VehicleOperation contained nonexistent vehicle", e);
-        }
-
-        return vehicles;
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAO.java
deleted file mode 100644
index 36b6f1b..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAO.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import java.util.Set;
-
-public interface RegistrationDAO {
-
-    /**
-     * Persist the given registration.
-     *
-     * @param vehicleId the id of the target vehicle
-     * @param registrations that should be stored
-     * @return a list of the ids that were assigned
-     * @throws PersistenceException if the registration could not be persisted
-     */
-    Set<Long> add(long vehicleId, Set<Registration> registrations) throws PersistenceException;
-
-    /**
-     * Make registration with the given id inactive.
-     *
-     * @param id of the registration that should be made inactive
-     * @throws ElementNotFoundException if no registration with the given id exists
-     * @throws PersistenceException if the registration could not be made inactive
-     */
-    void remove(long id) throws ElementNotFoundException, PersistenceException;
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDatabaseDAO.java
deleted file mode 100644
index 9f7ac84..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDatabaseDAO.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.time.OffsetDateTime;
-import java.time.ZoneId;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public class RegistrationDatabaseDAO implements RegistrationDAO {
-
-    private JDBCConnectionManager jdbcConnectionManager;
-    private EmployeeDAO employeePersistence;
-
-    @Autowired
-    public RegistrationDatabaseDAO(
-            JDBCConnectionManager jdbcConnectionManager, EmployeeDAO employeePersistence) {
-        this.jdbcConnectionManager = jdbcConnectionManager;
-        this.employeePersistence = employeePersistence;
-    }
-
-    @Override
-    public Set<Long> add(long vehicleId, Set<Registration> registrations)
-            throws PersistenceException {
-        String sql =
-                "INSERT INTO Registration (vehicleId, employeeId, start, end, active) VALUES (?,?,?,?,?)";
-        String sql2 = "UPDATE Vehicle SET status = 'FREI_WACHE' WHERE id = ?;";
-
-        Set<Long> vehicleIds = new HashSet<>();
-
-        try {
-            Connection con = jdbcConnectionManager.getConnection();
-            con.setAutoCommit(false);
-
-            try (PreparedStatement pstmt =
-                    con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
-                pstmt.setLong(1, vehicleId);
-
-                for (Registration r : registrations) {
-                    pstmt.setLong(2, r.employee().id());
-                    pstmt.setObject(3, OffsetDateTime.ofInstant(r.start(), ZoneId.systemDefault()));
-                    pstmt.setObject(4, OffsetDateTime.ofInstant(r.end(), ZoneId.systemDefault()));
-                    pstmt.setBoolean(5, true);
-                    pstmt.addBatch();
-                }
-
-                pstmt.executeBatch();
-
-                try (ResultSet rs = pstmt.getGeneratedKeys()) {
-                    while (rs.next()) vehicleIds.add(rs.getLong(1));
-                }
-            }
-
-            try (PreparedStatement pstmt = con.prepareStatement(sql2)) {
-                pstmt.setLong(1, vehicleId);
-                if (pstmt.executeUpdate() != 1) {
-                    con.rollback();
-                    throw new PersistenceException("Failed to persist registration");
-                }
-            }
-
-            con.commit();
-            return vehicleIds;
-        } catch (SQLException e) {
-            jdbcConnectionManager.rollbackConnection();
-            throw new PersistenceException(e);
-        }
-    }
-
-    @Override
-    public void remove(long id) throws ElementNotFoundException, PersistenceException {
-        throw new UnsupportedOperationException();
-    }
-
-    protected List<Registration> list(long vehicleId) throws PersistenceException {
-        String sql = "SELECT * FROM Registration WHERE vehicleId = ?";
-
-        List<Registration> registrationList = new ArrayList<>();
-        try {
-            Connection con = jdbcConnectionManager.getConnection();
-
-            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
-                pstmt.setLong(1, vehicleId);
-
-                try (ResultSet rs = pstmt.executeQuery()) {
-                    while (rs.next()) {
-                        long employeeId = rs.getLong("employeeId");
-                        // TODO: replace the following with employeePersistence.get once implemented
-                        Employee emp =
-                                employeePersistence
-                                        .list()
-                                        .stream()
-                                        .filter(employee -> employee.id() == employeeId)
-                                        .findAny()
-                                        .orElse(null);
-                        Registration registration =
-                                Registration.builder()
-                                        .id(rs.getLong("id"))
-                                        .start(
-                                                (rs.getObject("start", OffsetDateTime.class))
-                                                        .toInstant())
-                                        .end(
-                                                (rs.getObject("end", OffsetDateTime.class))
-                                                        .toInstant())
-                                        .employee(emp)
-                                        .build();
-                        registrationList.add(registration);
-                    }
-                }
-            }
-
-            return registrationList;
-        } catch (SQLException e) {
-            throw new PersistenceException(e);
-        }
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDAO.java
deleted file mode 100644
index 5782fd9..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDAO.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import java.util.Set;
-
-public interface VehicleDAO {
-
-    /**
-     * Persist the given vehicle.
-     *
-     * @param vehicle that should be stored
-     * @return the id that was assigned
-     * @throws PersistenceException if the vehicle could not be persisted
-     */
-    long add(Vehicle vehicle) throws PersistenceException;
-
-    /**
-     * Update the given vehicle.
-     *
-     * @param vehicle that should be updated
-     * @throws ElementNotFoundException if no vehicle with the given id exists
-     * @throws PersistenceException if the vehicle could not be updated
-     */
-    void update(Vehicle vehicle) throws ElementNotFoundException, PersistenceException;
-
-    /**
-     * Get all stored vehicles.
-     *
-     * @return list containing all stored vehicles
-     * @throws PersistenceException if loading the stored vehicles failed
-     */
-    Set<Vehicle> list() throws PersistenceException;
-
-    /**
-     * Returns the vehicle with the given id.
-     *
-     * @param vehicleId id of the vehicle that should be returned
-     * @return vehicle with the given id
-     * @throws ElementNotFoundException if no vehicle with the given id exists
-     * @throws PersistenceException if the vehicle could not be loaded
-     */
-    Vehicle get(long vehicleId) throws ElementNotFoundException, PersistenceException;
-
-    /**
-     * Remove vehicle with the given id from the store.
-     *
-     * @param id of the vehicle that should be removed
-     * @throws ElementNotFoundException if no vehicle with the given id exists
-     * @throws PersistenceException if the vehicle could not be removed
-     */
-    void remove(long id) throws ElementNotFoundException, PersistenceException;
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDatabaseDAO.java
deleted file mode 100644
index fcae6d3..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDatabaseDAO.java
+++ /dev/null
@@ -1,211 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.ConstructionType;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.HashSet;
-import java.util.Set;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public class VehicleDatabaseDAO implements VehicleDAO {
-
-    private final JDBCConnectionManager jdbcConnectionManager;
-    private RegistrationDatabaseDAO registrationDatabaseDao;
-
-    public VehicleDatabaseDAO(
-            JDBCConnectionManager j, RegistrationDatabaseDAO registrationDatabaseDao) {
-        jdbcConnectionManager = j;
-        this.registrationDatabaseDao = registrationDatabaseDao;
-    }
-
-    @Override
-    public long add(Vehicle v) throws PersistenceException {
-        String sql =
-                "INSERT INTO VehicleVersion (name,hasNef,constructionType,type) VALUES (?,?,?,?)";
-        String sql2 = "INSERT INTO Vehicle (version,status) VALUES (?,?)";
-        String sql3 = "UPDATE VehicleVersion SET name=? WHERE id=?";
-
-        try {
-            Connection con = jdbcConnectionManager.getConnection();
-            con.setAutoCommit(false);
-            String name = "";
-            long version, id;
-
-            try (PreparedStatement pstmt =
-                    con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
-                pstmt.setString(1, name);
-                pstmt.setBoolean(2, v.hasNef());
-                pstmt.setInt(3, v.constructionType().ordinal());
-                pstmt.setString(4, v.type().name());
-                pstmt.executeUpdate();
-
-                try (ResultSet rs = pstmt.getGeneratedKeys()) {
-                    if (!rs.next())
-                        throw new PersistenceException("Failed to insert into VehicleVersion");
-
-                    version = rs.getLong(1);
-                }
-            }
-
-            try (PreparedStatement pstmt =
-                    con.prepareStatement(sql2, Statement.RETURN_GENERATED_KEYS)) {
-                pstmt.setLong(1, version);
-                pstmt.setInt(2, Status.ABGEMELDET.ordinal());
-                pstmt.executeUpdate();
-
-                try (ResultSet rs = pstmt.getGeneratedKeys()) {
-                    if (!rs.next()) {
-                        con.rollback();
-                        throw new PersistenceException("Failed to insert into Vehicle");
-                    }
-
-                    id = rs.getLong(1);
-                }
-
-                name = v.type().name() + "-" + id;
-            }
-
-            try (PreparedStatement pstmt = con.prepareStatement(sql3)) {
-                pstmt.setString(1, name);
-                pstmt.setLong(2, version);
-
-                if (pstmt.executeUpdate() != 1) {
-                    con.rollback();
-                    throw new PersistenceException("Failed to update VehicleVersion");
-                }
-            }
-
-            con.commit();
-            return id;
-        } catch (SQLException e) {
-            jdbcConnectionManager.rollbackConnection();
-            throw new PersistenceException(e);
-        }
-    }
-
-    @Override
-    public void update(Vehicle v) throws ElementNotFoundException, PersistenceException {
-        String sql = "SELECT version FROM Vehicle WHERE id = ?";
-        String sql2 =
-                "MERGE INTO VehicleVersion(name, constructionType, type, hasNef)"
-                        + " KEY(name, constructionType, type, hasNef) VALUES(?, ?, ?, ?)";
-        String sql3 = "UPDATE Vehicle SET version = ?, status = ? WHERE id = ?";
-
-        long versionId;
-
-        try {
-            Connection con = jdbcConnectionManager.getConnection();
-            con.setAutoCommit(false);
-            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
-                pstmt.setLong(1, v.id());
-
-                try (ResultSet rs = pstmt.executeQuery()) {
-                    if (!rs.next()) throw new ElementNotFoundException("No such vehicleId exists");
-
-                    versionId = rs.getLong(1);
-                }
-            }
-
-            try (PreparedStatement pstmt =
-                    con.prepareStatement(sql2, Statement.RETURN_GENERATED_KEYS)) {
-                pstmt.setString(1, v.type().name() + "-" + v.id());
-                pstmt.setString(2, v.constructionType().name());
-                pstmt.setString(3, v.type().name());
-                pstmt.setBoolean(4, v.hasNef());
-                pstmt.executeUpdate();
-
-                try (ResultSet rs = pstmt.getGeneratedKeys()) {
-                    if (rs.next()) {
-                        // version changed, update it
-                        versionId = rs.getLong(1);
-                    }
-                }
-            }
-
-            try (PreparedStatement pstmt = con.prepareStatement(sql3)) {
-                pstmt.setLong(1, versionId);
-                pstmt.setString(2, v.status().name());
-                pstmt.setLong(3, v.id());
-                pstmt.executeUpdate();
-            }
-
-            con.commit();
-        } catch (SQLException e) {
-            jdbcConnectionManager.rollbackConnection();
-            throw new PersistenceException(e);
-        }
-    }
-
-    @Override
-    public Set<Vehicle> list() throws PersistenceException {
-        Set<Vehicle> result = new HashSet<>();
-
-        String sql =
-                "Select * from VehicleVersion, Vehicle where VehicleVersion.id=Vehicle.version";
-
-        try (PreparedStatement pstmt =
-                jdbcConnectionManager.getConnection().prepareStatement(sql)) {
-            pstmt.executeQuery();
-            try (ResultSet rs = pstmt.getResultSet()) {
-                while (rs.next()) {
-                    result.add(vehicleFromRS(rs));
-                }
-            }
-        } catch (SQLException e) {
-            throw new PersistenceException(e);
-        }
-        return result;
-    }
-
-    @Override
-    public Vehicle get(long id) throws ElementNotFoundException, PersistenceException {
-        String sql =
-                "SELECT a.id, b.name, b.constructionType, b.type, a.status, b.hasNef"
-                        + " FROM Vehicle a"
-                        + " INNER JOIN VehicleVersion b"
-                        + " ON version = b.id"
-                        + " WHERE a.id = ?";
-
-        try {
-            Connection con = jdbcConnectionManager.getConnection();
-            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
-                pstmt.setLong(1, id);
-
-                try (ResultSet rs = pstmt.executeQuery()) {
-                    if (!rs.first()) throw new ElementNotFoundException("No such vehicle exists");
-
-                    return vehicleFromRS(rs);
-                }
-            }
-        } catch (SQLException e) {
-            throw new PersistenceException(e);
-        }
-    }
-
-    @Override
-    public void remove(long id) throws ElementNotFoundException, PersistenceException {
-        throw new UnsupportedOperationException();
-    }
-
-    private Vehicle vehicleFromRS(ResultSet rs) throws SQLException, PersistenceException {
-        return Vehicle.builder()
-                .id(rs.getLong("Vehicle.id"))
-                .name(rs.getString("name"))
-                .constructionType(ConstructionType.values()[rs.getInt("constructionType")])
-                .type(VehicleType.valueOf(rs.getString("type")))
-                .status(Status.values()[rs.getInt("status")])
-                .hasNef(rs.getBoolean("hasNef"))
-                .registrations(registrationDatabaseDao.list(rs.getLong("id")))
-                .build();
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Employee.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Employee.java
deleted file mode 100644
index 583bf5b..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Employee.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto;
-
-import com.google.auto.value.AutoValue;
-import java.time.LocalDate;
-
-@AutoValue
-public abstract class Employee {
-    public enum EducationLevel {
-        RS,
-        NFS,
-        NKV,
-        NKA,
-        NKI,
-        NA
-    }
-
-    public abstract long id();
-
-    public abstract String name();
-
-    public abstract LocalDate birthday();
-
-    public abstract EducationLevel educationLevel();
-
-    public abstract boolean isDriver();
-
-    public abstract boolean isPilot();
-
-    public static Builder builder() {
-        return new AutoValue_Employee.Builder().id(0);
-    }
-
-    @AutoValue.Builder
-    public abstract static class Builder {
-        public abstract Builder id(long id);
-
-        public abstract Builder name(String name);
-
-        public abstract Builder birthday(LocalDate birthday);
-
-        public abstract Builder educationLevel(EducationLevel educationLevel);
-
-        public abstract Builder isDriver(boolean isDriver);
-
-        public abstract Builder isPilot(boolean isPilot);
-
-        public abstract Employee build();
-    }
-
-    public abstract Builder toBuilder();
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/EmployeeValidator.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/EmployeeValidator.java
deleted file mode 100644
index 36d8003..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/EmployeeValidator.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto;
-
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
-
-public class EmployeeValidator {
-
-    public static boolean validate(Employee employee) throws InvalidEmployeeException {
-
-        if (employee.name() == null || employee.name().trim().length() == 0) {
-            throw new InvalidEmployeeException("Name darf nicht leer sein!");
-        }
-
-        if (employee.birthday() == null) {
-            throw new InvalidEmployeeException("Geburtsdatum darf nicht leer sein!");
-        }
-
-        if (employee.educationLevel() == null) {
-            throw new InvalidEmployeeException("Ausbildungsgrad darf nicht leer sein!");
-        }
-
-        return true;
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Operation.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Operation.java
deleted file mode 100644
index 3a97dc7..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Operation.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto;
-
-import com.google.auto.value.AutoValue;
-import java.time.Instant;
-import java.util.Set;
-import javax.annotation.Nullable;
-
-@AutoValue
-public abstract class Operation {
-    public enum Severity {
-        A,
-        B,
-        C,
-        D,
-        E,
-        O,
-    }
-
-    public enum Status {
-        ACTIVE,
-        COMPLETED,
-        CANCELLED,
-    }
-
-    public abstract long id();
-
-    public abstract String opCode();
-
-    @Nullable
-    public abstract Severity severity();
-
-    public abstract Status status();
-
-    public abstract Set<Vehicle> vehicles();
-
-    @Nullable
-    public abstract Instant created();
-
-    public abstract String destination();
-
-    @Nullable
-    public abstract String additionalInfo();
-
-    public static Builder builder() {
-        return new AutoValue_Operation.Builder().id(0);
-    }
-
-    @AutoValue.Builder
-    public abstract static class Builder {
-        public abstract Builder id(long id);
-
-        public abstract Builder opCode(String opCode);
-
-        public abstract Builder severity(Severity severity);
-
-        public abstract Builder status(Status status);
-
-        public abstract Builder vehicles(Set<Vehicle> vehicles);
-
-        public abstract Builder created(Instant created);
-
-        public abstract Builder destination(String destination);
-
-        public abstract Builder additionalInfo(String additionalInfo);
-
-        public abstract Operation build();
-    }
-
-    public abstract Builder toBuilder();
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Registration.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Registration.java
deleted file mode 100644
index 8551266..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Registration.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto;
-
-import com.google.auto.value.AutoValue;
-import java.time.Instant;
-
-@AutoValue
-public abstract class Registration {
-    public abstract long id();
-
-    public abstract Instant start();
-
-    public abstract Instant end();
-
-    public abstract Employee employee();
-
-    public static Builder builder() {
-        return new AutoValue_Registration.Builder().id(0);
-    }
-
-    @AutoValue.Builder
-    public abstract static class Builder {
-        public abstract Builder id(long id);
-
-        public abstract Builder start(Instant start);
-
-        public abstract Builder end(Instant end);
-
-        public abstract Builder employee(Employee employee);
-
-        public abstract Registration build();
-    }
-
-    public abstract Builder toBuilder();
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/RegistrationValidator.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/RegistrationValidator.java
deleted file mode 100644
index 3456534..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/RegistrationValidator.java
+++ /dev/null
@@ -1,174 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-public class RegistrationValidator {
-
-    private RegistrationValidator() {}
-
-    public static void validate(Vehicle vehicle, Set<Registration> registrations)
-            throws InvalidVehicleException, InvalidRegistrationException {
-        /*
-        Vehicles and Employees are assumed to be valid.
-        They have been checked at creation, and for them to be checked again, access to
-        VehicleValidator and EmployeeValidator are needed, which are not available at this time.
-         */
-        /*
-        The method used here goes as follows: All given employees are inspected in regards to their
-        qualifications, and added to the appropriate lists of the roles they could fill.
-        For example, an NFS, who is also a driver, would be added to the lists driverIds, nfsIds
-        and rsIds (because an NFS can always substitute an RS).
-        Afterwards, the number of people is checked according to the chosen vehicle type, and if
-        the number is okay, the program tries to find a valid combination of roles for the vehicle.
-        For example, for an RTW, first a driver is chosen, their ID marked as found in the aptly
-        titled HashMap, and then for the second RS, the list of RS is checked, excluding the chosen
-        driver. If no other valid RS is found, the next possible driver is chosen, and so on. If no
-        valid combination is found, an InvalidRegistrationException is thrown.
-         */
-        List<Long> pilotIds = new LinkedList<>();
-        List<Long> driverIds = new LinkedList<>();
-        List<Long> naIds = new LinkedList<>();
-        List<Long> nfsIds = new LinkedList<>();
-        List<Long> rsIds = new LinkedList<>();
-        HashMap<Long, Boolean> found =
-                new HashMap<>(); // needed later in DFS, checks that no person is chosen twice
-        int total = 0;
-        for (Registration registration : registrations) {
-            total++;
-            if (found.put(registration.employee().id(), false) != null) {
-                throw new InvalidRegistrationException(
-                        "Person mit der ID: "
-                                + registration.employee().id()
-                                + " wurde mehrmals hinzugefügt!");
-            }
-            if (registration.employee().isPilot()) {
-                pilotIds.add(registration.employee().id());
-            }
-            if (registration.employee().isDriver()) {
-                driverIds.add(registration.employee().id());
-            }
-            if (registration.employee().educationLevel() == EducationLevel.NA) {
-                naIds.add(registration.employee().id());
-                nfsIds.add(registration.employee().id());
-                rsIds.add(registration.employee().id());
-            } else if (isNFS(registration.employee())) {
-                nfsIds.add(registration.employee().id());
-                rsIds.add(registration.employee().id());
-            } else { // only RS left
-                rsIds.add(registration.employee().id());
-            }
-        }
-        if (total <= 0) {
-            throw new InvalidRegistrationException("Kein Personal ausgewählt!");
-        }
-        if (vehicle.type() == VehicleType.NAH) {
-            /*
-            NAH
-            1 Pilot
-            1 NFS
-            1 NA
-            3-4 Personen
-             */
-            if (total < 3) {
-                throw new InvalidRegistrationException("Zu wenig Personal für NAH!");
-            } else if (total > 4) {
-                throw new InvalidRegistrationException("Zu viel Personal für NAH!");
-            }
-            for (long pilot_id : pilotIds) {
-                found.put(pilot_id, true);
-                for (long na_id : naIds) {
-                    if (found.get(na_id)) continue;
-                    found.put(na_id, true);
-                    for (long nfs_id : nfsIds) {
-                        if (found.get(nfs_id)) continue;
-                        return;
-                    }
-                    found.put(na_id, false);
-                }
-                found.put(pilot_id, false);
-            }
-            throw new InvalidRegistrationException(
-                    "Keine gültige Kombination von Personen für NAH!");
-        } else if (vehicle.type() == VehicleType.NEF) {
-            /*
-            NEF
-            1 Driver (has to be NFS)
-            1 NA
-             */
-            if (total < 2) {
-                throw new InvalidRegistrationException("Zu wenig Personal für NEF!");
-            } else if (total > 3) {
-                throw new InvalidRegistrationException("Zu viel Personal für NEF!");
-            }
-            for (long driver_id : driverIds) {
-                if (!nfsIds.contains(driver_id))
-                    continue; // if possible driver is not NFS, skip him
-                found.put(driver_id, true);
-                for (long na_id : naIds) {
-                    if (found.get(na_id)) continue;
-                    return;
-                }
-                found.put(driver_id, false);
-            }
-            throw new InvalidRegistrationException(
-                    "Keine gültige Kombination von Personen für NEF!");
-        } else if (vehicle.type() == VehicleType.BKTW) {
-            /*
-            BKTW
-            1 Driver
-             */
-            if (total > 3) {
-                throw new InvalidRegistrationException("Zu viel Personal für BKTW!");
-            }
-            if (!driverIds.isEmpty()) {
-                return;
-            }
-            throw new InvalidRegistrationException("Kein Fahrer gefunden für BKTW!");
-        } else { // KTW or RTW, both have the same requirements
-            /*
-            RTW/KTW
-            1 Driver
-            1 RS
-             */
-            if (total < 2) {
-                throw new InvalidRegistrationException(
-                        "Zu wenig Personal für " + vehicle.type().name() + "!");
-            } else if (total > 4) {
-                throw new InvalidRegistrationException(
-                        "Zu viel Persoanl für " + vehicle.type().name() + "!");
-            }
-            for (long driver_id : driverIds) { // driver includes rs
-                found.put(driver_id, true);
-                for (long rs_id : rsIds) {
-                    if (found.get(rs_id)) continue;
-                    return;
-                }
-            }
-            throw new InvalidRegistrationException(
-                    "Keine gültige Kombination von Personen für " + vehicle.type().name() + "!");
-        }
-    }
-
-    private static boolean isNFS(Employee employee) {
-        EducationLevel educationLevel = employee.educationLevel();
-        switch (educationLevel) {
-            case NFS:
-                return true;
-            case NKA:
-                return true;
-            case NKI:
-                return true;
-            case NKV:
-                return true;
-            default:
-                return false;
-        }
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Vehicle.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Vehicle.java
deleted file mode 100644
index e81db0b..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Vehicle.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto;
-
-import com.google.auto.value.AutoValue;
-import java.util.List;
-import javax.annotation.Nullable;
-
-@AutoValue
-public abstract class Vehicle {
-    public enum ConstructionType {
-        NORMAL,
-        HOCHDACH,
-        MITTELHOCHDACH,
-    }
-
-    public enum VehicleType {
-        BKTW,
-        KTW_B,
-        KTW,
-        RTW,
-        NEF,
-        NAH,
-    }
-
-    public enum Status {
-        ABGEMELDET,
-        FREI_WACHE,
-        FREI_FUNK,
-        ZUM_BERUFUNGSORT,
-        AM_BERUFUNGSORT,
-        ZUM_ZIELORT,
-        AM_ZIELORT,
-    }
-
-    public abstract long id();
-
-    public abstract String name();
-
-    public abstract ConstructionType constructionType();
-
-    public abstract VehicleType type();
-
-    public abstract Status status();
-
-    public abstract boolean hasNef();
-
-    @Nullable
-    public abstract List<Registration> registrations();
-
-    public static Builder builder() {
-        return new AutoValue_Vehicle.Builder().id(0);
-    }
-
-    @AutoValue.Builder
-    public abstract static class Builder {
-        public abstract Builder id(long id);
-
-        public abstract Builder name(String name);
-
-        public abstract Builder constructionType(ConstructionType constructionType);
-
-        public abstract Builder type(VehicleType type);
-
-        public abstract Builder status(Status status);
-
-        public abstract Builder hasNef(boolean hasNef);
-
-        public abstract Builder registrations(List<Registration> registrations);
-
-        public abstract Vehicle build();
-    }
-
-    public abstract Builder toBuilder();
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeService.java
deleted file mode 100644
index f7f8e71..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeService.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import java.util.Set;
-
-public interface EmployeeService {
-
-    /**
-     * Add given employee to the store.
-     *
-     * @param employee that should be added to the store
-     * @return the id that was assigned
-     * @throws InvalidEmployeeException if the employee is invalid
-     * @throws ServiceException if the employee could not be persisted
-     */
-    long add(Employee employee) throws InvalidEmployeeException, ServiceException;
-
-    /**
-     * Update the given employee.
-     *
-     * @param employee that should be updated
-     * @return the updated employee
-     * @throws InvalidEmployeeException if the employee is invalid
-     * @throws ServiceException if the updated employee could not be persisted
-     */
-    Employee update(Employee employee) throws InvalidEmployeeException, ServiceException;
-
-    /**
-     * Get all stored employees.
-     *
-     * @return list containing all stored employees
-     * @throws ServiceException if loading the stored employees failed
-     */
-    Set<Employee> list() throws ServiceException;
-
-    /**
-     * Remove employee with the given id from the store.
-     *
-     * @param id of the employee that should be removed
-     * @throws InvalidEmployeeException if given employee id is invalid or does not exist
-     * @throws ServiceException if the employee could not be removed from the store
-     */
-    void remove(long id) throws InvalidEmployeeException, ServiceException;
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceImpl.java
deleted file mode 100644
index cf054c3..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceImpl.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.EmployeeValidator;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import java.util.Set;
-import org.springframework.stereotype.Service;
-
-@Service
-public class EmployeeServiceImpl implements EmployeeService {
-
-    private final EmployeeDAO employeePersistence;
-
-    public EmployeeServiceImpl(EmployeeDAO employeePersistence) {
-        this.employeePersistence = employeePersistence;
-    }
-
-    @Override
-    public long add(Employee employee) throws InvalidEmployeeException, ServiceException {
-
-        EmployeeValidator.validate(employee);
-        try {
-            return employeePersistence.add(employee);
-        } catch (PersistenceException e) {
-            throw new ServiceException(e);
-        }
-    }
-
-    @Override
-    public Employee update(Employee employee) throws InvalidEmployeeException, ServiceException {
-
-        EmployeeValidator.validate(employee);
-        try {
-            employeePersistence.update(employee);
-            return employee;
-        } catch (ElementNotFoundException | PersistenceException e) {
-            throw new ServiceException(e);
-        }
-    }
-
-    @Override
-    public Set<Employee> list() throws ServiceException {
-
-        try {
-            return employeePersistence.list();
-        } catch (PersistenceException e) {
-            throw new ServiceException(e);
-        }
-    }
-
-    @Override
-    public void remove(long id) throws InvalidEmployeeException, ServiceException {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationService.java
deleted file mode 100644
index 4b7e630..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationService.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.SortedSet;
-
-public interface OperationService {
-
-    /**
-     * Add given operation to the store.
-     *
-     * @param operation that should be added to the store
-     * @return the id that was assigned
-     * @throws InvalidOperationException if the operation is invalid
-     * @throws ServiceException if the operation could not be persisted
-     */
-    long add(Operation operation) throws InvalidOperationException, ServiceException;
-
-    /**
-     * Request new vehicles to the given operation.
-     *
-     * @param operationId id of the operation that the vehicles should be send to
-     * @param vehicleIds the ids of the vehicles that should be send to the given operation
-     * @throws InvalidOperationException if the operationId is invalid or does not exist
-     * @throws InvalidVehicleException if one of the vehicle ids is invalid or does not exist
-     * @throws ServiceException if the vehicles could not be loaded or the operation could not be
-     *     persisted
-     */
-    void requestVehicles(long operationId, Set<Long> vehicleIds)
-            throws InvalidOperationException, InvalidVehicleException, ServiceException;
-
-    /**
-     * Completes the given operation with the specified status.
-     *
-     * @param operationId id of the operation that should be completed
-     * @param status of the completed operation, either {@link Status#COMPLETED} or {@link
-     *     Status#CANCELLED}
-     * @throws InvalidOperationException if the operationId is invalid or does not exist
-     * @throws ServiceException if the operation could not be persisted
-     */
-    void complete(long operationId, Status status)
-            throws InvalidOperationException, ServiceException;
-
-    /**
-     * Get all available vehicles, sorted by how well they fit to the given opCode, starting with
-     * the best fitting.
-     *
-     * @param opCode the operation code that is used to determine the ranking
-     * @return a sorted list containing all available vehicles
-     * @throws InvalidOperationException if the opCode is invalid
-     * @throws ServiceException if loading the stored vehicles failed
-     */
-    SortedSet<Vehicle> rankVehicles(String opCode)
-            throws InvalidOperationException, ServiceException;
-
-    /**
-     * Get all stored operations with matching status.
-     *
-     * @param statuses set containing all statuses that should be matched
-     * @return list containing all matched operations
-     * @throws ServiceException if loading the stored operations failed
-     */
-    Set<Operation> list(EnumSet<Status> statuses) throws ServiceException;
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceImpl.java
deleted file mode 100644
index a83cf64..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceImpl.java
+++ /dev/null
@@ -1,286 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Severity;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import java.time.Instant;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-@Service
-public class OperationServiceImpl implements OperationService {
-
-    private static final Logger LOG = LoggerFactory.getLogger(OperationServiceImpl.class);
-
-    private final OperationDAO operationDAO;
-    private final VehicleDAO vehicleDAO;
-    private final VehicleService vehicleService;
-
-    public OperationServiceImpl(
-            OperationDAO operationDAO, VehicleDAO vehicleDAO, VehicleService vehicleService) {
-        this.operationDAO = operationDAO;
-        this.vehicleDAO = vehicleDAO;
-        this.vehicleService = vehicleService;
-    }
-
-    @Override
-    public long add(Operation o) throws InvalidOperationException, ServiceException {
-        if (o.created() != null) {
-            throw new InvalidOperationException("Erstellungszeitpunkt darf nicht gesetzt sein");
-        }
-
-        if (o.severity() != null) {
-            throw new InvalidOperationException("Der Schweregrad darf nicht gesetzt sein");
-        }
-
-        if (o.id() != 0) {
-            throw new InvalidOperationException("Einsatz-ID muss 0 sein");
-        }
-
-        if (o.status() != Status.ACTIVE)
-            LOG.info("Status was set but will be overridden"); // TODO: nullable instead??
-
-        try {
-            for (long id : (Iterable<Long>) o.vehicles().stream().map(Vehicle::id)::iterator) {
-                Vehicle v = vehicleDAO.get(id);
-                VehicleServiceImpl.validateVehicle(v);
-
-                if (v.status() != Vehicle.Status.FREI_FUNK
-                        && v.status() != Vehicle.Status.FREI_WACHE)
-                    throw new InvalidOperationException("Fahrzeug nicht verfügbar: " + v.status());
-            }
-
-            validateOperation(o);
-
-            return operationDAO.add(
-                    o.toBuilder()
-                            .created(Instant.now())
-                            .severity(extractSeverityFromOpCode(o.opCode()))
-                            .status(Status.ACTIVE)
-                            .build());
-        } catch (PersistenceException e) {
-            throw new ServiceException(e);
-        } catch (InvalidVehicleException e) {
-            // already logged as invalid vehicle
-            throw new InvalidOperationException("Enthaltenes Fahrzeug ist ungültig", e);
-        } catch (ElementNotFoundException e) {
-            throw new InvalidOperationException("Enthaltenes Fahrzeug existiert nicht", e);
-        }
-    }
-
-    @Override
-    public void requestVehicles(long operationId, Set<Long> vehicleIds)
-            throws InvalidOperationException, InvalidVehicleException, ServiceException {
-        Set<Vehicle> vs = new HashSet<>();
-
-        try {
-            if (operationId <= 0) {
-                throw new InvalidOperationException("Einsatz-ID ist ungültig");
-            }
-            Operation o = operationDAO.get(operationId);
-            validateOperation(o);
-
-            if (o.opCode().trim().isEmpty()
-                    || extractSeverityFromOpCode(o.opCode()) != o.severity()) {
-                throw new InvalidOperationException("Einsatzcode ist ungültig");
-            }
-
-            if (o.status() != Status.ACTIVE) {
-                throw new InvalidOperationException("Einsatz ist ungültig");
-            }
-
-            if (o.created() == null) {
-                throw new InvalidOperationException("Erstellungszeitpunkt darf nicht leer sein");
-            }
-
-            for (Long id : vehicleIds) {
-                if (id <= 0) {
-                    throw new InvalidVehicleException("Fahrzeug-ID ist ungültig");
-                }
-
-                try {
-                    Vehicle v = vehicleDAO.get(id);
-                    VehicleServiceImpl.validateVehicle(v);
-                    if (v.status() != Vehicle.Status.FREI_FUNK
-                            && v.status() != Vehicle.Status.FREI_WACHE)
-                        throw new InvalidOperationException(
-                                "Fahrzeug nicht verfügbar: " + v.status());
-
-                    vs.add(v);
-                } catch (ElementNotFoundException e) {
-                    throw new InvalidVehicleException("VehicleId ist invalid");
-                }
-            }
-
-            vs.addAll(o.vehicles());
-            if (vs.equals(o.vehicles())) return;
-
-            operationDAO.update(o.toBuilder().vehicles(vs).build());
-        } catch (ElementNotFoundException e) {
-            throw new InvalidOperationException("Kein Einsatz mit dieser ID existiert");
-        } catch (PersistenceException e) {
-            throw new ServiceException(e);
-        }
-    }
-
-    @Override
-    public void complete(long operationId, Status status)
-            throws InvalidOperationException, ServiceException {
-        try {
-            Operation o = operationDAO.get(operationId);
-            operationDAO.update(o.toBuilder().status(status).build());
-        } catch (ElementNotFoundException e) {
-            throw new InvalidOperationException(e);
-        } catch (PersistenceException e) {
-            throw new ServiceException(e);
-        }
-    }
-
-    @Override
-    public SortedSet<Vehicle> rankVehicles(String opCode)
-            throws InvalidOperationException, ServiceException {
-        Set<Vehicle> vehicles =
-                vehicleService.list(EnumSet.complementOf(EnumSet.of(Vehicle.Status.ABGEMELDET)));
-
-        List<Predicate<Vehicle>> priorities = new ArrayList<>();
-        Predicate<Vehicle> ktw = v -> v.type() == VehicleType.KTW;
-        Predicate<Vehicle> rtwNoNEF = v -> v.type() == VehicleType.RTW && !v.hasNef();
-        Predicate<Vehicle> rtwNEF = v -> v.type() == VehicleType.RTW && v.hasNef();
-        Predicate<Vehicle> nef = v -> v.type() == VehicleType.NEF;
-        Predicate<Vehicle> nah = v -> v.type() == VehicleType.NAH;
-
-        switch (extractSeverityFromOpCode(opCode)) {
-            case A:
-                // fallthrough
-            case B:
-                // fallthrough
-            case O:
-                priorities.add(ktw);
-                priorities.add(rtwNoNEF);
-                priorities.add(rtwNEF);
-                break;
-            case C:
-                priorities.add(rtwNEF);
-                priorities.add(rtwNoNEF);
-                priorities.add(ktw);
-                break;
-            case D:
-                priorities.add(rtwNEF);
-                priorities.add(nef);
-                priorities.add(nah);
-                priorities.add(rtwNoNEF);
-                priorities.add(ktw);
-                break;
-            case E:
-                priorities.add(nah);
-                priorities.add(nef);
-                priorities.add(rtwNEF);
-                priorities.add(rtwNoNEF);
-                priorities.add(ktw);
-                break;
-        }
-
-        Comparator<Vehicle> vehicleComparator =
-                (v1, v2) -> {
-                    for (Predicate<Vehicle> priority : priorities) {
-                        if (priority.test(v1)) {
-                            return -1;
-                        }
-                        if (priority.test(v2)) {
-                            return +1;
-                        }
-                    }
-                    return 0;
-                };
-
-        Supplier<TreeSet<Vehicle>> supplier = () -> new TreeSet<>(vehicleComparator);
-
-        return vehicles.stream().collect(Collectors.toCollection(supplier));
-    }
-
-    @Override
-    public Set<Operation> list(EnumSet<Status> statuses) throws ServiceException {
-        try {
-            Set<Operation> operations = operationDAO.list(statuses);
-            for (Operation o : operations) validateOperation(o);
-
-            return operations;
-        } catch (PersistenceException e) {
-            throw new ServiceException(e);
-        } catch (InvalidOperationException e) {
-            // database returned invalid values
-            throw new ServiceException("DB returned invalid operation", e);
-        }
-    }
-
-    private static void validateOperation(Operation o) throws InvalidOperationException {
-        if (o.vehicles().isEmpty()) {
-            throw new InvalidOperationException(
-                    "Es muss mindestens ein Fahrzeug ausgewählt werden!");
-        }
-
-        for (Vehicle v : o.vehicles()) {
-            try {
-                VehicleServiceImpl.validateVehicle(v);
-            } catch (InvalidVehicleException e) {
-                throw new InvalidOperationException("Fahrzeug " + v.name() + " ist ungültig", e);
-            }
-
-            // TODO: validate if NEF/RTW/NAH conditions?
-        }
-
-        Instant created = o.created();
-        if (created != null && created.isAfter(Instant.now())) {
-            throw new InvalidOperationException("Einsatz wurde in der Zukunft erstellt");
-        }
-
-        if (o.destination() == null || o.destination().trim().isEmpty()) {
-            throw new InvalidOperationException("Adresse darf nicht leer sein");
-        }
-
-        if (o.destination().length() > 100) {
-            throw new InvalidOperationException("Adresse darf 100 Zeichen nicht überschreiten");
-        }
-
-        if (o.additionalInfo() != null && o.additionalInfo().length() > 100) {
-            throw new InvalidOperationException("Anmerkung darf 100 Zeichen nicht überschreiten");
-        }
-    }
-
-    private static final Pattern opCodePattern =
-            Pattern.compile("(?:\\w{1,3}-\\d{0,2})([ABCDEO])(?:.*)");
-
-    private static Severity extractSeverityFromOpCode(String opCode)
-            throws InvalidOperationException {
-        Matcher m = opCodePattern.matcher(opCode);
-
-        if (!m.matches()) {
-            throw new InvalidOperationException("Einsatzcode ist ungültig");
-        }
-
-        return Severity.valueOf(m.group(1));
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationService.java
deleted file mode 100644
index b7d8eef..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationService.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import java.util.Set;
-
-public interface RegistrationService {
-
-    /**
-     * Register employee to a vehicle.
-     *
-     * @param vehicleId the id of the target vehicle
-     * @param registrations that should be added to the vehicle
-     * @return the list of ids that were assigned
-     * @throws InvalidVehicleException if the vehicleId is invalid or does not exist
-     * @throws InvalidRegistrationException if the registration is invalid
-     * @throws ServiceException if the registration could not be persisted
-     */
-    Set<Long> add(long vehicleId, Set<Registration> registrations)
-            throws InvalidVehicleException, InvalidRegistrationException, ServiceException;
-
-    /**
-     * Remove given registration from the store.
-     *
-     * @param registrationId the id of the registration that should be removed
-     * @throws InvalidRegistrationException if the registration is invalid or does not exist
-     * @throws ServiceException if the registration could not be removed from the store
-     */
-    void remove(long registrationId) throws InvalidRegistrationException, ServiceException;
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceImpl.java
deleted file mode 100644
index 1d92644..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceImpl.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.RegistrationValidator;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import java.util.Set;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-@Service
-public class RegistrationServiceImpl implements RegistrationService {
-
-    private final RegistrationDAO registrationDAO;
-    private final VehicleDAO vehicleDAO;
-
-    @Autowired
-    public RegistrationServiceImpl(RegistrationDAO registrationDAO, VehicleDAO vehicleDAO) {
-        this.registrationDAO = registrationDAO;
-        this.vehicleDAO = vehicleDAO;
-    }
-
-    @Override
-    public Set<Long> add(long vehicleId, Set<Registration> registrations)
-            throws InvalidVehicleException, InvalidRegistrationException, ServiceException {
-
-        if (vehicleId <= 0) throw new InvalidVehicleException("VehicleId invalid");
-
-        try {
-            Vehicle vehicle = vehicleDAO.get(vehicleId);
-
-            RegistrationValidator.validate(vehicle, registrations);
-
-            return registrationDAO.add(vehicle.id(), registrations);
-        } catch (PersistenceException e) {
-            throw new ServiceException(e);
-        } catch (ElementNotFoundException e) {
-            throw new InvalidVehicleException(e);
-        }
-    }
-
-    @Override
-    public void remove(long registrationId) throws InvalidRegistrationException, ServiceException {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleService.java
deleted file mode 100644
index fe09ca1..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import java.util.EnumSet;
-import java.util.Set;
-
-public interface VehicleService {
-
-    /**
-     * Add given vehicle to the store.
-     *
-     * @param vehicle that should be added to the store
-     * @return the id that was assigned
-     * @throws InvalidVehicleException if the vehicle is invalid
-     * @throws ServiceException if the vehicle could not be persisted
-     */
-    long add(Vehicle vehicle) throws InvalidVehicleException, ServiceException;
-
-    /**
-     * Update the given vehicle.
-     *
-     * @param vehicle that should be updated
-     * @return the updated vehicle
-     * @throws InvalidVehicleException if the vehicle is invalid
-     * @throws ServiceException if the updated vehicle could not be persisted
-     */
-    Vehicle update(Vehicle vehicle) throws InvalidVehicleException, ServiceException;
-
-    /**
-     * Get all stored vehicles with matching status.
-     *
-     * @param statuses set containing all statuses that should be matched
-     * @return list containing all stored vehicles
-     * @throws ServiceException if loading the stored vehicles failed
-     */
-    Set<Vehicle> list(EnumSet<Status> statuses) throws ServiceException;
-
-    /**
-     * Remove vehicle with the given id from the store.
-     *
-     * @param id of the vehicle that should be removed
-     * @throws InvalidVehicleException if given vehicle id is invalid or does not exist
-     * @throws ServiceException if the vehicle could not be removed from the store
-     */
-    void remove(long id) throws InvalidVehicleException, ServiceException;
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceImpl.java
deleted file mode 100644
index 0bf4aa6..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceImpl.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.ConstructionType;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.stream.Collectors;
-import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
-
-@Service
-public class VehicleServiceImpl implements VehicleService {
-
-    private VehicleDAO vehiclePersistence;
-
-    public VehicleServiceImpl(VehicleDAO vehiclePersistence) {
-        this.vehiclePersistence = vehiclePersistence;
-    }
-
-    public long add(Vehicle vehicle) throws InvalidVehicleException, ServiceException {
-        if (!CollectionUtils.isEmpty(vehicle.registrations())) {
-            throw new InvalidVehicleException(
-                    "Fahrzeug kann nicht mit Anmeldungen erstellt werden");
-        }
-
-        validateVehicle(vehicle);
-        try {
-            vehiclePersistence.add(vehicle);
-        } catch (PersistenceException e) {
-            throw new ServiceException(e);
-        }
-        return 0;
-    }
-
-    public Vehicle update(Vehicle vehicle) throws InvalidVehicleException, ServiceException {
-        validateVehicle(vehicle);
-        try {
-            vehiclePersistence.update(vehicle);
-        } catch (ElementNotFoundException e) {
-            throw new ServiceException("Element not found", e);
-        } catch (PersistenceException e) {
-            throw new ServiceException(e);
-        }
-        return vehicle;
-    }
-
-    protected static void validateVehicle(Vehicle vehicle) throws InvalidVehicleException {
-        switch (vehicle.type()) {
-            case RTW:
-                if (vehicle.constructionType() == ConstructionType.NORMAL) {
-                    throw new InvalidVehicleException("RTW darf kein Normales Dach haben");
-                } else if (vehicle.constructionType() == ConstructionType.MITTELHOCHDACH) {
-                    throw new InvalidVehicleException("RTW darf kein Mittelhochdach haben");
-                }
-                break;
-            case KTW:
-                if (vehicle.constructionType() == ConstructionType.NORMAL) {
-                    throw new InvalidVehicleException("KTW darf kein Normales Dach haben");
-                }
-                break;
-            case KTW_B:
-                if (vehicle.constructionType() == ConstructionType.NORMAL) {
-                    throw new InvalidVehicleException("KTW-B darf kein Normales Dach haben");
-                }
-                break;
-            case NEF:
-                if (vehicle.constructionType() == ConstructionType.MITTELHOCHDACH) {
-                    throw new InvalidVehicleException("NEF darf kein Mittelhochdach haben");
-                } else if (vehicle.constructionType() == ConstructionType.HOCHDACH) {
-                    throw new InvalidVehicleException("NEF darf kein Hochdach haben");
-                }
-                break;
-            case NAH:
-                if (vehicle.constructionType() == ConstructionType.MITTELHOCHDACH) {
-                    throw new InvalidVehicleException("NEF darf kein Mittelhochdach haben");
-                } else if (vehicle.constructionType() == ConstructionType.HOCHDACH) {
-                    throw new InvalidVehicleException("NEF darf kein Hochdach haben");
-                }
-                break;
-            case BKTW:
-                break;
-            default:
-                throw new IllegalStateException("BUG: invalid vehicle type" + vehicle.type());
-        }
-    }
-
-    @Override
-    public Set<Vehicle> list(EnumSet<Status> statuses) throws ServiceException {
-        if (statuses == null) {
-            throw new ServiceException("Statuses may not be null");
-        }
-
-        Set<Vehicle> vehicles;
-
-        try {
-            vehicles = vehiclePersistence.list();
-        } catch (PersistenceException e) {
-            throw new ServiceException(e);
-        }
-
-        return vehicles.stream()
-                .filter(vehicle -> statuses.contains(vehicle.status()))
-                .collect(Collectors.toSet());
-    }
-
-    @Override
-    public void remove(long id) throws InvalidVehicleException, ServiceException {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ArchiveOperationController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ArchiveOperationController.java
new file mode 100644
index 0000000..6e0c89d
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ArchiveOperationController.java
@@ -0,0 +1,213 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showServiceExceptionAlertAndWait;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.OperationService;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+import javafx.fxml.FXML;
+import javafx.scene.control.Label;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.AnchorPane;
+import javafx.scene.layout.FlowPane;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class ArchiveOperationController {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ArchiveOperationController.class);
+
+    @FXML private ImageView imvVehicleDetail;
+    @FXML private Label lblStatus;
+    @FXML private AnchorPane apMainDetails;
+    @FXML private Label lblOperations;
+    @FXML private Label lblCompleted;
+    @FXML private Label lblCancelled;
+    @FXML private AnchorPane backApMain;
+    @FXML private AnchorPane backApDetails;
+    @FXML private AnchorPane archiveOperationAP;
+    @FXML private AnchorPane apDetails;
+    @FXML private Label lblCodeHeader;
+    @FXML private Label lblOpCode;
+    @FXML private Label lblVehicles;
+    @FXML private Label lblDate;
+    @FXML private Label lblAddress;
+    @FXML private FlowPane fpVehicles;
+    private final OperationService operationService;
+    @FXML private FlowPane archiveOperationFlowPane;
+    private final CreateOperationController createOperationController;
+    private Set<Operation> list = new HashSet<>();
+    private final SpringFXMLLoader fxmlLoader;
+
+    public ArchiveOperationController(
+            OperationService operationService,
+            CreateOperationController createOperationController,
+            SpringFXMLLoader fxmlLoader) {
+        this.operationService = operationService;
+        this.createOperationController = createOperationController;
+        this.fxmlLoader = fxmlLoader;
+    }
+
+    @FXML
+    private void initialize() {
+        update();
+    }
+
+    public void update() {
+        archiveOperationFlowPane.getChildren().clear();
+        list.clear();
+        try {
+            list.addAll(operationService.list(EnumSet.of(Status.CANCELLED, Status.COMPLETED)));
+            long cancelledAmount = 0;
+            long completedAmount = 0;
+            for (Operation operation : list) {
+                if (operation.status() == Status.CANCELLED) cancelledAmount++;
+                else completedAmount++;
+            }
+            lblCancelled.setText("storniert: " + cancelledAmount);
+            lblCompleted.setText("abgeschlossen: " + completedAmount);
+            lblOperations.setText("Einsätze: " + list.size());
+        } catch (ServiceException e) {
+            LOG.error("ServiceException in update().", e);
+            showServiceExceptionAlertAndWait("Die Einsätze konnten nicht geladen werden!");
+            ;
+        }
+        setFlowPane();
+    }
+
+    private void setFlowPane() {
+        try {
+            archiveOperationFlowPane.getChildren().clear();
+            for (Operation operation : sortSet(list)) {
+                OperationInArchiveController opInAController =
+                        OperationInArchiveController.create();
+                opInAController.set(operation);
+                opInAController
+                        .getRoot()
+                        .setOnMouseClicked(
+                                event -> {
+                                    detailOperation = operation;
+                                    backApMain.setVisible(false);
+                                    apMainDetails.setVisible(false);
+                                    backApDetails.setVisible(true);
+                                    setOperation();
+                                    setDetailsVisible(true);
+                                    imvVehicleDetail.setImage(new Image("/images/Vehicle.png"));
+                                });
+                archiveOperationFlowPane.getChildren().add(opInAController.getRoot());
+            }
+        } catch (IOException e) {
+            LOG.error("IOException in setFlowPane(). ", e);
+            showServiceExceptionAlertAndWait("Die Elemente konnten nicht geladen werden!");
+        }
+    }
+
+    private Operation detailOperation;
+
+    private List<Operation> sortSet(Set<Operation> operationsSet) {
+        Operation[] array = operationsSet.toArray(new Operation[operationsSet.size()]);
+        for (int i = array.length - 1; i > 0; i--) {
+            for (int j = 0; j < i; j++) {
+                LocalDateTime first =
+                        LocalDateTime.ofInstant(
+                                Objects.requireNonNull(array[j].created()), ZoneOffset.UTC);
+                LocalDateTime second =
+                        LocalDateTime.ofInstant(
+                                Objects.requireNonNull(array[j + 1].created()), ZoneOffset.UTC);
+                if (first.isBefore(second)) {
+                    Operation help = array[j];
+                    array[j] = array[j + 1];
+                    array[j + 1] = help;
+                }
+            }
+        }
+        return Arrays.asList(array);
+    }
+
+    private void setOperation() {
+        lblCodeHeader.setText(detailOperation.opCode());
+        if (detailOperation.created() != null) {
+            LocalDateTime dateTime =
+                    LocalDateTime.ofInstant(
+                            Objects.requireNonNull(detailOperation.created()), ZoneOffset.UTC);
+            lblDate.setText(
+                    "am "
+                            + dateTime.getDayOfMonth()
+                            + "."
+                            + dateTime.getMonth().getValue()
+                            + "."
+                            + dateTime.getYear());
+        } else {
+            lblDate.setText("---");
+        }
+        lblStatus.setText(
+                "Status: "
+                        + (detailOperation.status() == Status.CANCELLED
+                                ? "storniert"
+                                : "abgeschlossen"));
+        lblOpCode.setText(detailOperation.opCode());
+        Collection<String> elements =
+                detailOperation.vehicles().stream().map(Vehicle::name).collect(Collectors.toList());
+        String result = String.join(", ", elements);
+
+        lblVehicles.setText(result);
+        lblAddress.setText(detailOperation.destination());
+
+        fpVehicles.getChildren().clear();
+        try {
+            for (Vehicle vehicle : detailOperation.vehicles()) {
+                DetailArchiveOperationController controller = null;
+
+                controller = DetailArchiveOperationController.create(fxmlLoader);
+
+                controller.set(vehicle);
+                fpVehicles.getChildren().add(controller.getRoot());
+            }
+        } catch (IOException e) {
+            LOG.error("IOException in setOperation(). ", e);
+            showServiceExceptionAlertAndWait("Die Element konnte nicht geladen werden!");
+        }
+    }
+
+    private void setDetailsVisible(boolean b) {
+        apDetails.setVisible(b);
+    }
+
+    public void backClicked() {
+        LOG.debug("Hyperlink \"Zurück\" in archive detail view clicked.");
+        fpVehicles.getChildren().clear();
+        setDetailsVisible(false);
+        backApDetails.setVisible(false);
+        apMainDetails.setVisible(true);
+        backApMain.setVisible(true);
+    }
+
+    public void backToMain() {
+        LOG.debug("Hyperlink \"Zurück\" in archive main view clicked.");
+        this.setVisible(false);
+        createOperationController.setVisible(true);
+    }
+
+    void setVisible(boolean b) {
+        archiveOperationAP.setVisible(b);
+        backApMain.setVisible(b);
+        apMainDetails.setVisible(b);
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateCarController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateCarController.java
new file mode 100644
index 0000000..aa76535
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateCarController.java
@@ -0,0 +1,231 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showServiceExceptionAlertAndWait;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showSuccessAlertAndWait;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showValidationErrorAlertAndWait;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleService;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import java.io.IOException;
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import javafx.collections.FXCollections;
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.scene.control.Button;
+import javafx.scene.control.CheckBox;
+import javafx.scene.control.ChoiceBox;
+import javafx.scene.input.MouseButton;
+import javafx.scene.layout.AnchorPane;
+import javafx.scene.layout.FlowPane;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class CreateCarController {
+
+    @FXML private AnchorPane createCarAP;
+    @FXML private ChoiceBox<String> cmbCtype;
+    @FXML private ChoiceBox<String> cmbTyp;
+
+    @FXML private Button btnCreate;
+    @FXML private CheckBox cbxNEF;
+    @FXML private FlowPane fpVehicleList;
+    private final CreateOperationController createOperationController;
+
+    private static final Logger LOG = LoggerFactory.getLogger(CreateCarController.class);
+    private final VehicleService vehicleService;
+    private boolean update = false;
+    private long vid = -1;
+
+    private Vehicle chooseVehicle;
+
+    public CreateCarController(
+            CreateOperationController createOperationController, VehicleService vehicleService) {
+        this.createOperationController = createOperationController;
+        this.vehicleService = vehicleService;
+    }
+
+    @FXML
+    private void initialize() {
+        fpVehicleList.setHgap(5);
+        fpVehicleList.setVgap(5);
+
+        cmbCtype.setItems(
+                FXCollections.observableArrayList(
+                        Stream.of(
+                                        ConstructionType.NORMAL,
+                                        ConstructionType.MITTELHOCHDACH,
+                                        ConstructionType.HOCHDACH)
+                                .map(Enum::toString)
+                                .collect(Collectors.toList())));
+        cmbCtype.setValue(ConstructionType.NORMAL.toString());
+        cmbTyp.setItems(
+                FXCollections.observableArrayList(
+                        Stream.of(
+                                        VehicleType.BKTW,
+                                        VehicleType.KTW_B,
+                                        VehicleType.KTW,
+                                        VehicleType.RTW,
+                                        VehicleType.NEF,
+                                        VehicleType.NAH)
+                                .map(Enum::toString)
+                                .collect(Collectors.toList())));
+        cmbTyp.setValue(VehicleType.BKTW.toString());
+
+        updateVehiclePane();
+    }
+
+    @FXML
+    private void createCar(ActionEvent actionEvent) {
+
+        if (!update) {
+            LOG.debug("Button \"Erstellen\" clicked.");
+            Vehicle vehicle =
+                    Vehicle.builder()
+                            .constructionType(parseConstructionType())
+                            .type(parseType())
+                            .name("")
+                            .status(Status.ABGEMELDET)
+                            .hasNef(cbxNEF.isSelected())
+                            .build();
+            try {
+                vehicleService.add(vehicle);
+                setToStart();
+            } catch (InvalidVehicleException e) {
+                LOG.debug("Validation of Vehicle failed");
+                showValidationErrorAlertAndWait(e.getMessage());
+                setToStart();
+                return;
+            } catch (ServiceException e) {
+                LOG.error("ServiceException in createCar(). ", e);
+                showServiceExceptionAlertAndWait(
+                        "Ein Fehler beim Erstellen des Fahrzeuges ist aufgetreten.");
+                setToStart();
+                return;
+            }
+            showSuccessAlertAndWait("Auto wurde erfolgreich angelegt.");
+        } else {
+            LOG.debug("Button \"Speichern\" clicked.");
+            try {
+                Vehicle vehicle =
+                        Vehicle.builder()
+                                .id(vid)
+                                .constructionType(parseConstructionType())
+                                .type(parseType())
+                                .name("")
+                                .status(Status.ABGEMELDET)
+                                .hasNef(cbxNEF.isSelected())
+                                .build();
+                vehicleService.update(vehicle);
+                setToStart();
+                chooseVehicle = null;
+            } catch (InvalidVehicleException e) {
+                LOG.debug("Validation of Vehicle failed");
+                showValidationErrorAlertAndWait(e.getMessage());
+                setToStart();
+                return;
+            } catch (ServiceException e) {
+                LOG.error("ServiceException in createCar(). ", e);
+                showServiceExceptionAlertAndWait(e.getMessage());
+                setToStart();
+                return;
+            }
+            showSuccessAlertAndWait("Auto wurde erfolgreich bearbeitet.");
+        }
+
+        updateVehiclePane();
+    }
+
+    private ConstructionType parseConstructionType() {
+        if (cmbCtype.getSelectionModel().getSelectedItem() == null) {
+            return ConstructionType.NORMAL;
+        }
+        return ConstructionType.valueOf(cmbCtype.getSelectionModel().getSelectedItem());
+    }
+
+    private VehicleType parseType() {
+        if (cmbTyp.getSelectionModel().getSelectedItem() == null) {
+            return VehicleType.BKTW;
+        }
+        return VehicleType.valueOf(cmbTyp.getSelectionModel().getSelectedItem());
+    }
+
+    private void setToStart() {
+        btnCreate.setText("Erstellen");
+        cbxNEF.setSelected(false);
+        cmbTyp.setValue(VehicleType.BKTW.name());
+        cmbCtype.setValue(ConstructionType.NORMAL.name());
+        update = false;
+    }
+
+    private void updateVehicle(Vehicle vehicle) {
+
+        cmbCtype.setValue(vehicle.constructionType().name());
+        cmbTyp.setValue(vehicle.type().name());
+        cbxNEF.setSelected(vehicle.hasNef());
+        btnCreate.setText("Speichern");
+        vid = vehicle.id();
+        update = true;
+        chooseVehicle = vehicle;
+    }
+
+    public void setVisible(boolean b) {
+        createCarAP.setVisible(b);
+    }
+
+    @FXML
+    private void backToMain() {
+        LOG.debug("Hyperlink \"zurück\" clicked.");
+        this.setVisible(false);
+        createOperationController.setVisible(true);
+    }
+
+    private void updateVehiclePane() {
+        try {
+            fpVehicleList.getChildren().clear();
+
+            Set<Vehicle> vehicles;
+
+            vehicles = vehicleService.list(EnumSet.of(Status.ABGEMELDET));
+
+            for (Vehicle vehicle : vehicles) {
+                VehiclePaneController controller = VehiclePaneController.createVehiclePane();
+
+                controller.setData(vehicle, false, false);
+                controller
+                        .getRootElement()
+                        .setOnMouseClicked(
+                                event -> {
+                                    if (event.getButton().equals(MouseButton.PRIMARY)) {
+                                        if (chooseVehicle == null || vehicle == chooseVehicle) {
+                                            if (update == false) {
+                                                chooseVehicle = vehicle;
+                                                updateVehicle(vehicle);
+                                                controller.setSelected(true);
+                                            } else {
+                                                setToStart();
+                                                controller.setSelected(false);
+
+                                                chooseVehicle = null;
+                                            }
+                                        }
+                                    }
+                                });
+
+                fpVehicleList.getChildren().add(controller.getRootElement());
+            }
+        } catch (ServiceException | IOException e) {
+            LOG.error("Exception in updateVehiclePane(). ", e);
+            showServiceExceptionAlertAndWait(e.getMessage());
+        }
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeController.java
new file mode 100644
index 0000000..433bfa6
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeController.java
@@ -0,0 +1,174 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showServiceExceptionAlertAndWait;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showSuccessAlertAndWait;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showValidationErrorAlertAndWait;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.EmployeeService;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper;
+import java.io.IOException;
+import java.time.LocalDate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import javafx.collections.FXCollections;
+import javafx.fxml.FXML;
+import javafx.scene.Node;
+import javafx.scene.control.Button;
+import javafx.scene.control.CheckBox;
+import javafx.scene.control.ChoiceBox;
+import javafx.scene.control.Label;
+import javafx.scene.control.TextField;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Controller;
+
+@Controller
+@Scope("prototype")
+public class CreateNewEmployeeController {
+
+    private static final Logger LOG = LoggerFactory.getLogger(CreateNewEmployeeController.class);
+    private final EmployeeService employeeService;
+
+    @FXML private Label lblHeader;
+    @FXML private CheckBox inputIsDriver;
+    @FXML private CheckBox inputIsPilot;
+    @FXML private TextField inputName;
+    @FXML private ChoiceBox<String> inputQualification;
+    @FXML private Button btnCreate;
+
+    private Node rootElement;
+    private Employee employee;
+    private boolean isEdit;
+
+    private Runnable consumerCancelClicked;
+    private Runnable consumerCreateClicked;
+
+    public CreateNewEmployeeController(EmployeeService employeeService) {
+        this.employeeService = employeeService;
+    }
+
+    @FXML
+    private void initialize() {
+        inputQualification.setItems(
+                FXCollections.observableArrayList(
+                        Stream.of(
+                                        EducationLevel.RS,
+                                        EducationLevel.NFS,
+                                        EducationLevel.NKV,
+                                        EducationLevel.NKA,
+                                        EducationLevel.NKI,
+                                        EducationLevel.NA)
+                                .map(Enum::toString)
+                                .collect(Collectors.toList())));
+
+        inputQualification.setValue(EducationLevel.RS.toString());
+        employee =
+                Employee.builder()
+                        .name("")
+                        .educationLevel(EducationLevel.RS)
+                        .isDriver(false)
+                        .isPilot(false)
+                        .birthday(LocalDate.MIN)
+                        .build();
+    }
+
+    @FXML
+    private void onCancelClicked() {
+        LOG.debug("Hyperlink \"abbrechen\" clicked.");
+        if (consumerCancelClicked != null) {
+            consumerCancelClicked.run();
+        }
+    }
+
+    @FXML
+    private void onCreateClicked() {
+        LOG.debug("Button {} clicked.", btnCreate.getText());
+
+        employee =
+                employee.toBuilder()
+                        .name(inputName.getText())
+                        .educationLevel(parseEducationLevel())
+                        .birthday(LocalDate.MIN) // TODO: change UI to include birthday field
+                        .isDriver(inputIsDriver.isSelected())
+                        .isPilot(inputIsPilot.isSelected())
+                        .build();
+
+        try {
+            if (isEdit) {
+                employeeService.update(employee);
+            } else {
+                employeeService.add(employee);
+            }
+        } catch (InvalidEmployeeException e) {
+            LOG.debug("Validation for Employee failed");
+            showValidationErrorAlertAndWait(e.getMessage());
+            return;
+        } catch (ServiceException e) {
+            LOG.error("ServiceException in onCreateClicked(). ", e);
+            showServiceExceptionAlertAndWait(
+                    "Der Eintrag konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.");
+            return;
+        }
+
+        showSuccessAlertAndWait(
+                "Der/die MitarbeiterIn wurde erfolgreich angelegt und gespeichert!");
+
+        if (consumerCreateClicked != null) {
+            consumerCreateClicked.run();
+        }
+    }
+
+    private EducationLevel parseEducationLevel() {
+        if (inputQualification.getSelectionModel().getSelectedItem() == null) {
+            return EducationLevel.RS;
+        }
+        return EducationLevel.valueOf(inputQualification.getSelectionModel().getSelectedItem());
+    }
+
+    private void setData(Employee employee) {
+        isEdit = true;
+        this.employee = employee;
+        inputName.setText(employee.name());
+        inputQualification.setValue(employee.educationLevel().name());
+        inputIsDriver.setSelected(employee.isDriver());
+        inputIsPilot.setSelected(employee.isPilot());
+        lblHeader.setText("Person bearbeiten");
+        btnCreate.setText("Speichern");
+    }
+
+    public static CreateNewEmployeeController createCreateNewEmployeeController(
+            SpringFXMLLoader fxmlLoader, Employee employee) throws IOException {
+        CreateNewEmployeeController controller = createCreateNewEmployeeController(fxmlLoader);
+        controller.setData(employee);
+        return controller;
+    }
+
+    public static CreateNewEmployeeController createCreateNewEmployeeController(
+            SpringFXMLLoader fxmlLoader) throws IOException {
+        FXMLWrapper<Object, CreateNewEmployeeController> wrapper =
+                fxmlLoader.loadAndWrap(
+                        "/fxml/createNewEmployee.fxml", CreateNewEmployeeController.class);
+        Node root = (Node) wrapper.getLoadedObject();
+        CreateNewEmployeeController controller = wrapper.getController();
+        controller.rootElement = root;
+        return controller;
+    }
+
+    public Node getRootElement() {
+        return rootElement;
+    }
+
+    public void setConsumerCancelClicked(Runnable consumerCancelClicked) {
+        this.consumerCancelClicked = consumerCancelClicked;
+    }
+
+    public void setConsumerCreateClicked(Runnable consumerCreateClicked) {
+        this.consumerCreateClicked = consumerCreateClicked;
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateOperationController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateOperationController.java
new file mode 100644
index 0000000..b237265
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateOperationController.java
@@ -0,0 +1,371 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showServiceExceptionAlertAndWait;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showSuccessAlertAndWait;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showValidationErrorAlertAndWait;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.OperationService;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleService;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import java.io.IOException;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import javafx.collections.FXCollections;
+import javafx.fxml.FXML;
+import javafx.scene.control.Button;
+import javafx.scene.control.ContextMenu;
+import javafx.scene.control.Label;
+import javafx.scene.control.ListCell;
+import javafx.scene.control.ListView;
+import javafx.scene.control.MenuItem;
+import javafx.scene.control.TextField;
+import javafx.scene.input.KeyCode;
+import javafx.scene.input.KeyEvent;
+import javafx.scene.input.MouseButton;
+import javafx.scene.layout.AnchorPane;
+import javafx.scene.layout.FlowPane;
+import javafx.scene.layout.GridPane;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class CreateOperationController {
+
+    private static final Logger LOG = LoggerFactory.getLogger(CreateOperationController.class);
+
+    public AnchorPane apCreateOperation;
+    @FXML private GridPane grdWindowContainer;
+    @FXML private TextField txtCode;
+    @FXML private TextField txtAddress;
+    @FXML private TextField txtNote;
+    @FXML private Button btnCreateOperation;
+    @FXML private ListView<Vehicle> lvVehicles;
+    @FXML private ListView<Operation> lvActiveOperations;
+    @FXML private Label lblChosenVehicles;
+    @FXML private AnchorPane apInvisible;
+    @FXML private OperationDetailsController operationDetailsController;
+    @FXML private ManageEmployeesController manageEmployeesController;
+    @FXML private CreateCarController createCarController;
+    @FXML private RegistrationWindowController registrationWindowController;
+    @FXML private ArchiveOperationController archiveOperationController;
+    @FXML private FlowPane fpVehicles;
+
+    private LinkedList<Vehicle> chosenVehicles = new LinkedList<>();
+
+    private final OperationService operationService;
+    private final VehicleService vehicleService;
+
+    public CreateOperationController(
+            OperationService operationService, VehicleService vehicleService) {
+        this.operationService = operationService;
+        this.vehicleService = vehicleService;
+    }
+
+    @FXML
+    private void initialize() {
+
+        lblChosenVehicles.setText("keine ausgewählt");
+        lvActiveOperations.setCellFactory(param -> generateOpCodeListItem());
+
+        lvActiveOperations.setOnMouseClicked(
+                event -> {
+                    if (event.getClickCount() == 2) {
+                        if (lvActiveOperations.getSelectionModel().getSelectedItem() == null) {
+                            return;
+                        }
+                        openDetailsWindow(lvActiveOperations.getSelectionModel().getSelectedItem());
+                    }
+                });
+
+        setVisible(true);
+        createCarController.setVisible(false);
+        registrationWindowController.setVisible(false);
+    }
+
+    public void updateList() {
+        try {
+            fpVehicles.getChildren().clear();
+
+            // TODO: this should probably be handled differently
+            Set<Vehicle> vehicles;
+            if (txtCode.getText().isEmpty()) {
+                vehicles =
+                        vehicleService.list(
+                                EnumSet.complementOf(EnumSet.of(Vehicle.Status.ABGEMELDET)));
+            } else {
+                vehicles = operationService.rankVehicles(txtCode.getText());
+            }
+
+            for (Vehicle vehicle : vehicles) {
+                VehiclePaneController controller = VehiclePaneController.createVehiclePane();
+
+                controller.setData(vehicle, true, false);
+                controller
+                        .getRootElement()
+                        .setOnMouseClicked(
+                                event -> {
+                                    if (event.getButton().equals(MouseButton.SECONDARY)) {
+                                        createContextMenu(vehicle, vehicleService)
+                                                .show(
+                                                        controller.getRootElement(),
+                                                        event.getScreenX(),
+                                                        event.getScreenY());
+                                    } else {
+                                        if (chosenVehicles.contains(vehicle)) {
+                                            chosenVehicles.remove(vehicle);
+                                            controller.setSelected(false);
+                                        } else {
+                                            chosenVehicles.add(vehicle);
+                                            controller.setSelected(true);
+                                        }
+
+                                        StringBuilder result = new StringBuilder();
+                                        for (int i = 0; i < chosenVehicles.size(); i++) {
+                                            if (i == chosenVehicles.size() - 1) {
+                                                result.append(chosenVehicles.get(i).name());
+                                            } else {
+                                                result.append(chosenVehicles.get(i).name())
+                                                        .append(", ");
+                                            }
+                                        }
+                                        if (result.toString().equals("")) {
+                                            lblChosenVehicles.setText("keine ausgewählt");
+                                        } else {
+                                            lblChosenVehicles.setText(result.toString());
+                                        }
+                                    }
+                                });
+
+                if (chosenVehicles.stream().anyMatch(v -> v.id() == vehicle.id()))
+                    controller.setSelected(true);
+
+                fpVehicles.getChildren().add(controller.getRootElement());
+            }
+        } catch (ServiceException | IOException e) {
+            LOG.error("Exception in updateList(). ", e);
+            showServiceExceptionAlertAndWait(
+                    "Beim Erstellen des Ranking ist ein Fehler aufgetreten.");
+        } catch (InvalidOperationException e) {
+            LOG.debug("Validation error in updateList(). ", e);
+            showValidationErrorAlertAndWait(e.getMessage());
+        }
+        try {
+            lvActiveOperations.setItems(
+                    FXCollections.observableArrayList(
+                            operationService.list(EnumSet.of(Status.ACTIVE))));
+        } catch (ServiceException e) {
+            LOG.error("ServiceException in updateList(). ", e);
+            showServiceExceptionAlertAndWait(
+                    "Beim Holen der aktiven Einsätze ist ein Fehler aufgetreten");
+        }
+    }
+
+    private ContextMenu createContextMenu(Vehicle data, VehicleService vehicleService) {
+        ContextMenu menu = new ContextMenu();
+
+        for (Vehicle.Status status : Vehicle.Status.values()) {
+            if (status == Vehicle.Status.ABGEMELDET) {
+                continue;
+            }
+
+            MenuItem mi = new MenuItem(status.name());
+
+            if (status == Vehicle.Status.FREI_FUNK || status == Vehicle.Status.FREI_WACHE) {
+                mi.getStyleClass().add("mi-free");
+            } else {
+                mi.getStyleClass().add("mi-other");
+            }
+
+            mi.setOnAction(
+                    event -> {
+                        try {
+                            vehicleService.update(data.toBuilder().status(status).build());
+                            this.updateList();
+                        } catch (InvalidVehicleException e) {
+                            LOG.debug(
+                                    "Validation error in createContextMenu(). (mi.setOnAction) ",
+                                    e);
+                            showValidationErrorAlertAndWait(e.getMessage());
+                        } catch (ServiceException e) {
+                            LOG.error("Exception in createContextMenu(). (mi.setOnAction) ", e);
+                            showServiceExceptionAlertAndWait(
+                                    "Beim Aktualisieren der Fahrzeuge ist ein Fehler aufgetreten.");
+                        }
+                    });
+
+            menu.getItems().add(mi);
+        }
+
+        MenuItem abmelden = new MenuItem("abmelden");
+
+        abmelden.setOnAction(
+                event -> {
+                    try {
+                        List<Registration> registrations = data.registrations();
+                        assert registrations
+                                != null; // Otherwise the element shouldn't be in the list.
+
+                        List<Registration> newRegistrations = new ArrayList<>();
+                        Instant now = Instant.now();
+
+                        for (Registration registration : registrations) {
+                            if (registration.start().isBefore(now)
+                                    && registration.end().isAfter(now)) {
+                                newRegistrations.add(
+                                        registration
+                                                .toBuilder()
+                                                .end(Instant.now().minus(1, ChronoUnit.SECONDS))
+                                                .build());
+                            } else newRegistrations.add(registration);
+                        }
+
+                        vehicleService.update(
+                                data.toBuilder()
+                                        .registrations(newRegistrations)
+                                        .status(Vehicle.Status.ABGEMELDET)
+                                        .build());
+
+                        this.updateList();
+                    } catch (InvalidVehicleException e) {
+                        LOG.debug(
+                                "Validation error in createContextMenu(). (abmelden.setOnAction) ",
+                                e);
+                        showValidationErrorAlertAndWait(e.getMessage());
+                    } catch (ServiceException e) {
+                        LOG.error("Exception in createContextMenu(). (abmelden.setOnAction) ", e);
+                        showServiceExceptionAlertAndWait(
+                                "Beim Aktualisieren der Fahrzeuge ist ein Fehler aufgetreten.");
+                    }
+                });
+
+        menu.getItems().add(abmelden);
+        return menu;
+    }
+
+    @FXML
+    protected void createOperationClicked() {
+        LOG.debug("Button \"Erstellen\" clicked.");
+        Vehicle[] vehicles = new Vehicle[chosenVehicles.size()];
+        for (int i = 0; i < chosenVehicles.size(); i++) {
+            vehicles[i] = chosenVehicles.get(i);
+        }
+        Operation operation =
+                Operation.builder()
+                        .additionalInfo(txtNote.getText())
+                        .destination(txtAddress.getText())
+                        .opCode(txtCode.getText())
+                        .status(Status.ACTIVE)
+                        .vehicles(Set.of(vehicles))
+                        .build();
+        try {
+            operationService.add(operation);
+        } catch (ServiceException e) {
+            LOG.error("Exception in createOperationClicked(). ", e);
+            showServiceExceptionAlertAndWait(
+                    "Beim Erstellen des Einsatzes ist ein Fehler aufgetreten.");
+            return;
+        } catch (InvalidOperationException e) {
+            LOG.debug("Validation error in createOperationClicked(). ", e);
+            showValidationErrorAlertAndWait(e.getMessage());
+            return;
+        }
+        showSuccessAlertAndWait("Der Einsatz wurde erfolgreich gespeichert.");
+        updateList();
+        lblChosenVehicles.setText("keine ausgewählt");
+        txtAddress.setText("");
+        txtCode.setText("");
+        txtNote.setText("");
+        chosenVehicles = new LinkedList<>();
+    }
+
+    @FXML
+    private void onRegistrationLinkClicked() {
+        LOG.debug("Hyperlink \"Anmeldungen\" clicked.");
+        openRegistrationWindow();
+    }
+
+    @FXML
+    private void onEmployeeLinkClicked() {
+        LOG.debug("Hyperlink \"Personen\" clicked.");
+        openCreateNewEmployeeWindow();
+    }
+
+    @FXML
+    private void onVehicleLinkClicked() {
+        LOG.debug("Hyperlink \"Fahrzeuge\" clicked.");
+        openCreateCarWindow();
+    }
+
+    @FXML
+    private void onArchivLinkClicked() {
+        LOG.debug("Hyperlink \"Archiv\" clicked.");
+        archiveOperationController.update();
+        openArchivWindow();
+    }
+
+    private void openArchivWindow() {
+        archiveOperationController.setVisible(true);
+        this.setVisible(false);
+    }
+
+    void setVisible(boolean b) {
+        apInvisible.setVisible(!b);
+        grdWindowContainer.setVisible(!b);
+
+        updateList();
+    }
+
+    private void openDetailsWindow(Operation operation) {
+        operationDetailsController.initOperation(operation);
+        this.setVisible(false);
+    }
+
+    private void openCreateNewEmployeeWindow() {
+        this.setVisible(false);
+        manageEmployeesController.setVisible(true);
+    }
+
+    private void openCreateCarWindow() {
+        this.setVisible(false);
+        createCarController.setVisible(true);
+    }
+
+    private void openRegistrationWindow() {
+        this.setVisible(false);
+        registrationWindowController.setVisible(true);
+    }
+
+    @FXML
+    private void onOperationCodeChanged(KeyEvent keyEvent) {
+        if (keyEvent.getCode() == KeyCode.ENTER) {
+            updateList();
+        }
+    }
+
+    static ListCell<Operation> generateOpCodeListItem() {
+        return new ListCell<>() {
+            @Override
+            protected void updateItem(Operation item, boolean empty) {
+                super.updateItem(item, empty);
+
+                if (empty || item == null || item.opCode() == null) {
+                    setText(null);
+                } else {
+                    setText(item.opCode());
+                }
+            }
+        };
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CustomListItemController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CustomListItemController.java
new file mode 100644
index 0000000..ced0c10
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CustomListItemController.java
@@ -0,0 +1,24 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import javafx.scene.Node;
+
+public abstract class CustomListItemController {
+
+    protected Node rootElement;
+
+    public Node getRootElement() {
+        return rootElement;
+    }
+
+    public void setSelected(boolean selected) {
+        rootElement.getStyleClass().clear();
+
+        if (selected) {
+            rootElement.getStyleClass().add("bg-yellow");
+            rootElement.getStyleClass().add("shadowed");
+        } else {
+            rootElement.getStyleClass().add("bg-white");
+            rootElement.getStyleClass().add("shadowed");
+        }
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/DetailArchiveOperationController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/DetailArchiveOperationController.java
new file mode 100644
index 0000000..32630a5
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/DetailArchiveOperationController.java
@@ -0,0 +1,77 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showServiceExceptionAlertAndWait;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper;
+import java.io.IOException;
+import java.util.Objects;
+import javafx.fxml.FXML;
+import javafx.scene.Node;
+import javafx.scene.layout.VBox;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class DetailArchiveOperationController {
+    private static final Logger LOG =
+            LoggerFactory.getLogger(DetailArchiveOperationController.class);
+
+    @FXML private VBox vBoxVehicle;
+    @FXML private VBox vBoxPeople;
+    private final SpringFXMLLoader fxmlLoader;
+
+    public DetailArchiveOperationController(SpringFXMLLoader fxmlLoader) {
+        this.fxmlLoader = fxmlLoader;
+    }
+
+    static DetailArchiveOperationController create(SpringFXMLLoader fxmlLoader) throws IOException {
+        FXMLWrapper<Object, DetailArchiveOperationController> wrapper =
+                fxmlLoader.loadAndWrap(
+                        "/fxml/DetailArchiveOperation.fxml",
+                        DetailArchiveOperationController.class);
+
+        Node root = (Node) wrapper.getLoadedObject();
+        DetailArchiveOperationController result = wrapper.getController();
+        result.rootElement = root;
+
+        return result;
+    }
+
+    public Node getRoot() {
+        return rootElement;
+    }
+
+    private Node rootElement;
+
+    public void set(Vehicle vehicle) {
+        VehiclePaneController controller;
+        try {
+            controller = VehiclePaneController.createVehiclePane();
+            controller.setData(vehicle, false, false);
+            vBoxVehicle.getChildren().add(controller.getRootElement());
+        } catch (IOException e) {
+            LOG.error("IOException in set(Vehicle). (vBoxVehicle) ", e);
+            showServiceExceptionAlertAndWait(
+                    "Ein interner Fehler ist aufgetreten. Bitte wenden Sie sich an den/die SystemadministratorIn.");
+        }
+        try {
+            for (int i = 0; i < Objects.requireNonNull(vehicle.registrations()).size(); i++) {
+                Employee employee =
+                        Objects.requireNonNull(vehicle.registrations()).get(i).employee();
+
+                EmployeeListItemController employeeListItemController =
+                        EmployeeListItemController.createEmployeeListItemController(
+                                fxmlLoader, employee);
+                vBoxPeople.getChildren().add(employeeListItemController.getRootElement());
+            }
+        } catch (IOException e) {
+            LOG.error("IOException in set(Vehicle). (vBoxPeople) ", e);
+            showServiceExceptionAlertAndWait(
+                    "Ein interner Fehler ist aufgetreten. Bitte wenden Sie sich an den/die SystemadministratorIn.");
+        }
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/EmployeeListController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/EmployeeListController.java
new file mode 100644
index 0000000..12f6bff
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/EmployeeListController.java
@@ -0,0 +1,133 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Consumer;
+import javafx.fxml.FXML;
+import javafx.geometry.Insets;
+import javafx.scene.Node;
+import javafx.scene.layout.FlowPane;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Controller;
+
+@Controller
+@Scope("prototype")
+public class EmployeeListController {
+
+    private static final Logger LOG = LoggerFactory.getLogger(EmployeeListController.class);
+
+    @FXML private FlowPane flowPaneEmployeeList;
+
+    private Consumer<Employee> onEmployeeClicked;
+
+    private final SpringFXMLLoader fxmlLoader;
+    private Node rootElement;
+    private List<EmployeeListItemController> employeeListItemControllers;
+    private Insets listItemMargins = new Insets(10, 5, 0, 5);
+
+    public EmployeeListController(SpringFXMLLoader fxmlLoader) {
+        this.fxmlLoader = fxmlLoader;
+        this.employeeListItemControllers = new ArrayList<>();
+    }
+
+    public void setListItemMargins(Insets value) {
+        this.listItemMargins = value;
+    }
+
+    public void setData(Set<Employee> employeeList) {
+        setData(employeeList, null, null);
+    }
+
+    public void setData(Set<Employee> employeeList, Consumer<Employee> onEmployeeClicked) {
+        setData(employeeList, onEmployeeClicked, null);
+    }
+
+    public void setData(
+            Set<Employee> employeeList,
+            Consumer<Employee> onEmployeeClicked,
+            Consumer<EmployeeListItemController> onEmployeeListItemClicked) {
+
+        flowPaneEmployeeList.getChildren().clear();
+        employeeListItemControllers.clear();
+        employeeList.forEach(
+                employee ->
+                        addEmployeeToFlowPane(
+                                employee, onEmployeeClicked, onEmployeeListItemClicked));
+    }
+
+    private void addEmployeeToFlowPane(
+            Employee employee,
+            Consumer<Employee> onEmployeeClicked,
+            Consumer<EmployeeListItemController> onEmployeeListItemClicked) {
+
+        try {
+            EmployeeListItemController controller =
+                    EmployeeListItemController.createEmployeeListItemController(
+                            fxmlLoader, employee);
+            Node rootElement = controller.getRootElement();
+            flowPaneEmployeeList.getChildren().add(rootElement);
+            employeeListItemControllers.add(controller);
+            FlowPane.setMargin(rootElement, listItemMargins);
+            if (onEmployeeClicked != null) {
+                controller.setConsumerEmployeeClicked(onEmployeeClicked);
+            }
+            if (onEmployeeListItemClicked != null) {
+                controller.setConsumerEmployeeListItemClicked(
+                        employeeListItemController -> {
+                            onEmployeeListItemClicked.accept(employeeListItemController);
+                            if (this.onEmployeeClicked != null) {
+                                this.onEmployeeClicked.accept(
+                                        employeeListItemController.getEmployee());
+                            }
+                        });
+            }
+        } catch (IOException e) {
+            LOG.error("IOException in addEmployeeToFlowPane. ", e);
+        }
+    }
+
+    private void setEmployeeSelected(Employee employee, boolean selected) {
+        employeeListItemControllers
+                .stream()
+                .filter(controller -> controller.getEmployee().equals(employee))
+                .forEach(controller -> controller.setSelected(selected));
+    }
+
+    public void selectEmployee(Employee employee) {
+        setEmployeeSelected(employee, true);
+    }
+
+    public void deselectEmployee(Employee employee) {
+        setEmployeeSelected(employee, false);
+    }
+
+    public void deselectAllEmployees() {
+        employeeListItemControllers.forEach(
+                employeeListItemController -> employeeListItemController.setSelected(false));
+    }
+
+    public static EmployeeListController createEmployeeListController(SpringFXMLLoader loader)
+            throws IOException {
+        FXMLWrapper<Object, EmployeeListController> wrapper =
+                loader.loadAndWrap("/fxml/employeeList.fxml", EmployeeListController.class);
+        Node root = (Node) wrapper.getLoadedObject();
+        EmployeeListController controller = wrapper.getController();
+        controller.rootElement = root;
+        return controller;
+    }
+
+    public Node getRootElement() {
+        return rootElement;
+    }
+
+    public void setOnEmployeeClicked(Consumer<Employee> onEmployeeClicked) {
+        this.onEmployeeClicked = onEmployeeClicked;
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/EmployeeListItemController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/EmployeeListItemController.java
new file mode 100644
index 0000000..543fe0d
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/EmployeeListItemController.java
@@ -0,0 +1,87 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper;
+import java.io.IOException;
+import java.util.function.Consumer;
+import javafx.fxml.FXML;
+import javafx.scene.Node;
+import javafx.scene.control.Label;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Controller;
+
+@Controller
+@Scope("prototype")
+public class EmployeeListItemController extends CustomListItemController {
+
+    @FXML private Label lblName;
+    @FXML private Label lblQualification;
+    @FXML private Label lblPilot;
+    @FXML private Label lblDriver;
+    @FXML private ImageView imgPilot;
+    @FXML private ImageView imgDriver;
+    @FXML private ImageView imgQualification;
+
+    private Employee employee;
+
+    private Consumer<Employee> consumerEmployeeClicked;
+    private Consumer<EmployeeListItemController> consumerEmployeeListItemClicked;
+
+    @FXML
+    private void onEmployeeClicked() {
+        if (consumerEmployeeClicked != null) {
+            consumerEmployeeClicked.accept(employee);
+        }
+        if (consumerEmployeeListItemClicked != null) {
+            consumerEmployeeListItemClicked.accept(this);
+        }
+    }
+
+    private void setData(Employee employee) {
+        this.employee = employee;
+        lblName.setText(employee.name());
+        lblQualification.setText(employee.educationLevel().name());
+        lblPilot.setText(String.format("%s Pilot", employee.isPilot() ? "ist" : "nicht"));
+        lblDriver.setText(String.format("%s Fahrer", employee.isDriver() ? "ist" : "nicht"));
+        imgQualification.setImage(new Image("/images/Qualification.png"));
+        String imgSrcPilot =
+                String.format("/images/%s", employee.isPilot() ? "Pilot.png" : "NotPilot.png");
+        imgPilot.setImage(new Image(imgSrcPilot));
+        String imgSrcDriver =
+                String.format("/images/%s", employee.isDriver() ? "Driver.png" : "NotDriver.png");
+        imgDriver.setImage(new Image(imgSrcDriver));
+    }
+
+    public static EmployeeListItemController createEmployeeListItemController(
+            SpringFXMLLoader fxmlLoader, Employee employee) throws IOException {
+        EmployeeListItemController controller = createEmployeeListItemController(fxmlLoader);
+        controller.setData(employee);
+        return controller;
+    }
+
+    public static EmployeeListItemController createEmployeeListItemController(
+            SpringFXMLLoader loader) throws IOException {
+        FXMLWrapper<Object, EmployeeListItemController> wrapper =
+                loader.loadAndWrap("/fxml/employeeListItem.fxml", EmployeeListItemController.class);
+        Node root = (Node) wrapper.getLoadedObject();
+        EmployeeListItemController controller = wrapper.getController();
+        controller.rootElement = root;
+        return controller;
+    }
+
+    public Employee getEmployee() {
+        return employee;
+    }
+
+    public void setConsumerEmployeeClicked(Consumer<Employee> consumerEmployeeClicked) {
+        this.consumerEmployeeClicked = consumerEmployeeClicked;
+    }
+
+    public void setConsumerEmployeeListItemClicked(
+            Consumer<EmployeeListItemController> consumerEmployeeListItemClicked) {
+        this.consumerEmployeeListItemClicked = consumerEmployeeListItemClicked;
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/FilterEmployeesController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/FilterEmployeesController.java
new file mode 100644
index 0000000..a31c3e3
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/FilterEmployeesController.java
@@ -0,0 +1,65 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper;
+import java.io.IOException;
+import java.util.function.Consumer;
+import javafx.fxml.FXML;
+import javafx.scene.Node;
+import javafx.scene.control.TextField;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Controller;
+
+@Controller
+@Scope("prototype")
+public class FilterEmployeesController {
+    private static final Logger LOG = LoggerFactory.getLogger(FilterEmployeesController.class);
+
+    @FXML private TextField inputFilterString;
+
+    private Consumer<String> consumerFilterTextChanged;
+    private Runnable consumerAddEmployeeClicked;
+
+    private Node rootElement;
+
+    @FXML
+    private void onAddEmployeeClicked() {
+        LOG.debug("Button \"Person hinzufügen\" clicked.");
+        if (consumerAddEmployeeClicked != null) {
+            consumerAddEmployeeClicked.run();
+        }
+    }
+
+    @FXML
+    private void onFilterTextChanged() {
+        LOG.debug("Filter text changed.");
+        if (consumerFilterTextChanged != null) {
+            consumerFilterTextChanged.accept(inputFilterString.getText());
+        }
+    }
+
+    public void setOnFilterTextChangedListener(Consumer<String> callback) {
+        this.consumerFilterTextChanged = callback;
+    }
+
+    public void setOnAddEmployeeClickedListener(Runnable callback) {
+        this.consumerAddEmployeeClicked = callback;
+    }
+
+    public static FilterEmployeesController createFilterEmployeesController(
+            SpringFXMLLoader fxmlLoader) throws IOException {
+        FXMLWrapper<Object, FilterEmployeesController> wrapper =
+                fxmlLoader.loadAndWrap(
+                        "/fxml/filterEmployeesControl.fxml", FilterEmployeesController.class);
+        Node root = (Node) wrapper.getLoadedObject();
+        FilterEmployeesController controller = wrapper.getController();
+        controller.rootElement = root;
+        return controller;
+    }
+
+    public Node getRootElement() {
+        return rootElement;
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/Helper.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/Helper.java
new file mode 100644
index 0000000..f120eb6
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/Helper.java
@@ -0,0 +1,34 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import javafx.scene.control.Alert;
+import javafx.scene.control.Alert.AlertType;
+import javafx.scene.control.ButtonType;
+
+public class Helper {
+
+    static final String ALERT_TITLE_VALIDATION_ERROR = "Validierungsfehler";
+    static final String ALERT_TITLE_SERVICE_EXCEPTION = "Fehler";
+    static final String ALERT_TITLE_SUCCESS = "Erfolg";
+
+    private Helper() {} // SonarLint insisted to create a private constructor to hide the public one
+
+    static void showValidationErrorAlertAndWait(String message) {
+        showAlertWithOkButtonAndWait(AlertType.ERROR, ALERT_TITLE_VALIDATION_ERROR, message);
+    }
+
+    static void showServiceExceptionAlertAndWait(String message) {
+        showAlertWithOkButtonAndWait(AlertType.ERROR, ALERT_TITLE_SERVICE_EXCEPTION, message);
+    }
+
+    static void showSuccessAlertAndWait(String message) {
+        showAlertWithOkButtonAndWait(AlertType.INFORMATION, ALERT_TITLE_SUCCESS, message);
+    }
+
+    static void showAlertWithOkButtonAndWait(
+            AlertType alertType, String headerText, String contentText) {
+        Alert alert = new Alert(alertType, contentText, ButtonType.OK);
+        alert.setTitle(headerText);
+        alert.setHeaderText(headerText);
+        alert.showAndWait();
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ManageEmployeesController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ManageEmployeesController.java
new file mode 100644
index 0000000..6138094
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ManageEmployeesController.java
@@ -0,0 +1,120 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.EmployeeService;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.stream.Collectors;
+import javafx.fxml.FXML;
+import javafx.scene.layout.AnchorPane;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class ManageEmployeesController {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ManageEmployeesController.class);
+    @FXML private AnchorPane listEmployeesAP;
+    @FXML private AnchorPane containerHeader;
+    @FXML private EmployeeListController employeeListController;
+
+    private final EmployeeService employeeService;
+    private final SpringFXMLLoader fxmlLoader;
+
+    private final CreateOperationController createOperationController;
+
+    public ManageEmployeesController(
+            EmployeeService employeeService,
+            SpringFXMLLoader fxmlLoader,
+            CreateOperationController createOperationController) {
+        this.employeeService = employeeService;
+        this.fxmlLoader = fxmlLoader;
+        this.createOperationController = createOperationController;
+    }
+
+    @FXML
+    private void initialize() {
+        openFilter();
+    }
+
+    private void openFilter() {
+        try {
+            FilterEmployeesController filterEmployeesController =
+                    FilterEmployeesController.createFilterEmployeesController(fxmlLoader);
+            containerHeader.getChildren().clear();
+            containerHeader.getChildren().add(filterEmployeesController.getRootElement());
+            filterEmployeesController.setOnFilterTextChangedListener(this::updateEmployeeList);
+            filterEmployeesController.setOnAddEmployeeClickedListener(this::openAddEmployee);
+            updateEmployeeList();
+
+        } catch (IOException e) {
+            LOG.error("IOException in openFilter().", e);
+        }
+    }
+
+    private void openAddEmployee() {
+        employeeListController.deselectAllEmployees();
+        openEmployee(null);
+    }
+
+    private void openEditEmployee(Employee employee) {
+        employeeListController.deselectAllEmployees();
+        employeeListController.selectEmployee(employee);
+        openEmployee(employee);
+    }
+
+    private void openEmployee(Employee employee) {
+        try {
+            CreateNewEmployeeController createNewEmployeeController =
+                    employee == null
+                            ? CreateNewEmployeeController.createCreateNewEmployeeController(
+                                    fxmlLoader)
+                            : CreateNewEmployeeController.createCreateNewEmployeeController(
+                                    fxmlLoader, employee);
+            containerHeader.getChildren().clear();
+            containerHeader.getChildren().add(createNewEmployeeController.getRootElement());
+            createNewEmployeeController.setConsumerCancelClicked(this::openFilter);
+            createNewEmployeeController.setConsumerCreateClicked(this::openFilter);
+        } catch (IOException e) {
+            LOG.error("IOException in openEmployee(). ", e);
+        }
+    }
+
+    private void updateEmployeeList() {
+        updateEmployeeList("");
+    }
+
+    private void updateEmployeeList(String searchString) {
+
+        try {
+            employeeListController.setData(
+                    employeeService
+                            .list()
+                            .stream()
+                            .filter(
+                                    employee ->
+                                            searchString.trim().isEmpty()
+                                                    || employee.name()
+                                                            .toLowerCase()
+                                                            .contains(searchString.toLowerCase()))
+                            .collect(Collectors.toCollection(HashSet::new)),
+                    this::openEditEmployee);
+
+        } catch (ServiceException e) {
+            LOG.error("ServiceException in updateEmployeeList(). ", e);
+        }
+    }
+
+    public void setVisible(boolean b) {
+        listEmployeesAP.setVisible(b);
+    }
+
+    public void backToMain() {
+        LOG.debug("Hyperlink \"Zurück\" clicked.");
+        this.setVisible(false);
+        createOperationController.setVisible(true);
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationDetailsController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationDetailsController.java
new file mode 100644
index 0000000..0476fc6
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationDetailsController.java
@@ -0,0 +1,169 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showAlertWithOkButtonAndWait;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showServiceExceptionAlertAndWait;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showSuccessAlertAndWait;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showValidationErrorAlertAndWait;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.OperationService;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleService;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import javafx.collections.FXCollections;
+import javafx.fxml.FXML;
+import javafx.scene.control.Alert.AlertType;
+import javafx.scene.control.Button;
+import javafx.scene.control.Label;
+import javafx.scene.control.ListView;
+import javafx.scene.layout.AnchorPane;
+import javafx.scene.layout.FlowPane;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class OperationDetailsController {
+    private static final Logger LOG = LoggerFactory.getLogger(OperationDetailsController.class);
+
+    public Operation operation;
+    private final OperationService operationService;
+    private final VehicleService vehicleService;
+    private final CreateOperationController createOperationController;
+    @FXML private FlowPane fpVehicles;
+    @FXML private ListView<Operation> lvActiveOperations;
+    @FXML private Label lblChosenVehicles;
+    @FXML private Button btnCloseOperation;
+    @FXML private Button btnCancelOperation;
+    @FXML private Label lblCode, lblAdditionalInfo, lblAddress;
+    @FXML private AnchorPane operationDetailsAP;
+
+    public OperationDetailsController(
+            OperationService operationService,
+            VehicleService vehicleService,
+            CreateOperationController createOperationController) {
+        this.operationService = operationService;
+        this.vehicleService = vehicleService;
+        this.createOperationController = createOperationController;
+    }
+
+    @FXML
+    private void initialize() {
+        lvActiveOperations.setCellFactory(
+                param -> CreateOperationController.generateOpCodeListItem());
+        lvActiveOperations.setOnMouseClicked(
+                event -> {
+                    if (event.getClickCount() == 2) {
+                        if (lvActiveOperations.getSelectionModel().getSelectedItem() == null) {
+                            return;
+                        }
+                        initOperation(lvActiveOperations.getSelectionModel().getSelectedItem());
+                    }
+                });
+    }
+
+    private void updateFlowPane() {
+        try {
+            fpVehicles.getChildren().clear();
+            for (Vehicle vehicle : operation.vehicles()) {
+                VehiclePaneController controller = VehiclePaneController.createVehiclePane();
+                controller.setData(vehicle, true, true);
+                controller.getBtnRequest().setOnAction(e -> requestVehicleClicked(controller));
+                fpVehicles.getChildren().add(controller.getRootElement());
+            }
+        } catch (IOException e) {
+            LOG.error("Error while updating list.", e);
+            showServiceExceptionAlertAndWait("Error while updating list.");
+        }
+    }
+
+    void initOperation(Operation operation) {
+        fillActiveList();
+        this.operation = operation;
+        lblCode.setText(operation.opCode());
+        Collection<String> vehicleNames =
+                operation.vehicles().stream().map(Vehicle::name).collect(Collectors.toList());
+        String result = String.join(", ", vehicleNames);
+        lblChosenVehicles.setText(result.toString());
+        lblAdditionalInfo.setText(operation.additionalInfo());
+        lblAddress.setText(operation.destination());
+        updateFlowPane();
+        operationDetailsAP.setVisible(true);
+    }
+
+    private void fillActiveList() {
+        try {
+            lvActiveOperations.setItems(
+                    FXCollections.observableArrayList(
+                            operationService.list(EnumSet.of(Status.ACTIVE))));
+        } catch (ServiceException e) {
+            LOG.error("ServiceException in fillActiveList(). ", e);
+            showServiceExceptionAlertAndWait(e.getMessage());
+        }
+    }
+
+    @FXML
+    public void closeOperationClicked() {
+        LOG.debug("Button \"Abschließen\" clicked.");
+        try {
+            operationService.complete(operation.id(), Status.COMPLETED);
+        } catch (InvalidOperationException e) {
+            LOG.debug("Validation error in closeOperationClicked(). ", e);
+            showAlertWithOkButtonAndWait(AlertType.ERROR, "Validierungsfehler", e.getMessage());
+            return;
+        } catch (ServiceException e) {
+            LOG.error("Exception in closeOperationClicked(). ", e);
+            showServiceExceptionAlertAndWait(e.getMessage());
+            return;
+        }
+        showSuccessAlertAndWait("Der Einsatz wurde erfolgreich aktualisiert");
+        createOperationController.updateList();
+        closeWindow();
+    }
+
+    public void cancelOperationClicked() {
+        LOG.debug("Button \"Stornieren\" clicked.");
+        try {
+            operationService.complete(operation.id(), Status.CANCELLED);
+        } catch (InvalidOperationException e) {
+            LOG.debug("Validation error in cancelOperationClicked(). ", e);
+            showValidationErrorAlertAndWait(e.getMessage());
+            return;
+        } catch (ServiceException e) {
+            LOG.error("Exception in cancelOperationClicked(). ", e);
+            showServiceExceptionAlertAndWait(e.getMessage());
+            return;
+        }
+        showSuccessAlertAndWait("Der Einsatz wurde erfolgreich aktualisiert");
+        createOperationController.updateList();
+        closeWindow();
+    }
+
+    private void requestVehicleClicked(VehiclePaneController v) {
+        LOG.debug("Button \"Nachfordern\" clicked.");
+
+        try {
+            operationService.requestVehicles(operation.id(), Set.of(v.getData().id()));
+        } catch (ServiceException | InvalidOperationException | InvalidVehicleException e) {
+            LOG.error("Exception in requestVehicleClicked()", e);
+            showServiceExceptionAlertAndWait(e.getMessage());
+            return;
+        }
+        showSuccessAlertAndWait("Das Fahrzeug wurde erfolgreich angefordert");
+        createOperationController.updateList();
+    }
+
+    public void closeWindow() {
+        LOG.debug("Hyperlink \"Zurück\" clicked.");
+        operationDetailsAP.setVisible(false);
+        this.createOperationController.setVisible(true);
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationInArchiveController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationInArchiveController.java
new file mode 100644
index 0000000..17f0f55
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationInArchiveController.java
@@ -0,0 +1,65 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.Collection;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Node;
+import javafx.scene.text.Text;
+
+public class OperationInArchiveController {
+
+    @FXML private Text txtAddress;
+    @FXML private Text txtVehicles;
+    @FXML private Text txtDate;
+    @FXML private Text txtOpCode;
+
+    static OperationInArchiveController create() throws IOException {
+        FXMLLoader fxmlLoader =
+                new FXMLLoader(
+                        OperationInArchiveController.class.getResource(
+                                "/fxml/OperationInArchive.fxml"));
+        Node root = fxmlLoader.load();
+        OperationInArchiveController result = fxmlLoader.getController();
+        result.rootElement = root;
+
+        return result;
+    }
+
+    public Node getRoot() {
+        return rootElement;
+    }
+
+    private Node rootElement;
+
+    public void set(Operation operation) {
+        txtAddress.setText(operation.destination());
+        String date = "am ";
+        if (operation.created() != null) {
+            LocalDateTime myDateTime =
+                    LocalDateTime.ofInstant(
+                            Objects.requireNonNull(operation.created()), ZoneOffset.UTC);
+            date +=
+                    myDateTime.getDayOfMonth()
+                            + "."
+                            + myDateTime.getMonth().getValue()
+                            + "."
+                            + myDateTime.getYear();
+            txtDate.setText(date);
+        } else {
+            txtDate.setText("---");
+        }
+        txtOpCode.setText(operation.opCode());
+        Collection<String> elements =
+                operation.vehicles().stream().map(Vehicle::name).collect(Collectors.toList());
+        String result = String.join(", ", elements);
+
+        txtVehicles.setText(result);
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/RegistrationWindowController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/RegistrationWindowController.java
new file mode 100644
index 0000000..9c47fe4
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/RegistrationWindowController.java
@@ -0,0 +1,279 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showServiceExceptionAlertAndWait;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showValidationErrorAlertAndWait;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.EmployeeService;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.RegistrationService;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleService;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
+import java.io.IOException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.OffsetDateTime;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.fxml.FXML;
+import javafx.geometry.Insets;
+import javafx.scene.Node;
+import javafx.scene.control.ChoiceBox;
+import javafx.scene.control.Label;
+import javafx.scene.control.ScrollPane;
+import javafx.scene.control.TextField;
+import javafx.scene.input.KeyEvent;
+import javafx.scene.input.MouseButton;
+import javafx.scene.layout.GridPane;
+import javafx.scene.layout.VBox;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class RegistrationWindowController {
+
+    private static final Logger LOG = LoggerFactory.getLogger(RegistrationWindowController.class);
+
+    private final EmployeeService employeeService;
+    private final VehicleService vehicleService;
+    private final RegistrationService registrationService;
+    private final CreateOperationController createOperationController;
+    private final SpringFXMLLoader fxmlLoader;
+
+    @FXML private GridPane root;
+    @FXML private VBox vbVehicles;
+    @FXML private ScrollPane listEmployee;
+    @FXML private ChoiceBox<Integer> cbStart;
+    @FXML private ChoiceBox<Integer> cbEnd;
+    @FXML private Label lVehicles;
+    @FXML private Label lEmployees;
+    @FXML private TextField tfVehicleSearch;
+    @FXML private TextField tfEmployeeSearch;
+    private EmployeeListController employeeListController;
+
+    private Vehicle chosenVehicle;
+    private List<Employee> chosenEmployees = new LinkedList<>();
+
+    public RegistrationWindowController(
+            EmployeeService employeeService,
+            VehicleService vehicleService,
+            CreateOperationController createOperationController,
+            RegistrationService registrationService,
+            SpringFXMLLoader fxmlLoader) {
+        this.employeeService = employeeService;
+        this.vehicleService = vehicleService;
+        this.createOperationController = createOperationController;
+        this.registrationService = registrationService;
+        this.fxmlLoader = fxmlLoader;
+    }
+
+    @FXML
+    private void initialize() throws IOException {
+        employeeListController = EmployeeListController.createEmployeeListController(fxmlLoader);
+        employeeListController.setListItemMargins(new Insets(10, 6, 0, 6));
+        //        listEmployee. .getChildren().add(employeeListController.getRootElement());
+        Node emplList = employeeListController.getRootElement();
+        //        emplList.(360);
+        listEmployee.setContent(emplList);
+
+        ObservableList<Integer> hours =
+                FXCollections.observableArrayList(
+                        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+                        21, 22, 23);
+        cbStart.setItems(hours);
+        cbStart.setValue(0);
+        cbEnd.setItems(hours);
+        cbEnd.setValue(12);
+
+        reset();
+    }
+
+    private void updateEmplList() {
+        employeeListController.deselectAllEmployees();
+
+        try {
+            Set<Employee> employees =
+                    employeeService
+                            .list()
+                            .stream()
+                            .filter(
+                                    e ->
+                                            e.name()
+                                                    .toLowerCase()
+                                                    .contains(
+                                                            tfEmployeeSearch
+                                                                    .getText()
+                                                                    .toLowerCase()))
+                            .collect(Collectors.toCollection(HashSet::new));
+            employeeListController.setData(
+                    employees,
+                    selection -> {
+                        if (selection == null) {
+                            return;
+                        } else if (chosenEmployees.contains(selection)) {
+                            chosenEmployees.remove(selection);
+                        } else {
+                            chosenEmployees.add(selection);
+                        }
+
+                        StringBuilder text = new StringBuilder();
+                        boolean first = true;
+                        for (Employee employee : chosenEmployees) {
+                            if (!first) {
+                                text.append(", ");
+                            }
+                            text.append(employee.name());
+                            first = false;
+                        }
+                        lEmployees.setText(text.toString());
+                    },
+                    contr -> contr.setSelected(chosenEmployees.contains(contr.getEmployee())));
+
+            employees.forEach(
+                    e -> {
+                        if (chosenEmployees.contains(e)) employeeListController.selectEmployee(e);
+                    });
+        } catch (ServiceException e) {
+            LOG.error("ServiceException in updateEmplList(). ", e);
+            showServiceExceptionAlertAndWait(
+                    "Beim Auflisten des Personals ist ein Fehler aufgetreten.");
+        }
+    }
+
+    private void updateVehList() {
+        vbVehicles.getChildren().clear();
+
+        try {
+            Set<Vehicle> vehicles = vehicleService.list(EnumSet.of(Status.ABGEMELDET));
+
+            boolean anyMatch = false;
+
+            for (Vehicle vehicle : vehicles) {
+                if (!vehicle.name().toLowerCase().contains(tfVehicleSearch.getText().toLowerCase()))
+                    continue;
+
+                anyMatch = true;
+
+                VehiclePaneController vp = VehiclePaneController.createVehiclePane();
+                vp.setData(vehicle, false, false);
+                vbVehicles.getChildren().add(vp.getRootElement());
+
+                vp.getRootElement()
+                        .setOnMouseClicked(
+                                event -> {
+                                    if (event.getButton() == MouseButton.PRIMARY) {
+                                        chosenVehicle = vehicle;
+                                        lVehicles.setText(chosenVehicle.name());
+                                        updateVehList();
+                                    }
+                                });
+                if (chosenVehicle != null && chosenVehicle.id() == vehicle.id())
+                    vp.setSelected(true);
+            }
+
+            if (!anyMatch) {
+                // Kind of ugly, but best way to get the size of a VehiclePane
+                VehiclePaneController vp = VehiclePaneController.createVehiclePane();
+                vp.getRootElement().setVisible(false);
+                vbVehicles.getChildren().add(vp.getRootElement());
+            }
+        } catch (ServiceException e) {
+            LOG.error("ServiceException in updateVehList(). ", e);
+            showServiceExceptionAlertAndWait(
+                    "Beim Auflisten der Fahrzeuge ist ein Fehler aufgetreten");
+        } catch (IOException e) {
+            LOG.error("IOException in updateVehList(). ", e);
+            showServiceExceptionAlertAndWait("Beim Laden der Fahrzeuge ist ein Fehler aufgetreten");
+        }
+    }
+
+    public void cancel() {
+        LOG.debug("Hyperlink \"schließen\" clicked");
+        reset();
+        this.setVisible(false);
+        createOperationController.setVisible(true);
+    }
+
+    private void reset() {
+        chosenEmployees.clear();
+        chosenVehicle = null;
+        tfEmployeeSearch.setText("");
+        tfVehicleSearch.setText("");
+        lEmployees.setText("-");
+        lVehicles.setText("-");
+        updateVehList();
+        updateEmplList();
+    }
+
+    public void create() {
+        LOG.debug("Button \"ERSTELLEN\" clicked");
+
+        Set<Registration> registrations = new HashSet<>();
+        try {
+            if (chosenVehicle == null) {
+                throw new InvalidVehicleException("no Vehicle");
+            }
+            for (Employee employee : chosenEmployees) {
+                registrations.add(
+                        Registration.builder()
+                                .id(chosenVehicle.id())
+                                .employee(employee)
+                                .start(
+                                        LocalDateTime.of(
+                                                        LocalDate.now(),
+                                                        LocalTime.of(cbStart.getValue(), 0))
+                                                .toInstant(OffsetDateTime.now().getOffset()))
+                                .end(
+                                        LocalDateTime.of(
+                                                        LocalDate.now(),
+                                                        LocalTime.of(cbEnd.getValue(), 0))
+                                                .toInstant(OffsetDateTime.now().getOffset()))
+                                .build());
+            }
+
+            registrationService.add(chosenVehicle.id(), registrations);
+            chosenEmployees.clear();
+            // ((Stage) lVehicles.getScene().getWindow()).close();
+            this.setVisible(false);
+            createOperationController.setVisible(true);
+            reset();
+        } catch (InvalidVehicleException e) {
+            LOG.debug("Validation of Vehicle in Registration failed.");
+            showValidationErrorAlertAndWait("Das spezifizierte Fahrzeug ist nicht gültig.");
+        } catch (ServiceException e) {
+            LOG.error("ServiceException in create(). ", e);
+            showServiceExceptionAlertAndWait(
+                    "Beim Erstellen der Anmeldung ist ein Fehler aufgetreten.");
+        } catch (InvalidRegistrationException e) {
+            LOG.debug("Validation of Registration failed.");
+            showValidationErrorAlertAndWait(
+                    "Die gewählte Kombination von Fahrzeug und Personal ist nicht gültig!");
+        }
+    }
+
+    public void setVisible(boolean b) {
+        root.setVisible(b);
+        reset();
+    }
+
+    public void tfVehicleSearch_TextChanged(KeyEvent keyEvent) {
+        updateVehList();
+    }
+
+    public void tfEmployeeSearch_TextChanged(KeyEvent keyEvent) {
+        updateEmplList();
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/VehiclePaneController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/VehiclePaneController.java
new file mode 100644
index 0000000..66b45d2
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/VehiclePaneController.java
@@ -0,0 +1,118 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
+import java.io.IOException;
+import java.time.Instant;
+import java.util.List;
+import java.util.Optional;
+import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Node;
+import javafx.scene.control.Button;
+import javafx.scene.control.Label;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.text.Text;
+
+public class VehiclePaneController extends CustomListItemController {
+
+    public static VehiclePaneController createVehiclePane() throws IOException {
+        FXMLLoader fxmlLoader =
+                new FXMLLoader(VehiclePaneController.class.getResource("/fxml/vehiclePane.fxml"));
+        Node root = fxmlLoader.load();
+        VehiclePaneController result = fxmlLoader.getController();
+        result.rootElement = root;
+
+        return result;
+    }
+
+    @FXML private Label txtStatus;
+    @FXML private Text txtType;
+    @FXML private Text txtNumber;
+    @FXML private ImageView ivNEF;
+    @FXML private Text txtNEF;
+    @FXML private ImageView ivQualification;
+    @FXML private Text txtQualification;
+    @FXML private Text txtRooftype;
+    @FXML private Button btnRequest;
+
+    private Vehicle data;
+
+    public Vehicle getData() {
+        return data;
+    }
+
+    /**
+     * * Set the displayed data of this VehiclePane.
+     *
+     * @param vehicle The data to display.
+     * @param showStatusInfo If true, the highest qualification of the vehicle's active registration
+     *     and the vehicle's status will be shown.
+     */
+    public void setData(Vehicle vehicle, boolean showStatusInfo, boolean showRequestVehicle) {
+        txtType.setText(vehicle.type().name());
+        String constrType = vehicle.constructionType().name();
+        txtRooftype.setText(
+                constrType.substring(0, 1).toUpperCase() + constrType.substring(1).toLowerCase());
+        txtNumber.setText("-" + vehicle.id());
+        if (vehicle.hasNef()) {
+            ivNEF.setImage(new Image("images/NEF.png"));
+            txtNEF.setText("hat NEF-Halterung");
+        } else {
+            ivNEF.setImage(new Image("images/NotNEF.png"));
+            txtNEF.setText("keine NEF-Halterung");
+        }
+
+        if (showRequestVehicle) {
+            btnRequest.setVisible(true);
+            btnRequest.setManaged(true);
+        } else {
+            btnRequest.setVisible(false);
+            btnRequest.setManaged(false);
+        }
+
+        if (showStatusInfo) {
+            txtStatus.setText(vehicle.status().name());
+            if (vehicle.status() == Status.FREI_FUNK || vehicle.status() == Status.FREI_WACHE) {
+                txtStatus.getStyleClass().add("bg-status-green");
+            } else {
+                txtStatus.getStyleClass().add("bg-status-orange");
+            }
+
+            Instant now = Instant.now();
+            List<Registration> regs = vehicle.registrations();
+
+            if (regs == null) {
+                return;
+            }
+
+            Optional<EducationLevel> edu =
+                    regs.stream()
+                            .filter(reg -> reg.start().isBefore(now) && reg.end().isAfter(now))
+                            .map(reg -> reg.employee().educationLevel())
+                            .max(EducationLevel::compareTo);
+
+            if (!edu.isPresent()) {
+                return;
+            }
+
+            txtQualification.setText(edu.get().name());
+        } else {
+            txtQualification.setVisible(false);
+            txtQualification.setManaged(false);
+            ivQualification.setVisible(false);
+            ivQualification.setManaged(false);
+
+            txtStatus.setVisible(false);
+        }
+
+        this.data = vehicle;
+    }
+
+    public Button getBtnRequest() {
+        return btnRequest;
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAO.java
new file mode 100644
index 0000000..d8ac513
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAO.java
@@ -0,0 +1,44 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import java.util.Set;
+
+public interface EmployeeDAO {
+
+    /**
+     * Persist the given employee.
+     *
+     * @param employee that should be stored
+     * @return the id that was assigned
+     * @throws PersistenceException if the employee could not be persisted
+     */
+    long add(Employee employee) throws PersistenceException;
+
+    /**
+     * Update the given employee.
+     *
+     * @param employee that should be updated
+     * @throws ElementNotFoundException if no employee with the given id exists
+     * @throws PersistenceException if the employee could not be updated
+     */
+    void update(Employee employee) throws ElementNotFoundException, PersistenceException;
+
+    /**
+     * Get all stored employees.
+     *
+     * @return list containing all stored employees
+     * @throws PersistenceException if loading the stored employees failed
+     */
+    Set<Employee> list() throws PersistenceException;
+
+    /**
+     * Remove employee with the given id from the store.
+     *
+     * @param id of the employee that should be removed
+     * @throws ElementNotFoundException if no employee with the given id exists
+     * @throws PersistenceException if the employee could not be removed
+     */
+    void remove(long id) throws ElementNotFoundException, PersistenceException;
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDatabaseDAO.java
new file mode 100644
index 0000000..889b0fc
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDatabaseDAO.java
@@ -0,0 +1,144 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.time.LocalDate;
+import java.util.HashSet;
+import java.util.Set;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class EmployeeDatabaseDAO implements EmployeeDAO {
+
+    private JDBCConnectionManager jdbcConnectionManager;
+
+    public EmployeeDatabaseDAO(JDBCConnectionManager jdbcConnectionManager) {
+        this.jdbcConnectionManager = jdbcConnectionManager;
+    }
+
+    private long createEmployeeVersion(Connection con, Employee e)
+            throws PersistenceException, SQLException {
+        String sql =
+                "INSERT INTO EmployeeVersion(name, birthday, educationLevel, isDriver, isPilot) "
+                        + "VALUES(?, ?, ?, ?, ?)";
+
+        try (PreparedStatement pstmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
+            pstmt.setString(1, e.name());
+            pstmt.setObject(2, e.birthday());
+            pstmt.setInt(3, e.educationLevel().ordinal());
+            pstmt.setBoolean(4, e.isDriver());
+            pstmt.setBoolean(5, e.isPilot());
+            pstmt.executeUpdate();
+
+            try (ResultSet rs = pstmt.getGeneratedKeys()) {
+                if (!rs.next()) throw new PersistenceException("Failed to insert EmployeeVersion");
+
+                return rs.getLong(1);
+            }
+        }
+    }
+
+    @Override
+    public long add(Employee employee) throws PersistenceException {
+        String sql = "INSERT INTO Employee(version) VALUES(?)";
+
+        try {
+            Connection con = jdbcConnectionManager.getConnection();
+            con.setAutoCommit(false);
+
+            long versionId = createEmployeeVersion(con, employee);
+
+            try (PreparedStatement pstmt =
+                    con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
+                pstmt.setLong(1, versionId);
+                pstmt.executeUpdate();
+
+                try (ResultSet rs = pstmt.getGeneratedKeys()) {
+                    if (!rs.next()) {
+                        con.rollback();
+                        throw new PersistenceException("Failed to insert Employee");
+                    }
+
+                    con.commit();
+                    return rs.getLong(1);
+                }
+            }
+        } catch (SQLException e) {
+            jdbcConnectionManager.rollbackConnection();
+            throw new PersistenceException(e);
+        }
+    }
+
+    @Override
+    public void update(Employee employee) throws ElementNotFoundException, PersistenceException {
+        String sql = "UPDATE Employee SET version = ? WHERE id = ?";
+
+        try {
+            Connection con = jdbcConnectionManager.getConnection();
+            con.setAutoCommit(false);
+
+            long versionId = createEmployeeVersion(con, employee);
+
+            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
+                pstmt.setLong(1, versionId);
+                pstmt.setLong(2, employee.id());
+
+                if (pstmt.executeUpdate() != 1) {
+                    con.rollback();
+                    throw new ElementNotFoundException("No such employeeId exists");
+                }
+            }
+
+            con.commit();
+        } catch (SQLException e) {
+            jdbcConnectionManager.rollbackConnection();
+            throw new PersistenceException(e);
+        }
+    }
+
+    @Override
+    public Set<Employee> list() throws PersistenceException {
+        String sql =
+                "SELECT emp.id, v.name, v.birthday, v.educationLevel, v.isDriver, v.isPilot "
+                        + "FROM employee emp "
+                        + "JOIN EmployeeVersion v ON v.id = emp.version";
+
+        try {
+            Connection con = jdbcConnectionManager.getConnection();
+            Set<Employee> employees = new HashSet<>();
+
+            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
+                try (ResultSet rs = pstmt.executeQuery()) {
+                    while (rs.next()) {
+                        employees.add(
+                                Employee.builder()
+                                        .id(rs.getLong(1))
+                                        .name(rs.getString(2))
+                                        .birthday(rs.getObject(3, LocalDate.class))
+                                        .educationLevel(EducationLevel.valueOf(rs.getString(4)))
+                                        .isDriver(rs.getBoolean(5))
+                                        .isPilot(rs.getBoolean(6))
+                                        .build());
+                    }
+                }
+            }
+
+            return employees;
+        } catch (SQLException e) {
+            throw new PersistenceException(e);
+        }
+    }
+
+    @Override
+    public void remove(long id) throws ElementNotFoundException, PersistenceException {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAO.java
new file mode 100644
index 0000000..c0ef5d4
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAO.java
@@ -0,0 +1,48 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import java.util.EnumSet;
+import java.util.Set;
+
+public interface OperationDAO {
+
+    /**
+     * Persist the given operation.
+     *
+     * @param operation that should be stored
+     * @return the id that was assigned
+     * @throws PersistenceException if the operation could not be persisted
+     */
+    long add(Operation operation) throws PersistenceException;
+
+    /**
+     * Update the given operation.
+     *
+     * @param operation that should be updated
+     * @throws ElementNotFoundException if no operation with the given id exists
+     * @throws PersistenceException if the operation could not be updated
+     */
+    void update(Operation operation) throws ElementNotFoundException, PersistenceException;
+
+    /**
+     * Returns the operation with the given id.
+     *
+     * @param operationId id of the operation that should be returned
+     * @return operation with the given id
+     * @throws ElementNotFoundException if no operation with the given id exists
+     * @throws PersistenceException if the operation could not be loaded
+     */
+    Operation get(long operationId) throws ElementNotFoundException, PersistenceException;
+
+    /**
+     * Get all stored operations with matching status.
+     *
+     * @param statuses set containing all statuses that should be matched
+     * @return list containing all matched operations
+     * @throws PersistenceException if loading the stored operations failed
+     */
+    Set<Operation> list(EnumSet<Status> statuses) throws PersistenceException;
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDatabaseDAO.java
new file mode 100644
index 0000000..1641720
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDatabaseDAO.java
@@ -0,0 +1,221 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Severity;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.time.OffsetDateTime;
+import java.time.ZoneId;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.springframework.lang.NonNull;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class OperationDatabaseDAO implements OperationDAO {
+
+    private JDBCConnectionManager jdbcConnectionManager;
+    private VehicleDAO vehicleDAO;
+
+    public OperationDatabaseDAO(
+            JDBCConnectionManager jdbcConnectionManager, VehicleDAO vehicleDAO) {
+        this.jdbcConnectionManager = jdbcConnectionManager;
+        this.vehicleDAO = vehicleDAO;
+    }
+
+    @Override
+    public long add(@NonNull Operation o) throws PersistenceException {
+        String sql =
+                "INSERT INTO Operation(opCode, severity, created, destination, additionalInfo,"
+                        + "            status) VALUES (?, ?, ?, ?, ?, ?)";
+        String sql2 = "INSERT INTO VehicleOperation(vehicleId, operationId) VALUES (?, ?)";
+        long operationId;
+
+        try {
+            Connection con = jdbcConnectionManager.getConnection();
+            con.setAutoCommit(false);
+            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
+                pstmt.setString(1, o.opCode());
+                pstmt.setInt(2, o.severity().ordinal());
+                pstmt.setObject(3, OffsetDateTime.ofInstant(o.created(), ZoneId.systemDefault()));
+                pstmt.setString(4, o.destination());
+                pstmt.setString(5, o.additionalInfo());
+                pstmt.setInt(6, o.status().ordinal());
+                pstmt.executeUpdate();
+
+                try (ResultSet rs = pstmt.getGeneratedKeys()) {
+                    if (!rs.next()) throw new PersistenceException("Failed to persist operation");
+
+                    operationId = rs.getLong(1);
+                }
+            }
+
+            try (PreparedStatement pstmt = con.prepareStatement(sql2)) {
+                pstmt.setLong(2, operationId);
+
+                for (long id : (Iterable<Long>) o.vehicles().stream().map(Vehicle::id)::iterator) {
+                    pstmt.setLong(1, id);
+                    pstmt.addBatch();
+                }
+
+                pstmt.executeBatch();
+            }
+            con.commit();
+            return operationId;
+        } catch (SQLException e) {
+            jdbcConnectionManager.rollbackConnection();
+            throw new PersistenceException(e);
+        }
+    }
+
+    @Override
+    public void update(@NonNull Operation o) throws ElementNotFoundException, PersistenceException {
+        // Note this will, by design, not update created
+        String sql =
+                "UPDATE Operation SET opCode = ?, severity = ?, destination = ?,"
+                        + " additionalInfo = ?, status = ? WHERE id = ?";
+        String sql2 = "DELETE FROM VehicleOperation WHERE operationId = ?";
+        String sql3 = "INSERT INTO VehicleOperation(vehicleId, operationId) VALUES (?, ?)";
+
+        try {
+            Connection con = jdbcConnectionManager.getConnection();
+            con.setAutoCommit(false);
+            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
+                pstmt.setString(1, o.opCode());
+                pstmt.setInt(2, o.severity().ordinal());
+                pstmt.setString(3, o.destination());
+                pstmt.setString(4, o.additionalInfo());
+                pstmt.setInt(5, o.status().ordinal());
+                pstmt.setLong(6, o.id());
+
+                if (pstmt.executeUpdate() != 1)
+                    throw new ElementNotFoundException("No such operationId exists");
+            }
+
+            try (PreparedStatement pstmt = con.prepareStatement(sql2)) {
+                pstmt.setLong(1, o.id());
+                pstmt.executeUpdate();
+            }
+
+            try (PreparedStatement pstmt = con.prepareStatement(sql3)) {
+                pstmt.setLong(2, o.id());
+
+                for (long id : (Iterable<Long>) o.vehicles().stream().map(Vehicle::id)::iterator) {
+                    pstmt.setLong(1, id);
+                    pstmt.addBatch();
+                }
+
+                pstmt.executeBatch();
+            }
+            con.commit();
+        } catch (SQLException e) {
+            jdbcConnectionManager.rollbackConnection();
+            throw new PersistenceException(e);
+        }
+    }
+
+    @Override
+    public Operation get(long operationId) throws ElementNotFoundException, PersistenceException {
+        String sql = "Select * from operation where id = ?";
+
+        try {
+            Connection con = jdbcConnectionManager.getConnection();
+            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
+                pstmt.setLong(1, operationId);
+                pstmt.execute();
+
+                try (ResultSet rs = pstmt.getResultSet()) {
+                    if (!rs.next())
+                        throw new ElementNotFoundException("No such element could be found");
+
+                    return operationFromRS(rs);
+                }
+            }
+        } catch (SQLException e) {
+            throw new PersistenceException(e);
+        }
+    }
+
+    @Override
+    public Set<Operation> list(EnumSet<Status> statuses) throws PersistenceException {
+        // This hack exists because H2 currently has a bug that prevents IN (?) with an array of
+        // ids, i.e. pstmt.setArray(1, con.createArrayOf("INT", intarray) from working. See
+        // commented code below.
+
+        // SELECT * FROM Operation WHERE status IN ('COMPLETED', 'CANCELLED') is BUGGED on H2!
+        // for this reason we use the ordinal values instead
+        String str =
+                statuses.stream()
+                        .map(e -> Integer.toString(e.ordinal()))
+                        .collect(Collectors.joining(","));
+
+        String sql = "SELECT * FROM Operation WHERE status IN (" + str + ")";
+        Set<Operation> operations = new HashSet<>();
+
+        try {
+            Connection con = jdbcConnectionManager.getConnection();
+
+            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
+                // Object[] arr = statuses.stream().map(Enum::ordinal).toArray();
+                // pstmt.setArray(1, con.createArrayOf("INT", arr));
+
+                try (ResultSet rs = pstmt.executeQuery()) {
+                    while (rs.next()) operations.add(operationFromRS(rs));
+                }
+            }
+
+            return operations;
+        } catch (SQLException e) {
+            throw new PersistenceException(e);
+        }
+    }
+
+    private Operation operationFromRS(ResultSet rs) throws PersistenceException, SQLException {
+        Long operationId = rs.getLong("id");
+
+        return Operation.builder()
+                .id(operationId)
+                .opCode(rs.getString("opCode"))
+                .severity(Severity.valueOf(rs.getString("severity")))
+                .status(Status.valueOf(rs.getString("status")))
+                .vehicles(getVehiclesFromOperationId(operationId))
+                .created((rs.getObject("created", OffsetDateTime.class)).toInstant())
+                .destination(rs.getString("destination"))
+                .additionalInfo(rs.getString("additionalInfo"))
+                .build();
+    }
+
+    private Set<Vehicle> getVehiclesFromOperationId(long operationId) throws PersistenceException {
+        String sql = "SELECT vehicleId FROM VehicleOperation WHERE operationId = ?";
+        Set<Vehicle> vehicles = new HashSet<>();
+
+        try {
+            Connection con = jdbcConnectionManager.getConnection();
+            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
+                pstmt.setLong(1, operationId);
+                pstmt.execute();
+
+                try (ResultSet rs = pstmt.getResultSet()) {
+                    while (rs.next()) {
+                        vehicles.add(vehicleDAO.get(rs.getLong("vehicleId")));
+                    }
+                }
+            }
+        } catch (SQLException e) {
+            throw new PersistenceException(e);
+        } catch (ElementNotFoundException e) {
+            throw new PersistenceException("VehicleOperation contained nonexistent vehicle", e);
+        }
+
+        return vehicles;
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAO.java
new file mode 100644
index 0000000..02e742c
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAO.java
@@ -0,0 +1,28 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import java.util.Set;
+
+public interface RegistrationDAO {
+
+    /**
+     * Persist the given registration.
+     *
+     * @param vehicleId the id of the target vehicle
+     * @param registrations that should be stored
+     * @return a list of the ids that were assigned
+     * @throws PersistenceException if the registration could not be persisted
+     */
+    Set<Long> add(long vehicleId, Set<Registration> registrations) throws PersistenceException;
+
+    /**
+     * Make registration with the given id inactive.
+     *
+     * @param id of the registration that should be made inactive
+     * @throws ElementNotFoundException if no registration with the given id exists
+     * @throws PersistenceException if the registration could not be made inactive
+     */
+    void remove(long id) throws ElementNotFoundException, PersistenceException;
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDatabaseDAO.java
new file mode 100644
index 0000000..1006a33
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDatabaseDAO.java
@@ -0,0 +1,130 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.time.OffsetDateTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class RegistrationDatabaseDAO implements RegistrationDAO {
+
+    private JDBCConnectionManager jdbcConnectionManager;
+    private EmployeeDAO employeePersistence;
+
+    @Autowired
+    public RegistrationDatabaseDAO(
+            JDBCConnectionManager jdbcConnectionManager, EmployeeDAO employeePersistence) {
+        this.jdbcConnectionManager = jdbcConnectionManager;
+        this.employeePersistence = employeePersistence;
+    }
+
+    @Override
+    public Set<Long> add(long vehicleId, Set<Registration> registrations)
+            throws PersistenceException {
+        String sql =
+                "INSERT INTO Registration (vehicleId, employeeId, start, end, active) VALUES (?,?,?,?,?)";
+        String sql2 = "UPDATE Vehicle SET status = 'FREI_WACHE' WHERE id = ?;";
+
+        Set<Long> vehicleIds = new HashSet<>();
+
+        try {
+            Connection con = jdbcConnectionManager.getConnection();
+            con.setAutoCommit(false);
+
+            try (PreparedStatement pstmt =
+                    con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
+                pstmt.setLong(1, vehicleId);
+
+                for (Registration r : registrations) {
+                    pstmt.setLong(2, r.employee().id());
+                    pstmt.setObject(3, OffsetDateTime.ofInstant(r.start(), ZoneId.systemDefault()));
+                    pstmt.setObject(4, OffsetDateTime.ofInstant(r.end(), ZoneId.systemDefault()));
+                    pstmt.setBoolean(5, true);
+                    pstmt.addBatch();
+                }
+
+                pstmt.executeBatch();
+
+                try (ResultSet rs = pstmt.getGeneratedKeys()) {
+                    while (rs.next()) vehicleIds.add(rs.getLong(1));
+                }
+            }
+
+            try (PreparedStatement pstmt = con.prepareStatement(sql2)) {
+                pstmt.setLong(1, vehicleId);
+                if (pstmt.executeUpdate() != 1) {
+                    con.rollback();
+                    throw new PersistenceException("Failed to persist registration");
+                }
+            }
+
+            con.commit();
+            return vehicleIds;
+        } catch (SQLException e) {
+            jdbcConnectionManager.rollbackConnection();
+            throw new PersistenceException(e);
+        }
+    }
+
+    @Override
+    public void remove(long id) throws ElementNotFoundException, PersistenceException {
+        throw new UnsupportedOperationException();
+    }
+
+    protected List<Registration> list(long vehicleId) throws PersistenceException {
+        String sql = "SELECT * FROM Registration WHERE vehicleId = ?";
+
+        List<Registration> registrationList = new ArrayList<>();
+        try {
+            Connection con = jdbcConnectionManager.getConnection();
+
+            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
+                pstmt.setLong(1, vehicleId);
+
+                try (ResultSet rs = pstmt.executeQuery()) {
+                    while (rs.next()) {
+                        long employeeId = rs.getLong("employeeId");
+                        // TODO: replace the following with employeePersistence.get once implemented
+                        Employee emp =
+                                employeePersistence
+                                        .list()
+                                        .stream()
+                                        .filter(employee -> employee.id() == employeeId)
+                                        .findAny()
+                                        .orElse(null);
+                        Registration registration =
+                                Registration.builder()
+                                        .id(rs.getLong("id"))
+                                        .start(
+                                                (rs.getObject("start", OffsetDateTime.class))
+                                                        .toInstant())
+                                        .end(
+                                                (rs.getObject("end", OffsetDateTime.class))
+                                                        .toInstant())
+                                        .employee(emp)
+                                        .build();
+                        registrationList.add(registration);
+                    }
+                }
+            }
+
+            return registrationList;
+        } catch (SQLException e) {
+            throw new PersistenceException(e);
+        }
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAO.java
new file mode 100644
index 0000000..ed24498
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAO.java
@@ -0,0 +1,54 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import java.util.Set;
+
+public interface VehicleDAO {
+
+    /**
+     * Persist the given vehicle.
+     *
+     * @param vehicle that should be stored
+     * @return the id that was assigned
+     * @throws PersistenceException if the vehicle could not be persisted
+     */
+    long add(Vehicle vehicle) throws PersistenceException;
+
+    /**
+     * Update the given vehicle.
+     *
+     * @param vehicle that should be updated
+     * @throws ElementNotFoundException if no vehicle with the given id exists
+     * @throws PersistenceException if the vehicle could not be updated
+     */
+    void update(Vehicle vehicle) throws ElementNotFoundException, PersistenceException;
+
+    /**
+     * Get all stored vehicles.
+     *
+     * @return list containing all stored vehicles
+     * @throws PersistenceException if loading the stored vehicles failed
+     */
+    Set<Vehicle> list() throws PersistenceException;
+
+    /**
+     * Returns the vehicle with the given id.
+     *
+     * @param vehicleId id of the vehicle that should be returned
+     * @return vehicle with the given id
+     * @throws ElementNotFoundException if no vehicle with the given id exists
+     * @throws PersistenceException if the vehicle could not be loaded
+     */
+    Vehicle get(long vehicleId) throws ElementNotFoundException, PersistenceException;
+
+    /**
+     * Remove vehicle with the given id from the store.
+     *
+     * @param id of the vehicle that should be removed
+     * @throws ElementNotFoundException if no vehicle with the given id exists
+     * @throws PersistenceException if the vehicle could not be removed
+     */
+    void remove(long id) throws ElementNotFoundException, PersistenceException;
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDatabaseDAO.java
new file mode 100644
index 0000000..dd7c0f2
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDatabaseDAO.java
@@ -0,0 +1,211 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashSet;
+import java.util.Set;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class VehicleDatabaseDAO implements VehicleDAO {
+
+    private final JDBCConnectionManager jdbcConnectionManager;
+    private RegistrationDatabaseDAO registrationDatabaseDao;
+
+    public VehicleDatabaseDAO(
+            JDBCConnectionManager j, RegistrationDatabaseDAO registrationDatabaseDao) {
+        jdbcConnectionManager = j;
+        this.registrationDatabaseDao = registrationDatabaseDao;
+    }
+
+    @Override
+    public long add(Vehicle v) throws PersistenceException {
+        String sql =
+                "INSERT INTO VehicleVersion (name,hasNef,constructionType,type) VALUES (?,?,?,?)";
+        String sql2 = "INSERT INTO Vehicle (version,status) VALUES (?,?)";
+        String sql3 = "UPDATE VehicleVersion SET name=? WHERE id=?";
+
+        try {
+            Connection con = jdbcConnectionManager.getConnection();
+            con.setAutoCommit(false);
+            String name = "";
+            long version, id;
+
+            try (PreparedStatement pstmt =
+                    con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
+                pstmt.setString(1, name);
+                pstmt.setBoolean(2, v.hasNef());
+                pstmt.setInt(3, v.constructionType().ordinal());
+                pstmt.setString(4, v.type().name());
+                pstmt.executeUpdate();
+
+                try (ResultSet rs = pstmt.getGeneratedKeys()) {
+                    if (!rs.next())
+                        throw new PersistenceException("Failed to insert into VehicleVersion");
+
+                    version = rs.getLong(1);
+                }
+            }
+
+            try (PreparedStatement pstmt =
+                    con.prepareStatement(sql2, Statement.RETURN_GENERATED_KEYS)) {
+                pstmt.setLong(1, version);
+                pstmt.setInt(2, Status.ABGEMELDET.ordinal());
+                pstmt.executeUpdate();
+
+                try (ResultSet rs = pstmt.getGeneratedKeys()) {
+                    if (!rs.next()) {
+                        con.rollback();
+                        throw new PersistenceException("Failed to insert into Vehicle");
+                    }
+
+                    id = rs.getLong(1);
+                }
+
+                name = v.type().name() + "-" + id;
+            }
+
+            try (PreparedStatement pstmt = con.prepareStatement(sql3)) {
+                pstmt.setString(1, name);
+                pstmt.setLong(2, version);
+
+                if (pstmt.executeUpdate() != 1) {
+                    con.rollback();
+                    throw new PersistenceException("Failed to update VehicleVersion");
+                }
+            }
+
+            con.commit();
+            return id;
+        } catch (SQLException e) {
+            jdbcConnectionManager.rollbackConnection();
+            throw new PersistenceException(e);
+        }
+    }
+
+    @Override
+    public void update(Vehicle v) throws ElementNotFoundException, PersistenceException {
+        String sql = "SELECT version FROM Vehicle WHERE id = ?";
+        String sql2 =
+                "MERGE INTO VehicleVersion(name, constructionType, type, hasNef)"
+                        + " KEY(name, constructionType, type, hasNef) VALUES(?, ?, ?, ?)";
+        String sql3 = "UPDATE Vehicle SET version = ?, status = ? WHERE id = ?";
+
+        long versionId;
+
+        try {
+            Connection con = jdbcConnectionManager.getConnection();
+            con.setAutoCommit(false);
+            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
+                pstmt.setLong(1, v.id());
+
+                try (ResultSet rs = pstmt.executeQuery()) {
+                    if (!rs.next()) throw new ElementNotFoundException("No such vehicleId exists");
+
+                    versionId = rs.getLong(1);
+                }
+            }
+
+            try (PreparedStatement pstmt =
+                    con.prepareStatement(sql2, Statement.RETURN_GENERATED_KEYS)) {
+                pstmt.setString(1, v.type().name() + "-" + v.id());
+                pstmt.setString(2, v.constructionType().name());
+                pstmt.setString(3, v.type().name());
+                pstmt.setBoolean(4, v.hasNef());
+                pstmt.executeUpdate();
+
+                try (ResultSet rs = pstmt.getGeneratedKeys()) {
+                    if (rs.next()) {
+                        // version changed, update it
+                        versionId = rs.getLong(1);
+                    }
+                }
+            }
+
+            try (PreparedStatement pstmt = con.prepareStatement(sql3)) {
+                pstmt.setLong(1, versionId);
+                pstmt.setString(2, v.status().name());
+                pstmt.setLong(3, v.id());
+                pstmt.executeUpdate();
+            }
+
+            con.commit();
+        } catch (SQLException e) {
+            jdbcConnectionManager.rollbackConnection();
+            throw new PersistenceException(e);
+        }
+    }
+
+    @Override
+    public Set<Vehicle> list() throws PersistenceException {
+        Set<Vehicle> result = new HashSet<>();
+
+        String sql =
+                "Select * from VehicleVersion, Vehicle where VehicleVersion.id=Vehicle.version";
+
+        try (PreparedStatement pstmt =
+                jdbcConnectionManager.getConnection().prepareStatement(sql)) {
+            pstmt.executeQuery();
+            try (ResultSet rs = pstmt.getResultSet()) {
+                while (rs.next()) {
+                    result.add(vehicleFromRS(rs));
+                }
+            }
+        } catch (SQLException e) {
+            throw new PersistenceException(e);
+        }
+        return result;
+    }
+
+    @Override
+    public Vehicle get(long id) throws ElementNotFoundException, PersistenceException {
+        String sql =
+                "SELECT a.id, b.name, b.constructionType, b.type, a.status, b.hasNef"
+                        + " FROM Vehicle a"
+                        + " INNER JOIN VehicleVersion b"
+                        + " ON version = b.id"
+                        + " WHERE a.id = ?";
+
+        try {
+            Connection con = jdbcConnectionManager.getConnection();
+            try (PreparedStatement pstmt = con.prepareStatement(sql)) {
+                pstmt.setLong(1, id);
+
+                try (ResultSet rs = pstmt.executeQuery()) {
+                    if (!rs.first()) throw new ElementNotFoundException("No such vehicle exists");
+
+                    return vehicleFromRS(rs);
+                }
+            }
+        } catch (SQLException e) {
+            throw new PersistenceException(e);
+        }
+    }
+
+    @Override
+    public void remove(long id) throws ElementNotFoundException, PersistenceException {
+        throw new UnsupportedOperationException();
+    }
+
+    private Vehicle vehicleFromRS(ResultSet rs) throws SQLException, PersistenceException {
+        return Vehicle.builder()
+                .id(rs.getLong("Vehicle.id"))
+                .name(rs.getString("name"))
+                .constructionType(ConstructionType.values()[rs.getInt("constructionType")])
+                .type(VehicleType.valueOf(rs.getString("type")))
+                .status(Status.values()[rs.getInt("status")])
+                .hasNef(rs.getBoolean("hasNef"))
+                .registrations(registrationDatabaseDao.list(rs.getLong("id")))
+                .build();
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Employee.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Employee.java
new file mode 100644
index 0000000..f45550e
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Employee.java
@@ -0,0 +1,51 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto;
+
+import com.google.auto.value.AutoValue;
+import java.time.LocalDate;
+
+@AutoValue
+public abstract class Employee {
+    public enum EducationLevel {
+        RS,
+        NFS,
+        NKV,
+        NKA,
+        NKI,
+        NA
+    }
+
+    public abstract long id();
+
+    public abstract String name();
+
+    public abstract LocalDate birthday();
+
+    public abstract EducationLevel educationLevel();
+
+    public abstract boolean isDriver();
+
+    public abstract boolean isPilot();
+
+    public static Builder builder() {
+        return new AutoValue_Employee.Builder().id(0);
+    }
+
+    @AutoValue.Builder
+    public abstract static class Builder {
+        public abstract Builder id(long id);
+
+        public abstract Builder name(String name);
+
+        public abstract Builder birthday(LocalDate birthday);
+
+        public abstract Builder educationLevel(EducationLevel educationLevel);
+
+        public abstract Builder isDriver(boolean isDriver);
+
+        public abstract Builder isPilot(boolean isPilot);
+
+        public abstract Employee build();
+    }
+
+    public abstract Builder toBuilder();
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/EmployeeValidator.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/EmployeeValidator.java
new file mode 100644
index 0000000..b03fa04
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/EmployeeValidator.java
@@ -0,0 +1,23 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto;
+
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
+
+public class EmployeeValidator {
+
+    public static boolean validate(Employee employee) throws InvalidEmployeeException {
+
+        if (employee.name() == null || employee.name().trim().length() == 0) {
+            throw new InvalidEmployeeException("Name darf nicht leer sein!");
+        }
+
+        if (employee.birthday() == null) {
+            throw new InvalidEmployeeException("Geburtsdatum darf nicht leer sein!");
+        }
+
+        if (employee.educationLevel() == null) {
+            throw new InvalidEmployeeException("Ausbildungsgrad darf nicht leer sein!");
+        }
+
+        return true;
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Operation.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Operation.java
new file mode 100644
index 0000000..e119622
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Operation.java
@@ -0,0 +1,70 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto;
+
+import com.google.auto.value.AutoValue;
+import java.time.Instant;
+import java.util.Set;
+import javax.annotation.Nullable;
+
+@AutoValue
+public abstract class Operation {
+    public enum Severity {
+        A,
+        B,
+        C,
+        D,
+        E,
+        O,
+    }
+
+    public enum Status {
+        ACTIVE,
+        COMPLETED,
+        CANCELLED,
+    }
+
+    public abstract long id();
+
+    public abstract String opCode();
+
+    @Nullable
+    public abstract Severity severity();
+
+    public abstract Status status();
+
+    public abstract Set<Vehicle> vehicles();
+
+    @Nullable
+    public abstract Instant created();
+
+    public abstract String destination();
+
+    @Nullable
+    public abstract String additionalInfo();
+
+    public static Builder builder() {
+        return new AutoValue_Operation.Builder().id(0);
+    }
+
+    @AutoValue.Builder
+    public abstract static class Builder {
+        public abstract Builder id(long id);
+
+        public abstract Builder opCode(String opCode);
+
+        public abstract Builder severity(Severity severity);
+
+        public abstract Builder status(Status status);
+
+        public abstract Builder vehicles(Set<Vehicle> vehicles);
+
+        public abstract Builder created(Instant created);
+
+        public abstract Builder destination(String destination);
+
+        public abstract Builder additionalInfo(String additionalInfo);
+
+        public abstract Operation build();
+    }
+
+    public abstract Builder toBuilder();
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Registration.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Registration.java
new file mode 100644
index 0000000..a12c038
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Registration.java
@@ -0,0 +1,34 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto;
+
+import com.google.auto.value.AutoValue;
+import java.time.Instant;
+
+@AutoValue
+public abstract class Registration {
+    public abstract long id();
+
+    public abstract Instant start();
+
+    public abstract Instant end();
+
+    public abstract Employee employee();
+
+    public static Builder builder() {
+        return new AutoValue_Registration.Builder().id(0);
+    }
+
+    @AutoValue.Builder
+    public abstract static class Builder {
+        public abstract Builder id(long id);
+
+        public abstract Builder start(Instant start);
+
+        public abstract Builder end(Instant end);
+
+        public abstract Builder employee(Employee employee);
+
+        public abstract Registration build();
+    }
+
+    public abstract Builder toBuilder();
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/RegistrationValidator.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/RegistrationValidator.java
new file mode 100644
index 0000000..9512f64
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/RegistrationValidator.java
@@ -0,0 +1,174 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+public class RegistrationValidator {
+
+    private RegistrationValidator() {}
+
+    public static void validate(Vehicle vehicle, Set<Registration> registrations)
+            throws InvalidVehicleException, InvalidRegistrationException {
+        /*
+        Vehicles and Employees are assumed to be valid.
+        They have been checked at creation, and for them to be checked again, access to
+        VehicleValidator and EmployeeValidator are needed, which are not available at this time.
+         */
+        /*
+        The method used here goes as follows: All given employees are inspected in regards to their
+        qualifications, and added to the appropriate lists of the roles they could fill.
+        For example, an NFS, who is also a driver, would be added to the lists driverIds, nfsIds
+        and rsIds (because an NFS can always substitute an RS).
+        Afterwards, the number of people is checked according to the chosen vehicle type, and if
+        the number is okay, the program tries to find a valid combination of roles for the vehicle.
+        For example, for an RTW, first a driver is chosen, their ID marked as found in the aptly
+        titled HashMap, and then for the second RS, the list of RS is checked, excluding the chosen
+        driver. If no other valid RS is found, the next possible driver is chosen, and so on. If no
+        valid combination is found, an InvalidRegistrationException is thrown.
+         */
+        List<Long> pilotIds = new LinkedList<>();
+        List<Long> driverIds = new LinkedList<>();
+        List<Long> naIds = new LinkedList<>();
+        List<Long> nfsIds = new LinkedList<>();
+        List<Long> rsIds = new LinkedList<>();
+        HashMap<Long, Boolean> found =
+                new HashMap<>(); // needed later in DFS, checks that no person is chosen twice
+        int total = 0;
+        for (Registration registration : registrations) {
+            total++;
+            if (found.put(registration.employee().id(), false) != null) {
+                throw new InvalidRegistrationException(
+                        "Person mit der ID: "
+                                + registration.employee().id()
+                                + " wurde mehrmals hinzugefügt!");
+            }
+            if (registration.employee().isPilot()) {
+                pilotIds.add(registration.employee().id());
+            }
+            if (registration.employee().isDriver()) {
+                driverIds.add(registration.employee().id());
+            }
+            if (registration.employee().educationLevel() == EducationLevel.NA) {
+                naIds.add(registration.employee().id());
+                nfsIds.add(registration.employee().id());
+                rsIds.add(registration.employee().id());
+            } else if (isNFS(registration.employee())) {
+                nfsIds.add(registration.employee().id());
+                rsIds.add(registration.employee().id());
+            } else { // only RS left
+                rsIds.add(registration.employee().id());
+            }
+        }
+        if (total <= 0) {
+            throw new InvalidRegistrationException("Kein Personal ausgewählt!");
+        }
+        if (vehicle.type() == VehicleType.NAH) {
+            /*
+            NAH
+            1 Pilot
+            1 NFS
+            1 NA
+            3-4 Personen
+             */
+            if (total < 3) {
+                throw new InvalidRegistrationException("Zu wenig Personal für NAH!");
+            } else if (total > 4) {
+                throw new InvalidRegistrationException("Zu viel Personal für NAH!");
+            }
+            for (long pilot_id : pilotIds) {
+                found.put(pilot_id, true);
+                for (long na_id : naIds) {
+                    if (found.get(na_id)) continue;
+                    found.put(na_id, true);
+                    for (long nfs_id : nfsIds) {
+                        if (found.get(nfs_id)) continue;
+                        return;
+                    }
+                    found.put(na_id, false);
+                }
+                found.put(pilot_id, false);
+            }
+            throw new InvalidRegistrationException(
+                    "Keine gültige Kombination von Personen für NAH!");
+        } else if (vehicle.type() == VehicleType.NEF) {
+            /*
+            NEF
+            1 Driver (has to be NFS)
+            1 NA
+             */
+            if (total < 2) {
+                throw new InvalidRegistrationException("Zu wenig Personal für NEF!");
+            } else if (total > 3) {
+                throw new InvalidRegistrationException("Zu viel Personal für NEF!");
+            }
+            for (long driver_id : driverIds) {
+                if (!nfsIds.contains(driver_id))
+                    continue; // if possible driver is not NFS, skip him
+                found.put(driver_id, true);
+                for (long na_id : naIds) {
+                    if (found.get(na_id)) continue;
+                    return;
+                }
+                found.put(driver_id, false);
+            }
+            throw new InvalidRegistrationException(
+                    "Keine gültige Kombination von Personen für NEF!");
+        } else if (vehicle.type() == VehicleType.BKTW) {
+            /*
+            BKTW
+            1 Driver
+             */
+            if (total > 3) {
+                throw new InvalidRegistrationException("Zu viel Personal für BKTW!");
+            }
+            if (!driverIds.isEmpty()) {
+                return;
+            }
+            throw new InvalidRegistrationException("Kein Fahrer gefunden für BKTW!");
+        } else { // KTW or RTW, both have the same requirements
+            /*
+            RTW/KTW
+            1 Driver
+            1 RS
+             */
+            if (total < 2) {
+                throw new InvalidRegistrationException(
+                        "Zu wenig Personal für " + vehicle.type().name() + "!");
+            } else if (total > 4) {
+                throw new InvalidRegistrationException(
+                        "Zu viel Persoanl für " + vehicle.type().name() + "!");
+            }
+            for (long driver_id : driverIds) { // driver includes rs
+                found.put(driver_id, true);
+                for (long rs_id : rsIds) {
+                    if (found.get(rs_id)) continue;
+                    return;
+                }
+            }
+            throw new InvalidRegistrationException(
+                    "Keine gültige Kombination von Personen für " + vehicle.type().name() + "!");
+        }
+    }
+
+    private static boolean isNFS(Employee employee) {
+        EducationLevel educationLevel = employee.educationLevel();
+        switch (educationLevel) {
+            case NFS:
+                return true;
+            case NKA:
+                return true;
+            case NKI:
+                return true;
+            case NKV:
+                return true;
+            default:
+                return false;
+        }
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Vehicle.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Vehicle.java
new file mode 100644
index 0000000..c2033f5
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/Vehicle.java
@@ -0,0 +1,73 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto;
+
+import com.google.auto.value.AutoValue;
+import java.util.List;
+import javax.annotation.Nullable;
+
+@AutoValue
+public abstract class Vehicle {
+    public enum ConstructionType {
+        NORMAL,
+        HOCHDACH,
+        MITTELHOCHDACH,
+    }
+
+    public enum VehicleType {
+        BKTW,
+        KTW_B,
+        KTW,
+        RTW,
+        NEF,
+        NAH,
+    }
+
+    public enum Status {
+        ABGEMELDET,
+        FREI_WACHE,
+        FREI_FUNK,
+        ZUM_BERUFUNGSORT,
+        AM_BERUFUNGSORT,
+        ZUM_ZIELORT,
+        AM_ZIELORT,
+    }
+
+    public abstract long id();
+
+    public abstract String name();
+
+    public abstract ConstructionType constructionType();
+
+    public abstract VehicleType type();
+
+    public abstract Status status();
+
+    public abstract boolean hasNef();
+
+    @Nullable
+    public abstract List<Registration> registrations();
+
+    public static Builder builder() {
+        return new AutoValue_Vehicle.Builder().id(0);
+    }
+
+    @AutoValue.Builder
+    public abstract static class Builder {
+        public abstract Builder id(long id);
+
+        public abstract Builder name(String name);
+
+        public abstract Builder constructionType(ConstructionType constructionType);
+
+        public abstract Builder type(VehicleType type);
+
+        public abstract Builder status(Status status);
+
+        public abstract Builder hasNef(boolean hasNef);
+
+        public abstract Builder registrations(List<Registration> registrations);
+
+        public abstract Vehicle build();
+    }
+
+    public abstract Builder toBuilder();
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeService.java
new file mode 100644
index 0000000..fa4d0e6
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeService.java
@@ -0,0 +1,46 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import java.util.Set;
+
+public interface EmployeeService {
+
+    /**
+     * Add given employee to the store.
+     *
+     * @param employee that should be added to the store
+     * @return the id that was assigned
+     * @throws InvalidEmployeeException if the employee is invalid
+     * @throws ServiceException if the employee could not be persisted
+     */
+    long add(Employee employee) throws InvalidEmployeeException, ServiceException;
+
+    /**
+     * Update the given employee.
+     *
+     * @param employee that should be updated
+     * @return the updated employee
+     * @throws InvalidEmployeeException if the employee is invalid
+     * @throws ServiceException if the updated employee could not be persisted
+     */
+    Employee update(Employee employee) throws InvalidEmployeeException, ServiceException;
+
+    /**
+     * Get all stored employees.
+     *
+     * @return list containing all stored employees
+     * @throws ServiceException if loading the stored employees failed
+     */
+    Set<Employee> list() throws ServiceException;
+
+    /**
+     * Remove employee with the given id from the store.
+     *
+     * @param id of the employee that should be removed
+     * @throws InvalidEmployeeException if given employee id is invalid or does not exist
+     * @throws ServiceException if the employee could not be removed from the store
+     */
+    void remove(long id) throws InvalidEmployeeException, ServiceException;
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceImpl.java
new file mode 100644
index 0000000..945fb49
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceImpl.java
@@ -0,0 +1,59 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.EmployeeValidator;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import java.util.Set;
+import org.springframework.stereotype.Service;
+
+@Service
+public class EmployeeServiceImpl implements EmployeeService {
+
+    private final EmployeeDAO employeePersistence;
+
+    public EmployeeServiceImpl(EmployeeDAO employeePersistence) {
+        this.employeePersistence = employeePersistence;
+    }
+
+    @Override
+    public long add(Employee employee) throws InvalidEmployeeException, ServiceException {
+
+        EmployeeValidator.validate(employee);
+        try {
+            return employeePersistence.add(employee);
+        } catch (PersistenceException e) {
+            throw new ServiceException(e);
+        }
+    }
+
+    @Override
+    public Employee update(Employee employee) throws InvalidEmployeeException, ServiceException {
+
+        EmployeeValidator.validate(employee);
+        try {
+            employeePersistence.update(employee);
+            return employee;
+        } catch (ElementNotFoundException | PersistenceException e) {
+            throw new ServiceException(e);
+        }
+    }
+
+    @Override
+    public Set<Employee> list() throws ServiceException {
+
+        try {
+            return employeePersistence.list();
+        } catch (PersistenceException e) {
+            throw new ServiceException(e);
+        }
+    }
+
+    @Override
+    public void remove(long id) throws InvalidEmployeeException, ServiceException {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationService.java
new file mode 100644
index 0000000..ca1dce9
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationService.java
@@ -0,0 +1,70 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.SortedSet;
+
+public interface OperationService {
+
+    /**
+     * Add given operation to the store.
+     *
+     * @param operation that should be added to the store
+     * @return the id that was assigned
+     * @throws InvalidOperationException if the operation is invalid
+     * @throws ServiceException if the operation could not be persisted
+     */
+    long add(Operation operation) throws InvalidOperationException, ServiceException;
+
+    /**
+     * Request new vehicles to the given operation.
+     *
+     * @param operationId id of the operation that the vehicles should be send to
+     * @param vehicleIds the ids of the vehicles that should be send to the given operation
+     * @throws InvalidOperationException if the operationId is invalid or does not exist
+     * @throws InvalidVehicleException if one of the vehicle ids is invalid or does not exist
+     * @throws ServiceException if the vehicles could not be loaded or the operation could not be
+     *     persisted
+     */
+    void requestVehicles(long operationId, Set<Long> vehicleIds)
+            throws InvalidOperationException, InvalidVehicleException, ServiceException;
+
+    /**
+     * Completes the given operation with the specified status.
+     *
+     * @param operationId id of the operation that should be completed
+     * @param status of the completed operation, either {@link Status#COMPLETED} or {@link
+     *     Status#CANCELLED}
+     * @throws InvalidOperationException if the operationId is invalid or does not exist
+     * @throws ServiceException if the operation could not be persisted
+     */
+    void complete(long operationId, Status status)
+            throws InvalidOperationException, ServiceException;
+
+    /**
+     * Get all available vehicles, sorted by how well they fit to the given opCode, starting with
+     * the best fitting.
+     *
+     * @param opCode the operation code that is used to determine the ranking
+     * @return a sorted list containing all available vehicles
+     * @throws InvalidOperationException if the opCode is invalid
+     * @throws ServiceException if loading the stored vehicles failed
+     */
+    SortedSet<Vehicle> rankVehicles(String opCode)
+            throws InvalidOperationException, ServiceException;
+
+    /**
+     * Get all stored operations with matching status.
+     *
+     * @param statuses set containing all statuses that should be matched
+     * @return list containing all matched operations
+     * @throws ServiceException if loading the stored operations failed
+     */
+    Set<Operation> list(EnumSet<Status> statuses) throws ServiceException;
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceImpl.java
new file mode 100644
index 0000000..baae598
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceImpl.java
@@ -0,0 +1,286 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.OperationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Severity;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+@Service
+public class OperationServiceImpl implements OperationService {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OperationServiceImpl.class);
+
+    private final OperationDAO operationDAO;
+    private final VehicleDAO vehicleDAO;
+    private final VehicleService vehicleService;
+
+    public OperationServiceImpl(
+            OperationDAO operationDAO, VehicleDAO vehicleDAO, VehicleService vehicleService) {
+        this.operationDAO = operationDAO;
+        this.vehicleDAO = vehicleDAO;
+        this.vehicleService = vehicleService;
+    }
+
+    @Override
+    public long add(Operation o) throws InvalidOperationException, ServiceException {
+        if (o.created() != null) {
+            throw new InvalidOperationException("Erstellungszeitpunkt darf nicht gesetzt sein");
+        }
+
+        if (o.severity() != null) {
+            throw new InvalidOperationException("Der Schweregrad darf nicht gesetzt sein");
+        }
+
+        if (o.id() != 0) {
+            throw new InvalidOperationException("Einsatz-ID muss 0 sein");
+        }
+
+        if (o.status() != Status.ACTIVE)
+            LOG.info("Status was set but will be overridden"); // TODO: nullable instead??
+
+        try {
+            for (long id : (Iterable<Long>) o.vehicles().stream().map(Vehicle::id)::iterator) {
+                Vehicle v = vehicleDAO.get(id);
+                VehicleServiceImpl.validateVehicle(v);
+
+                if (v.status() != Vehicle.Status.FREI_FUNK
+                        && v.status() != Vehicle.Status.FREI_WACHE)
+                    throw new InvalidOperationException("Fahrzeug nicht verfügbar: " + v.status());
+            }
+
+            validateOperation(o);
+
+            return operationDAO.add(
+                    o.toBuilder()
+                            .created(Instant.now())
+                            .severity(extractSeverityFromOpCode(o.opCode()))
+                            .status(Status.ACTIVE)
+                            .build());
+        } catch (PersistenceException e) {
+            throw new ServiceException(e);
+        } catch (InvalidVehicleException e) {
+            // already logged as invalid vehicle
+            throw new InvalidOperationException("Enthaltenes Fahrzeug ist ungültig", e);
+        } catch (ElementNotFoundException e) {
+            throw new InvalidOperationException("Enthaltenes Fahrzeug existiert nicht", e);
+        }
+    }
+
+    @Override
+    public void requestVehicles(long operationId, Set<Long> vehicleIds)
+            throws InvalidOperationException, InvalidVehicleException, ServiceException {
+        Set<Vehicle> vs = new HashSet<>();
+
+        try {
+            if (operationId <= 0) {
+                throw new InvalidOperationException("Einsatz-ID ist ungültig");
+            }
+            Operation o = operationDAO.get(operationId);
+            validateOperation(o);
+
+            if (o.opCode().trim().isEmpty()
+                    || extractSeverityFromOpCode(o.opCode()) != o.severity()) {
+                throw new InvalidOperationException("Einsatzcode ist ungültig");
+            }
+
+            if (o.status() != Status.ACTIVE) {
+                throw new InvalidOperationException("Einsatz ist ungültig");
+            }
+
+            if (o.created() == null) {
+                throw new InvalidOperationException("Erstellungszeitpunkt darf nicht leer sein");
+            }
+
+            for (Long id : vehicleIds) {
+                if (id <= 0) {
+                    throw new InvalidVehicleException("Fahrzeug-ID ist ungültig");
+                }
+
+                try {
+                    Vehicle v = vehicleDAO.get(id);
+                    VehicleServiceImpl.validateVehicle(v);
+                    if (v.status() != Vehicle.Status.FREI_FUNK
+                            && v.status() != Vehicle.Status.FREI_WACHE)
+                        throw new InvalidOperationException(
+                                "Fahrzeug nicht verfügbar: " + v.status());
+
+                    vs.add(v);
+                } catch (ElementNotFoundException e) {
+                    throw new InvalidVehicleException("VehicleId ist invalid");
+                }
+            }
+
+            vs.addAll(o.vehicles());
+            if (vs.equals(o.vehicles())) return;
+
+            operationDAO.update(o.toBuilder().vehicles(vs).build());
+        } catch (ElementNotFoundException e) {
+            throw new InvalidOperationException("Kein Einsatz mit dieser ID existiert");
+        } catch (PersistenceException e) {
+            throw new ServiceException(e);
+        }
+    }
+
+    @Override
+    public void complete(long operationId, Status status)
+            throws InvalidOperationException, ServiceException {
+        try {
+            Operation o = operationDAO.get(operationId);
+            operationDAO.update(o.toBuilder().status(status).build());
+        } catch (ElementNotFoundException e) {
+            throw new InvalidOperationException(e);
+        } catch (PersistenceException e) {
+            throw new ServiceException(e);
+        }
+    }
+
+    @Override
+    public SortedSet<Vehicle> rankVehicles(String opCode)
+            throws InvalidOperationException, ServiceException {
+        Set<Vehicle> vehicles =
+                vehicleService.list(EnumSet.complementOf(EnumSet.of(Vehicle.Status.ABGEMELDET)));
+
+        List<Predicate<Vehicle>> priorities = new ArrayList<>();
+        Predicate<Vehicle> ktw = v -> v.type() == VehicleType.KTW;
+        Predicate<Vehicle> rtwNoNEF = v -> v.type() == VehicleType.RTW && !v.hasNef();
+        Predicate<Vehicle> rtwNEF = v -> v.type() == VehicleType.RTW && v.hasNef();
+        Predicate<Vehicle> nef = v -> v.type() == VehicleType.NEF;
+        Predicate<Vehicle> nah = v -> v.type() == VehicleType.NAH;
+
+        switch (extractSeverityFromOpCode(opCode)) {
+            case A:
+                // fallthrough
+            case B:
+                // fallthrough
+            case O:
+                priorities.add(ktw);
+                priorities.add(rtwNoNEF);
+                priorities.add(rtwNEF);
+                break;
+            case C:
+                priorities.add(rtwNEF);
+                priorities.add(rtwNoNEF);
+                priorities.add(ktw);
+                break;
+            case D:
+                priorities.add(rtwNEF);
+                priorities.add(nef);
+                priorities.add(nah);
+                priorities.add(rtwNoNEF);
+                priorities.add(ktw);
+                break;
+            case E:
+                priorities.add(nah);
+                priorities.add(nef);
+                priorities.add(rtwNEF);
+                priorities.add(rtwNoNEF);
+                priorities.add(ktw);
+                break;
+        }
+
+        Comparator<Vehicle> vehicleComparator =
+                (v1, v2) -> {
+                    for (Predicate<Vehicle> priority : priorities) {
+                        if (priority.test(v1)) {
+                            return -1;
+                        }
+                        if (priority.test(v2)) {
+                            return +1;
+                        }
+                    }
+                    return 0;
+                };
+
+        Supplier<TreeSet<Vehicle>> supplier = () -> new TreeSet<>(vehicleComparator);
+
+        return vehicles.stream().collect(Collectors.toCollection(supplier));
+    }
+
+    @Override
+    public Set<Operation> list(EnumSet<Status> statuses) throws ServiceException {
+        try {
+            Set<Operation> operations = operationDAO.list(statuses);
+            for (Operation o : operations) validateOperation(o);
+
+            return operations;
+        } catch (PersistenceException e) {
+            throw new ServiceException(e);
+        } catch (InvalidOperationException e) {
+            // database returned invalid values
+            throw new ServiceException("DB returned invalid operation", e);
+        }
+    }
+
+    private static void validateOperation(Operation o) throws InvalidOperationException {
+        if (o.vehicles().isEmpty()) {
+            throw new InvalidOperationException(
+                    "Es muss mindestens ein Fahrzeug ausgewählt werden!");
+        }
+
+        for (Vehicle v : o.vehicles()) {
+            try {
+                VehicleServiceImpl.validateVehicle(v);
+            } catch (InvalidVehicleException e) {
+                throw new InvalidOperationException("Fahrzeug " + v.name() + " ist ungültig", e);
+            }
+
+            // TODO: validate if NEF/RTW/NAH conditions?
+        }
+
+        Instant created = o.created();
+        if (created != null && created.isAfter(Instant.now())) {
+            throw new InvalidOperationException("Einsatz wurde in der Zukunft erstellt");
+        }
+
+        if (o.destination() == null || o.destination().trim().isEmpty()) {
+            throw new InvalidOperationException("Adresse darf nicht leer sein");
+        }
+
+        if (o.destination().length() > 100) {
+            throw new InvalidOperationException("Adresse darf 100 Zeichen nicht überschreiten");
+        }
+
+        if (o.additionalInfo() != null && o.additionalInfo().length() > 100) {
+            throw new InvalidOperationException("Anmerkung darf 100 Zeichen nicht überschreiten");
+        }
+    }
+
+    private static final Pattern opCodePattern =
+            Pattern.compile("(?:\\w{1,3}-\\d{0,2})([ABCDEO])(?:.*)");
+
+    private static Severity extractSeverityFromOpCode(String opCode)
+            throws InvalidOperationException {
+        Matcher m = opCodePattern.matcher(opCode);
+
+        if (!m.matches()) {
+            throw new InvalidOperationException("Einsatzcode ist ungültig");
+        }
+
+        return Severity.valueOf(m.group(1));
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationService.java
new file mode 100644
index 0000000..027417f
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationService.java
@@ -0,0 +1,32 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import java.util.Set;
+
+public interface RegistrationService {
+
+    /**
+     * Register employee to a vehicle.
+     *
+     * @param vehicleId the id of the target vehicle
+     * @param registrations that should be added to the vehicle
+     * @return the list of ids that were assigned
+     * @throws InvalidVehicleException if the vehicleId is invalid or does not exist
+     * @throws InvalidRegistrationException if the registration is invalid
+     * @throws ServiceException if the registration could not be persisted
+     */
+    Set<Long> add(long vehicleId, Set<Registration> registrations)
+            throws InvalidVehicleException, InvalidRegistrationException, ServiceException;
+
+    /**
+     * Remove given registration from the store.
+     *
+     * @param registrationId the id of the registration that should be removed
+     * @throws InvalidRegistrationException if the registration is invalid or does not exist
+     * @throws ServiceException if the registration could not be removed from the store
+     */
+    void remove(long registrationId) throws InvalidRegistrationException, ServiceException;
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceImpl.java
new file mode 100644
index 0000000..3ec69e7
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceImpl.java
@@ -0,0 +1,52 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.RegistrationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.RegistrationValidator;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import java.util.Set;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RegistrationServiceImpl implements RegistrationService {
+
+    private final RegistrationDAO registrationDAO;
+    private final VehicleDAO vehicleDAO;
+
+    @Autowired
+    public RegistrationServiceImpl(RegistrationDAO registrationDAO, VehicleDAO vehicleDAO) {
+        this.registrationDAO = registrationDAO;
+        this.vehicleDAO = vehicleDAO;
+    }
+
+    @Override
+    public Set<Long> add(long vehicleId, Set<Registration> registrations)
+            throws InvalidVehicleException, InvalidRegistrationException, ServiceException {
+
+        if (vehicleId <= 0) throw new InvalidVehicleException("VehicleId invalid");
+
+        try {
+            Vehicle vehicle = vehicleDAO.get(vehicleId);
+
+            RegistrationValidator.validate(vehicle, registrations);
+
+            return registrationDAO.add(vehicle.id(), registrations);
+        } catch (PersistenceException e) {
+            throw new ServiceException(e);
+        } catch (ElementNotFoundException e) {
+            throw new InvalidVehicleException(e);
+        }
+    }
+
+    @Override
+    public void remove(long registrationId) throws InvalidRegistrationException, ServiceException {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleService.java
new file mode 100644
index 0000000..d96dfb7
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleService.java
@@ -0,0 +1,49 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import java.util.EnumSet;
+import java.util.Set;
+
+public interface VehicleService {
+
+    /**
+     * Add given vehicle to the store.
+     *
+     * @param vehicle that should be added to the store
+     * @return the id that was assigned
+     * @throws InvalidVehicleException if the vehicle is invalid
+     * @throws ServiceException if the vehicle could not be persisted
+     */
+    long add(Vehicle vehicle) throws InvalidVehicleException, ServiceException;
+
+    /**
+     * Update the given vehicle.
+     *
+     * @param vehicle that should be updated
+     * @return the updated vehicle
+     * @throws InvalidVehicleException if the vehicle is invalid
+     * @throws ServiceException if the updated vehicle could not be persisted
+     */
+    Vehicle update(Vehicle vehicle) throws InvalidVehicleException, ServiceException;
+
+    /**
+     * Get all stored vehicles with matching status.
+     *
+     * @param statuses set containing all statuses that should be matched
+     * @return list containing all stored vehicles
+     * @throws ServiceException if loading the stored vehicles failed
+     */
+    Set<Vehicle> list(EnumSet<Status> statuses) throws ServiceException;
+
+    /**
+     * Remove vehicle with the given id from the store.
+     *
+     * @param id of the vehicle that should be removed
+     * @throws InvalidVehicleException if given vehicle id is invalid or does not exist
+     * @throws ServiceException if the vehicle could not be removed from the store
+     */
+    void remove(long id) throws InvalidVehicleException, ServiceException;
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleServiceImpl.java
new file mode 100644
index 0000000..6a035c6
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleServiceImpl.java
@@ -0,0 +1,116 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+@Service
+public class VehicleServiceImpl implements VehicleService {
+
+    private VehicleDAO vehiclePersistence;
+
+    public VehicleServiceImpl(VehicleDAO vehiclePersistence) {
+        this.vehiclePersistence = vehiclePersistence;
+    }
+
+    public long add(Vehicle vehicle) throws InvalidVehicleException, ServiceException {
+        if (!CollectionUtils.isEmpty(vehicle.registrations())) {
+            throw new InvalidVehicleException(
+                    "Fahrzeug kann nicht mit Anmeldungen erstellt werden");
+        }
+
+        validateVehicle(vehicle);
+        try {
+            vehiclePersistence.add(vehicle);
+        } catch (PersistenceException e) {
+            throw new ServiceException(e);
+        }
+        return 0;
+    }
+
+    public Vehicle update(Vehicle vehicle) throws InvalidVehicleException, ServiceException {
+        validateVehicle(vehicle);
+        try {
+            vehiclePersistence.update(vehicle);
+        } catch (ElementNotFoundException e) {
+            throw new ServiceException("Element not found", e);
+        } catch (PersistenceException e) {
+            throw new ServiceException(e);
+        }
+        return vehicle;
+    }
+
+    protected static void validateVehicle(Vehicle vehicle) throws InvalidVehicleException {
+        switch (vehicle.type()) {
+            case RTW:
+                if (vehicle.constructionType() == ConstructionType.NORMAL) {
+                    throw new InvalidVehicleException("RTW darf kein Normales Dach haben");
+                } else if (vehicle.constructionType() == ConstructionType.MITTELHOCHDACH) {
+                    throw new InvalidVehicleException("RTW darf kein Mittelhochdach haben");
+                }
+                break;
+            case KTW:
+                if (vehicle.constructionType() == ConstructionType.NORMAL) {
+                    throw new InvalidVehicleException("KTW darf kein Normales Dach haben");
+                }
+                break;
+            case KTW_B:
+                if (vehicle.constructionType() == ConstructionType.NORMAL) {
+                    throw new InvalidVehicleException("KTW-B darf kein Normales Dach haben");
+                }
+                break;
+            case NEF:
+                if (vehicle.constructionType() == ConstructionType.MITTELHOCHDACH) {
+                    throw new InvalidVehicleException("NEF darf kein Mittelhochdach haben");
+                } else if (vehicle.constructionType() == ConstructionType.HOCHDACH) {
+                    throw new InvalidVehicleException("NEF darf kein Hochdach haben");
+                }
+                break;
+            case NAH:
+                if (vehicle.constructionType() == ConstructionType.MITTELHOCHDACH) {
+                    throw new InvalidVehicleException("NEF darf kein Mittelhochdach haben");
+                } else if (vehicle.constructionType() == ConstructionType.HOCHDACH) {
+                    throw new InvalidVehicleException("NEF darf kein Hochdach haben");
+                }
+                break;
+            case BKTW:
+                break;
+            default:
+                throw new IllegalStateException("BUG: invalid vehicle type" + vehicle.type());
+        }
+    }
+
+    @Override
+    public Set<Vehicle> list(EnumSet<Status> statuses) throws ServiceException {
+        if (statuses == null) {
+            throw new ServiceException("Statuses may not be null");
+        }
+
+        Set<Vehicle> vehicles;
+
+        try {
+            vehicles = vehiclePersistence.list();
+        } catch (PersistenceException e) {
+            throw new ServiceException(e);
+        }
+
+        return vehicles.stream()
+                .filter(vehicle -> statuses.contains(vehicle.status()))
+                .collect(Collectors.toSet());
+    }
+
+    @Override
+    public void remove(long id) throws InvalidVehicleException, ServiceException {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/src/main/resources/fxml/ArchiveOperation.fxml b/src/main/resources/fxml/ArchiveOperation.fxml
index 0150d81..e9549ae 100644
--- a/src/main/resources/fxml/ArchiveOperation.fxml
+++ b/src/main/resources/fxml/ArchiveOperation.fxml
@@ -12,7 +12,7 @@
 <?import javafx.scene.layout.RowConstraints?>
 <?import javafx.scene.text.Font?>
 
-<AnchorPane fx:id="archiveOperationAP" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="650.0" prefWidth="1000.0" style="-fx-background-color: rgba(239,235,232,1);" visible="false" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.ArchiveOperationController">
+<AnchorPane fx:id="archiveOperationAP" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="650.0" prefWidth="1000.0" style="-fx-background-color: rgba(239,235,232,1);" visible="false" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.ArchiveOperationController">
    <children>
       <ScrollPane hbarPolicy="NEVER" layoutX="43.0" layoutY="202.0" prefHeight="435.0" prefWidth="906.0" style="-fx-background-color:  rgba(239,235,232,1);" vbarPolicy="NEVER" AnchorPane.leftAnchor="43.0">
          <content>
diff --git a/src/main/resources/fxml/CreateOperationController.fxml b/src/main/resources/fxml/CreateOperationController.fxml
index 0c82e29..56e0c90 100644
--- a/src/main/resources/fxml/CreateOperationController.fxml
+++ b/src/main/resources/fxml/CreateOperationController.fxml
@@ -14,7 +14,7 @@
 <?import javafx.scene.layout.RowConstraints?>
 <?import javafx.scene.text.Font?>
 
-<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="650.0" prefWidth="1200.0" styleClass="bg-gray-blue" stylesheets="@/styles/main.css" xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.CreateOperationController">
+<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="650.0" prefWidth="1200.0" styleClass="bg-gray-blue" stylesheets="@/styles/main.css" xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.CreateOperationController">
   <AnchorPane prefHeight="182.0" styleClass="bg-blue" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
   <AnchorPane fx:id="apCreateOperation" layoutX="40.0" layoutY="71.0" prefHeight="151.0" prefWidth="920.0" styleClass="bg-white, shadowed">
     <Label layoutX="14.0" layoutY="14.0" prefHeight="30.0" prefWidth="62.0" styleClass="text-medium" text="Code" />
diff --git a/src/main/resources/fxml/DetailArchiveOperation.fxml b/src/main/resources/fxml/DetailArchiveOperation.fxml
index 82c23ed..553dfd3 100644
--- a/src/main/resources/fxml/DetailArchiveOperation.fxml
+++ b/src/main/resources/fxml/DetailArchiveOperation.fxml
@@ -5,7 +5,7 @@
 <?import javafx.scene.layout.HBox?>
 <?import javafx.scene.layout.VBox?>
 
-<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.DetailArchiveOperationController">
+<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.DetailArchiveOperationController">
    <children>
       <HBox prefHeight="100.0" prefWidth="200.0" spacing="100.0">
          <children>
diff --git a/src/main/resources/fxml/OperationDetails.fxml b/src/main/resources/fxml/OperationDetails.fxml
index 4ca3a10..e1a4daa 100644
--- a/src/main/resources/fxml/OperationDetails.fxml
+++ b/src/main/resources/fxml/OperationDetails.fxml
@@ -9,7 +9,7 @@
 <?import javafx.scene.layout.FlowPane?>
 <?import javafx.scene.text.Font?>
 
-<AnchorPane fx:id="operationDetailsAP" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="542.0" prefWidth="1100.0" visible="false" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.OperationDetailsController">
+<AnchorPane fx:id="operationDetailsAP" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="542.0" prefWidth="1100.0" visible="false" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.OperationDetailsController">
   <children>
     <AnchorPane prefHeight="542.0" prefWidth="1100.0" style="-fx-background-color: rgba(239,235,232,1);" />
     <AnchorPane layoutX="10.0" layoutY="10.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="542.0" prefWidth="1000.0" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="0.0">
diff --git a/src/main/resources/fxml/OperationInArchive.fxml b/src/main/resources/fxml/OperationInArchive.fxml
index 9da1d9b..ebbaec8 100644
--- a/src/main/resources/fxml/OperationInArchive.fxml
+++ b/src/main/resources/fxml/OperationInArchive.fxml
@@ -10,7 +10,7 @@
 <?import javafx.scene.text.Font?>
 <?import javafx.scene.text.Text?>
 
-<GridPane hgap="12.0" prefHeight="106.0" prefWidth="374.0" styleClass="bg-white, shadowed" vgap="12" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.OperationInArchiveController">
+<GridPane hgap="12.0" prefHeight="106.0" prefWidth="374.0" styleClass="bg-white, shadowed" vgap="12" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.OperationInArchiveController">
    <columnConstraints>
       <ColumnConstraints maxWidth="249.6000518798828" minWidth="205.60003662109375" prefWidth="249.6000518798828" />
       <ColumnConstraints maxWidth="182.39996337890625" minWidth="138.3999481201172" prefWidth="138.3999481201172" />
diff --git a/src/main/resources/fxml/RegistrationWindow.fxml b/src/main/resources/fxml/RegistrationWindow.fxml
index afd6d55..1f57c11 100644
--- a/src/main/resources/fxml/RegistrationWindow.fxml
+++ b/src/main/resources/fxml/RegistrationWindow.fxml
@@ -13,7 +13,7 @@
 <?import javafx.scene.layout.HBox?>
 <?import javafx.scene.layout.RowConstraints?>
 <?import javafx.scene.layout.VBox?>
-<GridPane fx:id="root" stylesheets="@/styles/main.css" styleClass="bg-gray-orange" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.RegistrationWindowController">
+<GridPane fx:id="root" stylesheets="@/styles/main.css" styleClass="bg-gray-orange" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.RegistrationWindowController">
   <rowConstraints>
     <RowConstraints/> <!--"Neue Anmeldung", "von x bis x", Buttons-->
     <RowConstraints/> <!--"Fahrzeug", "Personen"-->
diff --git a/src/main/resources/fxml/createCar.fxml b/src/main/resources/fxml/createCar.fxml
index 5c1bafc..399c9bc 100644
--- a/src/main/resources/fxml/createCar.fxml
+++ b/src/main/resources/fxml/createCar.fxml
@@ -9,7 +9,7 @@
 <?import javafx.scene.layout.AnchorPane?>
 <?import javafx.scene.layout.FlowPane?>
 
-<AnchorPane fx:id="createCarAP" prefHeight="522.0" prefWidth="847.0" style="-fx-background-color: WHITE;" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.CreateCarController">
+<AnchorPane fx:id="createCarAP" prefHeight="522.0" prefWidth="847.0" style="-fx-background-color: WHITE;" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.CreateCarController">
    <children>
       <ScrollPane layoutX="29.0" layoutY="194.0" prefHeight="314.0" prefWidth="803.0">
          <content>
diff --git a/src/main/resources/fxml/createNewEmployee.fxml b/src/main/resources/fxml/createNewEmployee.fxml
index e2f841f..fd04ee1 100644
--- a/src/main/resources/fxml/createNewEmployee.fxml
+++ b/src/main/resources/fxml/createNewEmployee.fxml
@@ -12,7 +12,7 @@
   prefWidth="${apCreateNewEmployee.parent.width}" styleClass="bg-edit-area-orange"
   stylesheets="@/styles/main.css" xmlns="http://javafx.com/javafx/9.0.1"
   xmlns:fx="http://javafx.com/fxml/1"
-  fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.CreateNewEmployeeController">
+  fx:controller="at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.CreateNewEmployeeController">
   <children>
     <Label fx:id="lblHeader" layoutX="14.0" layoutY="14.0" styleClass="text-bold, text-medium"
       text="Neue Person erstellen"/>
diff --git a/src/main/resources/fxml/employeeList.fxml b/src/main/resources/fxml/employeeList.fxml
index 5bcce1c..85f693c 100644
--- a/src/main/resources/fxml/employeeList.fxml
+++ b/src/main/resources/fxml/employeeList.fxml
@@ -5,7 +5,7 @@
 <FlowPane
   xmlns="http://javafx.com/javafx/9.0.1"
   xmlns:fx="http://javafx.com/fxml/1"
-  fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.EmployeeListController"
+  fx:controller="at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.EmployeeListController"
   fx:id="flowPaneEmployeeList"
   stylesheets="@/styles/main.css"
   prefWidth="${flowPaneEmployeeList.parent.width}"
diff --git a/src/main/resources/fxml/employeeListItem.fxml b/src/main/resources/fxml/employeeListItem.fxml
index 3c020eb..7f6aabd 100644
--- a/src/main/resources/fxml/employeeListItem.fxml
+++ b/src/main/resources/fxml/employeeListItem.fxml
@@ -9,7 +9,7 @@
   onMouseClicked="#onEmployeeClicked" prefHeight="80.0" prefWidth="320.0"
   styleClass="bg-white, shadowed" stylesheets="@/styles/main.css"
   xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1"
-  fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.EmployeeListItemController">
+  fx:controller="at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.EmployeeListItemController">
   <children>
     <Label fx:id="lblName" layoutX="8.0" layoutY="22.0" styleClass="text-big, text-bold"
       text="Peter Mustermann" AnchorPane.leftAnchor="10.0" AnchorPane.topAnchor="5.0">
diff --git a/src/main/resources/fxml/filterEmployeesControl.fxml b/src/main/resources/fxml/filterEmployeesControl.fxml
index 55c80d8..8f7e72f 100644
--- a/src/main/resources/fxml/filterEmployeesControl.fxml
+++ b/src/main/resources/fxml/filterEmployeesControl.fxml
@@ -9,7 +9,7 @@
 <AnchorPane fx:id="apFilterEmployees" prefHeight="80" prefWidth="${apFilterEmployees.parent.width}"
   style="-fx-background-color: white;" stylesheets="/styles/main.css"
   xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1"
-  fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.FilterEmployeesController">
+  fx:controller="at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.FilterEmployeesController">
   <children>
     <Label text="Filtern nach Name" AnchorPane.leftAnchor="20.0"
       AnchorPane.topAnchor="15.0" styleClass="text-medium, text-bold"/>
diff --git a/src/main/resources/fxml/manageEmployees.fxml b/src/main/resources/fxml/manageEmployees.fxml
index 68851e2..b0ce2fc 100644
--- a/src/main/resources/fxml/manageEmployees.fxml
+++ b/src/main/resources/fxml/manageEmployees.fxml
@@ -9,7 +9,7 @@
 <AnchorPane fx:id="listEmployeesAP" prefHeight="536.0" prefWidth="702.0" styleClass="bg-gray-orange"
   stylesheets="@/styles/main.css" visible="false" xmlns="http://javafx.com/javafx/9.0.1"
   xmlns:fx="http://javafx.com/fxml/1"
-  fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.ManageEmployeesController">
+  fx:controller="at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.ManageEmployeesController">
   <children>
     <AnchorPane prefHeight="120.0" styleClass="bg-dark-orange" AnchorPane.leftAnchor="0.0"
       AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
diff --git a/src/main/resources/fxml/vehiclePane.fxml b/src/main/resources/fxml/vehiclePane.fxml
index 5a47181..752941a 100644
--- a/src/main/resources/fxml/vehiclePane.fxml
+++ b/src/main/resources/fxml/vehiclePane.fxml
@@ -17,7 +17,7 @@
 <?import javafx.scene.control.Label?>
 <GridPane stylesheets="@/styles/main.css" minWidth="-Infinity" styleClass="bg-white, shadowed"
   xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1"
-  fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.VehiclePaneController">
+  fx:controller="at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.VehiclePaneController">
   <columnConstraints>
     <ColumnConstraints/>
     <ColumnConstraints/>
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeControllerTest.java
deleted file mode 100644
index 3273593..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeControllerTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.ALERT_TITLE_SERVICE_EXCEPTION;
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.ALERT_TITLE_SUCCESS;
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.ALERT_TITLE_VALIDATION_ERROR;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.when;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
-import at.ac.tuwien.sepm.assignment.groupphase.util.HighDpiAwareApplicationTest;
-import javafx.scene.control.DialogPane;
-import javafx.scene.input.MouseButton;
-import javafx.stage.Stage;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.testfx.api.FxToolkit;
-import org.testfx.robot.Motion;
-
-public class CreateNewEmployeeControllerTest extends HighDpiAwareApplicationTest {
-
-    private EmployeeService employeeService;
-
-    @Before
-    public void setup() throws Exception {
-        FxToolkit.registerPrimaryStage();
-        FxToolkit.setupApplication(GuiTestApplication.class, "createNewEmployee.fxml");
-        employeeService = GuiTestApplication.context.getBean(EmployeeService.class);
-    }
-
-    @After
-    public void cleanup() throws Exception {
-        FxToolkit.cleanupStages();
-    }
-
-    @Test
-    public void testClickAddValidEmployee() throws InvalidEmployeeException, ServiceException {
-
-        when(employeeService.add(any())).thenReturn(1L);
-
-        clickOn("#inputName", Motion.DIRECT, MouseButton.PRIMARY);
-        write("Name");
-        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
-
-        Stage alertDialog = Helper.getTopModalStage(robotContext());
-        Assert.assertNotNull(alertDialog);
-
-        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
-        Assert.assertEquals(ALERT_TITLE_SUCCESS, dialogPane.getHeaderText());
-    }
-
-    @Test
-    public void testClickAddInvalidEmployee() throws InvalidEmployeeException, ServiceException {
-
-        when(employeeService.add(any())).thenThrow(InvalidEmployeeException.class);
-
-        moveTo("#inputName");
-        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
-
-        Stage alertDialog = Helper.getTopModalStage(robotContext());
-        Assert.assertNotNull(alertDialog);
-
-        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
-        Assert.assertEquals(ALERT_TITLE_VALIDATION_ERROR, dialogPane.getHeaderText());
-    }
-
-    @Test
-    public void testClickAddEmployeeWithServiceException()
-            throws InvalidEmployeeException, ServiceException {
-
-        when(employeeService.add(any())).thenThrow(ServiceException.class);
-
-        clickOn("#inputName", Motion.DIRECT, MouseButton.PRIMARY);
-        write("Test");
-        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
-
-        Stage alertDialog = Helper.getTopModalStage(robotContext());
-        Assert.assertNotNull(alertDialog);
-
-        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
-        Assert.assertEquals(ALERT_TITLE_SERVICE_EXCEPTION, dialogPane.getHeaderText());
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java
deleted file mode 100644
index f5f4b57..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewVehicleControllerTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.ALERT_TITLE_SERVICE_EXCEPTION;
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.ALERT_TITLE_SUCCESS;
-import static at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.Helper.ALERT_TITLE_VALIDATION_ERROR;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.when;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
-import at.ac.tuwien.sepm.assignment.groupphase.util.HighDpiAwareApplicationTest;
-import javafx.scene.control.DialogPane;
-import javafx.scene.input.MouseButton;
-import javafx.stage.Stage;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.testfx.api.FxToolkit;
-import org.testfx.robot.Motion;
-
-public class CreateNewVehicleControllerTest extends HighDpiAwareApplicationTest {
-
-    private VehicleService vehicleService;
-
-    @Before
-    public void setup() throws Exception {
-        FxToolkit.registerPrimaryStage();
-        FxToolkit.setupApplication(GuiTestApplication.class, "createCar.fxml");
-        vehicleService = GuiTestApplication.context.getBean(VehicleService.class);
-    }
-
-    @After
-    public void cleanup() throws Exception {
-        FxToolkit.cleanupStages();
-    }
-
-    @Test
-    public void testClickAddValidVehicle() throws ServiceException, InvalidVehicleException {
-
-        when(vehicleService.add(any())).thenReturn(1L);
-
-        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
-
-        Stage alertDialog = Helper.getTopModalStage(robotContext());
-        Assert.assertNotNull(alertDialog);
-
-        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
-        Assert.assertEquals(ALERT_TITLE_SUCCESS, dialogPane.getHeaderText());
-    }
-
-    @Test
-    public void testClickInvalidVehicleEx() throws ServiceException, InvalidVehicleException {
-
-        when(vehicleService.add(any())).thenThrow(InvalidVehicleException.class);
-
-        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
-
-        Stage alertDialog = Helper.getTopModalStage(robotContext());
-        Assert.assertNotNull(alertDialog);
-
-        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
-        Assert.assertEquals(ALERT_TITLE_VALIDATION_ERROR, dialogPane.getHeaderText());
-    }
-
-    @Test
-    public void testClickInvalidServiceEx() throws ServiceException, InvalidVehicleException {
-
-        when(vehicleService.add(any())).thenThrow(ServiceException.class);
-
-        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
-
-        Stage alertDialog = Helper.getTopModalStage(robotContext());
-        Assert.assertNotNull(alertDialog);
-
-        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
-        Assert.assertEquals(ALERT_TITLE_SERVICE_EXCEPTION, dialogPane.getHeaderText());
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestApplication.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestApplication.java
deleted file mode 100644
index cec2da0..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/GuiTestApplication.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import static org.mockito.Mockito.mock;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeService;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeServiceImpl;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationService;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationServiceImpl;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.RegistrationService;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.RegistrationServiceImpl;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleServiceImpl;
-import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
-import java.lang.invoke.MethodHandles;
-import javafx.application.Application;
-import javafx.scene.Parent;
-import javafx.scene.Scene;
-import javafx.stage.Stage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.AnnotationConfigApplicationContext;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Component;
-
-@Component
-@ComponentScan("at.ac.tuwien.sepm.assignment.groupphase")
-public class GuiTestApplication extends Application {
-
-    private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
-    public static AnnotationConfigApplicationContext context;
-
-    @Configuration
-    public static class ContextConfiguration {
-
-        @Bean
-        @Primary
-        public EmployeeService employeeService() {
-            return mock(EmployeeServiceImpl.class);
-        }
-
-        @Bean
-        @Primary
-        public VehicleService vehicleService() {
-            return mock(VehicleServiceImpl.class);
-        }
-
-        @Bean
-        @Primary
-        public OperationService operationService() {
-            return mock(OperationServiceImpl.class);
-        }
-
-        @Bean
-        @Primary
-        public RegistrationService registrationService() {
-            return mock(RegistrationServiceImpl.class);
-        }
-    }
-
-    @Override
-    public void start(Stage primaryStage) throws Exception {
-        // setup application
-        primaryStage.setTitle("Test window");
-        primaryStage.setWidth(1366);
-        primaryStage.setHeight(768);
-        primaryStage.centerOnScreen();
-        primaryStage.setOnCloseRequest(event -> LOG.debug("Application shutdown initiated"));
-
-        if (getParameters().getRaw().size() < 1) {
-            throw new UnsupportedOperationException("FXML file not set");
-        }
-
-        context = new AnnotationConfigApplicationContext(GuiTestApplication.class);
-        final var fxmlLoader = context.getBean(SpringFXMLLoader.class);
-        primaryStage.setScene(
-                new Scene(
-                        (Parent)
-                                fxmlLoader.load(
-                                        getClass()
-                                                .getResourceAsStream(
-                                                        "/fxml/"
-                                                                + getParameters()
-                                                                        .getRaw()
-                                                                        .get(0)))));
-
-        // show application
-        primaryStage.show();
-        primaryStage.toFront();
-        LOG.debug("Application startup complete");
-    }
-
-    @Override
-    public void stop() {
-        LOG.debug("Stopping application");
-        context.close();
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationControllerTest.java
deleted file mode 100644
index 560032e..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationControllerTest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller;
-
-import at.ac.tuwien.sepm.assignment.groupphase.util.HighDpiAwareApplicationTest;
-import org.junit.After;
-import org.junit.Before;
-import org.testfx.api.FxToolkit;
-
-public class RegistrationControllerTest extends HighDpiAwareApplicationTest {
-
-    @Before
-    public void setup() throws Exception {
-        FxToolkit.registerPrimaryStage();
-        FxToolkit.setupApplication(GuiTestApplication.class, "RegistrationWindow.fxml");
-    }
-
-    @After
-    public void cleanup() throws Exception {
-        FxToolkit.cleanupStages();
-    }
-
-    // TODO: implement GUI Tests
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAOTest.java
deleted file mode 100644
index dfee5f0..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAOTest.java
+++ /dev/null
@@ -1,253 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
-import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
-import java.io.InputStream;
-import java.time.LocalDate;
-import java.util.Set;
-import org.dbunit.Assertion;
-import org.dbunit.dataset.DataSetException;
-import org.dbunit.dataset.IDataSet;
-import org.dbunit.dataset.ITable;
-import org.dbunit.dataset.filter.DefaultColumnFilter;
-import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
-import org.dbunit.util.fileloader.FlatXmlDataFileLoader;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class EmployeeDAOTest extends JdbcTestCase {
-
-    private EmployeeDAO employeePersistence;
-
-    public EmployeeDAOTest() {
-        employeePersistence = new EmployeeDatabaseDAO(getJdbcConnectionManager());
-    }
-
-    @Override
-    protected IDataSet getDataSet() throws DataSetException {
-        InputStream res =
-                getClass()
-                        .getClassLoader()
-                        .getResourceAsStream("EmployeePersistenceTestBaseData.xml");
-        return new FlatXmlDataSetBuilder().build(res);
-    }
-
-    @Test
-    public void testListEmployees() throws PersistenceException {
-        Set<Employee> employees = employeePersistence.list();
-
-        Employee empOne =
-                Employee.builder()
-                        .id(1)
-                        .name("Adam")
-                        .birthday(LocalDate.parse("2010-10-10"))
-                        .educationLevel(EducationLevel.RS)
-                        .isDriver(true)
-                        .isPilot(false)
-                        .build();
-
-        Employee empTwo =
-                Employee.builder()
-                        .id(2)
-                        .name("Max")
-                        .birthday(LocalDate.parse("1990-11-11"))
-                        .educationLevel(EducationLevel.NFS)
-                        .isDriver(false)
-                        .isPilot(false)
-                        .build();
-
-        Employee empThree =
-                Employee.builder()
-                        .id(3)
-                        .name("Lisa")
-                        .birthday(LocalDate.parse("1999-10-16"))
-                        .educationLevel(EducationLevel.NKI)
-                        .isDriver(true)
-                        .isPilot(false)
-                        .build();
-
-        Assert.assertTrue(employees.contains(empOne));
-        Assert.assertTrue(employees.contains(empTwo));
-        Assert.assertTrue(employees.contains(empThree));
-        Assert.assertEquals(3, employees.size());
-    }
-
-    @Test
-    public void testEmployeeListNoElement() throws PersistenceException {
-        Set<Employee> employees = employeePersistence.list();
-
-        Employee empOne =
-                Employee.builder()
-                        .id(10)
-                        .name("Adam")
-                        .birthday(LocalDate.parse("2010-10-10"))
-                        .educationLevel(EducationLevel.RS)
-                        .isDriver(true)
-                        .isPilot(false)
-                        .build();
-
-        Assert.assertFalse(employees.contains(empOne));
-    }
-
-    Employee validEmployee =
-            Employee.builder()
-                    .name("Testperson")
-                    .birthday(LocalDate.parse("2010-11-11"))
-                    .educationLevel(EducationLevel.NA)
-                    .isDriver(true)
-                    .isPilot(false)
-                    .build();
-
-    @Test
-    public void testAddValidEmployee_EmployeeVersion() throws Exception {
-
-        employeePersistence.add(validEmployee);
-
-        String[] excludedColumnsEmployeeVersion = new String[] {"ID"};
-        String tableEmployeeVersion = "EMPLOYEEVERSION";
-
-        // load actual and expected data set
-        IDataSet actualDataSet = getConnection().createDataSet();
-        IDataSet expectedDataSet =
-                new FlatXmlDataFileLoader().load("/testAddValidEmployee_expected.xml");
-
-        // extract employeeVersion table
-        ITable actualEmployeeVersionTable = actualDataSet.getTable(tableEmployeeVersion);
-        ITable expectedEmployeeVersionTable = expectedDataSet.getTable(tableEmployeeVersion);
-
-        // exclude 'id' column as it is an autogenerated value
-        ITable actualFilteredTable =
-                DefaultColumnFilter.excludedColumnsTable(
-                        actualEmployeeVersionTable, excludedColumnsEmployeeVersion);
-        ITable expectedFilteredTable =
-                DefaultColumnFilter.excludedColumnsTable(
-                        expectedEmployeeVersionTable, excludedColumnsEmployeeVersion);
-
-        Assertion.assertEquals(expectedFilteredTable, actualFilteredTable);
-    }
-
-    @Test
-    public void testAddValidEmployee_Employee() throws Exception {
-
-        employeePersistence.add(validEmployee);
-
-        String[] excludedColumnsEmployee = new String[] {"VERSION", "ID"};
-        String tableEmployee = "EMPLOYEE";
-
-        // load actual and expected data set
-        IDataSet actualDataSet = getConnection().createDataSet();
-        IDataSet expectedDataSet =
-                new FlatXmlDataFileLoader().load("/testAddValidEmployee_expected.xml");
-
-        // extract employee table
-        ITable actualEmployeeTable = actualDataSet.getTable(tableEmployee);
-        ITable expectedEmployeeTable = expectedDataSet.getTable(tableEmployee);
-
-        // exclude 'version' as it is an autogenerated value
-        ITable actualFilteredEmpTable =
-                DefaultColumnFilter.excludedColumnsTable(
-                        actualEmployeeTable, excludedColumnsEmployee);
-        ITable expectedFilteredEmpTable =
-                DefaultColumnFilter.excludedColumnsTable(
-                        expectedEmployeeTable, excludedColumnsEmployee);
-
-        Assertion.assertEquals(expectedFilteredEmpTable, actualFilteredEmpTable);
-    }
-
-    @Test
-    public void testAddValidEmployee_Join() throws Exception {
-
-        employeePersistence.add(validEmployee);
-
-        String[] excludedColumns = new String[] {"E_VERSION", "V_ID", "E_ID"};
-        String table = "EMP_JOIN";
-        String expectedXmlDataFileName = "testAddValidEmployeeJoin_expected.xml";
-
-        String sqlJoinEmployeeVersion =
-                "SELECT e.id AS E_ID, v.name AS V_NAME, v.birthday AS V_BIRTHDAY, "
-                        + "v.educationLevel as V_EDUCATIONLEVEL, "
-                        + "v.isDriver AS V_ISDRIVER, v.isPilot AS V_ISPILOT "
-                        + "FROM Employee e "
-                        + "JOIN EmployeeVersion v ON e.version = v.id";
-
-        ITable actualFilteredJoinData =
-                Helper.getActualFilteredQueryTableData(
-                        getConnection(), table, sqlJoinEmployeeVersion, excludedColumns);
-
-        ITable expectedFilteredJoinData =
-                Helper.getExpectedFilteredTableData(
-                        table, excludedColumns, expectedXmlDataFileName);
-
-        Assertion.assertEquals(expectedFilteredJoinData, actualFilteredJoinData);
-    }
-
-    Employee validUpdateEmployee =
-            Employee.builder()
-                    .id(3)
-                    .name("Lisa")
-                    .birthday(LocalDate.parse("1999-10-16"))
-                    .educationLevel(EducationLevel.NKA)
-                    .isDriver(true)
-                    .isPilot(true)
-                    .build();
-
-    @Test
-    public void testUpdateValidEmployee_EmployeeVersion() throws Exception {
-
-        employeePersistence.update(validUpdateEmployee);
-
-        String[] excludedColumnsEmployeeVersion = new String[] {"ID"};
-        String tableEmployeeVersion = "EMPLOYEEVERSION";
-
-        ITable actualTableData =
-                Helper.getActualFilteredTableData(
-                        getConnection(), tableEmployeeVersion, excludedColumnsEmployeeVersion);
-        ITable expedtedTableData =
-                Helper.getExpectedFilteredTableData(
-                        tableEmployeeVersion,
-                        excludedColumnsEmployeeVersion,
-                        "testUpdateValidEmployee_expected.xml");
-
-        Assertion.assertEquals(expedtedTableData, actualTableData);
-    }
-
-    @Test
-    public void testUpdateValidEmployee_Employee() throws Exception {
-
-        employeePersistence.update(validUpdateEmployee);
-
-        String[] excludedColumns = new String[] {"VERSION"};
-        String tableName = "EMPLOYEE";
-        String expectedXmlDataFileName = "testUpdateValidEmployee_expected.xml";
-
-        ITable actualTableData =
-                Helper.getActualFilteredTableData(getConnection(), tableName, excludedColumns);
-
-        ITable expectedTableData =
-                Helper.getExpectedFilteredTableData(
-                        tableName, excludedColumns, expectedXmlDataFileName);
-
-        Assertion.assertEquals(expectedTableData, actualTableData);
-    }
-
-    @Test(expected = ElementNotFoundException.class)
-    public void testUpdateNonExistingEmployee()
-            throws PersistenceException, ElementNotFoundException {
-
-        Employee nonExistentEmployee =
-                Employee.builder()
-                        .id(1000)
-                        .name("Lisa")
-                        .birthday(LocalDate.parse("1999-10-16"))
-                        .educationLevel(EducationLevel.NKA)
-                        .isDriver(true)
-                        .isPilot(true)
-                        .build();
-
-        employeePersistence.update(nonExistentEmployee);
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
deleted file mode 100644
index dbe3c36..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAOTest.java
+++ /dev/null
@@ -1,197 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
-
-import static org.junit.Assert.assertEquals;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Severity;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.ConstructionType;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
-import java.time.Instant;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.LinkedList;
-import java.util.Set;
-import java.util.TimeZone;
-import org.dbunit.dataset.DataSetException;
-import org.dbunit.dataset.IDataSet;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class OperationDAOTest extends JdbcTestCase {
-
-    private static final String[] COMPARE_TABLES =
-            new String[] {"VehicleOperation", "Operation", "Vehicle", "VehicleVersion"};
-
-    private final OperationDAO operationDAO;
-
-    private final Operation o;
-
-    private final Operation originalOperation;
-
-    public OperationDAOTest() throws PersistenceException {
-        // TODO: fix once everything properly uses dependency injection
-        EmployeeDAO employeeDAO = new EmployeeDatabaseDAO(getJdbcConnectionManager());
-        RegistrationDatabaseDAO registrationDatabaseDAO =
-                new RegistrationDatabaseDAO(getJdbcConnectionManager(), employeeDAO);
-        VehicleDAO vehicleDAO =
-                new VehicleDatabaseDAO(getJdbcConnectionManager(), registrationDatabaseDAO);
-        this.operationDAO = new OperationDatabaseDAO(getJdbcConnectionManager(), vehicleDAO);
-
-        Vehicle v1 =
-                Vehicle.builder()
-                        .id(1)
-                        .name("RTW-1")
-                        .constructionType(Vehicle.ConstructionType.HOCHDACH)
-                        .type(Vehicle.VehicleType.RTW)
-                        .status(Vehicle.Status.FREI_FUNK)
-                        .hasNef(true)
-                        .build();
-
-        Vehicle v2 = v1.toBuilder().id(2).build();
-        Vehicle v3 = v1.toBuilder().id(3).build();
-
-        o =
-                Operation.builder()
-                        .id(1)
-                        .opCode("RD-2B0M")
-                        .severity(Severity.B)
-                        .status(Status.ACTIVE)
-                        .vehicles(Set.of(v1, v2, v3))
-                        .created(Instant.ofEpochSecond(1514764800)) // 2018-01-01 00:00:00.0
-                        .destination("New destination")
-                        .additionalInfo("New information")
-                        .build();
-
-        Vehicle vehicle =
-                Vehicle.builder()
-                        .id(4)
-                        .name("BKTW-2")
-                        .constructionType(ConstructionType.HOCHDACH)
-                        .type(VehicleType.BKTW)
-                        .hasNef(false)
-                        .status(Vehicle.Status.ZUM_BERUFUNGSORT)
-                        .registrations(new LinkedList<>())
-                        .build();
-
-        originalOperation =
-                Operation.builder()
-                        .id(1)
-                        .opCode("ALP-95E7")
-                        .severity(Severity.E)
-                        .created(Instant.parse("2000-01-01T00:00:00.0Z"))
-                        .destination("Wiedner Hauptstraße 35, Wien")
-                        .additionalInfo("Additional information")
-                        .status(Status.ACTIVE)
-                        .vehicles(Set.of(vehicle))
-                        .build();
-    }
-
-    @BeforeClass
-    public static void before() {
-        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
-    }
-
-    @Override
-    protected IDataSet getDataSet() throws DataSetException {
-        return getDataSet("operationDAOUpdateSetup.xml");
-    }
-
-    @Test
-    public void testUpdateNormal() throws Exception {
-        operationDAO.update(o);
-
-        compareWith("operationDAOUpdateNormal.xml", COMPARE_TABLES);
-    }
-
-    @Test(expected = ElementNotFoundException.class)
-    public void testUpdateMissing() throws Exception {
-        Operation op = o.toBuilder().id(73).build();
-
-        operationDAO.update(op);
-    }
-
-    @Test
-    public void testUpdateRemoveVehicles() throws Exception {
-        Operation op = o.toBuilder().vehicles(Collections.emptySet()).build();
-
-        operationDAO.update(op);
-
-        compareWith("operationDAOUpdateRemoveVehicles.xml", COMPARE_TABLES);
-    }
-
-    @Test
-    public void testListOperations() throws Exception {
-        Set<Operation> operationSet = operationDAO.list(EnumSet.allOf(Status.class));
-
-        assertEquals(Set.of(originalOperation), operationSet);
-    }
-
-    @Test
-    public void testGetOperations() throws Exception {
-        Operation gotOperation = operationDAO.get(originalOperation.id());
-
-        assertEquals(originalOperation, gotOperation);
-    }
-
-    @Test
-    public void testAddOperation() throws Exception {
-        long id = operationDAO.add(o);
-        assertEquals(2, id);
-        compareWith("operationDAOAddOperation.xml", COMPARE_TABLES);
-    }
-
-    @Test(expected = PersistenceException.class)
-    public void testAddFaultyOperation() throws PersistenceException {
-        Vehicle vehicle =
-                Vehicle.builder()
-                        .status(Vehicle.Status.FREI_FUNK)
-                        .constructionType(ConstructionType.HOCHDACH)
-                        .name("BKTW_123")
-                        .hasNef(true)
-                        .type(VehicleType.BKTW)
-                        .build();
-
-        Operation operation =
-                Operation.builder()
-                        .status(Status.ACTIVE)
-                        .opCode(String.valueOf(Arrays.stream(new int[200]).map(i -> 'a')))
-                        .created(Instant.now())
-                        .destination("Wiedner Hauptstraße 35, Wien")
-                        .additionalInfo("HTU Wien")
-                        .severity(Severity.B)
-                        .vehicles(Set.of(vehicle))
-                        .build();
-        operationDAO.add(operation);
-    }
-
-    @Test(expected = PersistenceException.class)
-    public void testAddFaultyOperation2() throws PersistenceException {
-        Vehicle vehicle =
-                Vehicle.builder()
-                        .status(Vehicle.Status.FREI_FUNK)
-                        .constructionType(ConstructionType.HOCHDACH)
-                        .name("BKTW_123")
-                        .hasNef(true)
-                        .type(VehicleType.BKTW)
-                        .build();
-
-        Operation operation =
-                Operation.builder()
-                        .status(Status.ACTIVE)
-                        .opCode("ALP-95E7")
-                        .created(Instant.now())
-                        .destination(
-                                "Wiednerstraße 888, 1010 Wien Wiednerstraße 888, 1010 Wien Wiednerstraße 888, 1010 Wien Wiednerstraße 888, 1010 Wien Wiednerstraße 888, 1010 Wien ")
-                        .additionalInfo("HTU Wien")
-                        .severity(Severity.B)
-                        .vehicles(Set.of(vehicle))
-                        .build();
-        operationDAO.add(operation);
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAOTest.java
deleted file mode 100644
index 2fb578b..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAOTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
-
-import static org.junit.Assert.*;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
-import java.time.Instant;
-import java.time.LocalDate;
-import java.util.HashSet;
-import java.util.Set;
-import org.dbunit.dataset.IDataSet;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-
-public class RegistrationDAOTest extends JdbcTestCase {
-
-    private RegistrationDAO registrationDAO;
-
-    public RegistrationDAOTest() throws PersistenceException {
-        this.registrationDAO =
-                new RegistrationDatabaseDAO(
-                        getJdbcConnectionManager(),
-                        new EmployeeDatabaseDAO(getJdbcConnectionManager()));
-    }
-
-    @Override
-    protected IDataSet getDataSet() throws Exception {
-        return getDataSet("registrationTestBaseData.xml");
-    }
-
-    @Rule public ExpectedException thrown = ExpectedException.none();
-
-    @Test
-    public void addRegistrationsShouldSucceed() throws PersistenceException {
-        Set<Registration> registrations = new HashSet<>();
-        Employee employee1 =
-                Employee.builder()
-                        .id(1)
-                        .name("John Doe")
-                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
-                        .educationLevel(EducationLevel.RS)
-                        .isDriver(true)
-                        .isPilot(true)
-                        .build();
-        Employee employee2 =
-                Employee.builder()
-                        .id(2)
-                        .name("Nick \"Kage\" Verily")
-                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
-                        .educationLevel(EducationLevel.NKV)
-                        .isDriver(true)
-                        .isPilot(false)
-                        .build();
-        Employee employee3 =
-                Employee.builder()
-                        .id(3)
-                        .name("Nicht Arzt")
-                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
-                        .educationLevel(EducationLevel.NA)
-                        .isDriver(false)
-                        .isPilot(false)
-                        .build();
-        Registration registration1 =
-                Registration.builder()
-                        .start(Instant.now()) // incorrect, but should be irrelevant to outcome
-                        .end(Instant.now()) // same
-                        .employee(employee1)
-                        .build();
-        Registration registration2 =
-                Registration.builder()
-                        .start(Instant.now()) // incorrect, but should be irrelevant to outcome
-                        .end(Instant.now()) // same
-                        .employee(employee2)
-                        .build();
-        Registration registration3 =
-                Registration.builder()
-                        .start(Instant.now()) // incorrect, but should be irrelevant to outcome
-                        .end(Instant.now()) // same
-                        .employee(employee3)
-                        .build();
-        registrations.add(registration1);
-        registrations.add(registration2);
-        registrations.add(registration3);
-
-        Set<Long> returnvalues = registrationDAO.add(1, registrations);
-        assertFalse(returnvalues.isEmpty()); // can be improved...
-    }
-
-    @Test
-    public void addRegistrationToInexistentVehicleShouldFail() throws PersistenceException {
-        thrown.expect(PersistenceException.class);
-        Set<Registration> registrations = new HashSet<>();
-        Employee employee =
-                Employee.builder()
-                        .id(1)
-                        .name("John Doe")
-                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
-                        .educationLevel(EducationLevel.RS)
-                        .isDriver(true)
-                        .isPilot(true)
-                        .build();
-        Registration registration =
-                Registration.builder()
-                        .start(Instant.now())
-                        .end(Instant.now())
-                        .employee(employee)
-                        .build();
-        registrations.add(registration);
-        registrationDAO.add(200, registrations);
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDAOTest.java
deleted file mode 100644
index 1862214..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDAOTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.ConstructionType;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
-import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Set;
-import org.dbunit.Assertion;
-import org.dbunit.dataset.IDataSet;
-import org.dbunit.dataset.ITable;
-import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class VehicleDAOTest extends JdbcTestCase {
-
-    private VehicleDAO vehicleDAO;
-
-    private Vehicle validUpdateVehicle =
-            Vehicle.builder()
-                    .hasNef(true)
-                    .constructionType(ConstructionType.HOCHDACH)
-                    .type(VehicleType.RTW)
-                    .id(2)
-                    .name("RTW-2")
-                    .status(Status.ABGEMELDET)
-                    .build();
-
-    public VehicleDAOTest() throws PersistenceException {
-        vehicleDAO =
-                new VehicleDatabaseDAO(
-                        getJdbcConnectionManager(),
-                        new RegistrationDatabaseDAO(
-                                getJdbcConnectionManager(),
-                                new EmployeeDatabaseDAO(getJdbcConnectionManager())));
-        // TODO: use Spring Dependency Injection!
-    }
-
-    @Override
-    protected IDataSet getDataSet() throws Exception {
-        InputStream res = getClass().getClassLoader().getResourceAsStream("vehicleTestData.xml");
-        return new FlatXmlDataSetBuilder().build(res);
-    }
-
-    @Test
-    public void testListVehicle() throws PersistenceException {
-        Set<Vehicle> vehicles = vehicleDAO.list();
-
-        Vehicle v1 =
-                Vehicle.builder()
-                        .id(1)
-                        .constructionType(ConstructionType.HOCHDACH)
-                        .name("RTW-1")
-                        .hasNef(true)
-                        .status(Status.ABGEMELDET)
-                        .type(VehicleType.RTW)
-                        .registrations(new ArrayList<>())
-                        .build();
-        Vehicle v2 =
-                Vehicle.builder()
-                        .id(2)
-                        .constructionType(ConstructionType.MITTELHOCHDACH)
-                        .name("KTW-2")
-                        .hasNef(false)
-                        .status(Status.FREI_WACHE)
-                        .type(VehicleType.KTW)
-                        .registrations(new ArrayList<>())
-                        .build();
-        Vehicle v3 =
-                Vehicle.builder()
-                        .id(3)
-                        .constructionType(ConstructionType.NORMAL)
-                        .name("NEF-3")
-                        .hasNef(false)
-                        .status(Status.FREI_FUNK)
-                        .type(VehicleType.NEF)
-                        .registrations(new ArrayList<>())
-                        .build();
-
-        Assert.assertTrue(vehicles.contains(v1));
-        Assert.assertTrue(vehicles.contains(v2));
-        Assert.assertTrue(vehicles.contains(v3));
-        Assert.assertEquals(3, vehicles.size());
-    }
-
-    @Test
-    public void testVehicleListNoElement() throws PersistenceException {
-        Set<Vehicle> vehicles = vehicleDAO.list();
-
-        Vehicle v1 =
-                Vehicle.builder()
-                        .id(30)
-                        .constructionType(ConstructionType.NORMAL)
-                        .name("NEF-3")
-                        .hasNef(false)
-                        .status(Status.FREI_FUNK)
-                        .type(VehicleType.NEF)
-                        .build();
-
-        Assert.assertFalse(vehicles.contains(v1));
-    }
-
-    @Test
-    public void testUpdateValid_VehicleVersion() throws Exception {
-        vehicleDAO.update(validUpdateVehicle);
-
-        String[] excludedColumnsVehicleVersion = new String[] {"ID", "NAME"};
-        String tableVehicleVersion = "VEHICLEVERSION";
-
-        ITable actualTableData =
-                Helper.getActualFilteredTableData(
-                        getConnection(), tableVehicleVersion, excludedColumnsVehicleVersion);
-
-        ITable expectedTableData =
-                Helper.getExpectedFilteredTableData(
-                        tableVehicleVersion,
-                        excludedColumnsVehicleVersion,
-                        "vehicleTestUpdateExpectedData.xml");
-        Assertion.assertEquals(expectedTableData, actualTableData);
-    }
-
-    @Test
-    public void testUpdateValid_Vehicle() throws Exception {
-        vehicleDAO.update(validUpdateVehicle);
-
-        String[] excludedColumnsVehicleVersion = new String[] {"VERSION", "STATUS"};
-        String tableVehicleVersion = "VEHICLE";
-
-        ITable actualTableData =
-                Helper.getActualFilteredTableData(
-                        getConnection(), tableVehicleVersion, excludedColumnsVehicleVersion);
-
-        ITable expectedTableData =
-                Helper.getExpectedFilteredTableData(
-                        tableVehicleVersion,
-                        excludedColumnsVehicleVersion,
-                        "vehicleTestUpdateExpectedData.xml");
-        Assertion.assertEquals(expectedTableData, actualTableData);
-    }
-
-    @Test(expected = ElementNotFoundException.class)
-    public void testUpdateNonExistingVehicle()
-            throws PersistenceException, ElementNotFoundException {
-        Vehicle nonExistentVehicle =
-                Vehicle.builder()
-                        .id(35)
-                        .constructionType(ConstructionType.NORMAL)
-                        .name("NEF-3")
-                        .hasNef(false)
-                        .status(Status.FREI_FUNK)
-                        .type(VehicleType.NEF)
-                        .build();
-        vehicleDAO.update(nonExistentVehicle);
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceTest.java
deleted file mode 100644
index 90f0a44..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDatabaseDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import java.time.LocalDate;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class EmployeeServiceTest {
-
-    private final EmployeeDAO employeePersistence = mock(EmployeeDatabaseDAO.class);
-    private final EmployeeService employeeService = new EmployeeServiceImpl(employeePersistence);
-
-    private final Employee.Builder employeeBuilder =
-            Employee.builder()
-                    .name("Testperson")
-                    .birthday(LocalDate.parse("1996-10-10"))
-                    .educationLevel(EducationLevel.NKA)
-                    .isDriver(true)
-                    .isPilot(false);
-
-    public EmployeeServiceTest() throws PersistenceException {
-        when(employeePersistence.add(any())).thenReturn(1L);
-    }
-
-    @Test
-    public void testAddValidEmployee() throws ServiceException, InvalidEmployeeException {
-
-        Employee employee = employeeBuilder.build();
-        Assert.assertThat(employeeService.add(employee), is(1L));
-    }
-
-    @Test(expected = InvalidEmployeeException.class)
-    public void testAddInvalidEmployee() throws InvalidEmployeeException, ServiceException {
-
-        Employee employee = employeeBuilder.name("").build();
-        employeeService.add(employee);
-    }
-
-    @Test
-    public void testUpdateValidEmployee() throws ElementNotFoundException, PersistenceException {
-
-        Employee employee = employeeBuilder.build();
-        employeePersistence.update(employee);
-    }
-
-    @Test(expected = ElementNotFoundException.class)
-    public void testUpdateNonExistentEmployee()
-            throws ElementNotFoundException, PersistenceException {
-
-        doThrow(ElementNotFoundException.class).when(employeePersistence).update(any());
-        Employee employee = employeeBuilder.id(1000).build();
-        employeePersistence.update(employee);
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceIntegrationTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceIntegrationTest.java
deleted file mode 100644
index 1928eff..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceIntegrationTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import static org.junit.Assert.assertEquals;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDatabaseDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDatabaseDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDatabaseDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDatabaseDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
-import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
-import java.util.Set;
-import org.dbunit.Assertion;
-import org.dbunit.dataset.IDataSet;
-import org.dbunit.dataset.ITable;
-import org.junit.Test;
-
-public class OperationServiceIntegrationTest extends JdbcTestCase {
-
-    private OperationService operationService;
-
-    private Operation o;
-
-    public OperationServiceIntegrationTest() throws PersistenceException {
-        EmployeeDAO employeeDAO = new EmployeeDatabaseDAO(getJdbcConnectionManager());
-        RegistrationDAO registrationDAO =
-                new RegistrationDatabaseDAO(getJdbcConnectionManager(), employeeDAO);
-        VehicleDAO vehicleDAO =
-                new VehicleDatabaseDAO(
-                        getJdbcConnectionManager(), (RegistrationDatabaseDAO) registrationDAO);
-        OperationDAO operationDAO =
-                new OperationDatabaseDAO(getJdbcConnectionManager(), vehicleDAO);
-
-        VehicleService vehicleService = new VehicleServiceImpl(vehicleDAO);
-
-        operationService = new OperationServiceImpl(operationDAO, vehicleDAO, vehicleService);
-
-        Vehicle v1 =
-                Vehicle.builder()
-                        .id(1)
-                        .name("RTW-1")
-                        .constructionType(Vehicle.ConstructionType.HOCHDACH)
-                        .type(Vehicle.VehicleType.RTW)
-                        .status(Vehicle.Status.FREI_FUNK)
-                        .hasNef(true)
-                        .build();
-
-        Vehicle v2 = v1.toBuilder().id(2).build();
-        Vehicle v3 = v1.toBuilder().id(3).build();
-
-        o =
-                Operation.builder()
-                        .opCode("RD-2B0M")
-                        .status(Status.ACTIVE)
-                        .vehicles(Set.of(v1, v2, v3))
-                        .destination("New destination")
-                        .additionalInfo("New information")
-                        .build();
-    }
-
-    @Override
-    protected IDataSet getDataSet() throws Exception {
-        return getDataSet("operationDAOUpdateSetup.xml");
-    }
-
-    @Test
-    public void addValidOperation() throws Exception {
-
-        long id = operationService.add(o);
-        assertEquals(2, id);
-
-        String tableName = "Operation";
-        String[] excludedColumns = new String[] {"created"};
-
-        ITable actual =
-                Helper.getActualFilteredTableData(getConnection(), tableName, excludedColumns);
-        ITable expected =
-                Helper.getExpectedFilteredTableData(
-                        tableName, excludedColumns, "operationDAOAddOperation.xml");
-
-        Assertion.assertEquals(expected, actual);
-    }
-
-    @Test(expected = InvalidOperationException.class)
-    public void addInvalidOperation() throws InvalidOperationException, ServiceException {
-        operationService.add(o.toBuilder().opCode("").build());
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceTest.java
deleted file mode 100644
index 67fb77d..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceTest.java
+++ /dev/null
@@ -1,205 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Severity;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.ConstructionType;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import java.time.Instant;
-import java.util.Collections;
-import java.util.Set;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-
-@RunWith(MockitoJUnitRunner.class)
-public class OperationServiceTest {
-
-    @Mock private OperationDAO operationDAO;
-
-    @Mock private VehicleDAO vehicleDAO;
-
-    @InjectMocks private OperationServiceImpl operationService;
-
-    private Set<Vehicle> vehicles;
-    private Vehicle v1, v2, v3, v4, v5;
-    private Operation baseOp, o1, o2;
-
-    @Before
-    public void setUp() throws Exception {
-        v1 =
-                Vehicle.builder()
-                        .id(1)
-                        .name("RTW-1")
-                        .constructionType(ConstructionType.HOCHDACH)
-                        .type(Vehicle.VehicleType.RTW)
-                        .status(Vehicle.Status.FREI_FUNK)
-                        .hasNef(true)
-                        .build();
-
-        v2 =
-                Vehicle.builder()
-                        .id(2)
-                        .name("KTW-1")
-                        .constructionType(ConstructionType.HOCHDACH)
-                        .type(Vehicle.VehicleType.KTW)
-                        .status(Vehicle.Status.FREI_WACHE)
-                        .hasNef(true)
-                        .build();
-
-        v3 =
-                Vehicle.builder()
-                        .id(3)
-                        .name("KTW-2")
-                        .constructionType(ConstructionType.MITTELHOCHDACH)
-                        .type(Vehicle.VehicleType.KTW_B)
-                        .status(Vehicle.Status.FREI_FUNK)
-                        .hasNef(false)
-                        .build();
-
-        v4 =
-                Vehicle.builder()
-                        .id(4)
-                        .name("BKTW-2")
-                        .constructionType(ConstructionType.HOCHDACH)
-                        .type(Vehicle.VehicleType.BKTW)
-                        .status(Vehicle.Status.FREI_FUNK)
-                        .hasNef(false)
-                        .build();
-
-        v5 =
-                Vehicle.builder()
-                        .id(5)
-                        .name("NEF-1")
-                        .constructionType(ConstructionType.NORMAL)
-                        .type(Vehicle.VehicleType.NEF)
-                        .status(Vehicle.Status.FREI_WACHE)
-                        .hasNef(true)
-                        .build();
-
-        Vehicle v6 =
-                Vehicle.builder()
-                        .id(6)
-                        .name("NAH-1")
-                        .constructionType(ConstructionType.MITTELHOCHDACH)
-                        .type(Vehicle.VehicleType.NAH)
-                        .status(Vehicle.Status.ABGEMELDET)
-                        .hasNef(true)
-                        .build();
-
-        vehicles = Set.of(v1, v2, v3, v4, v5, v6);
-
-        baseOp =
-                Operation.builder()
-                        .opCode("ALP-95E7")
-                        .severity(Severity.E)
-                        .status(Status.ACTIVE)
-                        .vehicles(Collections.singleton(v1))
-                        .destination("Wiedner Hauptstraße 35, Wien")
-                        .build();
-
-        o1 = baseOp.toBuilder().id(1).created(Instant.now()).build();
-        o2 = o1.toBuilder().id(5).status(Status.CANCELLED).build();
-
-        when(operationDAO.get(anyLong()))
-                .thenAnswer(
-                        ans -> {
-                            long arg = ans.getArgument(0);
-                            if (arg == 1L) return o1;
-                            else if (arg == 5L) return o2;
-                            else throw new ElementNotFoundException("");
-                        });
-
-        when(vehicleDAO.get(anyLong()))
-                .thenAnswer(
-                        ans -> {
-                            int arg = ((Long) ans.getArgument(0)).intValue();
-                            return vehicles.stream()
-                                    .filter(v -> v.id() == arg)
-                                    .findFirst()
-                                    .orElseThrow(() -> new ElementNotFoundException(""));
-                        });
-    }
-
-    @Test
-    public void requestNormal() throws Exception {
-        Set<Long> vehicleIds = Set.of(2L, 3L, 4L, 5L);
-        operationService.requestVehicles(1, vehicleIds);
-
-        Operation result =
-                operationDAO.get(1).toBuilder().vehicles(Set.of(v1, v2, v3, v4, v5)).build();
-        verify(operationDAO, times(1)).update(result);
-        verify(operationDAO, times(0)).get(6L);
-    }
-
-    @Test
-    public void requestExistingVehicle() throws Exception {
-        operationService.requestVehicles(1, Set.of(1L));
-
-        Operation result = operationDAO.get(1);
-        verify(operationDAO, times(0)).update(result);
-    }
-
-    @Test(expected = InvalidVehicleException.class)
-    public void requestInvalidVehicle() throws Exception {
-        operationService.requestVehicles(1, Set.of(5L, 6L));
-    }
-
-    @Test(expected = InvalidOperationException.class)
-    public void requestInvalidOperation() throws Exception {
-        operationService.requestVehicles(2, Set.of(1L));
-    }
-
-    @Test(expected = InvalidVehicleException.class)
-    public void requestInactiveVehicle() throws Exception {
-        operationService.requestVehicles(1, Set.of(6L));
-    }
-
-    @Test(expected = InvalidOperationException.class)
-    public void requestInactiveOperation() throws Exception {
-        operationService.requestVehicles(5, Set.of(1L));
-    }
-
-    @Test
-    public void addOperation() throws Exception {
-        operationService.add(baseOp.toBuilder().severity(null).build());
-
-        verify(operationDAO, times(1))
-                .add(baseOp.toBuilder().created(any()).status(Status.ACTIVE).build());
-        verify(vehicleDAO, times(1)).get(v1.id());
-    }
-
-    @Test(expected = InvalidOperationException.class)
-    public void addWithSeverity() throws Exception {
-        operationService.add(baseOp.toBuilder().severity(Severity.E).build());
-    }
-
-    @Test(expected = InvalidOperationException.class)
-    public void addWithoutVehicles() throws Exception {
-        operationService.add(baseOp.toBuilder().vehicles(Set.of()).build());
-    }
-
-    @Test(expected = InvalidOperationException.class)
-    public void addInvalidOpcode() throws Exception {
-        operationService.add(baseOp.toBuilder().opCode("ABC").build());
-    }
-
-    @Test(expected = InvalidOperationException.class)
-    public void addWithSetCreated() throws Exception {
-        operationService.add(baseOp.toBuilder().created(Instant.now()).build());
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceIntegrationTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceIntegrationTest.java
deleted file mode 100644
index 51b7621..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceIntegrationTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDatabaseDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDatabaseDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDatabaseDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
-import org.dbunit.dataset.IDataSet;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-
-public class RegistrationServiceIntegrationTest extends JdbcTestCase {
-
-    private RegistrationDAO registrationDAO;
-    private VehicleDAO vehicleDAO;
-
-    @Rule public ExpectedException thrown = ExpectedException.none();
-
-    @Override
-    protected IDataSet getDataSet() throws Exception {
-        return getDataSet("registrationTestBaseData.xml");
-    }
-
-    @Before
-    public void prepare() throws PersistenceException {
-
-        EmployeeDAO employeeDAO = new EmployeeDatabaseDAO(getJdbcConnectionManager());
-        registrationDAO = new RegistrationDatabaseDAO(getJdbcConnectionManager(), employeeDAO);
-        vehicleDAO =
-                new VehicleDatabaseDAO(
-                        getJdbcConnectionManager(), (RegistrationDatabaseDAO) registrationDAO);
-    }
-
-    @Test
-    public void addValidRegistrationsShouldSucceed()
-            throws InvalidRegistrationException, ServiceException, InvalidVehicleException {
-        RegistrationServiceTest.addValidRegistrations(registrationDAO, vehicleDAO);
-    }
-
-    @Test
-    public void addOnlyOnePersonToRTWShouldFail()
-            throws InvalidRegistrationException, ServiceException, InvalidVehicleException {
-        RegistrationServiceTest.addOnlyOnePersonToRTW(thrown, registrationDAO, vehicleDAO);
-    }
-
-    // TODO: also test real integration, e.g. add registration and delete afterwards (feedback)
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceTest.java
deleted file mode 100644
index c6af300..0000000
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceTest.java
+++ /dev/null
@@ -1,159 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
-
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.Mockito.when;
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.Builder;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.ConstructionType;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import java.time.Instant;
-import java.time.LocalDate;
-import java.time.temporal.ChronoUnit;
-import java.util.HashSet;
-import java.util.Set;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-
-public class RegistrationServiceTest {
-
-    @Mock private RegistrationDAO registrationDAO;
-
-    @Mock private VehicleDAO vehicleDAO;
-
-    @Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
-
-    @Rule public ExpectedException thrown = ExpectedException.none();
-
-    @Before
-    public void setUp() throws ElementNotFoundException, PersistenceException {
-        MockitoAnnotations.initMocks(this);
-        Builder b =
-                Vehicle.builder()
-                        .name("RTW-1")
-                        .constructionType(ConstructionType.HOCHDACH)
-                        .status(Status.ABGEMELDET)
-                        .type(VehicleType.RTW)
-                        .hasNef(true);
-        when(vehicleDAO.get(anyLong())).thenAnswer(ans -> b.id(ans.getArgument(0)).build());
-    }
-
-    @Test
-    public void addValidRegistrationsShouldSucceed()
-            throws InvalidRegistrationException, ServiceException, InvalidVehicleException {
-        addValidRegistrations(registrationDAO, vehicleDAO);
-    }
-
-    @Test
-    public void addOnlyOnePersonToRTWShouldFail()
-            throws InvalidRegistrationException, ServiceException, InvalidVehicleException {
-        addOnlyOnePersonToRTW(thrown, registrationDAO, vehicleDAO);
-    }
-
-    static void addValidRegistrations(RegistrationDAO registrationDAO, VehicleDAO vehicleDAO)
-            throws InvalidVehicleException, InvalidRegistrationException, ServiceException {
-        RegistrationService registrationService =
-                new RegistrationServiceImpl(registrationDAO, vehicleDAO);
-        Set<Registration> registrations = new HashSet<>();
-        Vehicle vehicle =
-                Vehicle.builder()
-                        .id(1)
-                        .name("RTW-1")
-                        .constructionType(ConstructionType.HOCHDACH)
-                        .type(VehicleType.RTW)
-                        .status(Status.ABGEMELDET)
-                        .hasNef(true)
-                        .build();
-        Employee employee1 =
-                Employee.builder()
-                        .id(1)
-                        .name("John Doe")
-                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
-                        .educationLevel(EducationLevel.RS)
-                        .isDriver(true)
-                        .isPilot(true)
-                        .build();
-        Employee employee2 =
-                Employee.builder()
-                        .id(2)
-                        .name("Nick \"Kage\" Verily")
-                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
-                        .educationLevel(EducationLevel.NKV)
-                        .isDriver(true)
-                        .isPilot(false)
-                        .build();
-        Employee employee3 =
-                Employee.builder()
-                        .id(3)
-                        .name("Nicht Arzt")
-                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
-                        .educationLevel(EducationLevel.NA)
-                        .isDriver(false)
-                        .isPilot(false)
-                        .build();
-        Instant start = Instant.now();
-        Instant end = start.plus(8, ChronoUnit.HOURS);
-        Registration registration1 =
-                Registration.builder().start(start).end(end).employee(employee1).build();
-        Registration registration2 =
-                Registration.builder().start(start).end(end).employee(employee2).build();
-        Registration registration3 =
-                Registration.builder().start(start).end(end).employee(employee3).build();
-        registrations.add(registration1);
-        registrations.add(registration2);
-        registrations.add(registration3);
-        registrationService.add(vehicle.id(), registrations);
-    }
-
-    static void addOnlyOnePersonToRTW(
-            ExpectedException thrown, RegistrationDAO registrationDAO, VehicleDAO vehicleDAO)
-            throws InvalidVehicleException, InvalidRegistrationException, ServiceException {
-        thrown.expect(InvalidRegistrationException.class);
-        RegistrationService registrationService =
-                new RegistrationServiceImpl(registrationDAO, vehicleDAO);
-        Set<Registration> registrations = new HashSet<>();
-        Vehicle vehicle =
-                Vehicle.builder()
-                        .id(1)
-                        .name("RTW-1")
-                        .constructionType(ConstructionType.HOCHDACH)
-                        .type(VehicleType.RTW)
-                        .status(Status.ABGEMELDET)
-                        .hasNef(true)
-                        .build();
-        Employee employee =
-                Employee.builder()
-                        .id(1)
-                        .name("John Doe")
-                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
-                        .educationLevel(EducationLevel.RS)
-                        .isDriver(true)
-                        .isPilot(true)
-                        .build();
-        Registration registration =
-                Registration.builder()
-                        .start(Instant.MIN)
-                        .end(Instant.MAX)
-                        .employee(employee)
-                        .build();
-        registrations.add(registration);
-        registrationService.add(vehicle.id(), registrations);
-    }
-}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeControllerTest.java
new file mode 100644
index 0000000..2b0f793
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeControllerTest.java
@@ -0,0 +1,87 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.ALERT_TITLE_SERVICE_EXCEPTION;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.ALERT_TITLE_SUCCESS;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.ALERT_TITLE_VALIDATION_ERROR;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.EmployeeService;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
+import at.ac.tuwien.sepm.assignment.groupphase.util.HighDpiAwareApplicationTest;
+import javafx.scene.control.DialogPane;
+import javafx.scene.input.MouseButton;
+import javafx.stage.Stage;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.testfx.api.FxToolkit;
+import org.testfx.robot.Motion;
+
+public class CreateNewEmployeeControllerTest extends HighDpiAwareApplicationTest {
+
+    private EmployeeService employeeService;
+
+    @Before
+    public void setup() throws Exception {
+        FxToolkit.registerPrimaryStage();
+        FxToolkit.setupApplication(GuiTestApplication.class, "createNewEmployee.fxml");
+        employeeService = GuiTestApplication.context.getBean(EmployeeService.class);
+    }
+
+    @After
+    public void cleanup() throws Exception {
+        FxToolkit.cleanupStages();
+    }
+
+    @Test
+    public void testClickAddValidEmployee() throws InvalidEmployeeException, ServiceException {
+
+        when(employeeService.add(any())).thenReturn(1L);
+
+        clickOn("#inputName", Motion.DIRECT, MouseButton.PRIMARY);
+        write("Name");
+        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
+
+        Stage alertDialog = Helper.getTopModalStage(robotContext());
+        Assert.assertNotNull(alertDialog);
+
+        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
+        Assert.assertEquals(ALERT_TITLE_SUCCESS, dialogPane.getHeaderText());
+    }
+
+    @Test
+    public void testClickAddInvalidEmployee() throws InvalidEmployeeException, ServiceException {
+
+        when(employeeService.add(any())).thenThrow(InvalidEmployeeException.class);
+
+        moveTo("#inputName");
+        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
+
+        Stage alertDialog = Helper.getTopModalStage(robotContext());
+        Assert.assertNotNull(alertDialog);
+
+        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
+        Assert.assertEquals(ALERT_TITLE_VALIDATION_ERROR, dialogPane.getHeaderText());
+    }
+
+    @Test
+    public void testClickAddEmployeeWithServiceException()
+            throws InvalidEmployeeException, ServiceException {
+
+        when(employeeService.add(any())).thenThrow(ServiceException.class);
+
+        clickOn("#inputName", Motion.DIRECT, MouseButton.PRIMARY);
+        write("Test");
+        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
+
+        Stage alertDialog = Helper.getTopModalStage(robotContext());
+        Assert.assertNotNull(alertDialog);
+
+        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
+        Assert.assertEquals(ALERT_TITLE_SERVICE_EXCEPTION, dialogPane.getHeaderText());
+    }
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewVehicleControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewVehicleControllerTest.java
new file mode 100644
index 0000000..282c50f
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewVehicleControllerTest.java
@@ -0,0 +1,81 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.ALERT_TITLE_SERVICE_EXCEPTION;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.ALERT_TITLE_SUCCESS;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.ALERT_TITLE_VALIDATION_ERROR;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleService;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
+import at.ac.tuwien.sepm.assignment.groupphase.util.HighDpiAwareApplicationTest;
+import javafx.scene.control.DialogPane;
+import javafx.scene.input.MouseButton;
+import javafx.stage.Stage;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.testfx.api.FxToolkit;
+import org.testfx.robot.Motion;
+
+public class CreateNewVehicleControllerTest extends HighDpiAwareApplicationTest {
+
+    private VehicleService vehicleService;
+
+    @Before
+    public void setup() throws Exception {
+        FxToolkit.registerPrimaryStage();
+        FxToolkit.setupApplication(GuiTestApplication.class, "createCar.fxml");
+        vehicleService = GuiTestApplication.context.getBean(VehicleService.class);
+    }
+
+    @After
+    public void cleanup() throws Exception {
+        FxToolkit.cleanupStages();
+    }
+
+    @Test
+    public void testClickAddValidVehicle() throws ServiceException, InvalidVehicleException {
+
+        when(vehicleService.add(any())).thenReturn(1L);
+
+        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
+
+        Stage alertDialog = Helper.getTopModalStage(robotContext());
+        Assert.assertNotNull(alertDialog);
+
+        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
+        Assert.assertEquals(ALERT_TITLE_SUCCESS, dialogPane.getHeaderText());
+    }
+
+    @Test
+    public void testClickInvalidVehicleEx() throws ServiceException, InvalidVehicleException {
+
+        when(vehicleService.add(any())).thenThrow(InvalidVehicleException.class);
+
+        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
+
+        Stage alertDialog = Helper.getTopModalStage(robotContext());
+        Assert.assertNotNull(alertDialog);
+
+        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
+        Assert.assertEquals(ALERT_TITLE_VALIDATION_ERROR, dialogPane.getHeaderText());
+    }
+
+    @Test
+    public void testClickInvalidServiceEx() throws ServiceException, InvalidVehicleException {
+
+        when(vehicleService.add(any())).thenThrow(ServiceException.class);
+
+        clickOn("#btnCreate", Motion.DIRECT, MouseButton.PRIMARY);
+
+        Stage alertDialog = Helper.getTopModalStage(robotContext());
+        Assert.assertNotNull(alertDialog);
+
+        DialogPane dialogPane = (DialogPane) alertDialog.getScene().getRoot();
+        Assert.assertEquals(ALERT_TITLE_SERVICE_EXCEPTION, dialogPane.getHeaderText());
+    }
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/GuiTestApplication.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/GuiTestApplication.java
new file mode 100644
index 0000000..968141e
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/GuiTestApplication.java
@@ -0,0 +1,101 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import static org.mockito.Mockito.mock;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.EmployeeService;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.EmployeeServiceImpl;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.OperationService;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.OperationServiceImpl;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.RegistrationService;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.RegistrationServiceImpl;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleService;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleServiceImpl;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
+import java.lang.invoke.MethodHandles;
+import javafx.application.Application;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.stage.Stage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Component;
+
+@Component
+@ComponentScan("at.ac.tuwien.sepm.assignment.groupphase")
+public class GuiTestApplication extends Application {
+
+    private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
+    public static AnnotationConfigApplicationContext context;
+
+    @Configuration
+    public static class ContextConfiguration {
+
+        @Bean
+        @Primary
+        public EmployeeService employeeService() {
+            return mock(EmployeeServiceImpl.class);
+        }
+
+        @Bean
+        @Primary
+        public VehicleService vehicleService() {
+            return mock(VehicleServiceImpl.class);
+        }
+
+        @Bean
+        @Primary
+        public OperationService operationService() {
+            return mock(OperationServiceImpl.class);
+        }
+
+        @Bean
+        @Primary
+        public RegistrationService registrationService() {
+            return mock(RegistrationServiceImpl.class);
+        }
+    }
+
+    @Override
+    public void start(Stage primaryStage) throws Exception {
+        // setup application
+        primaryStage.setTitle("Test window");
+        primaryStage.setWidth(1366);
+        primaryStage.setHeight(768);
+        primaryStage.centerOnScreen();
+        primaryStage.setOnCloseRequest(event -> LOG.debug("Application shutdown initiated"));
+
+        if (getParameters().getRaw().size() < 1) {
+            throw new UnsupportedOperationException("FXML file not set");
+        }
+
+        context = new AnnotationConfigApplicationContext(GuiTestApplication.class);
+        final var fxmlLoader = context.getBean(SpringFXMLLoader.class);
+        primaryStage.setScene(
+                new Scene(
+                        (Parent)
+                                fxmlLoader.load(
+                                        getClass()
+                                                .getResourceAsStream(
+                                                        "/fxml/"
+                                                                + getParameters()
+                                                                        .getRaw()
+                                                                        .get(0)))));
+
+        // show application
+        primaryStage.show();
+        primaryStage.toFront();
+        LOG.debug("Application startup complete");
+    }
+
+    @Override
+    public void stop() {
+        LOG.debug("Stopping application");
+        context.close();
+    }
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/RegistrationControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/RegistrationControllerTest.java
new file mode 100644
index 0000000..97fb0e7
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/RegistrationControllerTest.java
@@ -0,0 +1,22 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import at.ac.tuwien.sepm.assignment.groupphase.util.HighDpiAwareApplicationTest;
+import org.junit.After;
+import org.junit.Before;
+import org.testfx.api.FxToolkit;
+
+public class RegistrationControllerTest extends HighDpiAwareApplicationTest {
+
+    @Before
+    public void setup() throws Exception {
+        FxToolkit.registerPrimaryStage();
+        FxToolkit.setupApplication(GuiTestApplication.class, "RegistrationWindow.fxml");
+    }
+
+    @After
+    public void cleanup() throws Exception {
+        FxToolkit.cleanupStages();
+    }
+
+    // TODO: implement GUI Tests
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAOTest.java
new file mode 100644
index 0000000..8485f67
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAOTest.java
@@ -0,0 +1,253 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
+import java.io.InputStream;
+import java.time.LocalDate;
+import java.util.Set;
+import org.dbunit.Assertion;
+import org.dbunit.dataset.DataSetException;
+import org.dbunit.dataset.IDataSet;
+import org.dbunit.dataset.ITable;
+import org.dbunit.dataset.filter.DefaultColumnFilter;
+import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
+import org.dbunit.util.fileloader.FlatXmlDataFileLoader;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EmployeeDAOTest extends JdbcTestCase {
+
+    private EmployeeDAO employeePersistence;
+
+    public EmployeeDAOTest() {
+        employeePersistence = new EmployeeDatabaseDAO(getJdbcConnectionManager());
+    }
+
+    @Override
+    protected IDataSet getDataSet() throws DataSetException {
+        InputStream res =
+                getClass()
+                        .getClassLoader()
+                        .getResourceAsStream("EmployeePersistenceTestBaseData.xml");
+        return new FlatXmlDataSetBuilder().build(res);
+    }
+
+    @Test
+    public void testListEmployees() throws PersistenceException {
+        Set<Employee> employees = employeePersistence.list();
+
+        Employee empOne =
+                Employee.builder()
+                        .id(1)
+                        .name("Adam")
+                        .birthday(LocalDate.parse("2010-10-10"))
+                        .educationLevel(EducationLevel.RS)
+                        .isDriver(true)
+                        .isPilot(false)
+                        .build();
+
+        Employee empTwo =
+                Employee.builder()
+                        .id(2)
+                        .name("Max")
+                        .birthday(LocalDate.parse("1990-11-11"))
+                        .educationLevel(EducationLevel.NFS)
+                        .isDriver(false)
+                        .isPilot(false)
+                        .build();
+
+        Employee empThree =
+                Employee.builder()
+                        .id(3)
+                        .name("Lisa")
+                        .birthday(LocalDate.parse("1999-10-16"))
+                        .educationLevel(EducationLevel.NKI)
+                        .isDriver(true)
+                        .isPilot(false)
+                        .build();
+
+        Assert.assertTrue(employees.contains(empOne));
+        Assert.assertTrue(employees.contains(empTwo));
+        Assert.assertTrue(employees.contains(empThree));
+        Assert.assertEquals(3, employees.size());
+    }
+
+    @Test
+    public void testEmployeeListNoElement() throws PersistenceException {
+        Set<Employee> employees = employeePersistence.list();
+
+        Employee empOne =
+                Employee.builder()
+                        .id(10)
+                        .name("Adam")
+                        .birthday(LocalDate.parse("2010-10-10"))
+                        .educationLevel(EducationLevel.RS)
+                        .isDriver(true)
+                        .isPilot(false)
+                        .build();
+
+        Assert.assertFalse(employees.contains(empOne));
+    }
+
+    Employee validEmployee =
+            Employee.builder()
+                    .name("Testperson")
+                    .birthday(LocalDate.parse("2010-11-11"))
+                    .educationLevel(EducationLevel.NA)
+                    .isDriver(true)
+                    .isPilot(false)
+                    .build();
+
+    @Test
+    public void testAddValidEmployee_EmployeeVersion() throws Exception {
+
+        employeePersistence.add(validEmployee);
+
+        String[] excludedColumnsEmployeeVersion = new String[] {"ID"};
+        String tableEmployeeVersion = "EMPLOYEEVERSION";
+
+        // load actual and expected data set
+        IDataSet actualDataSet = getConnection().createDataSet();
+        IDataSet expectedDataSet =
+                new FlatXmlDataFileLoader().load("/testAddValidEmployee_expected.xml");
+
+        // extract employeeVersion table
+        ITable actualEmployeeVersionTable = actualDataSet.getTable(tableEmployeeVersion);
+        ITable expectedEmployeeVersionTable = expectedDataSet.getTable(tableEmployeeVersion);
+
+        // exclude 'id' column as it is an autogenerated value
+        ITable actualFilteredTable =
+                DefaultColumnFilter.excludedColumnsTable(
+                        actualEmployeeVersionTable, excludedColumnsEmployeeVersion);
+        ITable expectedFilteredTable =
+                DefaultColumnFilter.excludedColumnsTable(
+                        expectedEmployeeVersionTable, excludedColumnsEmployeeVersion);
+
+        Assertion.assertEquals(expectedFilteredTable, actualFilteredTable);
+    }
+
+    @Test
+    public void testAddValidEmployee_Employee() throws Exception {
+
+        employeePersistence.add(validEmployee);
+
+        String[] excludedColumnsEmployee = new String[] {"VERSION", "ID"};
+        String tableEmployee = "EMPLOYEE";
+
+        // load actual and expected data set
+        IDataSet actualDataSet = getConnection().createDataSet();
+        IDataSet expectedDataSet =
+                new FlatXmlDataFileLoader().load("/testAddValidEmployee_expected.xml");
+
+        // extract employee table
+        ITable actualEmployeeTable = actualDataSet.getTable(tableEmployee);
+        ITable expectedEmployeeTable = expectedDataSet.getTable(tableEmployee);
+
+        // exclude 'version' as it is an autogenerated value
+        ITable actualFilteredEmpTable =
+                DefaultColumnFilter.excludedColumnsTable(
+                        actualEmployeeTable, excludedColumnsEmployee);
+        ITable expectedFilteredEmpTable =
+                DefaultColumnFilter.excludedColumnsTable(
+                        expectedEmployeeTable, excludedColumnsEmployee);
+
+        Assertion.assertEquals(expectedFilteredEmpTable, actualFilteredEmpTable);
+    }
+
+    @Test
+    public void testAddValidEmployee_Join() throws Exception {
+
+        employeePersistence.add(validEmployee);
+
+        String[] excludedColumns = new String[] {"E_VERSION", "V_ID", "E_ID"};
+        String table = "EMP_JOIN";
+        String expectedXmlDataFileName = "testAddValidEmployeeJoin_expected.xml";
+
+        String sqlJoinEmployeeVersion =
+                "SELECT e.id AS E_ID, v.name AS V_NAME, v.birthday AS V_BIRTHDAY, "
+                        + "v.educationLevel as V_EDUCATIONLEVEL, "
+                        + "v.isDriver AS V_ISDRIVER, v.isPilot AS V_ISPILOT "
+                        + "FROM Employee e "
+                        + "JOIN EmployeeVersion v ON e.version = v.id";
+
+        ITable actualFilteredJoinData =
+                Helper.getActualFilteredQueryTableData(
+                        getConnection(), table, sqlJoinEmployeeVersion, excludedColumns);
+
+        ITable expectedFilteredJoinData =
+                Helper.getExpectedFilteredTableData(
+                        table, excludedColumns, expectedXmlDataFileName);
+
+        Assertion.assertEquals(expectedFilteredJoinData, actualFilteredJoinData);
+    }
+
+    Employee validUpdateEmployee =
+            Employee.builder()
+                    .id(3)
+                    .name("Lisa")
+                    .birthday(LocalDate.parse("1999-10-16"))
+                    .educationLevel(EducationLevel.NKA)
+                    .isDriver(true)
+                    .isPilot(true)
+                    .build();
+
+    @Test
+    public void testUpdateValidEmployee_EmployeeVersion() throws Exception {
+
+        employeePersistence.update(validUpdateEmployee);
+
+        String[] excludedColumnsEmployeeVersion = new String[] {"ID"};
+        String tableEmployeeVersion = "EMPLOYEEVERSION";
+
+        ITable actualTableData =
+                Helper.getActualFilteredTableData(
+                        getConnection(), tableEmployeeVersion, excludedColumnsEmployeeVersion);
+        ITable expedtedTableData =
+                Helper.getExpectedFilteredTableData(
+                        tableEmployeeVersion,
+                        excludedColumnsEmployeeVersion,
+                        "testUpdateValidEmployee_expected.xml");
+
+        Assertion.assertEquals(expedtedTableData, actualTableData);
+    }
+
+    @Test
+    public void testUpdateValidEmployee_Employee() throws Exception {
+
+        employeePersistence.update(validUpdateEmployee);
+
+        String[] excludedColumns = new String[] {"VERSION"};
+        String tableName = "EMPLOYEE";
+        String expectedXmlDataFileName = "testUpdateValidEmployee_expected.xml";
+
+        ITable actualTableData =
+                Helper.getActualFilteredTableData(getConnection(), tableName, excludedColumns);
+
+        ITable expectedTableData =
+                Helper.getExpectedFilteredTableData(
+                        tableName, excludedColumns, expectedXmlDataFileName);
+
+        Assertion.assertEquals(expectedTableData, actualTableData);
+    }
+
+    @Test(expected = ElementNotFoundException.class)
+    public void testUpdateNonExistingEmployee()
+            throws PersistenceException, ElementNotFoundException {
+
+        Employee nonExistentEmployee =
+                Employee.builder()
+                        .id(1000)
+                        .name("Lisa")
+                        .birthday(LocalDate.parse("1999-10-16"))
+                        .educationLevel(EducationLevel.NKA)
+                        .isDriver(true)
+                        .isPilot(true)
+                        .build();
+
+        employeePersistence.update(nonExistentEmployee);
+    }
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAOTest.java
new file mode 100644
index 0000000..a4a0829
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAOTest.java
@@ -0,0 +1,197 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
+
+import static org.junit.Assert.assertEquals;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Severity;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
+import java.time.Instant;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.LinkedList;
+import java.util.Set;
+import java.util.TimeZone;
+import org.dbunit.dataset.DataSetException;
+import org.dbunit.dataset.IDataSet;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class OperationDAOTest extends JdbcTestCase {
+
+    private static final String[] COMPARE_TABLES =
+            new String[] {"VehicleOperation", "Operation", "Vehicle", "VehicleVersion"};
+
+    private final OperationDAO operationDAO;
+
+    private final Operation o;
+
+    private final Operation originalOperation;
+
+    public OperationDAOTest() throws PersistenceException {
+        // TODO: fix once everything properly uses dependency injection
+        EmployeeDAO employeeDAO = new EmployeeDatabaseDAO(getJdbcConnectionManager());
+        RegistrationDatabaseDAO registrationDatabaseDAO =
+                new RegistrationDatabaseDAO(getJdbcConnectionManager(), employeeDAO);
+        VehicleDAO vehicleDAO =
+                new VehicleDatabaseDAO(getJdbcConnectionManager(), registrationDatabaseDAO);
+        this.operationDAO = new OperationDatabaseDAO(getJdbcConnectionManager(), vehicleDAO);
+
+        Vehicle v1 =
+                Vehicle.builder()
+                        .id(1)
+                        .name("RTW-1")
+                        .constructionType(Vehicle.ConstructionType.HOCHDACH)
+                        .type(Vehicle.VehicleType.RTW)
+                        .status(Vehicle.Status.FREI_FUNK)
+                        .hasNef(true)
+                        .build();
+
+        Vehicle v2 = v1.toBuilder().id(2).build();
+        Vehicle v3 = v1.toBuilder().id(3).build();
+
+        o =
+                Operation.builder()
+                        .id(1)
+                        .opCode("RD-2B0M")
+                        .severity(Severity.B)
+                        .status(Status.ACTIVE)
+                        .vehicles(Set.of(v1, v2, v3))
+                        .created(Instant.ofEpochSecond(1514764800)) // 2018-01-01 00:00:00.0
+                        .destination("New destination")
+                        .additionalInfo("New information")
+                        .build();
+
+        Vehicle vehicle =
+                Vehicle.builder()
+                        .id(4)
+                        .name("BKTW-2")
+                        .constructionType(ConstructionType.HOCHDACH)
+                        .type(VehicleType.BKTW)
+                        .hasNef(false)
+                        .status(Vehicle.Status.ZUM_BERUFUNGSORT)
+                        .registrations(new LinkedList<>())
+                        .build();
+
+        originalOperation =
+                Operation.builder()
+                        .id(1)
+                        .opCode("ALP-95E7")
+                        .severity(Severity.E)
+                        .created(Instant.parse("2000-01-01T00:00:00.0Z"))
+                        .destination("Wiedner Hauptstraße 35, Wien")
+                        .additionalInfo("Additional information")
+                        .status(Status.ACTIVE)
+                        .vehicles(Set.of(vehicle))
+                        .build();
+    }
+
+    @BeforeClass
+    public static void before() {
+        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+    }
+
+    @Override
+    protected IDataSet getDataSet() throws DataSetException {
+        return getDataSet("operationDAOUpdateSetup.xml");
+    }
+
+    @Test
+    public void testUpdateNormal() throws Exception {
+        operationDAO.update(o);
+
+        compareWith("operationDAOUpdateNormal.xml", COMPARE_TABLES);
+    }
+
+    @Test(expected = ElementNotFoundException.class)
+    public void testUpdateMissing() throws Exception {
+        Operation op = o.toBuilder().id(73).build();
+
+        operationDAO.update(op);
+    }
+
+    @Test
+    public void testUpdateRemoveVehicles() throws Exception {
+        Operation op = o.toBuilder().vehicles(Collections.emptySet()).build();
+
+        operationDAO.update(op);
+
+        compareWith("operationDAOUpdateRemoveVehicles.xml", COMPARE_TABLES);
+    }
+
+    @Test
+    public void testListOperations() throws Exception {
+        Set<Operation> operationSet = operationDAO.list(EnumSet.allOf(Status.class));
+
+        assertEquals(Set.of(originalOperation), operationSet);
+    }
+
+    @Test
+    public void testGetOperations() throws Exception {
+        Operation gotOperation = operationDAO.get(originalOperation.id());
+
+        assertEquals(originalOperation, gotOperation);
+    }
+
+    @Test
+    public void testAddOperation() throws Exception {
+        long id = operationDAO.add(o);
+        assertEquals(2, id);
+        compareWith("operationDAOAddOperation.xml", COMPARE_TABLES);
+    }
+
+    @Test(expected = PersistenceException.class)
+    public void testAddFaultyOperation() throws PersistenceException {
+        Vehicle vehicle =
+                Vehicle.builder()
+                        .status(Vehicle.Status.FREI_FUNK)
+                        .constructionType(ConstructionType.HOCHDACH)
+                        .name("BKTW_123")
+                        .hasNef(true)
+                        .type(VehicleType.BKTW)
+                        .build();
+
+        Operation operation =
+                Operation.builder()
+                        .status(Status.ACTIVE)
+                        .opCode(String.valueOf(Arrays.stream(new int[200]).map(i -> 'a')))
+                        .created(Instant.now())
+                        .destination("Wiedner Hauptstraße 35, Wien")
+                        .additionalInfo("HTU Wien")
+                        .severity(Severity.B)
+                        .vehicles(Set.of(vehicle))
+                        .build();
+        operationDAO.add(operation);
+    }
+
+    @Test(expected = PersistenceException.class)
+    public void testAddFaultyOperation2() throws PersistenceException {
+        Vehicle vehicle =
+                Vehicle.builder()
+                        .status(Vehicle.Status.FREI_FUNK)
+                        .constructionType(ConstructionType.HOCHDACH)
+                        .name("BKTW_123")
+                        .hasNef(true)
+                        .type(VehicleType.BKTW)
+                        .build();
+
+        Operation operation =
+                Operation.builder()
+                        .status(Status.ACTIVE)
+                        .opCode("ALP-95E7")
+                        .created(Instant.now())
+                        .destination(
+                                "Wiednerstraße 888, 1010 Wien Wiednerstraße 888, 1010 Wien Wiednerstraße 888, 1010 Wien Wiednerstraße 888, 1010 Wien Wiednerstraße 888, 1010 Wien ")
+                        .additionalInfo("HTU Wien")
+                        .severity(Severity.B)
+                        .vehicles(Set.of(vehicle))
+                        .build();
+        operationDAO.add(operation);
+    }
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAOTest.java
new file mode 100644
index 0000000..6f7ee49
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAOTest.java
@@ -0,0 +1,115 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
+
+import static org.junit.Assert.*;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.util.HashSet;
+import java.util.Set;
+import org.dbunit.dataset.IDataSet;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class RegistrationDAOTest extends JdbcTestCase {
+
+    private RegistrationDAO registrationDAO;
+
+    public RegistrationDAOTest() throws PersistenceException {
+        this.registrationDAO =
+                new RegistrationDatabaseDAO(
+                        getJdbcConnectionManager(),
+                        new EmployeeDatabaseDAO(getJdbcConnectionManager()));
+    }
+
+    @Override
+    protected IDataSet getDataSet() throws Exception {
+        return getDataSet("registrationTestBaseData.xml");
+    }
+
+    @Rule public ExpectedException thrown = ExpectedException.none();
+
+    @Test
+    public void addRegistrationsShouldSucceed() throws PersistenceException {
+        Set<Registration> registrations = new HashSet<>();
+        Employee employee1 =
+                Employee.builder()
+                        .id(1)
+                        .name("John Doe")
+                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
+                        .educationLevel(EducationLevel.RS)
+                        .isDriver(true)
+                        .isPilot(true)
+                        .build();
+        Employee employee2 =
+                Employee.builder()
+                        .id(2)
+                        .name("Nick \"Kage\" Verily")
+                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
+                        .educationLevel(EducationLevel.NKV)
+                        .isDriver(true)
+                        .isPilot(false)
+                        .build();
+        Employee employee3 =
+                Employee.builder()
+                        .id(3)
+                        .name("Nicht Arzt")
+                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
+                        .educationLevel(EducationLevel.NA)
+                        .isDriver(false)
+                        .isPilot(false)
+                        .build();
+        Registration registration1 =
+                Registration.builder()
+                        .start(Instant.now()) // incorrect, but should be irrelevant to outcome
+                        .end(Instant.now()) // same
+                        .employee(employee1)
+                        .build();
+        Registration registration2 =
+                Registration.builder()
+                        .start(Instant.now()) // incorrect, but should be irrelevant to outcome
+                        .end(Instant.now()) // same
+                        .employee(employee2)
+                        .build();
+        Registration registration3 =
+                Registration.builder()
+                        .start(Instant.now()) // incorrect, but should be irrelevant to outcome
+                        .end(Instant.now()) // same
+                        .employee(employee3)
+                        .build();
+        registrations.add(registration1);
+        registrations.add(registration2);
+        registrations.add(registration3);
+
+        Set<Long> returnvalues = registrationDAO.add(1, registrations);
+        assertFalse(returnvalues.isEmpty()); // can be improved...
+    }
+
+    @Test
+    public void addRegistrationToInexistentVehicleShouldFail() throws PersistenceException {
+        thrown.expect(PersistenceException.class);
+        Set<Registration> registrations = new HashSet<>();
+        Employee employee =
+                Employee.builder()
+                        .id(1)
+                        .name("John Doe")
+                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
+                        .educationLevel(EducationLevel.RS)
+                        .isDriver(true)
+                        .isPilot(true)
+                        .build();
+        Registration registration =
+                Registration.builder()
+                        .start(Instant.now())
+                        .end(Instant.now())
+                        .employee(employee)
+                        .build();
+        registrations.add(registration);
+        registrationDAO.add(200, registrations);
+    }
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAOTest.java
new file mode 100644
index 0000000..294ce10
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAOTest.java
@@ -0,0 +1,161 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Set;
+import org.dbunit.Assertion;
+import org.dbunit.dataset.IDataSet;
+import org.dbunit.dataset.ITable;
+import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class VehicleDAOTest extends JdbcTestCase {
+
+    private VehicleDAO vehicleDAO;
+
+    private Vehicle validUpdateVehicle =
+            Vehicle.builder()
+                    .hasNef(true)
+                    .constructionType(ConstructionType.HOCHDACH)
+                    .type(VehicleType.RTW)
+                    .id(2)
+                    .name("RTW-2")
+                    .status(Status.ABGEMELDET)
+                    .build();
+
+    public VehicleDAOTest() throws PersistenceException {
+        vehicleDAO =
+                new VehicleDatabaseDAO(
+                        getJdbcConnectionManager(),
+                        new RegistrationDatabaseDAO(
+                                getJdbcConnectionManager(),
+                                new EmployeeDatabaseDAO(getJdbcConnectionManager())));
+        // TODO: use Spring Dependency Injection!
+    }
+
+    @Override
+    protected IDataSet getDataSet() throws Exception {
+        InputStream res = getClass().getClassLoader().getResourceAsStream("vehicleTestData.xml");
+        return new FlatXmlDataSetBuilder().build(res);
+    }
+
+    @Test
+    public void testListVehicle() throws PersistenceException {
+        Set<Vehicle> vehicles = vehicleDAO.list();
+
+        Vehicle v1 =
+                Vehicle.builder()
+                        .id(1)
+                        .constructionType(ConstructionType.HOCHDACH)
+                        .name("RTW-1")
+                        .hasNef(true)
+                        .status(Status.ABGEMELDET)
+                        .type(VehicleType.RTW)
+                        .registrations(new ArrayList<>())
+                        .build();
+        Vehicle v2 =
+                Vehicle.builder()
+                        .id(2)
+                        .constructionType(ConstructionType.MITTELHOCHDACH)
+                        .name("KTW-2")
+                        .hasNef(false)
+                        .status(Status.FREI_WACHE)
+                        .type(VehicleType.KTW)
+                        .registrations(new ArrayList<>())
+                        .build();
+        Vehicle v3 =
+                Vehicle.builder()
+                        .id(3)
+                        .constructionType(ConstructionType.NORMAL)
+                        .name("NEF-3")
+                        .hasNef(false)
+                        .status(Status.FREI_FUNK)
+                        .type(VehicleType.NEF)
+                        .registrations(new ArrayList<>())
+                        .build();
+
+        Assert.assertTrue(vehicles.contains(v1));
+        Assert.assertTrue(vehicles.contains(v2));
+        Assert.assertTrue(vehicles.contains(v3));
+        Assert.assertEquals(3, vehicles.size());
+    }
+
+    @Test
+    public void testVehicleListNoElement() throws PersistenceException {
+        Set<Vehicle> vehicles = vehicleDAO.list();
+
+        Vehicle v1 =
+                Vehicle.builder()
+                        .id(30)
+                        .constructionType(ConstructionType.NORMAL)
+                        .name("NEF-3")
+                        .hasNef(false)
+                        .status(Status.FREI_FUNK)
+                        .type(VehicleType.NEF)
+                        .build();
+
+        Assert.assertFalse(vehicles.contains(v1));
+    }
+
+    @Test
+    public void testUpdateValid_VehicleVersion() throws Exception {
+        vehicleDAO.update(validUpdateVehicle);
+
+        String[] excludedColumnsVehicleVersion = new String[] {"ID", "NAME"};
+        String tableVehicleVersion = "VEHICLEVERSION";
+
+        ITable actualTableData =
+                Helper.getActualFilteredTableData(
+                        getConnection(), tableVehicleVersion, excludedColumnsVehicleVersion);
+
+        ITable expectedTableData =
+                Helper.getExpectedFilteredTableData(
+                        tableVehicleVersion,
+                        excludedColumnsVehicleVersion,
+                        "vehicleTestUpdateExpectedData.xml");
+        Assertion.assertEquals(expectedTableData, actualTableData);
+    }
+
+    @Test
+    public void testUpdateValid_Vehicle() throws Exception {
+        vehicleDAO.update(validUpdateVehicle);
+
+        String[] excludedColumnsVehicleVersion = new String[] {"VERSION", "STATUS"};
+        String tableVehicleVersion = "VEHICLE";
+
+        ITable actualTableData =
+                Helper.getActualFilteredTableData(
+                        getConnection(), tableVehicleVersion, excludedColumnsVehicleVersion);
+
+        ITable expectedTableData =
+                Helper.getExpectedFilteredTableData(
+                        tableVehicleVersion,
+                        excludedColumnsVehicleVersion,
+                        "vehicleTestUpdateExpectedData.xml");
+        Assertion.assertEquals(expectedTableData, actualTableData);
+    }
+
+    @Test(expected = ElementNotFoundException.class)
+    public void testUpdateNonExistingVehicle()
+            throws PersistenceException, ElementNotFoundException {
+        Vehicle nonExistentVehicle =
+                Vehicle.builder()
+                        .id(35)
+                        .constructionType(ConstructionType.NORMAL)
+                        .name("NEF-3")
+                        .hasNef(false)
+                        .status(Status.FREI_FUNK)
+                        .type(VehicleType.NEF)
+                        .build();
+        vehicleDAO.update(nonExistentVehicle);
+    }
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceTest.java
new file mode 100644
index 0000000..7a16d3e
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceTest.java
@@ -0,0 +1,67 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import java.time.LocalDate;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EmployeeServiceTest {
+
+    private final EmployeeDAO employeePersistence = mock(EmployeeDatabaseDAO.class);
+    private final EmployeeService employeeService = new EmployeeServiceImpl(employeePersistence);
+
+    private final Employee.Builder employeeBuilder =
+            Employee.builder()
+                    .name("Testperson")
+                    .birthday(LocalDate.parse("1996-10-10"))
+                    .educationLevel(EducationLevel.NKA)
+                    .isDriver(true)
+                    .isPilot(false);
+
+    public EmployeeServiceTest() throws PersistenceException {
+        when(employeePersistence.add(any())).thenReturn(1L);
+    }
+
+    @Test
+    public void testAddValidEmployee() throws ServiceException, InvalidEmployeeException {
+
+        Employee employee = employeeBuilder.build();
+        Assert.assertThat(employeeService.add(employee), is(1L));
+    }
+
+    @Test(expected = InvalidEmployeeException.class)
+    public void testAddInvalidEmployee() throws InvalidEmployeeException, ServiceException {
+
+        Employee employee = employeeBuilder.name("").build();
+        employeeService.add(employee);
+    }
+
+    @Test
+    public void testUpdateValidEmployee() throws ElementNotFoundException, PersistenceException {
+
+        Employee employee = employeeBuilder.build();
+        employeePersistence.update(employee);
+    }
+
+    @Test(expected = ElementNotFoundException.class)
+    public void testUpdateNonExistentEmployee()
+            throws ElementNotFoundException, PersistenceException {
+
+        doThrow(ElementNotFoundException.class).when(employeePersistence).update(any());
+        Employee employee = employeeBuilder.id(1000).build();
+        employeePersistence.update(employee);
+    }
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceIntegrationTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceIntegrationTest.java
new file mode 100644
index 0000000..e380850
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceIntegrationTest.java
@@ -0,0 +1,97 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
+
+import static org.junit.Assert.assertEquals;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.OperationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.OperationDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.RegistrationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.RegistrationDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
+import java.util.Set;
+import org.dbunit.Assertion;
+import org.dbunit.dataset.IDataSet;
+import org.dbunit.dataset.ITable;
+import org.junit.Test;
+
+public class OperationServiceIntegrationTest extends JdbcTestCase {
+
+    private OperationService operationService;
+
+    private Operation o;
+
+    public OperationServiceIntegrationTest() throws PersistenceException {
+        EmployeeDAO employeeDAO = new EmployeeDatabaseDAO(getJdbcConnectionManager());
+        RegistrationDAO registrationDAO =
+                new RegistrationDatabaseDAO(getJdbcConnectionManager(), employeeDAO);
+        VehicleDAO vehicleDAO =
+                new VehicleDatabaseDAO(
+                        getJdbcConnectionManager(), (RegistrationDatabaseDAO) registrationDAO);
+        OperationDAO operationDAO =
+                new OperationDatabaseDAO(getJdbcConnectionManager(), vehicleDAO);
+
+        VehicleService vehicleService = new VehicleServiceImpl(vehicleDAO);
+
+        operationService = new OperationServiceImpl(operationDAO, vehicleDAO, vehicleService);
+
+        Vehicle v1 =
+                Vehicle.builder()
+                        .id(1)
+                        .name("RTW-1")
+                        .constructionType(Vehicle.ConstructionType.HOCHDACH)
+                        .type(Vehicle.VehicleType.RTW)
+                        .status(Vehicle.Status.FREI_FUNK)
+                        .hasNef(true)
+                        .build();
+
+        Vehicle v2 = v1.toBuilder().id(2).build();
+        Vehicle v3 = v1.toBuilder().id(3).build();
+
+        o =
+                Operation.builder()
+                        .opCode("RD-2B0M")
+                        .status(Status.ACTIVE)
+                        .vehicles(Set.of(v1, v2, v3))
+                        .destination("New destination")
+                        .additionalInfo("New information")
+                        .build();
+    }
+
+    @Override
+    protected IDataSet getDataSet() throws Exception {
+        return getDataSet("operationDAOUpdateSetup.xml");
+    }
+
+    @Test
+    public void addValidOperation() throws Exception {
+
+        long id = operationService.add(o);
+        assertEquals(2, id);
+
+        String tableName = "Operation";
+        String[] excludedColumns = new String[] {"created"};
+
+        ITable actual =
+                Helper.getActualFilteredTableData(getConnection(), tableName, excludedColumns);
+        ITable expected =
+                Helper.getExpectedFilteredTableData(
+                        tableName, excludedColumns, "operationDAOAddOperation.xml");
+
+        Assertion.assertEquals(expected, actual);
+    }
+
+    @Test(expected = InvalidOperationException.class)
+    public void addInvalidOperation() throws InvalidOperationException, ServiceException {
+        operationService.add(o.toBuilder().opCode("").build());
+    }
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceTest.java
new file mode 100644
index 0000000..c232e78
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceTest.java
@@ -0,0 +1,205 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.OperationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Severity;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import java.time.Instant;
+import java.util.Collections;
+import java.util.Set;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class OperationServiceTest {
+
+    @Mock private OperationDAO operationDAO;
+
+    @Mock private VehicleDAO vehicleDAO;
+
+    @InjectMocks private OperationServiceImpl operationService;
+
+    private Set<Vehicle> vehicles;
+    private Vehicle v1, v2, v3, v4, v5;
+    private Operation baseOp, o1, o2;
+
+    @Before
+    public void setUp() throws Exception {
+        v1 =
+                Vehicle.builder()
+                        .id(1)
+                        .name("RTW-1")
+                        .constructionType(ConstructionType.HOCHDACH)
+                        .type(Vehicle.VehicleType.RTW)
+                        .status(Vehicle.Status.FREI_FUNK)
+                        .hasNef(true)
+                        .build();
+
+        v2 =
+                Vehicle.builder()
+                        .id(2)
+                        .name("KTW-1")
+                        .constructionType(ConstructionType.HOCHDACH)
+                        .type(Vehicle.VehicleType.KTW)
+                        .status(Vehicle.Status.FREI_WACHE)
+                        .hasNef(true)
+                        .build();
+
+        v3 =
+                Vehicle.builder()
+                        .id(3)
+                        .name("KTW-2")
+                        .constructionType(ConstructionType.MITTELHOCHDACH)
+                        .type(Vehicle.VehicleType.KTW_B)
+                        .status(Vehicle.Status.FREI_FUNK)
+                        .hasNef(false)
+                        .build();
+
+        v4 =
+                Vehicle.builder()
+                        .id(4)
+                        .name("BKTW-2")
+                        .constructionType(ConstructionType.HOCHDACH)
+                        .type(Vehicle.VehicleType.BKTW)
+                        .status(Vehicle.Status.FREI_FUNK)
+                        .hasNef(false)
+                        .build();
+
+        v5 =
+                Vehicle.builder()
+                        .id(5)
+                        .name("NEF-1")
+                        .constructionType(ConstructionType.NORMAL)
+                        .type(Vehicle.VehicleType.NEF)
+                        .status(Vehicle.Status.FREI_WACHE)
+                        .hasNef(true)
+                        .build();
+
+        Vehicle v6 =
+                Vehicle.builder()
+                        .id(6)
+                        .name("NAH-1")
+                        .constructionType(ConstructionType.MITTELHOCHDACH)
+                        .type(Vehicle.VehicleType.NAH)
+                        .status(Vehicle.Status.ABGEMELDET)
+                        .hasNef(true)
+                        .build();
+
+        vehicles = Set.of(v1, v2, v3, v4, v5, v6);
+
+        baseOp =
+                Operation.builder()
+                        .opCode("ALP-95E7")
+                        .severity(Severity.E)
+                        .status(Status.ACTIVE)
+                        .vehicles(Collections.singleton(v1))
+                        .destination("Wiedner Hauptstraße 35, Wien")
+                        .build();
+
+        o1 = baseOp.toBuilder().id(1).created(Instant.now()).build();
+        o2 = o1.toBuilder().id(5).status(Status.CANCELLED).build();
+
+        when(operationDAO.get(anyLong()))
+                .thenAnswer(
+                        ans -> {
+                            long arg = ans.getArgument(0);
+                            if (arg == 1L) return o1;
+                            else if (arg == 5L) return o2;
+                            else throw new ElementNotFoundException("");
+                        });
+
+        when(vehicleDAO.get(anyLong()))
+                .thenAnswer(
+                        ans -> {
+                            int arg = ((Long) ans.getArgument(0)).intValue();
+                            return vehicles.stream()
+                                    .filter(v -> v.id() == arg)
+                                    .findFirst()
+                                    .orElseThrow(() -> new ElementNotFoundException(""));
+                        });
+    }
+
+    @Test
+    public void requestNormal() throws Exception {
+        Set<Long> vehicleIds = Set.of(2L, 3L, 4L, 5L);
+        operationService.requestVehicles(1, vehicleIds);
+
+        Operation result =
+                operationDAO.get(1).toBuilder().vehicles(Set.of(v1, v2, v3, v4, v5)).build();
+        verify(operationDAO, times(1)).update(result);
+        verify(operationDAO, times(0)).get(6L);
+    }
+
+    @Test
+    public void requestExistingVehicle() throws Exception {
+        operationService.requestVehicles(1, Set.of(1L));
+
+        Operation result = operationDAO.get(1);
+        verify(operationDAO, times(0)).update(result);
+    }
+
+    @Test(expected = InvalidVehicleException.class)
+    public void requestInvalidVehicle() throws Exception {
+        operationService.requestVehicles(1, Set.of(5L, 6L));
+    }
+
+    @Test(expected = InvalidOperationException.class)
+    public void requestInvalidOperation() throws Exception {
+        operationService.requestVehicles(2, Set.of(1L));
+    }
+
+    @Test(expected = InvalidVehicleException.class)
+    public void requestInactiveVehicle() throws Exception {
+        operationService.requestVehicles(1, Set.of(6L));
+    }
+
+    @Test(expected = InvalidOperationException.class)
+    public void requestInactiveOperation() throws Exception {
+        operationService.requestVehicles(5, Set.of(1L));
+    }
+
+    @Test
+    public void addOperation() throws Exception {
+        operationService.add(baseOp.toBuilder().severity(null).build());
+
+        verify(operationDAO, times(1))
+                .add(baseOp.toBuilder().created(any()).status(Status.ACTIVE).build());
+        verify(vehicleDAO, times(1)).get(v1.id());
+    }
+
+    @Test(expected = InvalidOperationException.class)
+    public void addWithSeverity() throws Exception {
+        operationService.add(baseOp.toBuilder().severity(Severity.E).build());
+    }
+
+    @Test(expected = InvalidOperationException.class)
+    public void addWithoutVehicles() throws Exception {
+        operationService.add(baseOp.toBuilder().vehicles(Set.of()).build());
+    }
+
+    @Test(expected = InvalidOperationException.class)
+    public void addInvalidOpcode() throws Exception {
+        operationService.add(baseOp.toBuilder().opCode("ABC").build());
+    }
+
+    @Test(expected = InvalidOperationException.class)
+    public void addWithSetCreated() throws Exception {
+        operationService.add(baseOp.toBuilder().created(Instant.now()).build());
+    }
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceIntegrationTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceIntegrationTest.java
new file mode 100644
index 0000000..bfe44aa
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceIntegrationTest.java
@@ -0,0 +1,55 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.RegistrationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.RegistrationDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
+import org.dbunit.dataset.IDataSet;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class RegistrationServiceIntegrationTest extends JdbcTestCase {
+
+    private RegistrationDAO registrationDAO;
+    private VehicleDAO vehicleDAO;
+
+    @Rule public ExpectedException thrown = ExpectedException.none();
+
+    @Override
+    protected IDataSet getDataSet() throws Exception {
+        return getDataSet("registrationTestBaseData.xml");
+    }
+
+    @Before
+    public void prepare() throws PersistenceException {
+
+        EmployeeDAO employeeDAO = new EmployeeDatabaseDAO(getJdbcConnectionManager());
+        registrationDAO = new RegistrationDatabaseDAO(getJdbcConnectionManager(), employeeDAO);
+        vehicleDAO =
+                new VehicleDatabaseDAO(
+                        getJdbcConnectionManager(), (RegistrationDatabaseDAO) registrationDAO);
+    }
+
+    @Test
+    public void addValidRegistrationsShouldSucceed()
+            throws InvalidRegistrationException, ServiceException, InvalidVehicleException {
+        RegistrationServiceTest.addValidRegistrations(registrationDAO, vehicleDAO);
+    }
+
+    @Test
+    public void addOnlyOnePersonToRTWShouldFail()
+            throws InvalidRegistrationException, ServiceException, InvalidVehicleException {
+        RegistrationServiceTest.addOnlyOnePersonToRTW(thrown, registrationDAO, vehicleDAO);
+    }
+
+    // TODO: also test real integration, e.g. add registration and delete afterwards (feedback)
+}
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceTest.java
new file mode 100644
index 0000000..62982ac
--- /dev/null
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceTest.java
@@ -0,0 +1,159 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
+
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.when;
+
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.RegistrationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Builder;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.temporal.ChronoUnit;
+import java.util.HashSet;
+import java.util.Set;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+public class RegistrationServiceTest {
+
+    @Mock private RegistrationDAO registrationDAO;
+
+    @Mock private VehicleDAO vehicleDAO;
+
+    @Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
+
+    @Rule public ExpectedException thrown = ExpectedException.none();
+
+    @Before
+    public void setUp() throws ElementNotFoundException, PersistenceException {
+        MockitoAnnotations.initMocks(this);
+        Builder b =
+                Vehicle.builder()
+                        .name("RTW-1")
+                        .constructionType(ConstructionType.HOCHDACH)
+                        .status(Status.ABGEMELDET)
+                        .type(VehicleType.RTW)
+                        .hasNef(true);
+        when(vehicleDAO.get(anyLong())).thenAnswer(ans -> b.id(ans.getArgument(0)).build());
+    }
+
+    @Test
+    public void addValidRegistrationsShouldSucceed()
+            throws InvalidRegistrationException, ServiceException, InvalidVehicleException {
+        addValidRegistrations(registrationDAO, vehicleDAO);
+    }
+
+    @Test
+    public void addOnlyOnePersonToRTWShouldFail()
+            throws InvalidRegistrationException, ServiceException, InvalidVehicleException {
+        addOnlyOnePersonToRTW(thrown, registrationDAO, vehicleDAO);
+    }
+
+    static void addValidRegistrations(RegistrationDAO registrationDAO, VehicleDAO vehicleDAO)
+            throws InvalidVehicleException, InvalidRegistrationException, ServiceException {
+        RegistrationService registrationService =
+                new RegistrationServiceImpl(registrationDAO, vehicleDAO);
+        Set<Registration> registrations = new HashSet<>();
+        Vehicle vehicle =
+                Vehicle.builder()
+                        .id(1)
+                        .name("RTW-1")
+                        .constructionType(ConstructionType.HOCHDACH)
+                        .type(VehicleType.RTW)
+                        .status(Status.ABGEMELDET)
+                        .hasNef(true)
+                        .build();
+        Employee employee1 =
+                Employee.builder()
+                        .id(1)
+                        .name("John Doe")
+                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
+                        .educationLevel(EducationLevel.RS)
+                        .isDriver(true)
+                        .isPilot(true)
+                        .build();
+        Employee employee2 =
+                Employee.builder()
+                        .id(2)
+                        .name("Nick \"Kage\" Verily")
+                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
+                        .educationLevel(EducationLevel.NKV)
+                        .isDriver(true)
+                        .isPilot(false)
+                        .build();
+        Employee employee3 =
+                Employee.builder()
+                        .id(3)
+                        .name("Nicht Arzt")
+                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
+                        .educationLevel(EducationLevel.NA)
+                        .isDriver(false)
+                        .isPilot(false)
+                        .build();
+        Instant start = Instant.now();
+        Instant end = start.plus(8, ChronoUnit.HOURS);
+        Registration registration1 =
+                Registration.builder().start(start).end(end).employee(employee1).build();
+        Registration registration2 =
+                Registration.builder().start(start).end(end).employee(employee2).build();
+        Registration registration3 =
+                Registration.builder().start(start).end(end).employee(employee3).build();
+        registrations.add(registration1);
+        registrations.add(registration2);
+        registrations.add(registration3);
+        registrationService.add(vehicle.id(), registrations);
+    }
+
+    static void addOnlyOnePersonToRTW(
+            ExpectedException thrown, RegistrationDAO registrationDAO, VehicleDAO vehicleDAO)
+            throws InvalidVehicleException, InvalidRegistrationException, ServiceException {
+        thrown.expect(InvalidRegistrationException.class);
+        RegistrationService registrationService =
+                new RegistrationServiceImpl(registrationDAO, vehicleDAO);
+        Set<Registration> registrations = new HashSet<>();
+        Vehicle vehicle =
+                Vehicle.builder()
+                        .id(1)
+                        .name("RTW-1")
+                        .constructionType(ConstructionType.HOCHDACH)
+                        .type(VehicleType.RTW)
+                        .status(Status.ABGEMELDET)
+                        .hasNef(true)
+                        .build();
+        Employee employee =
+                Employee.builder()
+                        .id(1)
+                        .name("John Doe")
+                        .birthday(LocalDate.now()) // incorrect, but should be irrelevant
+                        .educationLevel(EducationLevel.RS)
+                        .isDriver(true)
+                        .isPilot(true)
+                        .build();
+        Registration registration =
+                Registration.builder()
+                        .start(Instant.MIN)
+                        .end(Instant.MAX)
+                        .employee(employee)
+                        .build();
+        registrations.add(registration);
+        registrationService.add(vehicle.id(), registrations);
+    }
+}
-- 
cgit v1.2.3-70-g09d2


From 41eaffacce8c35e517ec5a1e7a914858a0717a1d Mon Sep 17 00:00:00 2001
From: Tharre <tharre3@gmail.com>
Date: Mon, 18 Jun 2018 21:30:50 +0200
Subject: Sort imports after rename

---
 .../missioncontrol/controller/ArchiveOperationController.java  |  2 +-
 .../missioncontrol/controller/CreateCarController.java         |  4 ++--
 .../missioncontrol/controller/CreateNewEmployeeController.java |  4 ++--
 .../missioncontrol/controller/CreateOperationController.java   |  6 +++---
 .../missioncontrol/controller/ManageEmployeesController.java   |  2 +-
 .../missioncontrol/controller/OperationDetailsController.java  |  6 +++---
 .../controller/RegistrationWindowController.java               |  6 +++---
 .../assignment/groupphase/missioncontrol/dao/EmployeeDAO.java  |  2 +-
 .../groupphase/missioncontrol/dao/EmployeeDatabaseDAO.java     |  4 ++--
 .../assignment/groupphase/missioncontrol/dao/OperationDAO.java |  4 ++--
 .../groupphase/missioncontrol/dao/OperationDatabaseDAO.java    |  4 ++--
 .../groupphase/missioncontrol/dao/RegistrationDAO.java         |  2 +-
 .../groupphase/missioncontrol/dao/RegistrationDatabaseDAO.java |  4 ++--
 .../assignment/groupphase/missioncontrol/dao/VehicleDAO.java   |  2 +-
 .../groupphase/missioncontrol/dao/VehicleDatabaseDAO.java      |  4 ++--
 .../groupphase/missioncontrol/dto/RegistrationValidator.java   |  4 ++--
 .../groupphase/missioncontrol/service/EmployeeService.java     |  2 +-
 .../groupphase/missioncontrol/service/EmployeeServiceImpl.java |  6 +++---
 .../groupphase/missioncontrol/service/OperationService.java    |  6 +++---
 .../missioncontrol/service/OperationServiceImpl.java           | 10 +++++-----
 .../groupphase/missioncontrol/service/RegistrationService.java |  2 +-
 .../missioncontrol/service/RegistrationServiceImpl.java        | 10 +++++-----
 .../groupphase/missioncontrol/service/VehicleService.java      |  4 ++--
 .../groupphase/missioncontrol/service/VehicleServiceImpl.java  |  8 ++++----
 .../controller/CreateNewEmployeeControllerTest.java            |  2 +-
 .../controller/CreateNewVehicleControllerTest.java             |  2 +-
 .../groupphase/missioncontrol/dao/EmployeeDAOTest.java         |  4 ++--
 .../groupphase/missioncontrol/dao/OperationDAOTest.java        |  4 ++--
 .../groupphase/missioncontrol/dao/RegistrationDAOTest.java     |  2 +-
 .../groupphase/missioncontrol/dao/VehicleDAOTest.java          |  4 ++--
 .../groupphase/missioncontrol/service/EmployeeServiceTest.java |  8 ++++----
 .../service/OperationServiceIntegrationTest.java               |  6 +++---
 .../missioncontrol/service/OperationServiceTest.java           |  6 +++---
 .../service/RegistrationServiceIntegrationTest.java            |  8 ++++----
 .../missioncontrol/service/RegistrationServiceTest.java        | 10 +++++-----
 35 files changed, 82 insertions(+), 82 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ArchiveOperationController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ArchiveOperationController.java
index 6e0c89d..5b1f975 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ArchiveOperationController.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ArchiveOperationController.java
@@ -2,11 +2,11 @@ package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
 
 import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showServiceExceptionAlertAndWait;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.OperationService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
 import java.io.IOException;
 import java.time.LocalDateTime;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateCarController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateCarController.java
index aa76535..1dd41c7 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateCarController.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateCarController.java
@@ -4,13 +4,13 @@ import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.
 import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showSuccessAlertAndWait;
 import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showValidationErrorAlertAndWait;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import java.io.IOException;
 import java.util.EnumSet;
 import java.util.Set;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeController.java
index 433bfa6..3e0240c 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeController.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeController.java
@@ -4,11 +4,11 @@ import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.
 import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showSuccessAlertAndWait;
 import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showValidationErrorAlertAndWait;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.EmployeeService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
 import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper;
 import java.io.IOException;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateOperationController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateOperationController.java
index b237265..260b910 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateOperationController.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateOperationController.java
@@ -4,15 +4,15 @@ import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.
 import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showSuccessAlertAndWait;
 import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showValidationErrorAlertAndWait;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.OperationService;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import java.io.IOException;
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ManageEmployeesController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ManageEmployeesController.java
index 6138094..fa228de 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ManageEmployeesController.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/ManageEmployeesController.java
@@ -1,8 +1,8 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.EmployeeService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
 import java.io.IOException;
 import java.util.HashSet;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationDetailsController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationDetailsController.java
index 0476fc6..38d3bd1 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationDetailsController.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationDetailsController.java
@@ -5,14 +5,14 @@ import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.
 import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showSuccessAlertAndWait;
 import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showValidationErrorAlertAndWait;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.OperationService;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import java.io.IOException;
 import java.util.Collection;
 import java.util.EnumSet;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/RegistrationWindowController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/RegistrationWindowController.java
index 9c47fe4..e540b9f 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/RegistrationWindowController.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/RegistrationWindowController.java
@@ -3,6 +3,9 @@ package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
 import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showServiceExceptionAlertAndWait;
 import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showValidationErrorAlertAndWait;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
@@ -10,9 +13,6 @@ import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.EmployeeService;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.RegistrationService;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
 import java.io.IOException;
 import java.time.LocalDate;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAO.java
index d8ac513..675e951 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAO.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAO.java
@@ -1,8 +1,8 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
 import java.util.Set;
 
 public interface EmployeeDAO {
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDatabaseDAO.java
index 889b0fc..32dd6d2 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDatabaseDAO.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDatabaseDAO.java
@@ -1,9 +1,9 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
 import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAO.java
index c0ef5d4..e496898 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAO.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAO.java
@@ -1,9 +1,9 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
 import java.util.EnumSet;
 import java.util.Set;
 
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDatabaseDAO.java
index 1641720..1ccb4cf 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDatabaseDAO.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDatabaseDAO.java
@@ -1,11 +1,11 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Severity;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAO.java
index 02e742c..4a35f86 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAO.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAO.java
@@ -1,8 +1,8 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
 import java.util.Set;
 
 public interface RegistrationDAO {
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDatabaseDAO.java
index 1006a33..1f11024 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDatabaseDAO.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDatabaseDAO.java
@@ -1,9 +1,9 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
 import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAO.java
index ed24498..46d1853 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAO.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAO.java
@@ -1,8 +1,8 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import java.util.Set;
 
 public interface VehicleDAO {
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDatabaseDAO.java
index dd7c0f2..9bd7ec7 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDatabaseDAO.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDatabaseDAO.java
@@ -1,11 +1,11 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/RegistrationValidator.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/RegistrationValidator.java
index 9512f64..a2cb8c1 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/RegistrationValidator.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dto/RegistrationValidator.java
@@ -1,9 +1,9 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeService.java
index fa4d0e6..5beabaa 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeService.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeService.java
@@ -1,8 +1,8 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
 import java.util.Set;
 
 public interface EmployeeService {
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceImpl.java
index 945fb49..a08b03e 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceImpl.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceImpl.java
@@ -1,12 +1,12 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.EmployeeValidator;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.EmployeeValidator;
 import java.util.Set;
 import org.springframework.stereotype.Service;
 
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationService.java
index ca1dce9..42b23bb 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationService.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationService.java
@@ -1,11 +1,11 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import java.util.EnumSet;
 import java.util.Set;
 import java.util.SortedSet;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceImpl.java
index baae598..0c350fe 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceImpl.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceImpl.java
@@ -1,5 +1,10 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.OperationDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
@@ -7,11 +12,6 @@ import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Seve
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Comparator;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationService.java
index 027417f..91577dc 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationService.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationService.java
@@ -1,9 +1,9 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
 import java.util.Set;
 
 public interface RegistrationService {
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceImpl.java
index 3ec69e7..eb2cd1d 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceImpl.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceImpl.java
@@ -1,15 +1,15 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.RegistrationDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.RegistrationValidator;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.RegistrationDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.RegistrationValidator;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import java.util.Set;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleService.java
index d96dfb7..f8e303d 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleService.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleService.java
@@ -1,9 +1,9 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
 import java.util.EnumSet;
 import java.util.Set;
 
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleServiceImpl.java
index 6a035c6..a68720d 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleServiceImpl.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/VehicleServiceImpl.java
@@ -1,13 +1,13 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
 import java.util.EnumSet;
 import java.util.Set;
 import java.util.stream.Collectors;
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeControllerTest.java
index 2b0f793..ccd37b4 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeControllerTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewEmployeeControllerTest.java
@@ -6,9 +6,9 @@ import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.when;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.EmployeeService;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.EmployeeService;
 import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
 import at.ac.tuwien.sepm.assignment.groupphase.util.HighDpiAwareApplicationTest;
 import javafx.scene.control.DialogPane;
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewVehicleControllerTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewVehicleControllerTest.java
index 282c50f..4906d64 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewVehicleControllerTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/CreateNewVehicleControllerTest.java
@@ -6,9 +6,9 @@ import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.when;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleService;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleService;
 import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
 import at.ac.tuwien.sepm.assignment.groupphase.util.HighDpiAwareApplicationTest;
 import javafx.scene.control.DialogPane;
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAOTest.java
index 8485f67..008ac57 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/EmployeeDAOTest.java
@@ -1,9 +1,9 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
 import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
 import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
 import java.io.InputStream;
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAOTest.java
index a4a0829..b15b31a 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAOTest.java
@@ -2,14 +2,14 @@ package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
 
 import static org.junit.Assert.assertEquals;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Severity;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
 import java.time.Instant;
 import java.util.Arrays;
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAOTest.java
index 6f7ee49..2cb54f8 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDAOTest.java
@@ -2,10 +2,10 @@ package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
 
 import static org.junit.Assert.*;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
 import java.time.Instant;
 import java.time.LocalDate;
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAOTest.java
index 294ce10..c4d7d86 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDAOTest.java
@@ -1,11 +1,11 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
 import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
 import java.io.InputStream;
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceTest.java
index 7a16d3e..17c0a47 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/EmployeeServiceTest.java
@@ -6,14 +6,14 @@ import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDatabaseDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
-import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDatabaseDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel;
 import java.time.LocalDate;
 import org.junit.Assert;
 import org.junit.Test;
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceIntegrationTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceIntegrationTest.java
index e380850..865a402 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceIntegrationTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceIntegrationTest.java
@@ -2,6 +2,9 @@ package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
 
 import static org.junit.Assert.assertEquals;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDatabaseDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.OperationDAO;
@@ -13,9 +16,6 @@ import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDatabas
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.util.Helper;
 import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
 import java.util.Set;
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceTest.java
index c232e78..4c1eaf1 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceTest.java
@@ -6,6 +6,9 @@ import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.OperationDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation;
@@ -13,9 +16,6 @@ import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Seve
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
 import java.time.Instant;
 import java.util.Collections;
 import java.util.Set;
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceIntegrationTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceIntegrationTest.java
index bfe44aa..ac5c3fb 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceIntegrationTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceIntegrationTest.java
@@ -1,15 +1,15 @@
 package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDatabaseDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.RegistrationDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.RegistrationDatabaseDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDatabaseDAO;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.util.JdbcTestCase;
 import org.dbunit.dataset.IDataSet;
 import org.junit.Before;
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceTest.java
index 62982ac..b4bcff4 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/RegistrationServiceTest.java
@@ -3,6 +3,11 @@ package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.Mockito.when;
 
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.RegistrationDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.VehicleDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee;
@@ -13,11 +18,6 @@ import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Builde
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.ConstructionType;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle.VehicleType;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.temporal.ChronoUnit;
-- 
cgit v1.2.3-70-g09d2


From e9d65c968e38128f27d104cd4f96cc2d8f8df458 Mon Sep 17 00:00:00 2001
From: Dominic Rogetzer <e1627756@student.tuwien.ac.at>
Date: Tue, 19 Jun 2018 18:00:02 +0200
Subject: Add missing RegistrationDatabaseDao [#25963]

---
 .../missioncontrol/service/OperationServiceIntegrationTest.java   | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceIntegrationTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceIntegrationTest.java
index 865a402..008787f 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceIntegrationTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/service/OperationServiceIntegrationTest.java
@@ -3,7 +3,6 @@ package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service;
 import static org.junit.Assert.assertEquals;
 
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao.EmployeeDatabaseDAO;
@@ -30,7 +29,7 @@ public class OperationServiceIntegrationTest extends JdbcTestCase {
 
     private Operation o;
 
-    public OperationServiceIntegrationTest() throws PersistenceException {
+    public OperationServiceIntegrationTest() {
         EmployeeDAO employeeDAO = new EmployeeDatabaseDAO(getJdbcConnectionManager());
         RegistrationDAO registrationDAO =
                 new RegistrationDatabaseDAO(getJdbcConnectionManager(), employeeDAO);
@@ -38,7 +37,10 @@ public class OperationServiceIntegrationTest extends JdbcTestCase {
                 new VehicleDatabaseDAO(
                         getJdbcConnectionManager(), (RegistrationDatabaseDAO) registrationDAO);
         OperationDAO operationDAO =
-                new OperationDatabaseDAO(getJdbcConnectionManager(), vehicleDAO);
+                new OperationDatabaseDAO(
+                        getJdbcConnectionManager(),
+                        vehicleDAO,
+                        (RegistrationDatabaseDAO) registrationDAO);
 
         VehicleService vehicleService = new VehicleServiceImpl(vehicleDAO);
 
-- 
cgit v1.2.3-70-g09d2


From f0af2d1909ecdff0dc2cdb796622de69522ab15e Mon Sep 17 00:00:00 2001
From: Dominic Rogetzer <e1627756@student.tuwien.ac.at>
Date: Tue, 19 Jun 2018 18:02:03 +0200
Subject: Fix names of vehicles in test-data [#25963]

The name of a vehicle is always "<type>-<vehicleId>"
---
 .../assignment/groupphase/missioncontrol/dao/OperationDAOTest.java  | 6 ++++--
 src/test/resources/operationDAOAddOperation.xml                     | 6 +++---
 src/test/resources/operationDAOUpdateNormal.xml                     | 6 +++---
 src/test/resources/operationDAOUpdateRemoveVehicles.xml             | 6 +++---
 src/test/resources/operationDAOUpdateSetup.xml                      | 6 +++---
 src/test/resources/operationIntegrationVehicles.xml                 | 6 +++---
 6 files changed, 19 insertions(+), 17 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAOTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAOTest.java
index b15b31a..d9e7fb7 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAOTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/OperationDAOTest.java
@@ -41,7 +41,9 @@ public class OperationDAOTest extends JdbcTestCase {
                 new RegistrationDatabaseDAO(getJdbcConnectionManager(), employeeDAO);
         VehicleDAO vehicleDAO =
                 new VehicleDatabaseDAO(getJdbcConnectionManager(), registrationDatabaseDAO);
-        this.operationDAO = new OperationDatabaseDAO(getJdbcConnectionManager(), vehicleDAO);
+        this.operationDAO =
+                new OperationDatabaseDAO(
+                        getJdbcConnectionManager(), vehicleDAO, registrationDatabaseDAO);
 
         Vehicle v1 =
                 Vehicle.builder()
@@ -71,7 +73,7 @@ public class OperationDAOTest extends JdbcTestCase {
         Vehicle vehicle =
                 Vehicle.builder()
                         .id(4)
-                        .name("BKTW-2")
+                        .name("BKTW-4")
                         .constructionType(ConstructionType.HOCHDACH)
                         .type(VehicleType.BKTW)
                         .hasNef(false)
diff --git a/src/test/resources/operationDAOAddOperation.xml b/src/test/resources/operationDAOAddOperation.xml
index fad04ce..adc8c3d 100644
--- a/src/test/resources/operationDAOAddOperation.xml
+++ b/src/test/resources/operationDAOAddOperation.xml
@@ -5,9 +5,9 @@
     destination="New destination" additionalInfo="New information" status="ACTIVE"/>
 
   <VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
-  <VehicleVersion id="2" name="KTW-1" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
-  <VehicleVersion id="3" name="KTW-2" constructionType="MITTELHOCHDACH" type="KTW_B" hasNef="false"/>
-  <VehicleVersion id="4" name="BKTW-2" constructionType="HOCHDACH" type="BKTW" hasNef="false"/>
+  <VehicleVersion id="2" name="KTW-2" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
+  <VehicleVersion id="3" name="KTW-3" constructionType="MITTELHOCHDACH" type="KTW_B" hasNef="false"/>
+  <VehicleVersion id="4" name="BKTW-4" constructionType="HOCHDACH" type="BKTW" hasNef="false"/>
   <VehicleVersion id="5" name="NEF-1" constructionType="NORMAL" type="NEF" hasNef="true"/>
 
   <Vehicle id="1" version="1" status="FREI_FUNK"/>
diff --git a/src/test/resources/operationDAOUpdateNormal.xml b/src/test/resources/operationDAOUpdateNormal.xml
index a02f495..a4c4653 100644
--- a/src/test/resources/operationDAOUpdateNormal.xml
+++ b/src/test/resources/operationDAOUpdateNormal.xml
@@ -3,9 +3,9 @@
     destination="New destination" additionalInfo="New information" status="ACTIVE"/>
 
   <VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
-  <VehicleVersion id="2" name="KTW-1" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
-  <VehicleVersion id="3" name="KTW-2" constructionType="MITTELHOCHDACH" type="KTW_B" hasNef="false"/>
-  <VehicleVersion id="4" name="BKTW-2" constructionType="HOCHDACH" type="BKTW" hasNef="false"/>
+  <VehicleVersion id="2" name="KTW-2" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
+  <VehicleVersion id="3" name="KTW-3" constructionType="MITTELHOCHDACH" type="KTW_B" hasNef="false"/>
+  <VehicleVersion id="4" name="BKTW-4" constructionType="HOCHDACH" type="BKTW" hasNef="false"/>
   <VehicleVersion id="5" name="NEF-1" constructionType="NORMAL" type="NEF" hasNef="true"/>
 
   <Vehicle id="1" version="1" status="FREI_FUNK"/>
diff --git a/src/test/resources/operationDAOUpdateRemoveVehicles.xml b/src/test/resources/operationDAOUpdateRemoveVehicles.xml
index 1fcce62..a23f86c 100644
--- a/src/test/resources/operationDAOUpdateRemoveVehicles.xml
+++ b/src/test/resources/operationDAOUpdateRemoveVehicles.xml
@@ -3,9 +3,9 @@
     destination="New destination" status="ACTIVE" additionalInfo="New information"/>
 
   <VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
-  <VehicleVersion id="2" name="KTW-1" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
-  <VehicleVersion id="3" name="KTW-2" constructionType="MITTELHOCHDACH" type="KTW_B" hasNef="false"/>
-  <VehicleVersion id="4" name="BKTW-2" constructionType="HOCHDACH" type="BKTW" hasNef="false"/>
+  <VehicleVersion id="2" name="KTW-2" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
+  <VehicleVersion id="3" name="KTW-3" constructionType="MITTELHOCHDACH" type="KTW_B" hasNef="false"/>
+  <VehicleVersion id="4" name="BKTW-4" constructionType="HOCHDACH" type="BKTW" hasNef="false"/>
   <VehicleVersion id="5" name="NEF-1" constructionType="NORMAL" type="NEF" hasNef="true"/>
 
   <Vehicle id="1" version="1" status="FREI_FUNK"/>
diff --git a/src/test/resources/operationDAOUpdateSetup.xml b/src/test/resources/operationDAOUpdateSetup.xml
index 82ef238..533e58e 100644
--- a/src/test/resources/operationDAOUpdateSetup.xml
+++ b/src/test/resources/operationDAOUpdateSetup.xml
@@ -3,9 +3,9 @@
     destination="Wiedner Hauptstraße 35, Wien" additionalInfo="Additional information" status="ACTIVE"/>
 
   <VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
-  <VehicleVersion id="2" name="KTW-1" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
-  <VehicleVersion id="3" name="KTW-2" constructionType="MITTELHOCHDACH" type="KTW_B" hasNef="false"/>
-  <VehicleVersion id="4" name="BKTW-2" constructionType="HOCHDACH" type="BKTW" hasNef="false"/>
+  <VehicleVersion id="2" name="KTW-2" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
+  <VehicleVersion id="3" name="KTW-3" constructionType="MITTELHOCHDACH" type="KTW_B" hasNef="false"/>
+  <VehicleVersion id="4" name="BKTW-4" constructionType="HOCHDACH" type="BKTW" hasNef="false"/>
   <VehicleVersion id="5" name="NEF-1" constructionType="NORMAL" type="NEF" hasNef="true"/>
 
   <Vehicle id="1" version="1" status="FREI_FUNK"/>
diff --git a/src/test/resources/operationIntegrationVehicles.xml b/src/test/resources/operationIntegrationVehicles.xml
index 45475a4..0e6f848 100644
--- a/src/test/resources/operationIntegrationVehicles.xml
+++ b/src/test/resources/operationIntegrationVehicles.xml
@@ -1,8 +1,8 @@
 <dataset>
 <VehicleVersion id="1" name="RTW-1" constructionType="HOCHDACH" type="RTW" hasNef="true"/>
-<VehicleVersion id="2" name="KTW-1" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
-<VehicleVersion id="3" name="KTW-2" constructionType="MITTELHOCHDACH" type="KTW_B" hasNef="false"/>
-<VehicleVersion id="4" name="BKTW-2" constructionType="HOCHDACH" type="BKTW" hasNef="false"/>
+<VehicleVersion id="2" name="KTW-2" constructionType="HOCHDACH" type="KTW" hasNef="true"/>
+<VehicleVersion id="3" name="KTW-3" constructionType="MITTELHOCHDACH" type="KTW_B" hasNef="false"/>
+<VehicleVersion id="4" name="BKTW-4" constructionType="HOCHDACH" type="BKTW" hasNef="false"/>
 <VehicleVersion id="5" name="NEF-1" constructionType="NORMAL" type="NEF" hasNef="true"/>
 
 <Vehicle id="1" version="1" status="FREI_FUNK"/>
-- 
cgit v1.2.3-70-g09d2