diff --git a/core/assets/buttons/battle_overlay.pdn b/core/assets/buttons/battle_overlay.pdn
new file mode 100644
index 0000000000000000000000000000000000000000..26f1c9270234330dee350ebd161ea4074476a00f
Binary files /dev/null and b/core/assets/buttons/battle_overlay.pdn differ
diff --git a/core/assets/crew/background.png b/core/assets/crew/background.png
new file mode 100644
index 0000000000000000000000000000000000000000..6940a39e42533fe79f1bd917d04d58f458e0c3e4
Binary files /dev/null and b/core/assets/crew/background.png differ
diff --git a/core/assets/enemy/battle_overlay.png b/core/assets/enemy/battle_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ea485c5e17a7d50fd93b833957d23b5420e46ce
Binary files /dev/null and b/core/assets/enemy/battle_overlay.png differ
diff --git a/core/assets/ship/fed/fed_cruiser_2_base.png b/core/assets/ship/barrage/fed_cruiser_2_base.png
similarity index 100%
rename from core/assets/ship/fed/fed_cruiser_2_base.png
rename to core/assets/ship/barrage/fed_cruiser_2_base.png
diff --git a/core/assets/ship/fed/fed_cruiser_shields1.png b/core/assets/ship/barrage/fed_cruiser_shields1.png
similarity index 100%
rename from core/assets/ship/fed/fed_cruiser_shields1.png
rename to core/assets/ship/barrage/fed_cruiser_shields1.png
diff --git a/core/assets/ship/fed/fed_cruiser_base.png b/core/assets/ship/barragebase.png
similarity index 100%
rename from core/assets/ship/fed/fed_cruiser_base.png
rename to core/assets/ship/barragebase.png
diff --git a/core/assets/ship/fed/fed_cruiser_floor.png b/core/assets/ship/barragefloor.png
similarity index 100%
rename from core/assets/ship/fed/fed_cruiser_floor.png
rename to core/assets/ship/barragefloor.png
diff --git a/core/assets/ship/circle/circle_cruiser_2_base.png b/core/assets/ship/boarder/circle_cruiser_2_base.png
similarity index 100%
rename from core/assets/ship/circle/circle_cruiser_2_base.png
rename to core/assets/ship/boarder/circle_cruiser_2_base.png
diff --git a/core/assets/ship/circle/circle_cruiser_shields1.png b/core/assets/ship/boarder/circle_cruiser_shields1.png
similarity index 100%
rename from core/assets/ship/circle/circle_cruiser_shields1.png
rename to core/assets/ship/boarder/circle_cruiser_shields1.png
diff --git a/core/assets/ship/circle/circle_cruiser_base.png b/core/assets/ship/boarderbase.png
similarity index 100%
rename from core/assets/ship/circle/circle_cruiser_base.png
rename to core/assets/ship/boarderbase.png
diff --git a/core/assets/ship/circle/circle_cruiser_floor.png b/core/assets/ship/boarderfloor.png
similarity index 100%
rename from core/assets/ship/circle/circle_cruiser_floor.png
rename to core/assets/ship/boarderfloor.png
diff --git a/core/assets/ship/kestral/kestral_shields1.png b/core/assets/ship/default/kestral_shields1.png
similarity index 100%
rename from core/assets/ship/kestral/kestral_shields1.png
rename to core/assets/ship/default/kestral_shields1.png
diff --git a/core/assets/ship/kestral/kestral_base.png b/core/assets/ship/defaultbase.png
similarity index 100%
rename from core/assets/ship/kestral/kestral_base.png
rename to core/assets/ship/defaultbase.png
diff --git a/core/assets/ship/kestral/kestral_floor.png b/core/assets/ship/defaultfloor.png
similarity index 100%
rename from core/assets/ship/kestral/kestral_floor.png
rename to core/assets/ship/defaultfloor.png
diff --git a/core/assets/ship/anaerobic/shields.png b/core/assets/ship/killer/shields.png
similarity index 100%
rename from core/assets/ship/anaerobic/shields.png
rename to core/assets/ship/killer/shields.png
diff --git a/core/assets/ship/anaerobic/an2base.png b/core/assets/ship/killerbase.png
similarity index 100%
rename from core/assets/ship/anaerobic/an2base.png
rename to core/assets/ship/killerbase.png
diff --git a/core/assets/ship/anaerobic/an2floor.png b/core/assets/ship/killerfloor.png
similarity index 100%
rename from core/assets/ship/anaerobic/an2floor.png
rename to core/assets/ship/killerfloor.png
diff --git a/core/assets/ship/stealth/stealth_base.png b/core/assets/ship/stealthbase.png
similarity index 100%
rename from core/assets/ship/stealth/stealth_base.png
rename to core/assets/ship/stealthbase.png
diff --git a/core/assets/ship/stealth/stealth_floor.png b/core/assets/ship/stealthfloor.png
similarity index 100%
rename from core/assets/ship/stealth/stealth_floor.png
rename to core/assets/ship/stealthfloor.png
diff --git a/core/assets/ship/rock/rock_cruiser_floor.png b/core/assets/ship/tank/rock_cruiser_floor.png
similarity index 100%
rename from core/assets/ship/rock/rock_cruiser_floor.png
rename to core/assets/ship/tank/rock_cruiser_floor.png
diff --git a/core/assets/ship/rock/rock_cruiser_shields1.png b/core/assets/ship/tank/rock_cruiser_shields1.png
similarity index 100%
rename from core/assets/ship/rock/rock_cruiser_shields1.png
rename to core/assets/ship/tank/rock_cruiser_shields1.png
diff --git a/core/assets/ship/rock/rock_cruiser_base.png b/core/assets/ship/tankbase.png
similarity index 100%
rename from core/assets/ship/rock/rock_cruiser_base.png
rename to core/assets/ship/tankbase.png
diff --git a/core/assets/ship/rock/rock_cruiser_2_floor.png b/core/assets/ship/tankfloor.png
similarity index 100%
rename from core/assets/ship/rock/rock_cruiser_2_floor.png
rename to core/assets/ship/tankfloor.png
diff --git a/core/assets/ship/tile.png b/core/assets/ship/tile.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e125300d422dbbdfbc946f77900233af9326f30
Binary files /dev/null and b/core/assets/ship/tile.png differ
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_sensors_green1.png b/core/assets/shipsys/cameras/camerasgreen.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_sensors_green1.png
rename to core/assets/shipsys/cameras/camerasgreen.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_sensors_orange1.png b/core/assets/shipsys/cameras/camerasorange.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_sensors_orange1.png
rename to core/assets/shipsys/cameras/camerasorange.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_sensors_overlay.png b/core/assets/shipsys/cameras/camerasoverlay.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_sensors_overlay.png
rename to core/assets/shipsys/cameras/camerasoverlay.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_sensors_red1.png b/core/assets/shipsys/cameras/camerasred.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_sensors_red1.png
rename to core/assets/shipsys/cameras/camerasred.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_pilot_green1.png b/core/assets/shipsys/cockpit/cockpitgreen.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_pilot_green1.png
rename to core/assets/shipsys/cockpit/cockpitgreen.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_pilot_orange1.png b/core/assets/shipsys/cockpit/cockpitorange.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_pilot_orange1.png
rename to core/assets/shipsys/cockpit/cockpitorange.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_pilot_overlay.png b/core/assets/shipsys/cockpit/cockpitoverlay.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_pilot_overlay.png
rename to core/assets/shipsys/cockpit/cockpitoverlay.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_pilot_red1.png b/core/assets/shipsys/cockpit/cockpitred.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_pilot_red1.png
rename to core/assets/shipsys/cockpit/cockpitred.png
diff --git a/core/assets/shipsys/engine/engineover.png b/core/assets/shipsys/engine/engineoverlay.png
similarity index 100%
rename from core/assets/shipsys/engine/engineover.png
rename to core/assets/shipsys/engine/engineoverlay.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_medbay_green1.png b/core/assets/shipsys/medbay/medbaygreen.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_medbay_green1.png
rename to core/assets/shipsys/medbay/medbaygreen.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_medbay_orange1.png b/core/assets/shipsys/medbay/medbayorange.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_medbay_orange1.png
rename to core/assets/shipsys/medbay/medbayorange.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_medbay_overlay.png b/core/assets/shipsys/medbay/medbayoverlay.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_medbay_overlay.png
rename to core/assets/shipsys/medbay/medbayoverlay.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_medbay_red1.png b/core/assets/shipsys/medbay/medbayred.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_medbay_red1.png
rename to core/assets/shipsys/medbay/medbayred.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_oxygen_green1.png b/core/assets/shipsys/o2/o2green.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_oxygen_green1.png
rename to core/assets/shipsys/o2/o2green.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_oxygen_orange1.png b/core/assets/shipsys/o2/o2orange.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_oxygen_orange1.png
rename to core/assets/shipsys/o2/o2orange.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_oxygen_overlay.png b/core/assets/shipsys/o2/o2overlay.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_oxygen_overlay.png
rename to core/assets/shipsys/o2/o2overlay.png
diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_oxygen_red1.png b/core/assets/shipsys/o2/o2red.png
similarity index 100%
rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_oxygen_red1.png
rename to core/assets/shipsys/o2/o2red.png
diff --git a/core/assets/shipsys/shields/shieldsover.png b/core/assets/shipsys/shields/shieldsoverlay.png
similarity index 100%
rename from core/assets/shipsys/shields/shieldsover.png
rename to core/assets/shipsys/shields/shieldsoverlay.png
diff --git a/core/assets/shipsys/weapon_system/bomb.png b/core/assets/shipsys/weapon_system/bomb.png
new file mode 100644
index 0000000000000000000000000000000000000000..61dfec12ca5f68822fd7631cb7cba19a3ac776de
Binary files /dev/null and b/core/assets/shipsys/weapon_system/bomb.png differ
diff --git a/core/assets/shipsys/weapon/desktop.ini b/core/assets/shipsys/weapon_system/desktop.ini
similarity index 100%
rename from core/assets/shipsys/weapon/desktop.ini
rename to core/assets/shipsys/weapon_system/desktop.ini
diff --git a/core/assets/shipsys/weapon/generalbox.png b/core/assets/shipsys/weapon_system/generalbox.png
similarity index 100%
rename from core/assets/shipsys/weapon/generalbox.png
rename to core/assets/shipsys/weapon_system/generalbox.png
diff --git a/core/assets/shipsys/weapon_system/healbomb.png b/core/assets/shipsys/weapon_system/healbomb.png
new file mode 100644
index 0000000000000000000000000000000000000000..338d5e827583b04f2906324af06336955154bfd9
Binary files /dev/null and b/core/assets/shipsys/weapon_system/healbomb.png differ
diff --git a/core/assets/shipsys/weapon/laser.png b/core/assets/shipsys/weapon_system/laser.png
similarity index 100%
rename from core/assets/shipsys/weapon/laser.png
rename to core/assets/shipsys/weapon_system/laser.png
diff --git a/core/assets/shipsys/weapon/minibox.png b/core/assets/shipsys/weapon_system/minibox.png
similarity index 100%
rename from core/assets/shipsys/weapon/minibox.png
rename to core/assets/shipsys/weapon_system/minibox.png
diff --git a/core/assets/shipsys/weapon_system/radio.png b/core/assets/shipsys/weapon_system/radio.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f47b417847962fc29d21185b7011f8f936883c0
Binary files /dev/null and b/core/assets/shipsys/weapon_system/radio.png differ
diff --git a/core/assets/shipsys/weapon_system/radiobomb.png b/core/assets/shipsys/weapon_system/radiobomb.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a3373a064a2c651372cd9a9ae5c5d841688da0f
Binary files /dev/null and b/core/assets/shipsys/weapon_system/radiobomb.png differ
diff --git a/core/assets/shipsys/weapon_system/rocket.png b/core/assets/shipsys/weapon_system/rocket.png
new file mode 100644
index 0000000000000000000000000000000000000000..6271e0f5e57be397e7fc91ff74b693bd244eecad
Binary files /dev/null and b/core/assets/shipsys/weapon_system/rocket.png differ
diff --git a/core/assets/shipsys/weapon/smallbox.png b/core/assets/shipsys/weapon_system/smallbox.png
similarity index 100%
rename from core/assets/shipsys/weapon/smallbox.png
rename to core/assets/shipsys/weapon_system/smallbox.png
diff --git a/core/assets/shipsys/weapon/weaponsgreen.png b/core/assets/shipsys/weapon_system/weapon_systemgreen.png
similarity index 100%
rename from core/assets/shipsys/weapon/weaponsgreen.png
rename to core/assets/shipsys/weapon_system/weapon_systemgreen.png
diff --git a/core/assets/shipsys/weapon/weaponsorange.png b/core/assets/shipsys/weapon_system/weapon_systemorange.png
similarity index 100%
rename from core/assets/shipsys/weapon/weaponsorange.png
rename to core/assets/shipsys/weapon_system/weapon_systemorange.png
diff --git a/core/assets/shipsys/weapon/s_weapons_overlay.png b/core/assets/shipsys/weapon_system/weapon_systemoverlay.png
similarity index 100%
rename from core/assets/shipsys/weapon/s_weapons_overlay.png
rename to core/assets/shipsys/weapon_system/weapon_systemoverlay.png
diff --git a/core/assets/shipsys/weapon/weaponsred.png b/core/assets/shipsys/weapon_system/weapon_systemred.png
similarity index 100%
rename from core/assets/shipsys/weapon/weaponsred.png
rename to core/assets/shipsys/weapon_system/weapon_systemred.png
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java
index 995407694ac37189eba6dd6d7e5f9a81128fc4b6..cd0ef82a6a46e9c0bc5467e7324fdc9550275939 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java
@@ -81,7 +81,7 @@ public class Client {
      *
      * @throws IllegalArgumentException on error
      */
-    public boolean login(String username, ShipType shipType) throws IllegalArgumentException {
+    public boolean login(String username, ShipType shipType, int difficulty) throws IllegalArgumentException {
         try {
             // ==================== LOG-IN ====================
             send.println("[LOGIN]:" + username);
@@ -97,7 +97,8 @@ public class Client {
                 received = receive.readLine();
                 // ==================== NEW GAME ====================
                 if (received.equals("[NEW-GAME]")){
-                    System.out.println("<CLIENT>:[NEW-GAME]:[USERNAME]:"+username+":[SHIP-TYPE]:"+shipType);
+                    System.out.println("<CLIENT>:[NEW-GAME]:[USERNAME]:"+username+":[SHIP-TYPE]:"+shipType+":[DIFFICULTY]:"+difficulty);
+                    send.println(difficulty);
                     sendObject.writeObject(shipType);
                     received = receive.readLine();
                 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java
index eddd4de9d3412753098ef4083bf773ef40491b68..f9ae6b7fc731128050636239df1394e3dd1b4809 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java
@@ -1,10 +1,12 @@
 package com.galaxytrucker.galaxytruckerreloaded.Communication;
 
+import com.galaxytrucker.galaxytruckerreloaded.Controller.*;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
 import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.ShipType;
 import com.galaxytrucker.galaxytruckerreloaded.Server.RequestObject;
+import com.galaxytrucker.galaxytruckerreloaded.Server.RequestType;
 import com.galaxytrucker.galaxytruckerreloaded.Server.ResponseObject;
 import lombok.*;
 
@@ -48,8 +50,8 @@ public class ClientControllerCommunicator {
      * @param username - the username
      * @return true if the user already exists else create a enw spaceship
      */
-    public boolean login(String username) {
-        boolean permittedLogin = client.login(username, ShipType.DEFAULT);
+    public boolean login(String username, ShipType ship, int difficulty) {
+        boolean permittedLogin = client.login(username, ship, difficulty);
         if (permittedLogin) {
             this.clientShip = client.getMyShip();
             this.map = client.getOverworld();
@@ -57,12 +59,34 @@ public class ClientControllerCommunicator {
         return permittedLogin;
     }
 
+    /**
+     * Issue logout request
+     * @return true if the user was succesfully logged out
+     */
+    public boolean logout() {
+        try {
+            RequestObject requestObject = new RequestObject();
+            requestObject.setRequestType(RequestType.LOGOUT);
+            requestObject.setShip(clientShip);
+            ResponseObject responseObject = sendRequest(requestObject);
+            return responseObject.isValidRequest();
+        }
+        catch(Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
     /** Constructor
      * @param client - the client object, used to connect to server */
     public static ClientControllerCommunicator getInstance(Client client){
         if (singleton == null){
             singleton = new ClientControllerCommunicator(client);
         }
+        CrewController.getInstance(singleton);
+        HangerController.getInstance();
+        TraderController.getInstance(singleton);
+        TravelController.getInstance(singleton);
         // TODO CREATE ALL CONTROLLERS HERE, all controllers should be singletons
         return singleton;
     }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/BattleController.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/BattleController.java
index f779b6602562d097044135077f9fb3809d48d57c..9da29831fe9a8f18901c4d5f61923fe1d3b8d060 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/BattleController.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/BattleController.java
@@ -8,6 +8,7 @@ import lombok.*;
 @Setter
 @RequiredArgsConstructor(access = AccessLevel.PUBLIC)
 public class BattleController extends Controller{
+
     @NonNull
     private Ship myself;
 
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/CrewController.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/CrewController.java
index 9ef3d096eec5574d9a42bffd712c9639f6886369..29cea0ecbed625c42aa017b71adeaf0278ab544b 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/CrewController.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/CrewController.java
@@ -12,15 +12,29 @@ import lombok.*;
 
 @Getter
 @Setter
-@RequiredArgsConstructor(access = AccessLevel.PUBLIC)
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
 public class CrewController extends Controller {
 
+    private static CrewController singleton;
+
     /**
      * ClientControllerCommunicator
      */
     @NonNull
     private ClientControllerCommunicator clientControllerCommunicator;
 
+    /**
+     * return the instance of this singleton
+     * @param communicator the communicator
+     * @return the singleton instance
+     */
+    public static CrewController getInstance(ClientControllerCommunicator communicator) {
+        if(singleton == null) {
+            singleton = new CrewController(communicator);
+        }
+        return singleton;
+    }
+
     /**
      * Move a crew member to a different section
      *
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/HangerController.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/HangerController.java
index e8b677f1d5f65fd7700698d91aa73a2310f07f91..83b4bb3062cc6c7e4836edf418eb4c49584cb096 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/HangerController.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/HangerController.java
@@ -7,9 +7,18 @@ import lombok.Setter;
 
 @Getter
 @Setter
-@RequiredArgsConstructor(access = AccessLevel.PUBLIC)
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
 public class HangerController extends Controller {
 
+    private static HangerController singleton;
+
+    public static HangerController getInstance() {
+        if(singleton == null) {
+            singleton = new HangerController();
+        }
+        return singleton;
+    }
+
     /**
      * Picks a Shipmodel
      * @param username - the specified username
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TraderController.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TraderController.java
index 706877335a6caa5161101d9f7c5dc0c006d0e267..5eee83c3c85af10a3a91a37ca72bd72b220194f4 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TraderController.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TraderController.java
@@ -16,22 +16,27 @@ import java.util.List;
 
 @Getter
 @Setter
-@RequiredArgsConstructor(access = AccessLevel.PUBLIC)
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
 public class TraderController extends Controller{
 
-    /** the trader */
-    @NonNull
-    private Trader trader;
-
     /** ClientControllerCommunicator */
     @NonNull
     private ClientControllerCommunicator clientControllerCommunicator;
 
+    private static TraderController singleton;
+
+    public static TraderController getInstance(ClientControllerCommunicator communicator) {
+        if(singleton == null) {
+            singleton = new TraderController(communicator);
+        }
+        return singleton;
+    }
+
     /**
      * Buy a weapon from the trader
      * @param weapon - the weapon to buy
      */
-    public boolean purchaseWeapon(Weapon weapon) {
+    public boolean purchaseWeapon(Trader trader, Weapon weapon) {
         try {
             RequestObject requestObject = new RequestObject();
             requestObject.setWeapon(weapon);
@@ -65,7 +70,7 @@ public class TraderController extends Controller{
      * Buy crew from a trader
      * @param crew   - the crew to buy
      */
-    public boolean purchaseCrew(Crew crew) {
+    public boolean purchaseCrew(Trader trader, Crew crew) {
         try {
             RequestObject requestObject = new RequestObject();
             requestObject.setRequestType(RequestType.TRADERBUYCREW);
@@ -98,7 +103,7 @@ public class TraderController extends Controller{
      * Buy rockets from the trader
      * @param amount - the amount of rockets to buy
      */
-    public boolean purchaseRockets(int amount) {
+    public boolean purchaseRockets(Trader trader, int amount) {
         try {
             RequestObject requestObject = new RequestObject();
             requestObject.setRequestType(RequestType.TRADERBUYROCKETS);
@@ -130,7 +135,7 @@ public class TraderController extends Controller{
      * Buy fuel from the trader
      * @param amount - the amount of fuel to buy
      */
-    public boolean purchaseFuel( int amount) {
+    public boolean purchaseFuel(Trader trader, int amount) {
         try {
             RequestObject requestObject = new RequestObject();
             requestObject.setShip(clientControllerCommunicator.getClientShip());
@@ -162,7 +167,7 @@ public class TraderController extends Controller{
      * Buy health from the trader
      * @param amount - the amount to buy
      */
-    public boolean purchaseHP(int amount) {
+    public boolean purchaseHP(Trader trader, int amount) {
         try {
             RequestObject requestObject = new RequestObject();
             requestObject.setShip(clientControllerCommunicator.getClientShip());
@@ -194,7 +199,7 @@ public class TraderController extends Controller{
      * Sell weapon to the trader
      * @param weapon the weapon
      */
-    public boolean sellWeapon(Weapon weapon) {
+    public boolean sellWeapon(Trader trader, Weapon weapon) {
         try {
             RequestObject requestObject = new RequestObject();
             requestObject.setShip(clientControllerCommunicator.getClientShip());
@@ -228,7 +233,7 @@ public class TraderController extends Controller{
      * sell rockets to the trader
      * @param amount the amount of rockets
      */
-    public boolean sellRockets(int amount) {
+    public boolean sellRockets(Trader trader, int amount) {
         try {
             RequestObject requestObject = new RequestObject();
             requestObject.setShip(clientControllerCommunicator.getClientShip());
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TravelController.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TravelController.java
index 85f240aeb289d96841e8567de587ac287e7baec3..67ea4a3712966cfd2c94d10fd5daf337f19ed4da 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TravelController.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TravelController.java
@@ -12,13 +12,22 @@ import java.util.List;
 
 @Getter
 @Setter
-@RequiredArgsConstructor(access = AccessLevel.PUBLIC)
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
 public class TravelController extends Controller{
 
     /** ClientControllerCommunicator */
     @NonNull
     private ClientControllerCommunicator clientControllerCommunicator;
 
+    private static TravelController singleton;
+
+    public static TravelController getInstance(ClientControllerCommunicator communicator) {
+        if(singleton == null) {
+            singleton = new TravelController(communicator);
+        }
+        return singleton;
+    }
+
     /**
      * travels from one location to another
      * @param destination - the destination
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Main.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Main.java
index 298006821ee86cef117fdc96fa95a9902179ba1e..1626125cbca3e1215c332d925bf2cf192532a0b3 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Main.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Main.java
@@ -4,6 +4,8 @@ import com.badlogic.gdx.Game;
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 import com.galaxytrucker.galaxytruckerreloaded.Communication.Client;
+import com.galaxytrucker.galaxytruckerreloaded.Server.Server;
+import com.galaxytrucker.galaxytruckerreloaded.Server.ServerServiceCommunicator;
 import com.galaxytrucker.galaxytruckerreloaded.View.Screen.LoginScreen;
 import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu;
 import lombok.Getter;
@@ -27,9 +29,34 @@ public class Main extends Game {
      * the client
      */
     @Getter
-    @Setter
     private Client client;
 
+    /**
+     * the server
+     */
+    @Getter
+    @Setter
+    private boolean server;
+
+    /**
+     * start a server, if there isnt one
+     */
+    public void startServer() {
+        if(!server) {
+            Server.runServer();
+            server = true;
+        }
+    }
+
+    /**
+     * start a client, if there isnt already one
+     */
+    public void startClient() {
+        if(client == null) {
+            client = new Client("localhost", 5050);
+        }
+    }
+
     @Override
     public void create() {
         batch = new SpriteBatch();
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Overworld.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Overworld.java
index c39dce62a0c948d56bf6be6e4541bdd4e5003a86..a9a7d60762782cb892f43e5fbe8c560fbf650409 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Overworld.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Overworld.java
@@ -28,6 +28,14 @@ public class Overworld implements Serializable {
     @NonNull
     private int seed;
 
+    /**
+     * the difficulty of the map
+     * 0 = easy
+     * 1 = middle
+     * 2 = hard
+     */
+    private int difficulty;
+
     /** Username used as ID */
     @NonNull
     private String associatedUser;
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/ShipLayout/ShipType.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/ShipLayout/ShipType.java
index 0025590a653dd5748d8513d1ee5578c2af868fa5..bf08f4a8ba10ca888171faaaa5f9aeb1b153983c 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/ShipLayout/ShipType.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/ShipLayout/ShipType.java
@@ -1,5 +1,30 @@
 package com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout;
 
+
 public enum ShipType {
-    DEFAULT,TANK,KILLER,BARRAGE,STEALTH,BOARDER
+    DEFAULT,TANK,KILLER,BARRAGE,STEALTH,BOARDER;
+
+    public ShipType next() {
+        switch(this) {
+            case DEFAULT: return TANK;
+            case TANK: return KILLER;
+            case KILLER: return BARRAGE;
+            case BARRAGE: return STEALTH;
+            case STEALTH: return BOARDER;
+            case BOARDER: return DEFAULT;
+            default: return null;
+        }
+    }
+
+    public ShipType previous() {
+        switch(this) {
+            case DEFAULT: return BOARDER;
+            case TANK: return DEFAULT;
+            case BARRAGE: return KILLER;
+            case BOARDER: return STEALTH;
+            case STEALTH: return BARRAGE;
+            case KILLER: return TANK;
+            default: return null;
+        }
+    }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java
index d92bbe80f2379d7b019ddba4cda8089ccbbea4bf..9cf1de47aa7e55bb4d146639f5521a082570c5fa 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java
@@ -16,6 +16,7 @@ import lombok.Setter;
 import java.io.*;
 import java.net.Socket;
 import java.util.*;
+import java.util.concurrent.ThreadLocalRandom;
 
 /**
  * Handle each client in a separate thread
@@ -69,6 +70,8 @@ public class ClientHandler implements Runnable {
     @Setter
     private boolean gameActive = true;
 
+    private boolean clientRunning = true;
+
     /**
      * Map seed
      */
@@ -123,68 +126,76 @@ public class ClientHandler implements Runnable {
     @Override
     public void run() {
         planetNames.addAll(Arrays.asList(names));
-        // ==================== LOGIN ====================
-        try {
-            this.username = receive.readLine().replace("[LOGIN]:", "");
-            if (serverServiceCommunicator.isLoggedIn(username)) {
-                send.println(false);
-            } else {
-                send.println(true);
-                // ==================== NEW GAME ====================
-                try {
-                    this.user = serverServiceCommunicator.getUserService().getUser(username);
-                    if (user.isFirstGame()) {
-                        send.println("[NEW-GAME]");
-                        // ==================== Overworld Creation ====================
-                        this.seed = UUID.randomUUID().hashCode();
-                        Overworld overworld = generateOverworld(this.seed, username);
-                        user.setOverworld(overworld);
-                        //====================== Ship Creation ==================
-                        ShipType shipType = (ShipType) receiveObject.readObject();
-                        user.setUserShip(generateShip(shipType, username, overworld));
-                        //=======================================================
-                        user.setFirstGame(false);
-                    }
-                    // ==================== UPDATE LOGIN ====================
-                    user.setLoggedIn(true);
-                    serverServiceCommunicator.getUserService().updateUser(user);
-                    // ==================== FETCH SHIP ====================
-                    try {
-                        send.println("[FETCH-SHIP]");
-                        sendObject.writeObject(this.serverServiceCommunicator.getClientShip(username));
-                    } catch (Exception f) {
-                        f.printStackTrace();
-                        send.println("[EXCEPTION]:[FETCH-SHIP]:[USERNAME]:" + username);
-                        throw new IllegalArgumentException(f.getMessage());
-                    }
-                    // ==================== FETCH MAP ====================
+        while(clientRunning) {
+            // ==================== LOGIN ====================
+            try {
+                this.username = receive.readLine().replace("[LOGIN]:", "");
+                if (serverServiceCommunicator.isLoggedIn(username)) {
+                    send.println(false);
+                } else {
+                    send.println(true);
+                    // ==================== NEW GAME ====================
                     try {
-                        send.println("[FETCH-MAP]");
-                        sendObject.writeObject(this.serverServiceCommunicator.getClientMap(username));
-                    } catch (Exception f) {
-                        f.printStackTrace();
-                        send.println("[EXCEPTION]:[FETCH-MAP]:[USERNAME]:" + username);
-                        throw new IllegalArgumentException(f.getMessage());
-                    }
-                } catch (Exception e) {
-                    e.printStackTrace();
-                    send.println("[EXCEPTION]:[NEW-GAME]:[USERNAME]:" + username);
+                        this.user = serverServiceCommunicator.getUserService().getUser(username);
+                        if (user.isFirstGame()) {
+                            send.println("[NEW-GAME]");
+                            // ==================== Overworld Creation ====================
+                            int difficulty = Integer.parseInt(receive.readLine());
+                            this.seed = UUID.randomUUID().hashCode();
+                            Overworld overworld = generateOverworld(this.seed, username, difficulty);
+                            user.setOverworld(overworld);
+                            //====================== Ship Creation ==================
+                            ShipType shipType = (ShipType) receiveObject.readObject();
+                            user.setUserShip(generateShip(shipType, username, overworld));
+                            //=======================================================
+                            user.setFirstGame(false);
+                        }
+                        // ==================== UPDATE LOGIN ====================
+                        user.setLoggedIn(true);
+                        serverServiceCommunicator.getUserService().updateUser(user);
+                        // ==================== FETCH SHIP ====================
+                        try {
+                            send.println("[FETCH-SHIP]");
+                            sendObject.writeObject(this.serverServiceCommunicator.getClientShip(username));
+                        } catch (Exception f) {
+                            f.printStackTrace();
+                            send.println("[EXCEPTION]:[FETCH-SHIP]:[USERNAME]:" + username);
+                            throw new IllegalArgumentException(f.getMessage());
+                        }
+                        // ==================== FETCH MAP ====================
+                        try {
+                            send.println("[FETCH-MAP]");
+                            sendObject.writeObject(this.serverServiceCommunicator.getClientMap(username));
+                        } catch (Exception f) {
+                            f.printStackTrace();
+                            send.println("[EXCEPTION]:[FETCH-MAP]:[USERNAME]:" + username);
+                            throw new IllegalArgumentException(f.getMessage());
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        send.println("[EXCEPTION]:[NEW-GAME]:[USERNAME]:" + username);
+                    }
+                    gameActive = true;
+                    // ==================== RUNNING ====================
+                    while (gameActive) {
+                        RequestObject request = (RequestObject) receiveObject.readObject();
+                        sendObject.writeObject(this.serverServiceCommunicator.getResponse(request));
+                        if (request.getRequestType() == RequestType.LOGOUT) {
+                            gameActive = false;
+                        }
+                    }
                 }
-                // ==================== RUNNING ====================
-                while (gameActive) {
-                    sendObject.writeObject(this.serverServiceCommunicator.getResponse((RequestObject) receiveObject.readObject()));
+            } catch (Exception e) {
+                e.printStackTrace();
+                // Socket will be closed thanks to exception, therefor cannot send more data
+                // Thread will terminate with socket exception
+                try {
+                    serverServiceCommunicator.logoutAfterException(username);
+                    send.println("[EXCEPTION]:[LOGIN]:[USERNAME]:" + username);
+                } catch (Exception f) {
+                    f.printStackTrace();
                 }
             }
-        } catch (Exception e) {
-            e.printStackTrace();
-            // Socket will be closed thanks to exception, therefor cannot send more data
-            // Thread will terminate with socket exception
-            try {
-                serverServiceCommunicator.logoutAfterException(username);
-                send.println("[EXCEPTION]:[LOGIN]:[USERNAME]:" + username);
-            } catch (Exception f) {
-                f.printStackTrace();
-            }
         }
     }
 
@@ -211,7 +222,7 @@ public class ClientHandler implements Runnable {
      * @param seed - the world seed
      * @return the generated overworld
      */
-    private Overworld generateOverworld(int seed, String username) {
+    private Overworld generateOverworld(int seed, String username, int difficulty) {
         Random random = new Random(seed);
         List<PlanetEvent> planetEvents = new ArrayList<PlanetEvent>();
         planetEvents.add(PlanetEvent.SHOP);
@@ -225,19 +236,50 @@ public class ClientHandler implements Runnable {
         //TODO ADD TRADER WITH ITEMS TO MAP
         planets.add(new Planet(UUID.randomUUID().hashCode(), getPlanetName(planetNames, usedPlanetNames, seed),
                 0, 0, PlanetEvent.VOID, new ArrayList<Ship>()));
-        for (int i = 0; i < 5; i++) {
-            for (int a = 0; a < 5; a++) {
-                String nextPlanet = getPlanetName(planetNames, usedPlanetNames, seed);
-                planets.add(new Planet(UUID.randomUUID().hashCode(), nextPlanet, i, a,
-                        planetEvents.get(random.nextInt(planetEvents.size() - 1)), new ArrayList<Ship>()));
+
+        /**
+         * max - max range
+         */
+        int max = 3;
+        /**
+         * min -min range
+         */
+        int min = 1;
+
+        for (int x = 0; x < 1000; x+=100) {
+            for (int y = 0; y < 100; y+=50) {
+
+                //Random multiplication
+                int randomNumber = ThreadLocalRandom.current().nextInt(min,max +1);
+
+                int randomPlanetNumber = ThreadLocalRandom.current().nextInt(1, 5);
+
+                //X und Y Koordinaten randomisen
+                int randX = x*randomNumber;
+                int randY = y*randomNumber;
+
+                for(int planetenAnzahl = 0; planetenAnzahl <= randomPlanetNumber; planetenAnzahl++){
+                    String nextPlanet = getPlanetName(planetNames, usedPlanetNames, seed);
+                    planets.add(new Planet(UUID.randomUUID().hashCode(), nextPlanet,x ,randY,
+                            planetEvents.get(random.nextInt(planetEvents.size() - 1)), new ArrayList<Ship>()));
+                }
+
+
+                //Doppelte Planeten check noch ohne Funktion!
+                for(Planet test : planets){
+                    if(test.getPosX() == randX  && test.getPosY() == randY){
+
+                    }
+                }
             }
         }
         // Boss planet
         planets.add(new Planet(UUID.randomUUID().hashCode(), getPlanetName(planetNames, usedPlanetNames, seed),
-                30, 30, PlanetEvent.BOSS, new ArrayList<Ship>()));
+                500, 200, PlanetEvent.BOSS, new ArrayList<Ship>()));
         Overworld overworld = new Overworld(UUID.randomUUID().hashCode(), seed, username);
         overworld.setStartPlanet(planets.get(0));
         overworld.setPlanetMap(planets);
+        overworld.setDifficulty(difficulty);
         return overworld;
     }
 
@@ -251,7 +293,6 @@ public class ClientHandler implements Runnable {
     private Ship generateShip(ShipType shipType, String username, Overworld overworld) {
         List<Weapon> inventory = new ArrayList<>();
         List<Room> rooms = new ArrayList<>();
-        List<Tile> tiles = new ArrayList<>();
         List<Integer> crewStats = new ArrayList<>();
         switch (shipType) {
             // ========== KESTREL A ==========
@@ -260,6 +301,7 @@ public class ClientHandler implements Runnable {
                     crewStats.add(2);
                 }
                 for (int i = 0; i < 17; i++) {
+                    List<Tile> tiles = new ArrayList<>();
                     // ========== Tile generator ==========
                     // 2 Above each other
                     if (i == 0 || i == 16) {
@@ -312,11 +354,11 @@ public class ClientHandler implements Runnable {
                         weapons.getTiles().get(0).setStandingOnMe(crew);
                         weapons.setCrew(crewInRoom);
                         // Add Weapons
-                        Weapon laser = new Weapon(UUID.randomUUID().hashCode(), WeaponType.LASER, 2, 1, 1, 1, 0,
-                                (float) 1.0, (float) 0.3, 0, (float) 0.3, 1, 1, "Laser Gun", 30);
-                        Weapon rocket = new Weapon(UUID.randomUUID().hashCode(), WeaponType.ROCKET,1, 2, 2, 1, 1, (float) 1.0,
-                                (float) 0.25, 4, (float) 1.0, 2, 1, "Allahu Akbar", 30);
-                        // TODO Add weapon price list based on weapon level
+                        Weapon laser = new Weapon(UUID.randomUUID().hashCode(), 2, 1, 1, 1, 0,
+                                (float) 1.0, (float) 0.3, 0, (float) 0.3, 1, 1, "Laser", 30);
+                        Weapon rocket = new Weapon(UUID.randomUUID().hashCode(), 1, 2, 2, 1, 1, (float) 1.0,
+                                (float) 0.25, 4, (float) 1.0, 2, 1, "Rocket", 30);
+                        // TODO add weapon price list
                         laser.setWeaponSystem(weapons);
                         rocket.setWeaponSystem(weapons);
                         List<Weapon> shipWeapons = new ArrayList<>();
@@ -365,115 +407,584 @@ public class ClientHandler implements Runnable {
                         room.setTiles(tiles);
                         rooms.add(room);
                     }
-                    tiles.clear();
                 }
                 return new Ship(UUID.randomUUID().hashCode(), username, shipType, 30, 60, 11, 7, 8,
                         0, 0, 0, overworld.getStartPlanet(), 0, 100, rooms, inventory, false);
             // ========== ROCK A ==========
             case TANK:
+                crewStats = new ArrayList<>();
                 crewStats.add(0);
                 crewStats.add(3);
                 crewStats.add(4);
                 crewStats.add(3);
                 crewStats.add(0);
-                // ========== Tile Generator ==========
-                for (int i=0;i<18;++i){
-                    // Vertical 2x1
-                    if (i<=4 || i==14 || i==16 || i==17) {
-                        tiles.add(new Tile(UUID.randomUUID().hashCode(),0,0));
-                        tiles.add(new Tile(UUID.randomUUID().hashCode(),0,1));
-                    }
-                    // Horizontal 1x2
-                    else if (i == 6 || i== 7 || i==10 || i==11){
-                        tiles.add(new Tile(UUID.randomUUID().hashCode(),0,0));
-                        tiles.add(new Tile(UUID.randomUUID().hashCode(),1,0));
-                    }
-                    // Normal 4x4
-                    else{
-                        tiles.add(new Tile(UUID.randomUUID().hashCode(),0,0));
-                        tiles.add(new Tile(UUID.randomUUID().hashCode(),1,0));
-                        tiles.add(new Tile(UUID.randomUUID().hashCode(),0,1));
-                        tiles.add(new Tile(UUID.randomUUID().hashCode(),1,1));
-                    }
-                    // ========== Room Generator ==========
-                    // O2
-                    if (i==0){
-                        rooms.add(new System(UUID.randomUUID().hashCode(),0,100,i,new ArrayList<Crew>(),
-                                tiles,1,5,0,SystemType.O2,new ArrayList<Weapon>()));
+                for (int i = 0; i < 18; i++) {
 
+                    List<Tile> tiles = new ArrayList<>();
+                    // ========== Tile Generator ==========
+                    // 2 Above each other
+                    if (i == 0 || i == 1 || i==2 || i==3 || i==4 || i==14 || i==16 || i==17) {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 1));
                     }
-                    // Cameras
-                    else if (i==1){
-                        rooms.add(new System(UUID.randomUUID().hashCode(),0,100,i,new ArrayList<Crew>(),
-                                tiles,1,5,0,SystemType.CAMERAS,new ArrayList<Weapon>()));
+                    // 2 beside each other
+                    else if (i == 6 || i ==7 || i == 10 || i == 11 ) {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 0));
+                    } else {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 1));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 1));
                     }
-                    // Shields
-                    else if (i==5){
-                        rooms.add(new System(UUID.randomUUID().hashCode(),0,100,i, new ArrayList<Crew>(),
-                                tiles,2,5,0,SystemType.SHIELDS,new ArrayList<Weapon>()));
+                    // ========== Room Generator ==========
+                    //O2
+                    if(i==0) {
+                        Room o2 = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.O2, new ArrayList<Weapon>());
+                        o2.setTiles(tiles);
+                        rooms.add(o2);
                     }
-                    // Engine
-                    else if (i==8){
-                        Room engine = new System(UUID.randomUUID().hashCode(),0,100,i,new ArrayList<Crew>(),
-                                tiles,2,5, 0,SystemType.ENGINE,new ArrayList<Weapon>());
-                        Crew c = new Crew(UUID.randomUUID().hashCode(),"Varnas",8, 8, crewStats, 3 * crewStats.size() * 2, username);
-                        c.setTile(tiles.get(0));
-                        tiles.get(0).setStandingOnMe(c);
+                    //Engine
+                    else if(i==8) {
+                        Room engine = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 2, 5, 0, SystemType.ENGINE, new ArrayList<Weapon>());
                         engine.setTiles(tiles);
-                        c.setCurrentRoom(engine);
+                        Crew crew = new Crew(UUID.randomUUID().hashCode(), "Isac", 8, 8, crewStats, 3*3+3*4+3*3, username);
+                        crew.setTile(engine.getTiles().get(0));
+                        engine.getTiles().get(0).setStandingOnMe(crew);
+                        crew.setCurrentRoom(engine);
                         List<Crew> crewInRoom = engine.getCrew();
-                        crewInRoom.add(c);
+                        crewInRoom.add(crew);
                         engine.setCrew(crewInRoom);
                         rooms.add(engine);
                     }
-                    // Weapons
-                    else if (i==12){
-                        System weapons = new System(UUID.randomUUID().hashCode(),0,100,i,new ArrayList<Crew>(),
-                                tiles,3,5,0,SystemType.WEAPON_SYSTEM,new ArrayList<Weapon>());
-                        Weapon rocket2 = new Weapon(UUID.randomUUID().hashCode(),WeaponType.ROCKET,2,3,2,1,1,
-                                (float) 0.3,(float)0.25,4,(float)1.0,2,1,"Rocket 2",25);
-                        Weapon rocket1 = new Weapon(UUID.randomUUID().hashCode(),WeaponType.ROCKET,2,2,2,1,1,
-                                (float) 0.3,(float)0.25,4,(float)1.0,2,1,"Rocket 1",25);
-                        // TODO Add weapon price list based on weapon level
-                        List<Weapon> currentWeapons = weapons.getShipWeapons();
+                    //Weapons
+                    else if(i==12) {
+                        System weapons = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 3, 5, 0, SystemType.WEAPON_SYSTEM, new ArrayList<Weapon>());
+                        weapons.setTiles(tiles);
+                        // Add Weapons
+                        Weapon rocket2 = new Weapon(UUID.randomUUID().hashCode(), 2, 3, 2, 1, 1, (float) 1.0,
+                                (float) 0.25, 4, (float) 1.0, 2, 1, "Rocket", 30);
+                        Weapon rocket1 = new Weapon(UUID.randomUUID().hashCode(), 1, 2, 2, 1, 1, (float) 1.0,
+                                (float) 0.25, 4, (float) 1.0, 2, 1, "Rocket", 30);
+                        // TODO add weapon price list
                         rocket1.setWeaponSystem(weapons);
                         rocket2.setWeaponSystem(weapons);
-                        currentWeapons.add(rocket1);
-                        currentWeapons.add(rocket2);
-                        weapons.setShipWeapons(currentWeapons);
+                        List<Weapon> shipWeapons = new ArrayList<>();
+                        shipWeapons.add(rocket1);
+                        shipWeapons.add(rocket2);
+                        weapons.setShipWeapons(shipWeapons);
                         rooms.add(weapons);
                     }
-                    // Medbay
-                    else if (i==15){
-                        rooms.add(new System(UUID.randomUUID().hashCode(),0,100,i,new ArrayList<Crew>(),
-                                tiles,1,5,0,SystemType.MEDBAY,new ArrayList<Weapon>()));
+                    //Medbay
+                    else if(i==15) {
+                        Room medbay = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.MEDBAY, new ArrayList<Weapon>());
+                        medbay.setTiles(tiles);
+                        rooms.add(medbay);
                     }
-                    // Cockpit
-                    else if (i==16){
-                        Room cockpit = new System(UUID.randomUUID().hashCode(),0,100,i,new ArrayList<Crew>(),
-                                tiles,1,5,0,SystemType.COCKPIT,new ArrayList<Weapon>());
-                        Crew c = new Crew(UUID.randomUUID().hashCode(),"Bomfy",8,8,crewStats,3 * crewStats.size() * 2, username);
-                        c.setTile(cockpit.getTiles().get(0));
-                        c.setCurrentRoom(cockpit);
-                        tiles.get(0).setStandingOnMe(c);
+                    //Shields
+                    else if(i==5) {
+                        Room shields = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 2, 5, 0, SystemType.SHIELDS, new ArrayList<Weapon>());
+                        shields.setTiles(tiles);
+                        rooms.add(shields);
+                    }
+                    //Cameras
+                    else if(i==1) { //TODO irgendeine logik hinter energy/maxenergy?
+                        Room cameras = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.CAMERAS, new ArrayList<Weapon>());
+                        cameras.setTiles(tiles);
+                        rooms.add(cameras);
+                    }
+                    //Cockpit
+                    else if(i==16) {
+                        Room cockpit = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.COCKPIT, new ArrayList<Weapon>());
                         cockpit.setTiles(tiles);
+                        // Add crew
+                        Crew crew = new Crew(UUID.randomUUID().hashCode(), "Ahmad", 8, 8, crewStats, 3*3+3*4+3*3, username);
+                        crew.setTile(cockpit.getTiles().get(0));
+                        crew.setCurrentRoom(cockpit);
                         List<Crew> crewInRoom = cockpit.getCrew();
-                        crewInRoom.add(c);
+                        crewInRoom.add(crew);
+                        cockpit.getTiles().get(0).setStandingOnMe(crew);
                         cockpit.setCrew(crewInRoom);
                         rooms.add(cockpit);
                     }
+                    //otherwise
                     else {
-                        rooms.add(new Room(UUID.randomUUID().hashCode(),0,100,i,new ArrayList<Crew>(),tiles));
+                        Room room = new Room(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(), new ArrayList<Tile>());
+                        room.setTiles(tiles);
+                        rooms.add(room);
                     }
-                    tiles.clear();
                 }
                 return new Ship(UUID.randomUUID().hashCode(), username, shipType, 50, 10, 30, 4, 9,
                         0, 0, 0, overworld.getStartPlanet(), 0, 100, rooms, inventory, false);
             case KILLER:
-
-                // ========== Tile Generator ==========
-
-                // ========== Room Generator ==========
+                crewStats = new ArrayList<>();
+                crewStats.add(3);
+                crewStats.add(4);
+                crewStats.add(0);
+                crewStats.add(1);
+                crewStats.add(2);
+                for (int i = 0; i < 16; i++) {
+                    List<Tile> tiles = new ArrayList<>();
+                    // ========== Tile Generator ==========
+                    // 2 Above each other
+                    if (i == 11 || i == 12 || i==13 || i==14 || i==15) {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 1));
+                    }
+                    // 2 beside each other
+                    else if (i == 2 || i ==3 || i == 5 || i == 6 || i==7 || i==10 ) {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 0));
+                    } else {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 1));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 1));
+                    }
+                    // ========== Room Generator ==========
+                    //O2
+                    if(i==7) {
+                        Room o2 = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.O2, new ArrayList<Weapon>());
+                        o2.setTiles(tiles);
+                        rooms.add(o2);
+                    }
+                    //Medbay TODO??
+                    //Engine
+                    else if(i==4) {
+                        Room engine = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 2, 5, 0, SystemType.ENGINE, new ArrayList<Weapon>());
+                        engine.setTiles(tiles);
+                        rooms.add(engine);
+                    }
+                    //Weapon
+                    else if(i==9) {
+                        System weapons = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 3, 5, 0, SystemType.WEAPON_SYSTEM, new ArrayList<Weapon>());
+                        weapons.setTiles(tiles);
+                        // Add Weapons
+                        Weapon laser = new Weapon(UUID.randomUUID().hashCode(), 2, 1, 1, 1, 0,
+                                (float) 1.0, (float) 0.3, 0, (float) 0.3, 1, 1, "Laser", 30);
+                        Weapon radio = new Weapon(UUID.randomUUID().hashCode(), 4, 0, 3, 1, 0, (float) 1.0,
+                                (float) 0.12, 0, (float) 0.0, 2, 3, "Radio", 45);
+                        // TODO add weapon price list
+                        radio.setWeaponSystem(weapons);
+                        laser.setWeaponSystem(weapons);
+                        List<Weapon> shipWeapons = new ArrayList<>();
+                        shipWeapons.add(radio);
+                        shipWeapons.add(laser);
+                        weapons.setShipWeapons(shipWeapons);
+                        rooms.add(weapons);
+                    }
+                    //Cockpit
+                    else if(i==14) {
+                        Room cockpit = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.COCKPIT, new ArrayList<Weapon>());
+                        cockpit.setTiles(tiles);
+                        // Add crew
+                        Crew crew = new Crew(UUID.randomUUID().hashCode(), "Ahmad", 8, 8, crewStats, 30, username);
+                        crew.setTile(cockpit.getTiles().get(0));
+                        crew.setCurrentRoom(cockpit);
+                        List<Crew> crewInRoom = cockpit.getCrew();
+                        crewInRoom.add(crew);
+                        cockpit.getTiles().get(0).setStandingOnMe(crew);
+                        cockpit.setCrew(crewInRoom);
+                        rooms.add(cockpit);
+                    }
+                    //Cameras
+                    else if(i==6) {
+                        Room cameras = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.CAMERAS, new ArrayList<Weapon>());
+                        cameras.setTiles(tiles);
+                        rooms.add(cameras);
+                    }
+                    //Shields
+                    else if(i==8) {
+                        Room shields = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 2, 5, 0, SystemType.SHIELDS, new ArrayList<Weapon>());
+                        shields.setTiles(tiles);
+                        rooms.add(shields);
+                    }
+                    //otherwise
+                    else {
+                        Room room = new Room(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(), new ArrayList<Tile>());
+                        room.setTiles(tiles);
+                        rooms.add(room);
+                    }
+                }
+                return new Ship(UUID.randomUUID().hashCode(), username, shipType, 25, 40, 0, 10, 8,
+                        0, 0, 0, overworld.getStartPlanet(), 0, 100, rooms, inventory, false);
+            case BARRAGE:
+                crewStats = new ArrayList<>();
+                crewStats.add(2);
+                crewStats.add(4);
+                crewStats.add(2);
+                crewStats.add(1);
+                crewStats.add(1);
+                for(int i=0; i<18; i++) {
+                    List<Tile> tiles = new ArrayList<>();
+                    // ========== Tile Generator ==========
+                    // 2 Above each other
+                    if (i == 0 || i == 1 || i==7 || i==8 || i==9 || i==12 || i==17) {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 1));
+                    }
+                    // 2 beside each other
+                    else if (i == 2 || i ==3 || i == 5 || i == 6 || i==13 || i==14 ) {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 0));
+                    } else {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 1));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 1));
+                    }
+                    // ========== Room Generator ==========
+                    //O2
+                    if(i==9) {
+                        Room o2 = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.O2, new ArrayList<Weapon>());
+                        o2.setTiles(tiles);
+                        rooms.add(o2);
+                    }
+                    //Engine
+                    else if(i==4) {
+                        Room engine = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 2, 5, 0, SystemType.ENGINE, new ArrayList<Weapon>());
+                        engine.setTiles(tiles);
+                        // Add crew
+                        Crew crew = new Crew(UUID.randomUUID().hashCode(), "Isac", 8, 8, crewStats, 30, username);
+                        crew.setTile(engine.getTiles().get(0));
+                        crew.setCurrentRoom(engine);
+                        List<Crew> crewInRoom = engine.getCrew();
+                        crewInRoom.add(crew);
+                        engine.getTiles().get(0).setStandingOnMe(crew);
+                        engine.setCrew(crewInRoom);
+                        rooms.add(engine);
+                    }
+                    //Medbay
+                    else if(i==10) {
+                        Room medbay = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.MEDBAY, new ArrayList<Weapon>());
+                        medbay.setTiles(tiles);
+                        rooms.add(medbay);
+                    }
+                    //Shields
+                    else if(i==11) {
+                        Room shields = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 2, 5, 0, SystemType.SHIELDS, new ArrayList<Weapon>());
+                        shields.setTiles(tiles);
+                        rooms.add(shields);
+                    }
+                    //Cameras
+                    else if(i==13) {
+                        Room cameras = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.CAMERAS, new ArrayList<Weapon>());
+                        cameras.setTiles(tiles);
+                        rooms.add(cameras);
+                    }
+                    //Cockpit
+                    else if(i==7) {
+                        Room cockpit = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.COCKPIT, new ArrayList<Weapon>());
+                        cockpit.setTiles(tiles);
+                        // Add crew
+                        Crew crew = new Crew(UUID.randomUUID().hashCode(), "Ahmad", 8, 8, crewStats, 30, username);
+                        crew.setTile(cockpit.getTiles().get(0));
+                        crew.setCurrentRoom(cockpit);
+                        List<Crew> crewInRoom = cockpit.getCrew();
+                        crewInRoom.add(crew);
+                        cockpit.getTiles().get(0).setStandingOnMe(crew);
+                        cockpit.setCrew(crewInRoom);
+                        rooms.add(cockpit);
+                    }
+                    //Weapons
+                    else if(i==15) {
+                        System weapons = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 3, 5, 0, SystemType.WEAPON_SYSTEM, new ArrayList<Weapon>());
+                        weapons.setTiles(tiles);
+                        // Add crew
+                        Crew crew = new Crew(UUID.randomUUID().hashCode(), "Newton", 8, 8, crewStats, 30, username);
+                        crew.setTile(weapons.getTiles().get(0));
+                        crew.setCurrentRoom(weapons);
+                        List<Crew> crewInRoom = weapons.getCrew();
+                        crewInRoom.add(crew);
+                        weapons.getTiles().get(0).setStandingOnMe(crew);
+                        weapons.setCrew(crewInRoom);
+                        // Add Weapons
+                        Weapon laser = new Weapon(UUID.randomUUID().hashCode(), 2, 1, 1, 1, 0,
+                                (float) 1.0, (float) 0.3, 0, (float) 0.3, 1, 1, "Laser", 30);
+                        Weapon laser2 = new Weapon(UUID.randomUUID().hashCode(), 2, 1, 1, 1, 0,
+                                (float) 1.0, (float) 0.3, 0, (float) 0.3, 1, 1, "Laser", 30);
+                        Weapon laser3 = new Weapon(UUID.randomUUID().hashCode(), 2, 1, 1, 1, 0,
+                                (float) 1.0, (float) 0.3, 0, (float) 0.3, 1, 1, "Laser", 30);
+                        // TODO add weapon price list
+                        laser.setWeaponSystem(weapons);
+                        laser2.setWeaponSystem(weapons);
+                        laser3.setWeaponSystem(weapons);
+                        List<Weapon> shipWeapons = new ArrayList<>();
+                        shipWeapons.add(laser);
+                        shipWeapons.add(laser2);
+                        shipWeapons.add(laser3);
+                        weapons.setShipWeapons(shipWeapons);
+                        rooms.add(weapons);
+                    }
+                    //otherwise
+                    else {
+                        Room room = new Room(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(), new ArrayList<Tile>());
+                        room.setTiles(tiles);
+                        rooms.add(room);
+                    }
+                }
+                return new Ship(UUID.randomUUID().hashCode(), username, shipType, 20, 10, 0, 3, 8,
+                        0, 0, 0, overworld.getStartPlanet(), 0, 100, rooms, inventory, false);
+            case STEALTH:
+                crewStats = new ArrayList<>();
+                crewStats.add(4);
+                crewStats.add(1);
+                crewStats.add(0);
+                crewStats.add(3);
+                crewStats.add(2);
+                for(int i=0; i<15; i++) {
+                    List<Tile> tiles = new ArrayList<>();
+                    // ========== Tile Generator ==========
+                    // 2 Above each other
+                    if (i == 2 || i == 6 || i==9 || i==14) {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 1));
+                    }
+                    // 2 beside each other
+                    else if (i == 1 || i ==3 || i == 8 || i == 10 || i==12 || i==13 ) {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 0));
+                    } else {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 1));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 1));
+                    }
+                    // ========== Room Generator ==========
+                    //O2
+                    if(i==12) {
+                        Room o2 = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.O2, new ArrayList<Weapon>());
+                        o2.setTiles(tiles);
+                        rooms.add(o2);
+                    }
+                    //Engines
+                    else if(i==0) {
+                        Room engine = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 2, 5, 0, SystemType.ENGINE, new ArrayList<Weapon>());
+                        engine.setTiles(tiles);
+                        // Add crew
+                        Crew crew = new Crew(UUID.randomUUID().hashCode(), "Isac", 8, 8, crewStats, 30, username);
+                        crew.setTile(engine.getTiles().get(0));
+                        crew.setCurrentRoom(engine);
+                        List<Crew> crewInRoom = engine.getCrew();
+                        crewInRoom.add(crew);
+                        engine.getTiles().get(0).setStandingOnMe(crew);
+                        engine.setCrew(crewInRoom);
+                        rooms.add(engine);
+                    }
+                    //Medbay
+                    else if(i==5) {
+                        Room medbay = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.MEDBAY, new ArrayList<Weapon>());
+                        medbay.setTiles(tiles);
+                        rooms.add(medbay);
+                    }
+                    //Weapons
+                    else if(i==11) {
+                        System weapons = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 3, 5, 0, SystemType.WEAPON_SYSTEM, new ArrayList<Weapon>());
+                        weapons.setTiles(tiles);
+                        // Add Weapons
+                        Weapon laser = new Weapon(UUID.randomUUID().hashCode(), 1, 1, 1, 1, 0,
+                                (float) 1.0, (float) 0.3, 0, (float) 0.3, 1, 1, "Laser", 30);
+                        Weapon bomb = new Weapon(UUID.randomUUID().hashCode(), 2, 6, 5, 1, 1,
+                                (float) 1.5, (float) 0.18, 4, (float) 1.5, 3, 1, "Bomb", 35);
+                        // TODO add weapon price list
+                        laser.setWeaponSystem(weapons);
+                        bomb.setWeaponSystem(weapons);
+                        List<Weapon> shipWeapons = new ArrayList<>();
+                        shipWeapons.add(laser);
+                        shipWeapons.add(bomb);
+                        weapons.setShipWeapons(shipWeapons);
+                        rooms.add(weapons);
+                    }
+                    //Shields
+                    else if(i==4) {
+                        Room shields = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 2, 5, 0, SystemType.SHIELDS, new ArrayList<Weapon>());
+                        shields.setTiles(tiles);
+                        rooms.add(shields);
+                    }
+                    //Cameras
+                    else if(i==1) {
+                        Room cameras = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.CAMERAS, new ArrayList<Weapon>());
+                        cameras.setTiles(tiles);
+                        rooms.add(cameras);
+                    }
+                    //Cockpit
+                    else if(i==14) {
+                        Room cockpit = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.COCKPIT, new ArrayList<Weapon>());
+                        cockpit.setTiles(tiles);
+                        // Add crew
+                        Crew crew = new Crew(UUID.randomUUID().hashCode(), "Ahmad", 8, 8, crewStats, 30, username);
+                        crew.setTile(cockpit.getTiles().get(0));
+                        crew.setCurrentRoom(cockpit);
+                        List<Crew> crewInRoom = cockpit.getCrew();
+                        crewInRoom.add(crew);
+                        cockpit.getTiles().get(0).setStandingOnMe(crew);
+                        cockpit.setCrew(crewInRoom);
+                        rooms.add(cockpit);
+                    }
+                    //otherwise
+                    else {
+                        Room room = new Room(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(), new ArrayList<Tile>());
+                        room.setTiles(tiles);
+                        rooms.add(room);
+                    }
+                }
+                return new Ship(UUID.randomUUID().hashCode(), username, shipType, 30, 100, 25, 25, 10,
+                        0, 0, 0, overworld.getStartPlanet(), 0, 100, rooms, inventory, false);
+            case BOARDER:
+                crewStats = new ArrayList<>();
+                crewStats.add(2);
+                crewStats.add(2);
+                crewStats.add(2);
+                crewStats.add(0);
+                crewStats.add(4);
+                for(int i=0; i<16; i++) {
+                    List<Tile> tiles = new ArrayList<>();
+                    // ========== Tile Generator ==========
+                    // 2 Above each other
+                    if (i == 1 || i == 3 || i==7 || i==8 || i==9 || i==10 || i==12 || i==14 || i==15) {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 1));
+                    }
+                    // 2 beside each other
+                    else if (i == 5 || i ==6) {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 0));
+                    } else {
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 0));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 0, 1));
+                        tiles.add(new Tile(UUID.randomUUID().hashCode(), 1, 1));
+                    }
+                    // ========== Room Generator ==========
+                    //O2
+                    if (i ==3) {
+                        Room o2 = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.O2, new ArrayList<Weapon>());
+                        o2.setTiles(tiles);
+                        rooms.add(o2);
+                    }
+                    //Engines
+                    else if (i ==2) {
+                        Room engine = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 2, 5, 0, SystemType.ENGINE, new ArrayList<Weapon>());
+                        engine.setTiles(tiles);
+                        // Add crew
+                        Crew crew = new Crew(UUID.randomUUID().hashCode(), "Isac", 8, 8, crewStats, 30, username);
+                        crew.setTile(engine.getTiles().get(0));
+                        crew.setCurrentRoom(engine);
+                        List<Crew> crewInRoom = engine.getCrew();
+                        crewInRoom.add(crew);
+                        engine.getTiles().get(0).setStandingOnMe(crew);
+                        engine.setCrew(crewInRoom);
+                        rooms.add(engine);
+                    }
+                    //Medbay
+                    else if (i ==13) {
+                        Room medbay = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.MEDBAY, new ArrayList<Weapon>());
+                        medbay.setTiles(tiles);
+                        rooms.add(medbay);
+                    }
+                    //Weapons
+                    else if (i ==11) {
+                        System weapons = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 3, 5, 0, SystemType.WEAPON_SYSTEM, new ArrayList<Weapon>());
+                        weapons.setTiles(tiles);
+                        // Add crew
+                        Crew crew = new Crew(UUID.randomUUID().hashCode(), "crew1", 8, 8, crewStats, 30, username);
+                        crew.setTile(weapons.getTiles().get(0));
+                        crew.setCurrentRoom(weapons);
+                        List<Crew> crewInRoom = weapons.getCrew();
+                        crewInRoom.add(crew);
+                        weapons.getTiles().get(0).setStandingOnMe(crew);
+                        weapons.setCrew(crewInRoom);
+                        // Add Weapons
+                        Weapon radioBomb = new Weapon(UUID.randomUUID().hashCode(), 2, 2, 5, 1, 0,
+                                (float) 1.5, (float) 0.05, 4, (float) 1.5, 5, 1, "RadioBomb", 75);
+                        Weapon healBomb = new Weapon(UUID.randomUUID().hashCode(), 2, 0, 6, 1, 1,
+                                (float) 1.5, (float) 0.1, 4, (float) 0, -4, 1, "HealBomb", 60);
+                        // TODO add weapon price list
+                        radioBomb.setWeaponSystem(weapons);
+                        healBomb.setWeaponSystem(weapons);
+                        List<Weapon> shipWeapons = new ArrayList<>();
+                        shipWeapons.add(radioBomb);
+                        shipWeapons.add(healBomb);
+                        weapons.setShipWeapons(shipWeapons);
+                        rooms.add(weapons);
+                    }
+                    //Shields
+                    else if (i ==4) {
+                        Room shields = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 2, 5, 0, SystemType.SHIELDS, new ArrayList<Weapon>());
+                        shields.setTiles(tiles);
+                        // Add crew
+                        Crew crew = new Crew(UUID.randomUUID().hashCode(), "crew2", 8, 8, crewStats, 30, username);
+                        crew.setTile(shields.getTiles().get(0));
+                        crew.setCurrentRoom(shields);
+                        List<Crew> crewInRoom = shields.getCrew();
+                        crewInRoom.add(crew);
+                        shields.getTiles().get(0).setStandingOnMe(crew);
+                        shields.setCrew(crewInRoom);
+                        rooms.add(shields);
+                    }
+                    //Cameras
+                    else if (i ==7) {
+                        Room cameras = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.CAMERAS, new ArrayList<Weapon>());
+                        cameras.setTiles(tiles);
+                        rooms.add(cameras);
+                    }
+                    //Cockpit
+                    else if (i ==15) {
+                        Room cockpit = new System(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(),
+                                new ArrayList<Tile>(), 1, 5, 0, SystemType.COCKPIT, new ArrayList<Weapon>());
+                        cockpit.setTiles(tiles);
+                        // Add crew
+                        Crew crew = new Crew(UUID.randomUUID().hashCode(), "Ahmad", 8, 8, crewStats, 30, username);
+                        crew.setTile(cockpit.getTiles().get(0));
+                        crew.setCurrentRoom(cockpit);
+                        List<Crew> crewInRoom = cockpit.getCrew();
+                        crewInRoom.add(crew);
+                        cockpit.getTiles().get(0).setStandingOnMe(crew);
+                        cockpit.setCrew(crewInRoom);
+                        rooms.add(cockpit);
+                    }
+                    //otherwise
+                    else {
+                        Room room = new Room(UUID.randomUUID().hashCode(), 0, 100, i, new ArrayList<Crew>(), new ArrayList<Tile>());
+                        room.setTiles(tiles);
+                        rooms.add(room);
+                    }
+                }
+                return new Ship(UUID.randomUUID().hashCode(), username, shipType, 40, 10, 20, 7, 6,
+                        0, 0, 0, overworld.getStartPlanet(), 0, 100, rooms, inventory, false);
             default:
                 return null;
         }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ResponseObject.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ResponseObject.java
index 7320b627f0a527fa282821d6cb279551be395a48..55e1373a7062cc93a2c087e610c4e8326457176d 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ResponseObject.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ResponseObject.java
@@ -4,13 +4,14 @@ import lombok.*;
 
 import javax.persistence.Entity;
 import javax.persistence.Id;
+import java.io.Serializable;
 
 /** Response sent from the server to the client */
 @Getter
 @Setter
 @RequiredArgsConstructor(access = AccessLevel.PUBLIC)
 @Entity
-public class ResponseObject {
+public class ResponseObject implements Serializable {
 
     /** ID */
     @Id
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java
index fa233b26ad99010e8e2ff486670ee4fb920683ba..7577671e356286c89f5a71d0a8e65235df1f9659 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java
@@ -4,6 +4,7 @@ package com.galaxytrucker.galaxytruckerreloaded.Server;
 import com.galaxytrucker.galaxytruckerreloaded.Communication.Client;
 import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.ShipType;
 import com.galaxytrucker.galaxytruckerreloaded.Server.Database.Database;
+import lombok.Setter;
 
 import java.net.ServerSocket;
 import java.net.Socket;
@@ -21,6 +22,7 @@ public class Server implements Runnable{
     private Thread serverThread;
 
     /** ServerServiceCommunicator */
+    @Setter
     private ServerServiceCommunicator serverServiceCommunicator;
 
     /** Server port */
@@ -43,22 +45,6 @@ public class Server implements Runnable{
         }
     }
 
-    /** Main method (TESTING ONLY) */ // TODO REMOVE WHEN DONE
-    public static void main(String[] args){
-        Server server = new Server();
-        server.setPort(5050);
-        server.serverServiceCommunicator = new ServerServiceCommunicator();
-        new Thread(server).start();
-        try {
-            Thread.sleep(1000);
-        }
-        catch (Exception f){
-            f.printStackTrace();
-        }
-        //Client client = new Client("localhost",5050);
-        //boolean a = client.login("ahmad", ShipType.DEFAULT);
-    }
-
     /** Start server on specified port
      * @param port - the port to bind */
     private void bindPort(int port) {
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TraderService.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TraderService.java
index b6f34195bbca401e6aedfe3b9247f578c9c74263..38fd92439ad679a86e13305effba8d8b78063349 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TraderService.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TraderService.java
@@ -121,7 +121,7 @@ public class TraderService extends PlanetEventService {
                 ship.setCoins(shipCoins - crew.getPrice());
                 //List<Crew> shipCrew = ship. TODO wie crew von schiff?
                 //set current Room
-                crew.setCurrentRoom(ship.getSystems().get(0)); //TODO in welchen raum setzen?
+                crew.setCurrentRoom(ship.getSystems().get(0));
                 crew.setAssociatedUser(ship.getAssociatedUser());
                 crewDAO.update(crew);
                 return true;
@@ -133,7 +133,7 @@ public class TraderService extends PlanetEventService {
                     trader.setCrewStock(traderCrew);
                     traderDAO.update(trader);
                     //set current Room
-                    crew.setCurrentRoom(null); //TODO ?
+                    crew.setCurrentRoom(null);
                     crew.setAssociatedUser(user);
                     crewDAO.update(crew);
                     //remove from ship?
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TravelService.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TravelService.java
index 83a26d6907a3030092c2b90ccb1b892a5b948940..1a6a4d36dd80a94f24d5fb1518c4c95e3f2ef13e 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TravelService.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TravelService.java
@@ -40,7 +40,7 @@ public class TravelService {
 //            if (u.getOverworld().getPlanetMap().containsValue(p)) {
 //                return !s.getPlanet().equals(p) && s.getFTLCharge() == 100;
 //            }
-            return false;
+            return true;
         } catch (Exception e) {
             e.printStackTrace();
             return false;
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewDismissButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewSelectButton.java
similarity index 89%
rename from core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewDismissButton.java
rename to core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewSelectButton.java
index df0ca86366ef80273ff45e064bb63b2f050aeff6..a0cb370084c5b26b341a993aad23317f0c716c7d 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewDismissButton.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewSelectButton.java
@@ -15,7 +15,7 @@ import com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation.CrewUI;
 /**
  * Button for dismissing a Crew Member
  */
-public class CrewDismissButton extends ImButton
+public class CrewSelectButton extends ImButton
 {
     /**
      * Background
@@ -38,7 +38,7 @@ public class CrewDismissButton extends ImButton
      *
      * @param crew the crew member
      */
-    public CrewDismissButton(Texture texture, float x, float y, float width, float height, int crew, CrewUI ui) {
+    public CrewSelectButton(Texture texture, float x, float y, float width, float height, int crew, CrewUI ui) {
         super(texture, x, y, width, height);
         this.crewID = crew;
         this.ui = ui;
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/InventoryCloseButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/InventoryCloseButton.java
index dbd1aa5f4932cdf359c00c630ca00f7674968e65..23192191b464be3fffe2ac75d8648c26e696b670 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/InventoryCloseButton.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/InventoryCloseButton.java
@@ -11,6 +11,7 @@ import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button;
 import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton;
 import com.galaxytrucker.galaxytruckerreloaded.View.UI.Events.ShopUI;
 import com.galaxytrucker.galaxytruckerreloaded.View.UI.Inventory.InventoryUI;
+import com.galaxytrucker.galaxytruckerreloaded.View.UI.Map.MapUI;
 
 /**
  * used to close the inventory
@@ -28,6 +29,12 @@ public class InventoryCloseButton extends ImButton {
      */
     private ShopUI shop;
 
+    /**
+     * map ui, if Button on map
+     * otherwise null
+     */
+    private MapUI map;
+
     /**
      * the inventory ui, if button on inventory
      * otherwise null
@@ -45,17 +52,23 @@ public class InventoryCloseButton extends ImButton {
         else if(inventory != null) {
             inventory.disposeInventoryUI();
         }
+
+        else if (map != null) {
+            map.disposeMapUI();
+        }
     }
 
     /**
      * constructor
      * @param ui the shop ui this is on, or null
      * @param inventory the inventory ui this is on, or null
+     * @param map the map ui this is on, or null
      */
-    public InventoryCloseButton(float x, float y, float width, float height, ShopUI ui, InventoryUI inventory) {
+    public InventoryCloseButton(float x, float y, float width, float height, ShopUI ui, InventoryUI inventory, MapUI map) {
         super(new Texture("close_on.png"), x, y, width, height);
         shop = ui;
         this.inventory = inventory;
+        this.map = map;
         this.addListener(new ClickListener() {
             public void clicked(InputEvent event, float x, float y) {
                 leftClick();
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MainMenuButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MainMenuButton.java
index e17a65014d733b58e47683b197aaa4ebc4b762f2..99abf6fba2c6e4fc7689a9c8583ed9f9938915ba 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MainMenuButton.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MainMenuButton.java
@@ -6,6 +6,7 @@ import com.badlogic.gdx.graphics.Texture;
 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 import com.badlogic.gdx.scenes.scene2d.InputEvent;
 import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
+import com.galaxytrucker.galaxytruckerreloaded.Communication.ClientControllerCommunicator;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
 import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button;
 import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton;
@@ -28,7 +29,10 @@ public class MainMenuButton extends ImButton {
      */
     @Override
     public void leftClick() {
-        main.setScreen(new MainMenu(main));
+        boolean success = ClientControllerCommunicator.getInstance(main.getClient()).logout();
+        if(success) {
+            main.setScreen(new MainMenu(main));
+        }
     }
 
     /**
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/TileButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/TileButton.java
new file mode 100644
index 0000000000000000000000000000000000000000..017c85b409dd8c93fdaaca4872e57f8bcd55b348
--- /dev/null
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/TileButton.java
@@ -0,0 +1,38 @@
+package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons;
+
+import com.badlogic.gdx.Input;
+import com.badlogic.gdx.audio.Sound;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
+import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room;
+import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton;
+import com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation.RoomUI;
+
+public class TileButton extends ImButton {
+
+    /**
+     * the click sound
+     */
+    private Sound clickSound;
+
+    private RoomUI ui;
+
+    @Override
+    public void leftClick() {
+        ui.chosen();
+    }
+
+    public TileButton(float x, float y, float width, float height, RoomUI ui) {
+        super(new Texture("ship/tile.png"), x, y, width, height);
+        this.ui = ui;
+
+        this.addListener(new ClickListener() {
+            public void clicked(InputEvent event, float x, float y) {
+                leftClick();
+            }
+        });
+
+        this.getImage().setFillParent(true);
+    }
+}
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/ShipSelectButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/ShipSelectButton.java
deleted file mode 100644
index 9342452ad4612698ddaf5b7ec89ed66fd6b25def..0000000000000000000000000000000000000000
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/ShipSelectButton.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons;
-
-import com.badlogic.gdx.audio.Sound;
-import com.badlogic.gdx.graphics.OrthographicCamera;
-import com.badlogic.gdx.graphics.Texture;
-import com.badlogic.gdx.graphics.g2d.SpriteBatch;
-import com.badlogic.gdx.scenes.scene2d.InputEvent;
-import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
-import com.galaxytrucker.galaxytruckerreloaded.Main;
-import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
-import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.ShipType;
-import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button;
-import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton;
-import com.galaxytrucker.galaxytruckerreloaded.View.Screen.ShipSelector;
-
-/**
- * the button representing one ship in the ship selector
- */
-public class ShipSelectButton extends ImButton {
-
-    /**
-     * Click sound effect
-     */
-    private Sound clickSound;
-
-    /**
-     * the ship this button represents in the ship selector
-     */
-    private ShipType ship;
-
-    /**
-     * the screen this button is on
-     */
-    private ShipSelector screen;
-
-    /**
-     * Left-Click action of the Button.
-     */
-    @Override
-    public void leftClick() {
-        screen.setShip(ship);
-    }
-
-    /**
-     * constructor
-     * @param ship the ship, (index of ship in list in shipselector)
-     * @param screen the screen this button is on
-     */
-    public ShipSelectButton(float x, float y, float width, float height, ShipType ship, ShipSelector screen) {
-        super(new Texture("yes.png"), x, y, width, height);
-        this.screen = screen;
-        this.ship = ship;
-        this.addListener(new ClickListener() {
-            public void clicked(InputEvent event, float x, float y) {
-                leftClick();
-            }
-        });
-    }
-}
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/ChooseDifficultyScreen.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/ChooseDifficultyScreen.java
index e653478a1f8b63d0466c6b86df216b03cdde7b17..b8b5a308511f1f9df964cd3fc4720e0e15d8ad79 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/ChooseDifficultyScreen.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/ChooseDifficultyScreen.java
@@ -205,5 +205,6 @@ public class ChooseDifficultyScreen implements Screen {
     public void dispose() {
         background.dispose();
         stage.dispose();
+        font.dispose();
     }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/CreateOrJoinServer.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/CreateOrJoinServer.java
index d8d69ff8e2ca45bc5789ddda88881070a18c4f32..c00d393a35541b3ce5c94b41155036e58ef13fa7 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/CreateOrJoinServer.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/CreateOrJoinServer.java
@@ -140,10 +140,9 @@ public class CreateOrJoinServer implements Screen {
      * start a game on a new server
      */
     public void startServer() {
-        String[] args = new String[0];
-        Server.main(args);
-        main.setClient(new Client("localhost", 5050));
-        boolean success = ClientControllerCommunicator.getInstance(main.getClient()).login(username);
+        main.startServer();
+        main.startClient();
+        boolean success = ClientControllerCommunicator.getInstance(main.getClient()).login(username, ship, difficulty);
         if(success) {
             main.setScreen(new LobbyScreenHost(main, ship, false, difficulty, username));
         }
@@ -154,7 +153,8 @@ public class CreateOrJoinServer implements Screen {
      * go back to last screen
      */
     public void goBack() {
-        main.setScreen(new ShipSelector(main, false, 0)); //TODO set difficulty once that is a ship attribute
+        main.setScreen(new ShipSelector(main, false, difficulty));
+        dispose();
     }
 
     /**
@@ -221,5 +221,6 @@ public class CreateOrJoinServer implements Screen {
     public void dispose() {
         background.dispose();
         stage.dispose();
+        font.dispose();
     }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/GamePlay.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/GamePlay.java
index 866edcb88229e4d26f6e2072cc00c55dbc86dfc7..8aa52d0018223567eec46cf5f4ef0bf044424156 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/GamePlay.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/GamePlay.java
@@ -10,15 +10,16 @@ import com.badlogic.gdx.graphics.Texture;
 import com.badlogic.gdx.scenes.scene2d.Stage;
 import com.badlogic.gdx.utils.viewport.FitViewport;
 import com.badlogic.gdx.utils.viewport.Viewport;
+import com.galaxytrucker.galaxytruckerreloaded.Controller.CrewController;
+import com.galaxytrucker.galaxytruckerreloaded.Controller.TravelController;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew;
-import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Map.PlanetEvent;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader;
-import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
 import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room;
-import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.ShipType;
+import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.System;
+import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.SystemType;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon;
 import com.galaxytrucker.galaxytruckerreloaded.View.UI.Events.EventGUI;
 import com.galaxytrucker.galaxytruckerreloaded.View.UI.Events.GameOver;
@@ -27,7 +28,6 @@ import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.*;
 import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.EnemyShip;
 import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView;
 
-import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -121,6 +121,8 @@ public class GamePlay implements Screen {
      */
     private Stage pauseStage;
 
+    private Stage tileStage;
+
     /**
      * the viewport
      */
@@ -131,6 +133,13 @@ public class GamePlay implements Screen {
      */
     private PauseMenuUI pauseMenuUI;
 
+    /**
+     * whether or not a crew member was chosen to be moved
+     */
+    private boolean crewMoving = false;
+
+    private Crew chosenCrew;
+
     /**
      * Constructor
      *
@@ -141,48 +150,15 @@ public class GamePlay implements Screen {
         background = new Texture("1080p.png");
 
         viewport = new FitViewport(main.WIDTH, main.HEIGHT);
-        stage = new Stage(viewport);
-        pauseStage = new Stage(viewport);
+        stage = new Stage(viewport, main.batch);
+        pauseStage = new Stage(viewport, main.batch);
+        tileStage = new Stage(viewport, main.batch);
 
-        player = new ShipView(main, fakeShip(), stage, fakeMap(), this); //TODO wie schiff aus controller?
+        player = new ShipView(main, main.getClient().getMyShip(), stage, tileStage, main.getClient().getOverworld(), this);
 
         Gdx.input.setInputProcessor(stage);
     }
 
-    //TODO only for testing
-    public Ship fakeShip(){
-        Trader trader = new Trader();
-        //Planet planet = new Planet("planet", 125f, 125f, PlanetEvent.SHOP, false, new LinkedList<>(), trader);
-        Planet planet = new Planet();
-        List<Room> rooms = new LinkedList<>();
-//        rooms.add(new BlankRoom());
-//        rooms.add(new BlankRoom());
-//        rooms.add(new BlankRoom());
-        List<Weapon> weapons = new LinkedList<>();
-//        weapons.add(new LaserBlaster("karl"));
-//        weapons.add(new LaserBlaster("test"));
-        return new Ship(1, "aaron", ShipType.DEFAULT, 100, 49, 5, 5, 7, 9, 23, 6f, planet, 6, 6, rooms, weapons, false);
-    }
-
-    /**
-     * später durch laden aus controller ersetzen
-     */
-    public Overworld fakeMap() {
-        Overworld res = new Overworld(2, 1, "aaron");
-        HashMap<String, Planet> hmap = new HashMap<>();
-        Planet sp = new Planet(0, "planet1", (float) 78, (float) 199, PlanetEvent.SHOP, new LinkedList<Ship>());
-        String f = "78, 199";
-        hmap.put(f, sp);
-        Planet sp1 = new Planet(1, "planet2", (float) 200, (float) 154, PlanetEvent.COMBAT, new LinkedList<Ship>());
-        String f1 = "200, 154";
-        hmap.put(f1, sp1);
-        //TODO
-        //res.setPlanetMap(hmap);
-        res.setStartPlanet(sp);
-
-        return res;
-    }
-
 
     @Override
     public void show() {
@@ -215,6 +191,7 @@ public class GamePlay implements Screen {
         else if(optionUI != null) { optionUI.render(); }
         else if(pauseMenuUI != null) { pauseMenuUI.render(); }
 
+
         stage.draw();
     }
 
@@ -241,6 +218,10 @@ public class GamePlay implements Screen {
             Gdx.input.setInputProcessor(pauseStage);
             createPauseMenu();
         }
+        if(crewMoving && Gdx.input.isKeyJustPressed(Input.Keys.SPACE)) {
+            Gdx.input.setInputProcessor(stage);
+            crewMoving = false;
+        }
     }
 
     /**
@@ -268,7 +249,7 @@ public class GamePlay implements Screen {
      * @return whether or not it is a valid request
      */
     public boolean travel(Planet planet) {
-        boolean success = true; //TODO call to controller
+        boolean success = TravelController.getInstance(null).travel(planet); //Communicator can be null since already created, so never used
         if(success) {
             createEvent(planet.getEvent());
             if(planet.getEvent() == PlanetEvent.SHOP) {
@@ -531,14 +512,46 @@ public class GamePlay implements Screen {
      * @param crew the id of the crew member
      * @param room the new room
      */
-    public void crewMoved(int crew, Room room) {} //call controller, ask for permission
+    private void crewMoved(Crew crew, Room room) {
+        boolean success = CrewController.getInstance(null).moveCrewToRoom(crew, room);
+        if(success) {
+            player.crewMoved(crew, room);
+        }
+    }
+
+    /**
+     * a crew member was chosen to be moved.
+     * @param crew the crew member
+     */
+    public void crewMoving(Crew crew) {
+        crewMoving = !crewMoving;
+        if(crewMoving) {
+            Gdx.input.setInputProcessor(tileStage);
+            chosenCrew = crew;
+        }
+        else {
+            Gdx.input.setInputProcessor(stage);
+            chosenCrew = null;
+        }
+    }
+
+    /**
+     * a room was chosen with the tile buttons
+     * @param room the room that was chosen
+     */
+    public void roomChosen(Room room) {
+        if(crewMoving && chosenCrew != null) {
+            crewMoved(chosenCrew, room);
+            Gdx.input.setInputProcessor(stage);
+        }
+    }
 
     /**
      * update the health of a crew member
      * @param crew the crew member
      * @param health the new health
      */
-    public void crewHealth(int crew, int health) { player.crewHealth(crew, health); }
+    public void crewHealth(Crew crew, int health) { player.crewHealth(crew, health); }
 
     /**
      * update the energy status of the overall energy not yet assigned to a system
@@ -556,7 +569,7 @@ public class GamePlay implements Screen {
      * the player has chosen a new amount of energy for a system
      * @param amount how much should be subtracted/added
      */
-    public void roomSystemEnergyChosen(int id, int amount) {
+    public void roomSystemEnergyChosen(Room room, int amount) {
         //call controller
     }
 
@@ -564,17 +577,17 @@ public class GamePlay implements Screen {
      * the energy for a system is updated
      * @param amount the new total amount
      */
-    public void roomSystemEnergyUpdate(int id, int amount) {
-        player.roomSystemEnergyUpdate(id, amount);
+    public void roomSystemEnergyUpdate(Room room, int amount) {
+        player.roomSystemEnergyUpdate(room, amount);
     }
 
     /**
      * update the status of a system
-     * @param id the id of the system
+     * @param room the system
      * @param amount the new status
      */
-    public void roomSystemStatusUpdate(int id, int amount) {
-        player.roomSystemStatusUpdate(id, amount);
+    public void roomSystemStatusUpdate(Room room, int amount) {
+        player.roomSystemStatusUpdate(room, amount);
     }
 
     /**
@@ -596,44 +609,50 @@ public class GamePlay implements Screen {
 
     /**
      * load the crew of a ship
-     * @param shipId the ship id
      * @return the crew members
      */
-    public List<Crew> loadCrew(int shipId) {  //TODO call controller
-//        List<Crew> result = new LinkedList<>();
-//        Crew c1 = new Crew(1, "ana", 7, 10);
-//        result.add(c1);
-//        Crew c2 = new Crew(2, "battle", 8, 10);
-//        result.add(c2);
-//        return result;
-        return null;
+    public List<Crew> loadCrew() {
+        List<Crew> crew = new LinkedList<>();
+        List<Room> rs = main.getClient().getMyShip().getSystems();
+        for(Room r : rs) {
+            crew.addAll(r.getCrew());
+        }
+        return crew;
     }
 
     /**
      * load the weapons of a ship
-     * @param shipId the ship id
      * @return the weapons of the ship in a list
      */
-    public List<Weapon> loadWeapons(int shipId) {
+    public List<Weapon> loadWeapons() {
         List<Weapon> weapons = new LinkedList<>();
-//        weapons.add(new LaserBlaster("karl"));
-//        weapons.add(new LaserBlaster("test"));
+        weapons.addAll(main.getClient().getMyShip().getInventory());
+        for(Room r : main.getClient().getMyShip().getSystems()) {
+            if(r instanceof System) {
+                if(((System) r).getSystemType() == SystemType.WEAPON_SYSTEM) {
+                    weapons.addAll(((System) r).getShipWeapons());
+                }
+            }
+        }
+        //BIS HIER LÖSCHEN
         return weapons;
     }
 
     /**
      * load the missiles of a ship
-     * @param shipId the id of the ship
      * @return the amount of missiles
      */
-    public int loadMissiles(int shipId) { return 0; }
+    public int loadMissiles() {
+        return main.getClient().getMyShip().getMissiles();
+    }
 
     /**
      * load the fuel of a ship
-     * @param shipId the id of the ship
      * @return the amount of fuel
      */
-    public int loadFuel(int shipId) { return 0; }
+    public int loadFuel() {
+        return main.getClient().getMyShip().getFuel();
+    }
 
     @Override
     public void pause() {
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LobbyScreenHost.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LobbyScreenHost.java
index 2f4a0ac33f40de169be08736b4ca18f02851d8f4..b556ed2aa55d39ea52743f66b0ca4a5a91b94abb 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LobbyScreenHost.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LobbyScreenHost.java
@@ -1,5 +1,6 @@
 package com.galaxytrucker.galaxytruckerreloaded.View.Screen;
 
+import com.badlogic.gdx.Game;
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.Screen;
 import com.badlogic.gdx.files.FileHandle;
@@ -166,7 +167,7 @@ public class LobbyScreenHost implements Screen {
      * continue the game with the players that are in the lobby
      */
     public void resumeGame() {
-
+        main.setScreen(new GamePlay(main)); //TODO irgendwas an server kommunizieren?
     }
 
     /**
@@ -239,5 +240,6 @@ public class LobbyScreenHost implements Screen {
     public void dispose() {
         background.dispose();
         stage.dispose();
+        font.dispose();
     }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LobbyScreenNormal.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LobbyScreenNormal.java
index 568a7b4f631a7145cdd3b04b1c200703ce5e6646..8f35b6561c16d90ea7078223fac548188453b162 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LobbyScreenNormal.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LobbyScreenNormal.java
@@ -231,6 +231,7 @@ public class LobbyScreenNormal implements Screen {
     public void dispose() {
         background.dispose();
         stage.dispose();
+        font.dispose();
     }
 
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LoginScreen.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LoginScreen.java
index 29bbf7e0084ffa5696b1080b04970dce436f17b5..1a49735d4799ba19b2b057fca4c834315edf4f08 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LoginScreen.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LoginScreen.java
@@ -83,6 +83,16 @@ public class LoginScreen implements Screen {
      */
     private LoginBackButton backButton;
 
+    /**
+     * the glyphlayout for the server address, if multiplayer
+     * */
+    private GlyphLayout glyph2 = new GlyphLayout();
+
+    /**
+     * the server address field, if multiplayer
+     */
+    private TextField address;
+
     /**
      * Constructor
      *
@@ -124,6 +134,16 @@ public class LoginScreen implements Screen {
         stage.addActor(username);
         stage.addActor(backButton);
 
+        if(!singleplayer) {
+            address = new TextField("", skin);
+            address.setSize(248, 50);
+            address.setPosition(main.WIDTH/2 - username.getWidth()/2, main.HEIGHT/2 + 100);
+            stage.addActor(address);
+
+            glyph2.setText(font, "Please enter the server address"); //localhost if you are host
+
+        }
+
         Gdx.input.setInputProcessor(stage);
     }
 
@@ -147,6 +167,9 @@ public class LoginScreen implements Screen {
         main.batch.begin();
         main.batch.draw(background, 0, 0, main.WIDTH, main.HEIGHT);
         font.draw(main.batch, glyph, main.WIDTH/2 - glyph.width/2, main.HEIGHT/2 + 50);
+        if(!singleplayer) {
+            font.draw(main.batch, glyph2, main.WIDTH/2 - glyph2.width/2, main.HEIGHT/2 + 250);
+        }
         main.batch.end();
         stage.draw();
     }
@@ -175,6 +198,7 @@ public class LoginScreen implements Screen {
     public void dispose() {
         background.dispose();
         stage.dispose();
+        font.dispose();
     }
 
     /**
@@ -182,24 +206,32 @@ public class LoginScreen implements Screen {
      */
     public void login() {
         String name = username.getText();
-        ShipType ship = ShipType.DEFAULT;
 
         if(singleplayer) {
-            String[] args = new String[0];
-            Server.main(args);
-            main.setClient(new Client("localhost", 5050));
-            boolean success = ClientControllerCommunicator.getInstance(main.getClient()).login(username.getText());
+            main.startClient();
+            boolean success = ClientControllerCommunicator.getInstance(main.getClient()).login(name, ShipType.DEFAULT, 0); //ShipType sowieso irrelevant, da kein neues schiff erstellt wird
             if(success) {
-                main.setScreen(new SPResumeLobby(main, singleplayer));
+                main.setScreen(new SPResumeLobby(main));
+                dispose();
             }
         }
         else {
-            boolean host = false; //whether or not the player was host last time?
-            if(host) {
-                main.setScreen(new LobbyScreenHost(main, ship, true, 0, name)); //TODO diff von server laden
+            if(address.getText().equals("localhost") || address.getText().equals("127.0.0.1"))
+            {
+                main.startClient();
+                boolean success = ClientControllerCommunicator.getInstance(main.getClient()).login(name, ShipType.DEFAULT, 0);
+                if(success) {
+                    main.setScreen(new LobbyScreenHost(main, main.getClient().getMyShip().getShipType(), true, 0, name)); //TODO diff von server laden
+                    dispose();
+                }
             }
             else {
-                main.setScreen(new LobbyScreenHost(main, ship, true, 0, name));
+                main.startClient();
+                boolean success = ClientControllerCommunicator.getInstance(main.getClient()).login(name, ShipType.DEFAULT, 0);
+                if(success) {
+                    main.setScreen(new LobbyScreenHost(main, main.getClient().getMyShip().getShipType(), true, 0, name));
+                    dispose();
+                }
             }
         }
     }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/SPResumeLobby.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/SPResumeLobby.java
index 31de98cbe35f2cc4195809c7a9bb1e7eb0829748..e1c9c59e0d63a1e7edbf3fb2fa2eea887e37cb6c 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/SPResumeLobby.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/SPResumeLobby.java
@@ -12,6 +12,7 @@ import com.badlogic.gdx.scenes.scene2d.Stage;
 import com.badlogic.gdx.utils.viewport.FitViewport;
 import com.badlogic.gdx.utils.viewport.Viewport;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
+import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.ShipType;
 import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.*;
 import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.*;
 
@@ -82,14 +83,11 @@ public class SPResumeLobby implements Screen {
      */
     private String seedName = "TestSeed";
 
-    private boolean singleplayer;
-
     private SPResumeLobbyBackButton spResumeLobbyBackButton;
 
     /** Constructor  */
-    public SPResumeLobby(Main main, boolean singleplayer){
+    public SPResumeLobby(Main main){
         this.main = main;
-        this.singleplayer = singleplayer;
         background = new Texture("1080p.png");
 
         spResumeStartGame = new SPResumeStartGame(7*main.WIDTH/8 - 124, main.HEIGHT/8 , 248, 50, this);
@@ -108,9 +106,9 @@ public class SPResumeLobby implements Screen {
         params.size = 15;
 
         font = generator.generateFont(params);
-        glyph.setText(font, "Your Ship: " + shipName);
-        glyph2.setText(font, "Your Difficulty: " + difficultyName);
-        glyph3.setText(font, "Your Seed: " + seedName);
+        glyph.setText(font, "Your Ship: " + main.getClient().getMyShip().getShipType());
+        glyph2.setText(font, "Your Difficulty: " + main.getClient().getOverworld().getDifficulty());
+        glyph3.setText(font, "Your Seed: " + main.getClient().getOverworld().getSeed());
 
         viewport = new FitViewport(main.WIDTH, main.HEIGHT);
         stage = new Stage(viewport);
@@ -185,6 +183,7 @@ public class SPResumeLobby implements Screen {
     public void dispose() {
         background.dispose();
         stage.dispose();
+        font.dispose();
     }
 
     /**
@@ -199,7 +198,7 @@ public class SPResumeLobby implements Screen {
      * go back to previous screen
      */
     public void goBack() {
-        main.setScreen(new LoginScreen(main, singleplayer));
+        main.setScreen(new LoginScreen(main, true));
         dispose();
     }
 
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/SelectLobbyScreen.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/SelectLobbyScreen.java
index efc4aaf9228d36241eae7648a790061fbd1d84ef..3662c41044e0dfa0272a4adc121b2c9ecace54e2 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/SelectLobbyScreen.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/SelectLobbyScreen.java
@@ -136,8 +136,8 @@ public class SelectLobbyScreen implements Screen {
      * join a lobby by taking the text from the text field
      */
     public void joinLobby() {
-        main.setClient(new Client(lobby.getText(), 5050));
-        boolean success = ClientControllerCommunicator.getInstance(main.getClient()).login(username);
+        main.startClient();
+        boolean success = ClientControllerCommunicator.getInstance(main.getClient()).login(username, ship, difficulty);
         if(success) {
             main.setScreen(new LobbyScreenNormal(main, ship, false, difficulty, username));
         }
@@ -217,5 +217,6 @@ public class SelectLobbyScreen implements Screen {
     public void dispose() {
         background.dispose();
         stage.dispose();
+        font.dispose();
     }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/ShipSelector.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/ShipSelector.java
index 274a873ed23a929a7883b06c51954c882658f449..63cc65d9024d7e8f39d10419f209ecccfbdf9b9a 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/ShipSelector.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/ShipSelector.java
@@ -17,17 +17,12 @@ import com.badlogic.gdx.utils.viewport.Viewport;
 import com.galaxytrucker.galaxytruckerreloaded.Communication.Client;
 import com.galaxytrucker.galaxytruckerreloaded.Communication.ClientControllerCommunicator;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
-import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
 import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.ShipType;
 import com.galaxytrucker.galaxytruckerreloaded.Server.Server;
 import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.CreateGameButton;
-import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.ShipSelectButton;
 import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.ShipSelectorBackButton;
 import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ShipSelectorButtons.LeftArrowButton;
 import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ShipSelectorButtons.RightArrowButton;
-import org.h2.index.RangeIndex;
-
-import java.util.List;
 
 /**
  * Ship selector screen when creating new game
@@ -49,16 +44,6 @@ public class ShipSelector implements Screen {
      */
     private Stage stage;
 
-    /**
-     * the textures of the ships to choose from
-     */
-    private List<Texture> ships;
-
-    /**
-     * the buttons for the ships
-     */
-    private List<ShipSelectButton> shipButtons;
-
     /**
      * button to create game
      */
@@ -121,10 +106,6 @@ public class ShipSelector implements Screen {
 
     private Image shipImage;
 
-    private String[] shipList = {"ship/kestral/kestral_base.png", "ship/anaerobic/an2base.png", "ship/fed/fed_cruiser_2_base.png"};
-
-    private int currentShip = 0;
-
     /** Constructor
      * @param main - main class */
     public ShipSelector(Main main, boolean singleplayer, int difficulty){
@@ -163,7 +144,9 @@ public class ShipSelector implements Screen {
         leftArrowButton = new LeftArrowButton(main.WIDTH/4 -30 , main.HEIGHT/2-25+100, 60, 50, this);
         rightArrowButton = new RightArrowButton(3*main.WIDTH/4 -30 , main.HEIGHT/2-25+100, 60, 50, this);
 
-        shipImage = new Image(new Texture(shipList[currentShip]));
+
+        ship = ShipType.DEFAULT;
+        shipImage = new Image(new Texture("ship/" + ship.toString().toLowerCase() + "base.png"));
         shipImage.setPosition(main.WIDTH/2 - shipImage.getWidth()/2, main.HEIGHT/2 - shipImage.getHeight()/2+100);
 
         stage.addActor(shipImage);
@@ -173,7 +156,6 @@ public class ShipSelector implements Screen {
         stage.addActor(leftArrowButton);
         stage.addActor(rightArrowButton);
 
-        //get ships from server, for each one texture and one button
 
         Gdx.input.setInputProcessor(stage);
     }
@@ -210,7 +192,7 @@ public class ShipSelector implements Screen {
         leftArrowButton = new LeftArrowButton(main.WIDTH/4 -30 , main.HEIGHT/2-25+100, 60, 50, this);
         rightArrowButton = new RightArrowButton(3*main.WIDTH/4 -30 , main.HEIGHT/2-25+100, 60, 50, this);
 
-        shipImage = new Image(new Texture(shipList[currentShip]));
+        shipImage = new Image(new Texture("ship/" + ship.toString().toLowerCase() + "base.png"));
         shipImage.setPosition(main.WIDTH/2 - shipImage.getWidth()/2, main.HEIGHT/2 - shipImage.getHeight()/2+100);
 
         stage.addActor(shipImage);
@@ -220,8 +202,6 @@ public class ShipSelector implements Screen {
         stage.addActor(leftArrowButton);
         stage.addActor(rightArrowButton);
 
-        //get ships from server, for each one texture and one button
-
         Gdx.input.setInputProcessor(stage);
     }
 
@@ -274,15 +254,7 @@ public class ShipSelector implements Screen {
     public void dispose() {
         background.dispose();
         stage.dispose();
-    }
-
-    /**
-     * the ship is selected
-     * @param ship the index of the ship in the list of possible ships
-     */
-    public void setShip(ShipType ship) {
-        this.ship = ship;
-        //TODO set difficulty
+        font.dispose();
     }
 
     /**
@@ -290,10 +262,9 @@ public class ShipSelector implements Screen {
      */
     public void startGame() {
         if(singleplayer) {
-            String[] args = new String[0];
-            Server.main(args);
-            main.setClient(new Client("localhost", 5050));
-            boolean success = ClientControllerCommunicator.getInstance(main.getClient()).login(username.getText());
+            main.startServer();
+            main.startClient();
+            boolean success = ClientControllerCommunicator.getInstance(main.getClient()).login(username.getText(), ship, difficulty);
             if(success) {
                 main.setScreen(new GamePlay(main)); //TODO ?
             }
@@ -308,24 +279,16 @@ public class ShipSelector implements Screen {
      * shows the next ship in shipselector
      */
     public void nextShip() {
-        currentShip +=1;
-        if(currentShip > shipList.length-1){
-            currentShip = 0;
-        }
+        ship = ship.next();
         dispose();
         prepareUI();
-        //TODO Liste von SHips, die man durchschaltet
     }
 
     /**
      * shows the prev ship in shipselector
      */
     public void prevShip() {
-        //TODO Liste von SHips, die man durchschaltet
-        currentShip -=1;
-        if(currentShip < 0){
-            currentShip = shipList.length-1;
-        }
+        ship = ship.previous();
         dispose();
         prepareUI();
     }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/ShopUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/ShopUI.java
index 76cc4f212db079d5c563f108a2c5932fa9bcc5c2..caf1f2c330da6716ae362342e7ec79bbc2ca89b3 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/ShopUI.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/ShopUI.java
@@ -97,7 +97,7 @@ public class ShopUI {
             sellElements.add(new ShopSellElement(main, stage, new Texture("laser.png"), 0, 0, this, w, 0));
         }
 
-        closeButton = new InventoryCloseButton(0, 0, 10, 10, this, null);
+        closeButton = new InventoryCloseButton(0, 0, 10, 10, this, null, null);
         stage.addActor(closeButton);
 
         background = new Texture("shop/storeback.png");
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryCrewSlotUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryCrewSlotUI.java
index 23202b09d033832ca2bbc65983bbc92572a5da11..d37acddec84fde9af426114f4aa91fde27aa06f4 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryCrewSlotUI.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryCrewSlotUI.java
@@ -2,8 +2,10 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.Inventory;
 
 import com.badlogic.gdx.graphics.Texture;
 
-import java.util.LinkedList;
 import java.util.List;
+
+import com.badlogic.gdx.graphics.g2d.BitmapFont;
+import com.badlogic.gdx.graphics.g2d.GlyphLayout;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew;
 
@@ -27,11 +29,6 @@ public class InventoryCrewSlotUI extends InventorySlotUI {
      */
     private Texture healthBox;
 
-    /**
-     * the name of the crew member
-     */
-    private String name;
-
     /**
      * the health of the crew member
      */
@@ -44,15 +41,34 @@ public class InventoryCrewSlotUI extends InventorySlotUI {
 
     private int currTexture;
 
+    private GlyphLayout glyphName = new GlyphLayout();
+
+    private GlyphLayout glyphEngine = new GlyphLayout();
+
+    private GlyphLayout glyphWeapon = new GlyphLayout();
+
+    private GlyphLayout glyphShield = new GlyphLayout();
+
+    private GlyphLayout glyphRepair = new GlyphLayout();
+
+    private GlyphLayout glyphCombat = new GlyphLayout();
+
     /**
      * Constructor
      *
      * @param main - main class
      */
-    public InventoryCrewSlotUI(Main main, Crew crew, float x, float y) {
-        super(main, x, y);
+    public InventoryCrewSlotUI(Main main, Crew crew, float x, float y, BitmapFont font) {
+        super(main, x, y, font);
+
+        glyphName.setText(font, crew.getName());
+        List<Integer> stats = crew.getStats();
+        glyphEngine.setText(font, "Engine: "+stats.get(0));
+        glyphWeapon.setText(font, "Weapon: "+stats.get(1));
+        glyphShield.setText(font, "Shield: "+stats.get(2));
+        glyphRepair.setText(font, "Repair: "+stats.get(3));
+        glyphCombat.setText(font, "Combat: "+stats.get(4));
 
-        name = crew.getName();
         health = crew.getHealth();
         maxhealth = crew.getMaxhealth();
         currTexture = (int) (((float) health/maxhealth) * 10);
@@ -78,6 +94,12 @@ public class InventoryCrewSlotUI extends InventorySlotUI {
     public void render() {
         super.render();
         main.batch.begin();
+        font.draw(main.batch, glyphName, posX+72, posY + 50);
+        font.draw(main.batch, glyphEngine, posX+72, posY + 30);
+        font.draw(main.batch, glyphWeapon, posX+72, posY + 10);
+        font.draw(main.batch, glyphShield, posX+200, posY + 50);
+        font.draw(main.batch, glyphRepair, posX+200, posY + 30);
+        font.draw(main.batch, glyphCombat, posX+200, posY + 10);
         main.batch.draw(crewTexture, posX, posY, 72, 72); //48
         main.batch.draw(healthBox, posX+5, posY-15, 50, 15);
         float x = posX+11;
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryIntSlotUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryIntSlotUI.java
index 3590eb42144ec465e9500cc94a4103c14ce96b7f..51634067637de66e42dc3c0239fb8e2fe28b6561 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryIntSlotUI.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryIntSlotUI.java
@@ -1,35 +1,26 @@
 package com.galaxytrucker.galaxytruckerreloaded.View.UI.Inventory;
 
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.Color;
 import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.BitmapFont;
+import com.badlogic.gdx.graphics.g2d.GlyphLayout;
+import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
 
 public class InventoryIntSlotUI extends InventorySlotUI {
 
-    /**
-     * the value of the thing
-     */
-    private int value;
-
-    /**
-     * the texture
-     */
-    private Texture texture;
-
-    /**
-     * the text explaining what this inventory slot represents
-     */
-    private String text;
+    private GlyphLayout glyphLayout = new GlyphLayout();
 
     /**
      * Constructor
      *
      * @param main - main class
      */
-    public InventoryIntSlotUI(Main main, int value, float x, float y, String text) {
-        super(main, x, y);
-        this.value = value;
-        this.text = text;
-        //texture = new Texture();
+    public InventoryIntSlotUI(Main main, int value, float x, float y, String text, BitmapFont font) {
+        super(main, x, y, font);
+
+        glyphLayout.setText(font, text + ": " + value);
     }
 
     /**
@@ -38,18 +29,6 @@ public class InventoryIntSlotUI extends InventorySlotUI {
     @Override
     public void disposeInventorySlotUI() {
         super.disposeInventorySlotUI();
-        //texture.dispose();
-    }
-
-    /**
-     * render
-     * without stage stuff
-     */
-    public void render() {
-        super.render();
-        /*main.batch.begin();
-        main.batch.draw(texture, 0, 0, 0, 0);//TODO whxy
-        main.batch.end();*/
     }
 
     /**
@@ -67,4 +46,15 @@ public class InventoryIntSlotUI extends InventorySlotUI {
     public void hideInventorySlotUI() {
 
     }
+
+    /**
+     * render
+     * without stage stuff
+     */
+    public void render() {
+        super.render();
+        main.batch.begin();
+        font.draw(main.batch, glyphLayout, posX, posY);
+        main.batch.end();
+    }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventorySlotUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventorySlotUI.java
index ae6f80c72b99524701036634ce483301dd948fa2..c92c374578411c6f1dd4db5b04b996f5defb5584 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventorySlotUI.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventorySlotUI.java
@@ -1,8 +1,12 @@
 package com.galaxytrucker.galaxytruckerreloaded.View.UI.Inventory;
 
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.Color;
 import com.badlogic.gdx.graphics.OrthographicCamera;
 import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.BitmapFont;
 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
 
 public abstract class InventorySlotUI {
@@ -17,25 +21,21 @@ public abstract class InventorySlotUI {
      */
     protected float posY;
 
-    /**
-     * Inventory slot background
-     */
-    private Texture inventorySlotTexture;
-
     protected Main main;
 
+    protected BitmapFont font;
+
     /**
      * Constructor
      *
      * @param main - main class
      */
-    public InventorySlotUI(Main main, float x, float y) {
+    public InventorySlotUI(Main main, float x, float y, BitmapFont font) {
         this.main = main;
+        this.font = font;
 
         posX = x;
         posY = y;
-
-        //inventorySlotTexture = new Texture();
     }
 
     /**
@@ -43,9 +43,6 @@ public abstract class InventorySlotUI {
      * without stage stuff
      */
     public void render() {
-        /*main.batch.begin();
-        main.batch.draw(inventorySlotTexture, posX, posY, 0, 0); //TODO wh
-        main.batch.end();*/
     }
 
     /**
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryUI.java
index 1f5804f9454689358d5a9e56261470c2b10b1f26..b42d1427ccffd673437c47bca1ccf26411c5cb13 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryUI.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryUI.java
@@ -2,6 +2,7 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.Inventory;
 
 
 import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.BitmapFont;
 import com.badlogic.gdx.scenes.scene2d.Stage;
 
 import java.util.LinkedList;
@@ -44,7 +45,7 @@ public class InventoryUI {
      * @param crew the crew members
      * @param weapons the weapons
      */
-    public InventoryUI(Main main, List<Crew> crew, List<Weapon> weapons, int fuel, int missiles, Stage stage, ShipView shipView) {
+    public InventoryUI(Main main, List<Crew> crew, List<Weapon> weapons, int fuel, int missiles, Stage stage, ShipView shipView, BitmapFont font) {
         this.main = main;
         this.stage = stage;
         this.shipView = shipView;
@@ -54,24 +55,24 @@ public class InventoryUI {
         x = main.WIDTH/2 - inventoryBackground.getWidth()/2;
         y = main.HEIGHT/2 - inventoryBackground.getHeight()/2;
 
-        closeButton = new InventoryCloseButton(x+750, y+5, 248, 50, null, this);
+        closeButton = new InventoryCloseButton(x+700, y+15, 248, 50, null, this, null);
         stage.addActor(closeButton);
 
         slots = new LinkedList<>();
         float cx = x + 25;
         float cy = y + 560;
         for(Crew c : crew) {
-            slots.add(new InventoryCrewSlotUI(main, c, cx, cy));
+            slots.add(new InventoryCrewSlotUI(main, c, cx, cy, font));
             cy -= 80;
         }
-        float wy = y + 550;
-        float wx = cx + 200;
+        float wy = y + 525;
+        float wx = cx + 400;
         for(Weapon w : weapons) {
-            slots.add(new InventoryWeaponSlotUI(main, w, wx, wy));
-            wy -=90;
+            slots.add(new InventoryWeaponSlotUI(main, w, wx, wy, font));
+            wy -=100;
         }
-        slots.add(new InventoryIntSlotUI(main, fuel, wx+200, y+550, "fuel")); //TODO xy
-        slots.add(new InventoryIntSlotUI(main, missiles, wx+200, y+750, "missiles")); //TODO xy
+        slots.add(new InventoryIntSlotUI(main, fuel, x+50, y+50, "fuel", font));
+        slots.add(new InventoryIntSlotUI(main, missiles, x+150, y+50, "missiles", font));
     }
 
     /**
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryWeaponSlotUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryWeaponSlotUI.java
index 30d01ad6b4f48b1af18891744147144c61afded1..c817bb766c7ba52bed6a162e1525e7221948092a 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryWeaponSlotUI.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryWeaponSlotUI.java
@@ -1,6 +1,8 @@
 package com.galaxytrucker.galaxytruckerreloaded.View.UI.Inventory;
 
 import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.BitmapFont;
+import com.badlogic.gdx.graphics.g2d.GlyphLayout;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon;
 
@@ -11,41 +13,32 @@ public class InventoryWeaponSlotUI extends InventorySlotUI {
      */
     private Texture weaponTexture;
 
-    /** Weapon damage */
-    private int damage;
+    private GlyphLayout glyphDamage = new GlyphLayout();
+    private GlyphLayout glyphCooldown = new GlyphLayout();
+    private GlyphLayout glyphMissile = new GlyphLayout();
+    private GlyphLayout glyphCrewDamage = new GlyphLayout();
+    private GlyphLayout glyphBurst = new GlyphLayout();
+    private GlyphLayout glyphPrecision = new GlyphLayout();
 
-    /** Weapon coolDown */
-    private int cooldown;
-
-    /** Weapon energy */
-    private int energy;
-
-    private int missileCost;
-    private float dropchance;
-    private int crewdamage;
-    /**
-     * How many projectiles are fired per burst
-     */
-    private int burst;
-    private float precision;
+    private GlyphLayout glyphName = new GlyphLayout();
 
     /**
      * constructor
      * @param main the main class
      * @param weapon the weapon to be displayed
      */
-    public InventoryWeaponSlotUI(Main main, Weapon weapon, float x, float y) {
-        super(main, x, y);
-        damage = weapon.getDamage();
-        cooldown = weapon.getCooldown();
-        energy = weapon.getEnergy();
-        missileCost = weapon.getMissileCost();
-        dropchance = weapon.getDropChance();
-        crewdamage = weapon.getCrewDamage();
-        burst = weapon.getBurst();
-        precision = weapon.getAccuracy();
-
-        weaponTexture = new Texture("shipsys/weapon/laser.png");
+    public InventoryWeaponSlotUI(Main main, Weapon weapon, float x, float y, BitmapFont font) {
+        super(main, x, y, font);
+        glyphDamage.setText(font, "Damage: "+weapon.getDamage());
+        glyphCooldown.setText(font, "Cooldown: "+weapon.getCooldown());
+        glyphMissile.setText(font, "Missile Cost: "+weapon.getMissileCost());
+        glyphCrewDamage.setText(font, "Crew Damage: "+weapon.getCrewDamage());
+        glyphBurst.setText(font, "Burst: "+weapon.getBurst());
+        glyphPrecision.setText(font, "Precision: "+weapon.getAccuracy());
+
+        String name = weapon.getWeaponName();
+        weaponTexture = new Texture("shipsys/weapon_system/"+name.toLowerCase()+".png");
+        glyphName.setText(font, name);
     }
 
     /**
@@ -60,7 +53,14 @@ public class InventoryWeaponSlotUI extends InventorySlotUI {
     public void render() {
         super.render();
         main.batch.begin();
-        main.batch.draw(weaponTexture, posX, posY, 22, 67);
+        font.draw(main.batch, glyphName, posX, posY + weaponTexture.getHeight() + 25);
+        font.draw(main.batch, glyphBurst, posX+72, posY+60);
+        font.draw(main.batch, glyphCooldown, posX+72, posY+40);
+        font.draw(main.batch, glyphCrewDamage, posX+72, posY+20);
+        font.draw(main.batch, glyphDamage, posX+220, posY+60);
+        font.draw(main.batch, glyphMissile, posX+220, posY+40);
+        font.draw(main.batch, glyphPrecision, posX+220, posY+20);
+        main.batch.draw(weaponTexture, posX, posY, weaponTexture.getWidth(), weaponTexture.getHeight());
         main.batch.end();
     }
 
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Map/MapUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Map/MapUI.java
index 8a931283178ff677bfa695b5f8cfa5817852cd0a..7ff37f1832e1cc1a8d1d8044587d0e853c756f6b 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Map/MapUI.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Map/MapUI.java
@@ -5,6 +5,7 @@ import com.badlogic.gdx.scenes.scene2d.Stage;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet;
+import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.InventoryCloseButton;
 import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.MapButton;
 import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView;
 
@@ -18,15 +19,36 @@ public class MapUI {
      */
     private Texture mapTexture;
 
+    /**
+     * the mapbuttons representing the locations on the map
+     */
     private List<MapButton> locations;
 
-    private Main main;
+    private InventoryCloseButton closeButton;
 
-    private Stage stage;
+    /**
+     * main class extending game
+     */
+    private Main main;
 
+    /**
+     * the ui this is a part of
+     */
     private ShipView shipView;
 
+    /**
+     * the map this ui displays
+     */
+    private Overworld map;
+
+    /**
+     * the x position
+     */
     private float x;
+
+    /**
+     * the y position
+     */
     private float y;
 
     /**
@@ -35,23 +57,26 @@ public class MapUI {
      */
     public MapUI(Main main, Stage stage, Overworld map, ShipView shipView) {
         this.main = main;
-        this.stage = stage;
         this.shipView = shipView;
+        this.map = main.getClient().getOverworld();
 
         mapTexture = new Texture("map/map_overlay.png");
 
-        x = main.WIDTH/2 - mapTexture.getWidth()/2;
-        y = main.HEIGHT/2 - mapTexture.getHeight()/2;
+        x = Main.WIDTH/2f - mapTexture.getWidth()/2f;
+        y = Main.HEIGHT/2f - mapTexture.getHeight()/2f;
+
+        closeButton = new InventoryCloseButton(x+955, y-80, 248, 50, null, null, this);
+        stage.addActor(closeButton);
 
         locations = new LinkedList<>();
         //TODO
-//        for(String f : map.getPlanetMap().keySet()) {
-//            float fx = Float.parseFloat(f.split(",")[0]);
-//            float fy = Float.parseFloat(f.split(",")[1]);
-//            MapButton mb = new MapButton(new Texture("map/map_button.png"), (x+fx), (y+fy), 10, 10, this, map.getPlanetMap().get(f));
-//            locations.add(mb);
-//            stage.addActor(mb);
-//        }
+        for(Planet f : map.getPlanetMap()) {
+            float fx = f.getPosX();
+            float fy = f.getPosY();
+           MapButton mb = new MapButton(new Texture("map/map_button.png"), (x+fx+120), (y+fy+80), 20, 20, this, f);
+           locations.add(mb);
+            stage.addActor(mb);
+        }
     }
 
     /**
@@ -60,7 +85,7 @@ public class MapUI {
      */
     public void render() {
         main.batch.begin();
-        main.batch.draw(mapTexture, x, y, 1160, 626);
+        main.batch.draw(mapTexture, x, y-100, 1160, 626);
         main.batch.end();
     }
 
@@ -73,7 +98,7 @@ public class MapUI {
             m.remove();
         }
         shipView.deleteMap();
-
+        closeButton.remove();
     }
 
     /**
@@ -85,6 +110,7 @@ public class MapUI {
         boolean success = shipView.travel(planet);
         if(success) {
             disposeMapUI();
+            closeButton.remove();
         }
     }
 
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/EnemyShip.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/EnemyShip.java
index 663110a39da5e92288b371dd9457dcf757229edd..73ecef2d25e1ebd9fb689f49ddc79c39fb30f6a6 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/EnemyShip.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/EnemyShip.java
@@ -21,17 +21,32 @@ public class EnemyShip extends AbstractShip {
      */
     private List<EnemySystemUI> systems;
 
+    private float x;
+    private float y;
+
     /**
      * the hull status ui of the enemy ship
      */
     private EnemyHullUI hull;
 
+    public EnemyShip(Main main, Ship ship, Stage stage, GamePlay game, Texture enemyBackground, List<EnemySystemUI> systems, EnemyHullUI hull) {
+        super(main, ship, stage, game);
+        this.enemyBackground = new Texture("battle/battle_overlay.png");
+        //TODO Systeme des Schiffes in SystemUI umwandeln
+        this.systems = systems;
+        this.hull = hull;
+        x = main.WIDTH - enemyBackground.getWidth() - main.WIDTH/6;
+        y = main.HEIGHT/2 - enemyBackground.getHeight()/2;
+    }
+
     /**
      * to render the ui
      */
     @Override
     public void render() {
-
+        main.batch.begin();
+        main.batch.draw(enemyBackground, x, y, 400, 700);
+        main.batch.end();
     }
 
     /**
@@ -56,6 +71,7 @@ public class EnemyShip extends AbstractShip {
     @Override
     public void disposeShipView() {
 
+        
     }
 
     /**
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/ShipView.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/ShipView.java
index 21442971f00500ecf896ea3626c9ef73b91b39aa..504994e898e938d172c05982681236ed09f8975b 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/ShipView.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/ShipView.java
@@ -1,12 +1,19 @@
 package com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship;
 
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.Color;
 import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.BitmapFont;
+import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
 import com.badlogic.gdx.scenes.scene2d.Stage;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
+import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
-import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room;
+import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.*;
+import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.System;
+import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon;
 import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.AutofireButton;
 import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.MoveButton;
 import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.ShipButton;
@@ -15,6 +22,7 @@ import com.galaxytrucker.galaxytruckerreloaded.View.UI.Inventory.InventoryUI;
 import com.galaxytrucker.galaxytruckerreloaded.View.UI.Map.MapUI;
 import com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation.*;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 
@@ -87,37 +95,179 @@ public class ShipView extends AbstractShip {
      */
     private MapUI mapUI;
 
+    private float width, height;
+    private float roomWidth, roomHeight;
+
+    private BitmapFont font15;
+
+    private Stage tileStage;
+
     /**
      * Constructor
      * @param main - the main class for SpriteBatch
      */
-    public ShipView(Main main, Ship ship, Stage stage, Overworld map, GamePlay game) {
+    public ShipView(Main main, Ship ship, Stage stage, Stage tileStage, Overworld map, GamePlay game) {
         super(main, ship, stage, game);
-        //java.util.List crew = ship.get ??
+        this.tileStage = tileStage;
+
+        //font generator to get bitmapfont from .ttf file
+        FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.local("fonts/JustinFont11Bold.ttf"));
+        FreeTypeFontGenerator.FreeTypeFontParameter params = new FreeTypeFontGenerator.FreeTypeFontParameter();
+        //setting parameters of font
+        params.borderWidth = 1;
+        params.borderColor = Color.BLACK;
+        params.characters = FreeTypeFontGenerator.DEFAULT_CHARS;
+        params.magFilter = Texture.TextureFilter.Nearest;
+        params.minFilter = Texture.TextureFilter.Nearest;
+        params.genMipMaps = true;
+        params.size = 15;
+
+        font15 = generator.generateFont(params);
+
+        shipBackground = new Texture("ship/" + main.getClient().getMyShip().getShipType().toString().toLowerCase() + "base.png");
+        shipRoomBackground = new Texture("ship/" + main.getClient().getMyShip().getShipType().toString().toLowerCase() + "floor.png");
+        weaponGeneralBackground = new Texture("shipsys/weapon_system/generalbox.png");
+
+        width = shipBackground.getWidth()*1.5f;
+        height = shipBackground.getHeight()*1.5f;
+        roomWidth = shipRoomBackground.getWidth()*1.5f;
+        roomHeight = shipRoomBackground.getHeight()*1.5f;
+
+        float roomsBaseX = (70 + width/2);
+        float roomsBaseY = main.HEIGHT/2;
+
+        List<Crew> crews = new ArrayList<>();
+        for(Room r : ship.getSystems()) {
+            crews.addAll(r.getCrew());
+        }
+        crew = new HashMap<>();
+        float cy = Main.HEIGHT - 150;
+        for(Crew c : crews) {
+            crew.put(c.getId(), new CrewUI(main, c, stage, this, 30, cy, font15, getRoomX(ship.getShipType(), c.getCurrentRoom().getInteriorID(), roomsBaseX), getRoomY(ship.getShipType(), c.getCurrentRoom().getInteriorID(), roomsBaseY)));
+            cy -= 60;
+        }
 
         this.map = map;
 
+        //uis for all the systems/rooms
         rooms = new HashMap<>();
-        List<Room> existingRooms = ship.getSystems();
-        for(Room r : existingRooms) {
-            //TODO wie system das zu raum gehört? dann sys id als key, roomui als value
+        List<Room> existingSystems = ship.getSystems();
+        float sx = 60;
+        for(Room r : existingSystems) {
+            if(r instanceof System) {
+                if(r instanceof Shield) {
+                    rooms.put(r.getId(), new ShieldUI(main, tileStage, this, getRoomX(ship.getShipType(), r.getInteriorID(), roomsBaseX), getRoomY(ship.getShipType(), r.getInteriorID(), roomsBaseY), (Shield) r, sx));
+                }
+                else if(! (r instanceof WeaponSystem)) {
+                    rooms.put(r.getId(), new SubsystemUI(main, tileStage, this, getRoomX(ship.getShipType(), r.getInteriorID(), roomsBaseX), getRoomY(ship.getShipType(), r.getInteriorID(), roomsBaseY), (System) r, sx));
+                }
+                sx += 55;
+            }
+            else {
+                rooms.put(r.getId(), new RoomUI(main, r, tileStage, this, getRoomX(ship.getShipType(), r.getInteriorID(), roomsBaseX), getRoomY(ship.getShipType(), r.getInteriorID(), roomsBaseY)));
+            }
+        }
+        //need to be done extra bc they need the actual weapon, not just the system
+        for(Weapon w : ship.getInventory()) {
+            rooms.put(w.getId(), new WeaponUI(main, tileStage, this, getRoomX(ship.getShipType(), w.getWeaponSystem().getInteriorID(), roomsBaseX), getRoomY(ship.getShipType(), w.getWeaponSystem().getInteriorID(), roomsBaseY), w, sx + 55));
         }
 
         moveButton = new MoveButton(850, main.HEIGHT - 90, 150, 92, this);
-        inventory = new ShipButton(750,main.HEIGHT - 80, 50, 92, this);
+        inventory = new ShipButton(660,main.HEIGHT - 60, 248, 50, this);
 
         money = new ScrapUI(main, ship.getCoins());
         hull = new HullUI(main, ship.getHp());
         energy = new EnergyUI(main, ship.getEnergy());
 
-        shipBackground = new Texture("ship/anaerobic/an2base.png");
-        shipRoomBackground = new Texture("ship/anaerobic/an2floor.png");
-        weaponGeneralBackground = new Texture("shipsys/weapon/generalbox.png");
-
         stage.addActor(inventory);
         stage.addActor(moveButton);
     }
 
+    /**
+     * get the x position of a room depending on the interior id and the ship type
+     * @param id the interior id of the room (from left to right, up to down)
+     * @param bx the x position of the start (the most to the left)
+     * @return the total x position (lower right corner of the room)
+     */
+    private float getRoomX(ShipType type, int id, float bx) {
+        switch(type) {
+            case DEFAULT:
+                switch(id) {
+                    case 0: return bx - 360;
+                    case 1:
+                    case 2:
+                    case 3:
+                        return bx-312;
+                    case 4:
+                    case 6:
+                        return bx-216;
+                    case 5:
+                        return bx-168;
+                    case 7:
+                    case 8:
+                    case 9:
+                    case 10:
+                        return bx-72;
+                    case 11:
+                    case 12:
+                        return bx+24;
+                    case 13:
+                    case 14:
+                        return bx+120;
+                    case 15:
+                        return bx+216;
+                    case 16: return bx+312;
+                }
+            case BARRAGE: return 0;
+            case BOARDER: return 0;
+            case TANK: return 0;
+            case KILLER: return 0;
+            case STEALTH: return 0;
+            default: return 0;
+        }
+    }
+
+    /**
+     * return the y position of a room, depending on the ship type
+     * @param type the ship type
+     * @param id the interior id
+     * @return total y position (lower right corner of room)
+     */
+    private float getRoomY(ShipType type, int id, float by) {
+        switch(type) {
+            case DEFAULT:
+                switch(id) {
+                    case 0:
+                    case 2:
+                    case 5:
+                    case 14:
+                    case 15:
+                    case 16:
+                        return by - 48;
+                    case 1:
+                    case 4:
+                        return by +48;
+                    case 3:
+                    case 6:
+                    case 9:
+                    case 12:
+                        return by -96;
+                    case 7: return by +96;
+                    case 8:
+                    case 11:
+                    case 13:
+                        return by;
+                    case 10 : return by -144;
+                }
+            case BARRAGE: return 0;
+            case BOARDER: return 0;
+            case TANK: return 0;
+            case KILLER: return 0;
+            case STEALTH: return 0;
+            default: return 0;
+        }
+    }
+
     /**
      * renders the ship
      * no stage stuff!! only textures
@@ -126,8 +276,8 @@ public class ShipView extends AbstractShip {
     public void render() {
 
         main.batch.begin();
-        main.batch.draw(shipBackground, main.WIDTH -1730, main.HEIGHT/2 - shipBackground.getHeight()/2 - 200, 1000, 1000);
-        main.batch.draw(shipRoomBackground, main.WIDTH -1500, main.HEIGHT/2 - shipRoomBackground.getHeight()/2 - 100, 550, 550);
+        main.batch.draw(shipBackground, 70, main.HEIGHT/2 - height/2, width, height);
+        main.batch.draw(shipRoomBackground, (70 + width/2) - roomWidth/2, main.HEIGHT/2 - roomHeight/2, roomWidth, roomHeight);
         main.batch.draw(weaponGeneralBackground, 700, 100, 328, 90);
         main.batch.end();
 
@@ -135,16 +285,23 @@ public class ShipView extends AbstractShip {
         hull.render();
         energy.render();
 
+        tileStage.draw();
+
+
+        for(RoomUI r : rooms.values()) {
+            r.render();
+        }
+
+        for(CrewUI c : crew.values()) {
+            c.render();
+        }
+
         if(inventoryUI != null) {
             inventoryUI.render();
         }
         else if(mapUI != null) {
             mapUI.render();
         }
-
-        for(RoomUI r : rooms.values()) {
-            r.render();
-        }
     }
 
     /**
@@ -165,6 +322,10 @@ public class ShipView extends AbstractShip {
         for(RoomUI r : rooms.values()) {
             r.disposeRoomUI();
         }
+        for(CrewUI c : crew.values()) {
+            c.disposeCrewUI();
+        }
+        font15.dispose();
     }
 
     /**
@@ -193,7 +354,7 @@ public class ShipView extends AbstractShip {
      */
     public void openInventory() {
         if(inventoryUI == null){
-            inventoryUI = new InventoryUI(main, game.loadCrew(id), game.loadWeapons(id), game.loadFuel(id), game.loadMissiles(id), stage, this);
+            inventoryUI = new InventoryUI(main, game.loadCrew(), game.loadWeapons(), game.loadFuel(), game.loadMissiles(), stage, this, font15);
         }
     }
 
@@ -236,24 +397,41 @@ public class ShipView extends AbstractShip {
     /**
      * a crew member is moved to a new room
      * called by crew ui after player attempts to move a crew
-     * @param crewid the id of the crew member
+     * @param crew the crew member
      * @param room the new room
      */
-    public void crewMoved(int crewid, Room room) {
-        game.crewMoved(crewid, room);
+    public void crewMoved(Crew crew, Room room) {
+        this.crew.get(crew.getId()).crewMoved(room);
+    }
+
+    /**
+     * a crew member is moving to a new room
+     * called by button
+     * @param crew the crew member that was chosen
+     */
+    public void crewMoving(Crew crew) {
+        game.crewMoving(crew);
+    }
+
+    /**
+     * a room was chosen to move a crew member to
+     * @param room the room
+     */
+    public void roomChosen(Room room) {
+        game.roomChosen(room);
     }
 
     /**
      * crew member health update. called by game
-     * @param crewid the crew member
+     * @param crew the crew member
      * @param health the new health
      */
-    public void crewHealth(int crewid, int health) {
+    public void crewHealth(Crew crew, int health) {
         if(health == 0) {
-            crew.get(crewid).crewDied();
+            this.crew.get(crew.getId()).crewDied();
         }
         else {
-            crew.get(crewid).statusUpdate(health);
+            this.crew.get(crew.getId()).statusUpdate(health);
         }
     }
 
@@ -265,25 +443,25 @@ public class ShipView extends AbstractShip {
      * update the energy of a system in a room
      * @param amount the new total amount
      */
-    public void roomSystemEnergyUpdate(int sysid, int amount) {
-        rooms.get(sysid).systemEnergyUpdate(amount);
+    public void roomSystemEnergyUpdate(Room room, int amount) {
+        rooms.get(room.getId()).systemEnergyUpdate(amount);
     }
 
     /**
      * update the status of a system in a room
-     * @param sysid the system id
+     * @param room the system
      * @param amount the new status
      */
-    public void roomSystemStatusUpdate(int sysid, int amount) {
-        rooms.get(sysid).systemStatusUpdate(amount);
+    public void roomSystemStatusUpdate(Room room, int amount) {
+        rooms.get(room.getId()).systemStatusUpdate(amount);
     }
 
     /**
      * the player has chosen a new amount of energy
      * @param amount how much should be subtracted/added
      */
-    public void roomSystemEnergyChosen(int id, int amount) {
-        game.roomSystemEnergyChosen(id, amount);
+    public void roomSystemEnergyChosen(Room room, int amount) {
+        game.roomSystemEnergyChosen(room, amount);
     }
 
     /**
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/CrewUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/CrewUI.java
index 260d5c050b3ae6b50bd64914044a844154f0c063..9445bd773a850f4bce6a2d0bb7a0de7f27fe437a 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/CrewUI.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/CrewUI.java
@@ -2,17 +2,20 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation;
 
 
 import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.Color;
 import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.BitmapFont;
+import com.badlogic.gdx.graphics.g2d.GlyphLayout;
+import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
 import com.badlogic.gdx.scenes.scene2d.Stage;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew;
 
-import java.util.LinkedList;
 import java.util.List;
 
 import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
 import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room;
-import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.CrewDismissButton;
+import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.CrewSelectButton;
 import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView;
 
 /**
@@ -47,59 +50,69 @@ public class CrewUI {
      * button to click to send the crew to another room. After the button is clicked,
      * the player needs to click on a room in their own ship
      */
-    private CrewDismissButton crewButton;
+    private CrewSelectButton crewButton;
 
     /**
-     * the name of the crew member
+     * the background box
      */
-    private String name;
+    private Texture background;
 
     /**
-     * id of the crew member
+     * the crew member displayed with this ui
      */
-    private int id;
+    private Crew crew;
 
     /**
-     * the current health of the crew member
+     * the main class
      */
-    private int health;
+    private Main main;
 
     /**
-     * the maximum health of the crew member
+     * the shipview of this crewui
      */
-    private int maxhealth;
+    private ShipView shipView;
 
     /**
-     * the main class
+     * the x position of the picture of the crew member in the upper left corner
      */
-    private Main main;
+    private float x;
 
     /**
-     * the stage for buttons
+     * the y position of the picture of the crew member in the upper left corner
      */
-    private Stage stage;
+    private float y;
 
     /**
-     * rooms of the ship
+     * the position of the room the crew member is in
      */
-    private List<Room> rooms;
+    private float roomX, roomY;
 
-    private ShipView shipView;
+    /**
+     * the font used to draw the name
+     */
+    private BitmapFont font;
+
+    /**
+     * the glyph layout used for better positioning
+     */
+    private GlyphLayout glyph = new GlyphLayout();
 
     /**
      * constructor
      * @param main the main class
      * @param crew the crew member
      */
-    public CrewUI(Main main, Crew crew, Stage stage, Ship ship, ShipView shipView) {
+    public CrewUI(Main main, Crew crew, Stage stage, ShipView shipView, float x, float y, BitmapFont font, float rX, float rY) {
         this.main = main;
-        this.stage = stage;
+        this.crew = crew;
         this.shipView = shipView;
+        this.x = x;
+        this.y = y;
+        this.font = font;
+        this.roomX = rX;
+        this.roomY = rY;
 
-        name = crew.getName();
-        maxhealth = crew.getMaxhealth();
-        health = crew.getHealth();
-        id = crew.getId();
+        glyph.setText(font, crew.getName());
 
         if(crew.getName().equals("ana")) {
             crewImage = new Texture("crew/anaerobic.png");
@@ -108,21 +121,21 @@ public class CrewUI {
             crewImage = new Texture("crew/battle.png");
         }
         else {
-            crewImage = new Texture("crew/energy.png"); //TODO wie sieht das mit namen aus?
+            crewImage = new Texture("crew/energy.png");
         }
 
-        crewButton = new CrewDismissButton(crewImage, 0, 0, 10, 10, crew.getId(), this);
+        crewButton = new CrewSelectButton(crewImage, x, y+15, 50, 50, crew.getId(), this);
         stage.addActor(crewButton);
 
-        crewInShip = crewImage; //TODO for now
+        crewInShip = crewImage;
 
         crewStatus = new Texture("gameuis/energybar.png");
 
         box = new Texture("crew/health_box.png");
 
-        currentTexture = 10;
+        background = new Texture("crew/background.png");
 
-        rooms = ship.getSystems();
+        currentTexture = 10;
     }
 
     /**
@@ -143,48 +156,35 @@ public class CrewUI {
      */
     public void render() {
         main.batch.begin();
-        main.batch.draw(crewInShip, 0, 0, 0, 0); //TODO whxy
-        main.batch.draw(box, 0, 0, 10, 10); //TODO xywh
-        float x=0;
+        main.batch.draw(background, x, y, 200, 55);
+        font.draw(main.batch, glyph, x + 55, y + 40);
+        main.batch.draw(crewInShip, roomX, roomY, 50, 50);
+        main.batch.draw(box, x + 35, y +5, 140, 20);
+        float ex=x+55;
         for(int i=0;i<=currentTexture;i++) {
-             main.batch.draw(crewStatus, x, 0, 0, 0); //TODO whxy
-            x+=5;
+             main.batch.draw(crewStatus, ex, y+13, 8.75f, 5);
+            ex+=8.75;
         }
         main.batch.end();
     }
 
     /**
      * the crew member was moved to a new room
-     *
+     * called by shipview
      *
      * @param room the new room
      */
     public void crewMoved(Room room) {
-        shipView.crewMoved(id, room);
+
     }
 
     /**
      * the crew was chosen to be moved
-     * called by button crewdismiss
+     * called by button crewSelect
      * now waiting for the user to choose a room on the ship
      */
     public void crewMoving() {
-        boolean chosen = false;
-        while(!chosen) {
-            if(Gdx.input.justTouched()) {
-                int tx = Gdx.input.getX();
-                int ty = Gdx.input.getY();
-                for(Room r : rooms) {
-                    //TODO
-//                    if (r.getPosX() <= tx && r.getPosX() + r.getWidth() >= tx //TODO ist die berechnung richtig
-//                        && r.getPosY() <= ty && r.getPosY()+r.getHeight() >= ty) { //TODO wo sind die x und y koordinaten des schiffes?
-//                        chosen = true;
-//                        crewMoved(r);
-//                        break;
-//                    }
-                }
-            }
-        }
+        shipView.crewMoving(crew);
     }
 
     /**
@@ -209,7 +209,7 @@ public class CrewUI {
      * @param status the new status
      */
     public void statusUpdate(int status) {
-        int percent = status/maxhealth;
+        int percent = status/crew.getMaxhealth();
         currentTexture = percent * 10;
         //adapt currentTexture according to amount of textures we end up having
     }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/RoomUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/RoomUI.java
index 069ce529564b22174a67095c2032d2628cd41f4f..0aa2146bd0c7de2e4c142919d0434c195cea710a 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/RoomUI.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/RoomUI.java
@@ -7,39 +7,39 @@ import com.badlogic.gdx.scenes.scene2d.Stage;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
 import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room;
+import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Tile;
+import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.TileButton;
 import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.AbstractShip;
 import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView;
 
 public class RoomUI {
 
-    /**
-     * the system of this room
-     */
-    private SubsystemUI system;
 
     /**
-     * the normal texture of the room
+     * the texture for the case that the room is low on oxygen
      */
-    private Texture roomTexture;
+    protected Texture roomLowOxyTexture;
 
     /**
-     * the texture for the case that the room is low on oxygen
+     * the texture of the tiles the room is made up of
      */
-    private Texture roomLowOxyTexture;
+    private Texture tileTexture;
+
+    protected Room room;
+
+    protected Main main;
+
+    protected ShipView ship;
 
     /**
-     * Höhe des Raumes. Räume sind immer rechteckig.
+     * x position of the room
      */
-    private int height;
+    protected float x;
 
     /**
-     * Weite des Raumes. Räume sind immer rechteckig.
+     * y position of the room
      */
-    private int width;
-
-    private Main main;
-
-    private ShipView ship;
+    protected float y;
 
     /**
      * Constructor
@@ -47,67 +47,66 @@ public class RoomUI {
      * @param main - the main class for SpriteBatch
      * @param room the room
      */
-    public RoomUI(Main main, Room room, Stage stage, ShipView ship) {
+    public RoomUI(Main main, Room room, Stage stage, ShipView ship, float x, float y) {
         this.main = main;
-        // TODO
-//        height = room.getHeight();
-//        width = room.getWidth();
+        this.room = room;
+        this.ship = ship;
+        this.x = x;
+        this.y = y;
+
+        tileTexture = new Texture("ship/tile.png");
 
-        //System sys = TODO wie system?
-        //dann neue systemui mit stage
+        for(Tile t : room.getTiles()) {
+            stage.addActor(new TileButton(x + (t.getPosX()*48), y + (t.getPosY()*48), 48, 48, this));
+        }
     }
 
     /**
      * renders everything this room consists of
      */
     public void render() {
-        system.render();
-        //und textures TODO räume schöner abtrennen? aktuell einfach generell + symbole
+        main.batch.begin();
+        /*for(Tile t : room.getTiles()) {
+            main.batch.draw(tileTexture, x + (t.getPosX()*48), y + (t.getPosY()*48), 48, 48);
+        }*/
+        main.batch.end();
     }
 
     /**
      * Dispose of room ui
      */
     public void disposeRoomUI() {
-        system.disposeSubsystemUI();
-        //texturen
-    }
 
-    /**
-     * energy status update from controller
-     */
-    public void systemEnergyUpdate(int energy) {
-        system.energyUpdate(energy);
     }
 
     /**
-     * system status update from controller
+     * animation for the case that the room was hit
      */
-    public void systemStatusUpdate(int damage) {
-        system.systemStatusUpdate(damage);
+    public void roomHitAnimation() {
+
     }
 
     /**
-     * the player chooses a new amount
-     * @param amount how much should be subtracted/added
+     * the rooms texture changes because it is low on oxygen
+     *
      */
-    public void systemEnergyChosen(int id, int amount) {
-        ship.roomSystemEnergyChosen(id, amount);
+    public void roomLowOnOxygen() {
+
     }
 
     /**
-     * animation for the case that the room was hit
+     * the amount of energy given to a system (if this room is a system) is changed
+     * @param amount the new amount
      */
-    public void roomHitAnimation() {
+    public void systemEnergyUpdate(int amount) {
 
     }
 
     /**
-     * the rooms texture changes because it is low on oxygen
-     *
+     * the status of the system (if this room is a system) is changed
+     * @param amount the new amount
      */
-    public void roomLowOnOxygen() {
-
+    public void systemStatusUpdate(int amount) {
     }
 
     /**
@@ -117,6 +116,13 @@ public class RoomUI {
 
     }
 
+    /**
+     * the room was chosen with a tile button
+     */
+    public void chosen() {
+        ship.roomChosen(room);
+    }
+
     /**
      * setup called after initialisation
      *
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ScrapUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ScrapUI.java
index 3e0d6590c3383f7a54a64841bd8e437ed5a82d29..05f8a76c5fabd8dc35375dd1fd015f350f76f4eb 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ScrapUI.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ScrapUI.java
@@ -1,7 +1,12 @@
 package com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation;
 
 
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.Color;
 import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.BitmapFont;
+import com.badlogic.gdx.graphics.g2d.GlyphLayout;
+import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
 
 public class ScrapUI {
@@ -14,13 +19,17 @@ public class ScrapUI {
     /**
      * the amount of money
      */
-    private int amount;
+    private int amount = 0;
 
     /**
      * the main class with the sprite batch
      */
     private Main main;
 
+    private BitmapFont font;
+
+    private GlyphLayout glyph = new GlyphLayout();
+
     /**
      * Constructor
      *
@@ -29,9 +38,25 @@ public class ScrapUI {
      */
     public ScrapUI(Main main, int money) {
         this.main = main;
-        amount = money;
+        this.amount = money;
 
         scrapBackground = new Texture("gameuis/top_scrap.png");
+
+        //font generator to get bitmapfont from .ttf file
+        FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.local("fonts/JustinFont11Bold.ttf"));
+        FreeTypeFontGenerator.FreeTypeFontParameter params = new FreeTypeFontGenerator.FreeTypeFontParameter();
+        //setting parameters of font
+        params.borderWidth = 1;
+        params.borderColor = Color.BLACK;
+        params.characters = FreeTypeFontGenerator.DEFAULT_CHARS;
+        params.magFilter = Texture.TextureFilter.Nearest;
+        params.minFilter = Texture.TextureFilter.Nearest;
+        params.genMipMaps = true;
+        params.size = 25;
+
+        font = generator.generateFont(params);
+
+        glyph.setText(font, Integer.toString(amount));
     }
 
     /**
@@ -40,7 +65,8 @@ public class ScrapUI {
      */
     public void render() {
         main.batch.begin();
-        main.batch.draw(scrapBackground, 600, main.HEIGHT - 90, 147, 60);
+        main.batch.draw(scrapBackground, 600, Main.HEIGHT - 90, 147, 60);
+        font.draw(main.batch, glyph, 600 + (147f/2) - glyph.width/2, (Main.HEIGHT - 40) - glyph.height/2);
         main.batch.end();
     }
 
@@ -67,6 +93,7 @@ public class ScrapUI {
      */
     public void disposeScrapUI() {
         scrapBackground.dispose();
+        font.dispose();
     }
 
     /**
@@ -75,5 +102,6 @@ public class ScrapUI {
      */
     public void changeAmount(int amount) {
         this.amount += amount;
+        glyph.setText(font, Integer.toString(this.amount));
     }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ShieldUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ShieldUI.java
index 53a1ec23d0ad4da93a5bc2102264a672fd9be745..d4ac82983e824a7ec02d5110a4a357758d1c07b3 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ShieldUI.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ShieldUI.java
@@ -7,6 +7,7 @@ import java.util.LinkedList;
 import java.util.List;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
 import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Shield;
+import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView;
 
 public class ShieldUI extends SubsystemUI {
 
@@ -36,8 +37,8 @@ public class ShieldUI extends SubsystemUI {
      * @param main - the main class
      * @param shield the shield
      */
-    public ShieldUI(Main main, Shield shield, Stage stage, RoomUI roomUI) {
-        super(main, shield, stage, roomUI);
+    public ShieldUI(Main main, Stage stage, ShipView ship, float x, float y, Shield shield, float sx) {
+        super(main, stage, ship, x, y, shield, sx);
 
         onShip = new Texture("ship/anaerobic/shields.png");
 
@@ -61,8 +62,8 @@ public class ShieldUI extends SubsystemUI {
     /**
      * Dispose of shield ui
      */
-    public void disposeShieldUI() {
-        super.disposeSubsystemUI();
+    public void disposeRoomUI() {
+        super.disposeRoomUI();
 
         shieldTexture.dispose();
         upperBackground.dispose();
@@ -89,24 +90,6 @@ public class ShieldUI extends SubsystemUI {
         main.batch.end();
     }
 
-    /**
-     * Setup called after initialisation
-     */
-    private void setup() {
-    }
-
-    /**
-     * Show shield ui
-     */
-    public void showShieldUI() {
-    }
-
-    /**
-     * hide the shield ui
-     */
-    public void hideShieldUI() {
-    }
-
     /**
      * shield was hit
      */
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/SubsystemUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/SubsystemUI.java
index c18f643bac37f9bd6984ba0546b0df9ed0b23330..2e6f928e0d7e40d26409f662546a81867a3d8a2f 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/SubsystemUI.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/SubsystemUI.java
@@ -8,16 +8,15 @@ import com.badlogic.gdx.scenes.scene2d.Stage;
 import java.util.LinkedList;
 import java.util.List;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
-import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Engine;
-import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Shield;
+import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.*;
 import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.System;
-import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.WeaponSystem;
 import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.SystemButton;
+import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView;
 
 /**
  * shows the subsystems of the ship
  */
-public class SubsystemUI {
+public class SubsystemUI extends RoomUI {
 
     /**
      * the textures to display the system in its current damage level
@@ -37,16 +36,6 @@ public class SubsystemUI {
      */
     private SystemButton energyButton;
 
-    /**
-     * x position of the room
-     */
-    private float x;
-
-    /**
-     * y position of the room
-     */
-    private float y;
-
     /**
      * the current energy level
      */
@@ -65,97 +54,62 @@ public class SubsystemUI {
      */
     protected int id;
 
-    protected Main main;
-
-    protected Stage stage;
-
     private int currentStatus;
 
-    private RoomUI roomUI;
+    /**
+     * the x position of the subsystem in the lower left corner
+     */
+    private float sx;
 
     /**
      * constructor
      * @param main the main class
      * @param system the system
      */
-    public SubsystemUI(Main main, System system, Stage stage, RoomUI roomUI) {
-        this.main = main;
-        this.stage = stage;
-        this.roomUI = roomUI;
-
-//        x = system.getPosX();
-//        y = system.getPosY();
+    public SubsystemUI(Main main, Stage stage, ShipView ship, float x, float y, System system, float sx) {
+        super(main, system, stage, ship, x, y);
+        this.sx = sx;
         energy = system.getEnergy();
         maxEnergy = system.getMaxEnergy();
         damage = system.getDamage();
         systemTexture = new java.util.LinkedList<>();
         id = system.getId();
 
-        if(system instanceof Engine) {
-            systemTexture.add(new Texture("shipsys/engine/enginegreen.png"));
-            systemTexture.add(new Texture("shipsys/engine/engineorange.png"));
-            systemTexture.add(new Texture("shipsys/engine/enginered.png"));
-        }
-        else if (system instanceof Shield) {
-            systemTexture.add(new Texture("shipsys/shields/shieldsgreen.png"));
-            systemTexture.add(new Texture("shipsys/shields/shieldsorange.png"));
-            systemTexture.add(new Texture("shipsys/shields/shieldsred.png"));
-        }
-        else if(system instanceof WeaponSystem) {
-            systemTexture.add(new Texture("shipsys/weapon/weapongreen.png"));
-            systemTexture.add(new Texture("shipsys/weapon/weaponorange.png"));
-            systemTexture.add(new Texture("shipsys/weapon/weaponred.png"));
-        }
-        energyButton = new SystemButton(systemTexture.get(0), x, y, 15, 15, this); //TODO w, h also x y for corner!! not these
+        String sysType = system.getSystemType().toString().toLowerCase();
+
+        systemTexture.add(new Texture("shipsys/"+sysType+"/"+sysType+"green.png"));
+        systemTexture.add(new Texture("shipsys/"+sysType+"/"+sysType+"orange.png"));
+        systemTexture.add(new Texture("shipsys/"+sysType+"/"+sysType+"red.png"));
+        systemTexture.add(new Texture("shipsys/"+sysType+"/"+sysType+"overlay.png"));
+
+        energyButton = new SystemButton(systemTexture.get(0), sx, 50, 50, 50, this);
 
         energyTexture = new Texture("gameuis/energybar.png");
 
         stage.addActor(energyButton);
-
-        Gdx.input.setInputProcessor(stage);
     }
 
     public void render() {
+        super.render();
         main.batch.begin();
-        float x = 0; //TODO
+        float sy = 90;
         for(int i = 0; i<energy; i++) {
-            main.batch.draw(energyTexture, x, 0, 10, 10);
-            x += 5; //TODO?
+            main.batch.draw(energyTexture, sx + 18, sy, 20, 5);
+            sy += 8;
         }
-        //TODO else für alle level
-        main.batch.draw(systemTexture.get(currentStatus), 0, 0, 15, 15); //TODO position, w, h
+        main.batch.draw(systemTexture.get(3), (x + 24 + (24*room.getTiles().get(room.getTiles().size()-1).getPosX()))-16, (y + 24 + (24*room.getTiles().get(room.getTiles().size()-1).getPosY()))-16, 32, 32);
         main.batch.end();
     }
 
-    /**
-     * Setup called after initialisation
-     */
-    private void setup() {
-    }
-
-    /**
-     * show the Subsystem ui
-     */
-    public void showSubsystemUI() {
-
-    }
-
-    /**
-     * hide the Subsystem ui
-     */
-    public void hideSubsystemUI() {
-
-    }
-
     /**
      * dispose of the Subsystem UI
      */
-    public void disposeSubsystemUI() {
+    public void disposeRoomUI() {
+        super.disposeRoomUI();
         energyTexture.dispose();
         for(Texture t : systemTexture) {
             t.dispose();
         }
-        stage.dispose();
 
         energyButton.remove();
     }
@@ -187,7 +141,7 @@ public class SubsystemUI {
      * if energy supply already activated and not at maximum, then more energy to this system
      */
     public void activateEnergy() {
-        roomUI.systemEnergyChosen(id, 1); //TODO how much
+        ship.roomSystemEnergyChosen(room, 1);
     }
 
     /**
@@ -195,6 +149,6 @@ public class SubsystemUI {
      * called by button
      */
     public void lessEnergy() {
-        roomUI.systemEnergyChosen(id, -1);
+        ship.roomSystemEnergyChosen(room, -1);
     }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/WeaponUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/WeaponUI.java
index 304233127f19aca7ccab1e57d729766b0af208f1..b2e4d574f8b22003e6b9faa9ebbd16421982bac4 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/WeaponUI.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/WeaponUI.java
@@ -7,8 +7,10 @@ import java.util.LinkedList;
 import java.util.List;
 import com.galaxytrucker.galaxytruckerreloaded.Main;
 import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room;
+import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.System;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon;
 import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.WeaponActivateButton;
+import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView;
 
 /**
  * shows the weapons of the ship
@@ -54,8 +56,8 @@ public class WeaponUI extends SubsystemUI {
      * @param main the main class
      * @param weapon the weapon
      */
-    public WeaponUI(Main main, Weapon weapon, Stage stage, RoomUI roomUI) {
-        super(main, weapon.getWeaponSystem(), stage, roomUI);
+    public WeaponUI(Main main, Stage stage, ShipView ship, float x, float y, Weapon weapon, float sx) {
+        super(main, stage, ship, x, y, weapon.getWeaponSystem(), sx);
 
         cooldown = weapon.getCooldown();
         energy = weapon.getEnergy();
@@ -88,8 +90,8 @@ public class WeaponUI extends SubsystemUI {
     /**
      * dispose of everything
      */
-    public void disposeWeaponUI() {
-        super.disposeSubsystemUI();
+    public void disposeRoomUI() {
+        super.disposeRoomUI();
 
         //weaponBackground.dispose();
 
@@ -100,12 +102,6 @@ public class WeaponUI extends SubsystemUI {
         activateButton.remove();
     }
 
-    /**
-     * Setup called after initialisation
-     */
-    private void setup() {
-    }
-
     /**
      * animation for when the weapon was shot
      */
diff --git a/database.mv.db b/database.mv.db
index d69079387e21d64acfde1da8ab4bfe2e611999b2..7a87282e34745059e6dd0408379ae22a946d0993 100644
Binary files a/database.mv.db and b/database.mv.db differ
diff --git a/database.trace.db b/database.trace.db
new file mode 100644
index 0000000000000000000000000000000000000000..b5d127f528068e72448c401efc8541fb97091f78
--- /dev/null
+++ b/database.trace.db
@@ -0,0 +1,240 @@
+2020-07-13 18:48:28 database: flush
+org.h2.message.DbException: Allgemeiner Fehler: "java.lang.IllegalStateException: The file is locked: nio:/Users/lnittsch/Documents/UniMaterial/ReSWP2/galaxytrucker/database.mv.db [1.4.199/7]"
+General error: "java.lang.IllegalStateException: The file is locked: nio:/Users/lnittsch/Documents/UniMaterial/ReSWP2/galaxytrucker/database.mv.db [1.4.199/7]" [50000-199]
+	at org.h2.message.DbException.get(DbException.java:194)
+	at org.h2.message.DbException.convert(DbException.java:347)
+	at org.h2.mvstore.db.MVTableEngine$1.uncaughtException(MVTableEngine.java:90)
+	at org.h2.mvstore.MVStore.handleException(MVStore.java:2787)
+	at org.h2.mvstore.MVStore.panic(MVStore.java:441)
+	at org.h2.mvstore.MVStore.<init>(MVStore.java:404)
+	at org.h2.mvstore.MVStore$Builder.open(MVStore.java:3343)
+	at org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:162)
+	at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:95)
+	at org.h2.engine.Database.getPageStore(Database.java:2739)
+	at org.h2.engine.Database.open(Database.java:769)
+	at org.h2.engine.Database.openDatabase(Database.java:319)
+	at org.h2.engine.Database.<init>(Database.java:313)
+	at org.h2.engine.Engine.openSession(Engine.java:69)
+	at org.h2.engine.Engine.openSession(Engine.java:201)
+	at org.h2.engine.Engine.createSessionAndValidate(Engine.java:178)
+	at org.h2.engine.Engine.createSession(Engine.java:161)
+	at org.h2.engine.Engine.createSession(Engine.java:31)
+	at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:336)
+	at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:169)
+	at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:148)
+	at org.h2.Driver.connect(Driver.java:69)
+	at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38)
+	at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.addConnections(DriverManagerConnectionProviderImpl.java:331)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:250)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:228)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections$Builder.build(DriverManagerConnectionProviderImpl.java:369)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:98)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:73)
+	at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:107)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:246)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
+	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145)
+	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66)
+	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
+	at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
+	at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
+	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:176)
+	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:118)
+	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224)
+	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255)
+	at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)
+	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
+	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Database.Database.<clinit>(Database.java:28)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.ObjectDAO.<init>(ObjectDAO.java:13)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.UserDAO.<init>(UserDAO.java:8)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Services.UserService.<init>(UserService.java:15)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.ServerServiceCommunicator.<init>(ServerServiceCommunicator.java:27)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Server.runServer(Server.java:38)
+	at com.galaxytrucker.galaxytruckerreloaded.Main.startServer(Main.java:46)
+	at com.galaxytrucker.galaxytruckerreloaded.View.Screen.ShipSelector.startGame(ShipSelector.java:265)
+	at com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.CreateGameButton.leftClick(CreateGameButton.java:18)
+	at com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.CreateGameButton$1.clicked(CreateGameButton.java:26)
+	at com.badlogic.gdx.scenes.scene2d.utils.ClickListener.touchUp(ClickListener.java:88)
+	at com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:59)
+	at com.badlogic.gdx.scenes.scene2d.Stage.touchUp(Stage.java:351)
+	at com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:360)
+	at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:221)
+	at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:128)
+Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Allgemeiner Fehler: "java.lang.IllegalStateException: The file is locked: nio:/Users/lnittsch/Documents/UniMaterial/ReSWP2/galaxytrucker/database.mv.db [1.4.199/7]"
+General error: "java.lang.IllegalStateException: The file is locked: nio:/Users/lnittsch/Documents/UniMaterial/ReSWP2/galaxytrucker/database.mv.db [1.4.199/7]" [50000-199]
+	at org.h2.message.DbException.getJdbcSQLException(DbException.java:502)
+	at org.h2.message.DbException.getJdbcSQLException(DbException.java:427)
+	... 67 more
+Caused by: java.lang.IllegalStateException: The file is locked: nio:/Users/lnittsch/Documents/UniMaterial/ReSWP2/galaxytrucker/database.mv.db [1.4.199/7]
+	at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:883)
+	at org.h2.mvstore.FileStore.open(FileStore.java:172)
+	at org.h2.mvstore.MVStore.<init>(MVStore.java:390)
+	... 61 more
+2020-07-13 18:49:57 database: flush
+org.h2.message.DbException: Allgemeiner Fehler: "java.lang.IllegalStateException: The file is locked: nio:/Users/lnittsch/Documents/UniMaterial/ReSWP2/galaxytrucker/database.mv.db [1.4.199/7]"
+General error: "java.lang.IllegalStateException: The file is locked: nio:/Users/lnittsch/Documents/UniMaterial/ReSWP2/galaxytrucker/database.mv.db [1.4.199/7]" [50000-199]
+	at org.h2.message.DbException.get(DbException.java:194)
+	at org.h2.message.DbException.convert(DbException.java:347)
+	at org.h2.mvstore.db.MVTableEngine$1.uncaughtException(MVTableEngine.java:90)
+	at org.h2.mvstore.MVStore.handleException(MVStore.java:2787)
+	at org.h2.mvstore.MVStore.panic(MVStore.java:441)
+	at org.h2.mvstore.MVStore.<init>(MVStore.java:404)
+	at org.h2.mvstore.MVStore$Builder.open(MVStore.java:3343)
+	at org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:162)
+	at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:95)
+	at org.h2.engine.Database.getPageStore(Database.java:2739)
+	at org.h2.engine.Database.open(Database.java:769)
+	at org.h2.engine.Database.openDatabase(Database.java:319)
+	at org.h2.engine.Database.<init>(Database.java:313)
+	at org.h2.engine.Engine.openSession(Engine.java:69)
+	at org.h2.engine.Engine.openSession(Engine.java:201)
+	at org.h2.engine.Engine.createSessionAndValidate(Engine.java:178)
+	at org.h2.engine.Engine.createSession(Engine.java:161)
+	at org.h2.engine.Engine.createSession(Engine.java:31)
+	at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:336)
+	at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:169)
+	at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:148)
+	at org.h2.Driver.connect(Driver.java:69)
+	at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38)
+	at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.addConnections(DriverManagerConnectionProviderImpl.java:331)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:250)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:228)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections$Builder.build(DriverManagerConnectionProviderImpl.java:369)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:98)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:73)
+	at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:107)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:246)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
+	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145)
+	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66)
+	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
+	at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
+	at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
+	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:176)
+	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:118)
+	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224)
+	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255)
+	at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)
+	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
+	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Database.Database.<clinit>(Database.java:28)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.ObjectDAO.<init>(ObjectDAO.java:13)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.UserDAO.<init>(UserDAO.java:8)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Services.UserService.<init>(UserService.java:15)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.ServerServiceCommunicator.<init>(ServerServiceCommunicator.java:27)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Server.runServer(Server.java:38)
+	at com.galaxytrucker.galaxytruckerreloaded.Main.startServer(Main.java:46)
+	at com.galaxytrucker.galaxytruckerreloaded.View.Screen.ShipSelector.startGame(ShipSelector.java:265)
+	at com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.CreateGameButton.leftClick(CreateGameButton.java:18)
+	at com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.CreateGameButton$1.clicked(CreateGameButton.java:26)
+	at com.badlogic.gdx.scenes.scene2d.utils.ClickListener.touchUp(ClickListener.java:88)
+	at com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:59)
+	at com.badlogic.gdx.scenes.scene2d.Stage.touchUp(Stage.java:351)
+	at com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:360)
+	at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:221)
+	at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:128)
+Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Allgemeiner Fehler: "java.lang.IllegalStateException: The file is locked: nio:/Users/lnittsch/Documents/UniMaterial/ReSWP2/galaxytrucker/database.mv.db [1.4.199/7]"
+General error: "java.lang.IllegalStateException: The file is locked: nio:/Users/lnittsch/Documents/UniMaterial/ReSWP2/galaxytrucker/database.mv.db [1.4.199/7]" [50000-199]
+	at org.h2.message.DbException.getJdbcSQLException(DbException.java:502)
+	at org.h2.message.DbException.getJdbcSQLException(DbException.java:427)
+	... 67 more
+Caused by: java.lang.IllegalStateException: The file is locked: nio:/Users/lnittsch/Documents/UniMaterial/ReSWP2/galaxytrucker/database.mv.db [1.4.199/7]
+	at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:883)
+	at org.h2.mvstore.FileStore.open(FileStore.java:172)
+	at org.h2.mvstore.MVStore.<init>(MVStore.java:390)
+	... 61 more
+2020-07-13 18:55:48 database: flush
+org.h2.message.DbException: Allgemeiner Fehler: "java.lang.IllegalStateException: The file is locked: nio:C:/Users/playj/OneDrive/Desktop/UNI/SWP2/galaxytrucker/database.mv.db [1.4.199/7]"
+General error: "java.lang.IllegalStateException: The file is locked: nio:C:/Users/playj/OneDrive/Desktop/UNI/SWP2/galaxytrucker/database.mv.db [1.4.199/7]" [50000-199]
+	at org.h2.message.DbException.get(DbException.java:194)
+	at org.h2.message.DbException.convert(DbException.java:347)
+	at org.h2.mvstore.db.MVTableEngine$1.uncaughtException(MVTableEngine.java:90)
+	at org.h2.mvstore.MVStore.handleException(MVStore.java:2787)
+	at org.h2.mvstore.MVStore.panic(MVStore.java:441)
+	at org.h2.mvstore.MVStore.<init>(MVStore.java:404)
+	at org.h2.mvstore.MVStore$Builder.open(MVStore.java:3343)
+	at org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:162)
+	at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:95)
+	at org.h2.engine.Database.getPageStore(Database.java:2739)
+	at org.h2.engine.Database.open(Database.java:769)
+	at org.h2.engine.Database.openDatabase(Database.java:319)
+	at org.h2.engine.Database.<init>(Database.java:313)
+	at org.h2.engine.Engine.openSession(Engine.java:69)
+	at org.h2.engine.Engine.openSession(Engine.java:201)
+	at org.h2.engine.Engine.createSessionAndValidate(Engine.java:178)
+	at org.h2.engine.Engine.createSession(Engine.java:161)
+	at org.h2.engine.Engine.createSession(Engine.java:31)
+	at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:336)
+	at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:169)
+	at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:148)
+	at org.h2.Driver.connect(Driver.java:69)
+	at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38)
+	at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.addConnections(DriverManagerConnectionProviderImpl.java:331)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:250)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:228)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections$Builder.build(DriverManagerConnectionProviderImpl.java:369)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:98)
+	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:73)
+	at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:107)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:246)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
+	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145)
+	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66)
+	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
+	at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
+	at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243)
+	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
+	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:176)
+	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:118)
+	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224)
+	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255)
+	at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)
+	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
+	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Database.Database.<clinit>(Database.java:28)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.ObjectDAO.<init>(ObjectDAO.java:13)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.UserDAO.<init>(UserDAO.java:8)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Services.UserService.<init>(UserService.java:15)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.ServerServiceCommunicator.<init>(ServerServiceCommunicator.java:27)
+	at com.galaxytrucker.galaxytruckerreloaded.Server.Server.runServer(Server.java:38)
+	at com.galaxytrucker.galaxytruckerreloaded.Main.startServer(Main.java:46)
+	at com.galaxytrucker.galaxytruckerreloaded.View.Screen.ShipSelector.startGame(ShipSelector.java:265)
+	at com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.CreateGameButton.leftClick(CreateGameButton.java:18)
+	at com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.CreateGameButton$1.clicked(CreateGameButton.java:26)
+	at com.badlogic.gdx.scenes.scene2d.utils.ClickListener.touchUp(ClickListener.java:88)
+	at com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:59)
+	at com.badlogic.gdx.scenes.scene2d.Stage.touchUp(Stage.java:351)
+	at com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:360)
+	at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:221)
+	at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:128)
+Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Allgemeiner Fehler: "java.lang.IllegalStateException: The file is locked: nio:C:/Users/playj/OneDrive/Desktop/UNI/SWP2/galaxytrucker/database.mv.db [1.4.199/7]"
+General error: "java.lang.IllegalStateException: The file is locked: nio:C:/Users/playj/OneDrive/Desktop/UNI/SWP2/galaxytrucker/database.mv.db [1.4.199/7]" [50000-199]
+	at org.h2.message.DbException.getJdbcSQLException(DbException.java:502)
+	at org.h2.message.DbException.getJdbcSQLException(DbException.java:427)
+	... 67 more
+Caused by: java.lang.IllegalStateException: The file is locked: nio:C:/Users/playj/OneDrive/Desktop/UNI/SWP2/galaxytrucker/database.mv.db [1.4.199/7]
+	at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:883)
+	at org.h2.mvstore.FileStore.open(FileStore.java:172)
+	at org.h2.mvstore.MVStore.<init>(MVStore.java:390)
+	... 61 more