diff --git a/core/database.mv.db b/core/database.mv.db
index 9dbdffc5c5d72fd1cf5f84151e6d3282d8f5cb4f..6a79fd6fa0459afb5b4d59b08e63d215d31e2170 100644
Binary files a/core/database.mv.db and b/core/database.mv.db differ
diff --git a/core/out/production/resources/META-INF/persistence.xml b/core/out/production/resources/META-INF/persistence.xml
index 4c58c8089a776ec7cda39e824d734f97cbd5551f..7c239e2dde412c4cbe1a907b6f398321cdd563bb 100644
--- a/core/out/production/resources/META-INF/persistence.xml
+++ b/core/out/production/resources/META-INF/persistence.xml
@@ -4,8 +4,15 @@
              version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
 
     <persistence-unit name="database" transaction-type="RESOURCE_LOCAL">
-        <class>com.galaxytrucker.galaxytruckerreloaded.Model.User</class>
         <class>com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.System</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.Ship</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.User</class>
         <properties>
             <property name="javax.persistence.jdbc.url" value="jdbc:h2:./database;DB_CLOSE_ON_EXIT=FALSE;" />
             <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java
index b05b700bfa6354463857b213bd26ad77b9749bd1..b015bb86e18e769b4cdfa8c280765fe5a4781f9b 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java
@@ -1,12 +1,15 @@
 package com.galaxytrucker.galaxytruckerreloaded.Communication;
 
+import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
 import com.galaxytrucker.galaxytruckerreloaded.Server.RequestObject;
 import com.galaxytrucker.galaxytruckerreloaded.Server.ResponseObject;
+import lombok.Getter;
 import lombok.NonNull;
 
 import java.io.*;
 import java.net.Socket;
 
+/** This class handles the client-side networking */
 public class Client {
 
     /**
@@ -34,16 +37,25 @@ public class Client {
      */
     private ObjectInputStream receiveObject;
 
+    /**
+     * The client's ship
+     */
+    @Getter
+    private Ship myShip;
+
     /**
      * Send a request to the server
+     *
+     * @param requestObject - the request object
      * @return the server's response
+     *
+     * @throws IllegalArgumentException on exception
      */
     public ResponseObject sendAndReceive(RequestObject requestObject) throws IllegalArgumentException {
         try {
             sendObject.writeObject(requestObject);
             return (ResponseObject) receiveObject.readObject();
-        }
-        catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             throw new IllegalArgumentException(e.getMessage());
         }
@@ -51,19 +63,67 @@ public class Client {
 
     /**
      * Login
+     *
+     * @param username - the username of the user to login
+     *
+     * @return whether the client is allowed to login or not
+     *
+     * @throws IllegalArgumentException on error
      */
     public boolean login(String username) throws IllegalArgumentException {
         try {
+            // ==================== LOG-IN ====================
             send.println("[LOGIN]:" + username);
-            return receive.readLine().equals("[ACCEPTED]");
-        } catch (Exception e) {
+            String received = receive.readLine();
+            // ==================== EXCEPTION ====================
+            if (received.contains("[EXCEPTION]:[LOGIN]")){
+                System.out.println("<CLIENT>:[EXCEPTION DURING LOGIN! TERMINATING...]");
+                throw new IllegalArgumentException();
+            }
+            // ==================== SUCCESSFUL LOGIN ====================
+            else if (received.equals("true")){
+                System.out.println("<CLIENT>:[LOGIN SUCCESSFUL]:[USERNAME]:" + username);
+                received = receive.readLine();
+                // ==================== NEW GAME ====================
+                if (received.equals("[NEW-GAME]")){
+                    System.out.println("<CLIENT>:[NEW-GAME]:[USERNAME]:"+username);
+                    // TODO NEW GAME CREATION
+
+                    // =======================
+                    received = receive.readLine();
+                }
+                // ==================== FETCH SHIP ====================
+                if (received.equals("[FETCH-SHIP]")){
+                    System.out.println("<CLIENT>:[FETCH-SHIP]:[USERNAME]:"+username);
+                    try {
+                        this.myShip = (Ship) receiveObject.readObject();
+                    }
+                    catch (Exception f){
+                        f.printStackTrace();
+                        System.out.println("<CLIENT>:[EXCEPTION]:[FETCH-SHIP]:[USERNAME]:"+username);
+                        throw new IllegalArgumentException();
+                    }
+                }
+                return true;
+            }
+            // ==================== FAILED LOGIN ====================
+            else {
+                return false;
+            }
+        }
+        catch (Exception e){
             e.printStackTrace();
-            throw new IllegalArgumentException(e.getMessage());
+            throw new IllegalArgumentException();
         }
     }
 
     /**
      * Constructor
+     *
+     * @param ipAddress - the ipAddress of the server
+     * @param port      - the server port
+     *
+     * @throws IllegalArgumentException on error
      */
     public Client(@NonNull String ipAddress, @NonNull int port) throws IllegalArgumentException {
         try {
@@ -74,7 +134,7 @@ public class Client {
             receiveObject = new ObjectInputStream(socket.getInputStream());
         } catch (Exception e) {
             e.printStackTrace();
-            throw new IllegalArgumentException("Couldn't initialize connection to server");
+            throw new IllegalArgumentException("<CLIENT>:[Couldn't initialize connection to server]");
         }
     }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java
index 0d38b4595b11733a9c47ea2849454bd2bf65d5c8..e7884b27d98abf87a7cd93fecb8dca78f31bbd8d 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/ClientControllerCommunicator.java
@@ -3,29 +3,49 @@ package com.galaxytrucker.galaxytruckerreloaded.Communication;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
-import lombok.Getter;
-import lombok.Setter;
+import com.galaxytrucker.galaxytruckerreloaded.Server.RequestObject;
+import com.galaxytrucker.galaxytruckerreloaded.Server.ResponseObject;
+import lombok.*;
 
 @Setter
 @Getter
+@RequiredArgsConstructor(access = AccessLevel.PUBLIC)
 public class ClientControllerCommunicator {
 
-    /** Client ship */
+    /**
+     * Client ship
+     */
     private Ship clientShip;
     private Overworld map;
     private Planet currentPlanet;
 
-    /** Issue a new request and receive a response
+    /**
+     * Client class
+     */
+    @NonNull
+    private Client client;
+
+    /**
+     * Issue a new request and receive a response
+     *
      * @param request - the request
-     * @return the server's response */
-    public String sendRequest(String request){
-        return null;
+     * @return the server's response
+     */
+    public ResponseObject sendRequest(RequestObject request) throws IllegalArgumentException {
+        return client.sendAndReceive(request);
     }
 
-    /** Issue login request
+    /**
+     * Issue login request
+     *
      * @param username - the username
-     * @return true if the user already exists else create a enw spaceship */
-    public boolean login(String username){
-        return false;
+     * @return true if the user already exists else create a enw spaceship
+     */
+    public boolean login(String username) {
+        boolean permittedLogin = client.login(username);
+        if (permittedLogin) {
+            clientShip = client.getMyShip();
+        }
+        return permittedLogin;
     }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Overworld.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Overworld.java
index ebde8497d8ba6bc99209fb211cd632bb2e843257..1462415c4b55098d314777cc5fe1c89e49cdebec 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Overworld.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Overworld.java
@@ -1,10 +1,7 @@
 package com.galaxytrucker.galaxytruckerreloaded.Model.Map;
 
 
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
+import lombok.*;
 
 import javax.persistence.*;
 import java.io.Serializable;
@@ -17,6 +14,8 @@ import java.util.Map;
 @NamedQueries({
         @NamedQuery(name = "Overworld.getByUsername", query = "select o from Overworld o where o.associatedUser =: name")
 })
+@Getter
+@Setter
 public class Overworld implements Serializable {
 
     /** ID */
@@ -24,21 +23,19 @@ public class Overworld implements Serializable {
     @Id
     private int id;
 
+    /** Seed */
+    @NonNull
+    private int seed;
+
     /** Username used as ID */
     @NonNull
     private String associatedUser;
 
     /** Stores planet and their location on the map */
-    @OneToMany
+    @OneToMany(cascade = CascadeType.ALL)
     private Map<String,Planet> planetMap;
 
     /** The start planet */
-    @NonNull
-    @OneToOne
+    @OneToOne(cascade = CascadeType.ALL)
     private Planet startPlanet;
-
-    /** Constructor */
-    public Overworld(int seed) {
-        planetMap = new HashMap<>();
-    }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Planet.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Planet.java
index 4e0a1a2de46f1c82cd03c219eb86e2ee23c1a8e6..9d9ec737506e0da4b069d2a551069e343d3b18c6 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Planet.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Planet.java
@@ -5,10 +5,7 @@ import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
 
 import lombok.*;
 
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
+import javax.persistence.*;
 import java.io.Serializable;
 import java.util.List;
 
@@ -58,4 +55,8 @@ public class Planet implements Serializable {
     /** Trader */
     @OneToOne
     private Trader trader;
+
+    /** The overWorld this planet belongs to */
+    @ManyToOne
+    private Overworld overworld;
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Trader.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Trader.java
index ce267d3b4dde64a83094a4dd026e6c3b150c6649..fce3efc8cc281041e6a3a50cde3d04271ddf2107 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Trader.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Trader.java
@@ -5,9 +5,7 @@ import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon;
 import lombok.*;
 
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
+import javax.persistence.*;
 import java.io.Serializable;
 
 @Getter
@@ -15,18 +13,20 @@ import java.io.Serializable;
 @Entity
 @RequiredArgsConstructor(access = AccessLevel.PUBLIC)
 @NoArgsConstructor(access = AccessLevel.PUBLIC)
-public class Trader extends Planet implements Serializable {
+public class Trader implements Serializable {
 
     /** ID */
-    @Id
+    @NonNull @Id
     private int id;
 
-    /** Associated user */
+    /** Planet the trader is located at */
+    @OneToOne (cascade = CascadeType.ALL)
+    @NonNull
     private Planet planet;
 
     /** Weapons for sale */
     @NonNull
-    @OneToMany
+    @OneToMany (cascade = CascadeType.ALL)
     private List<Weapon> weaponStock;
 
     /** Rockets for sale */
@@ -38,7 +38,7 @@ public class Trader extends Planet implements Serializable {
     private int fuelStock;
 
     /** Crew for sale */
-    @OneToMany
+    @OneToMany (cascade = CascadeType.ALL)
     @NonNull
     private List<Crew> crewStock;
 
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Ship.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Ship.java
index a6c8b61e4c66bd1edc01111dd6d4080a79b4c291..e7d6e5de3184e326885aac874d25a323d9b0bc2c 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Ship.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Ship.java
@@ -78,6 +78,7 @@ public class Ship implements Serializable {
      * The planet the ship is currently at
      */
     @NonNull
+    @ManyToOne
     private Planet planet;
 
     /** Shields */
@@ -92,12 +93,12 @@ public class Ship implements Serializable {
 
     /** This ship's systems */
     @NonNull
-    @ElementCollection
+    @OneToMany
     private List<Room> systems;
 
     /** Inventory */
     @NonNull
-    @ElementCollection
+    @OneToMany
     private List<Weapon> inventory;
 
     /** Whether or not the ship is in combat */
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/User.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/User.java
index bc0748dcd89b62291c83caafbe22e742e0a56271..8ae8e7812d7d3d2e662be4c1179e80ae6ccc9801 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/User.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/User.java
@@ -29,6 +29,8 @@ public class User implements Serializable {
     private Ship userShip;
 
     /** Whether or not the user is logged in */
-    @NonNull
     private boolean loggedIn = false;
+
+    /** First game */
+    private boolean firstGame = true;
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java
index 32c776cb91e787e81d33f34dc5e06c6fe01ff3e5..eb0c7f5ba759ad5f12b8affddb77a87df86630f7 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java
@@ -1,5 +1,7 @@
 package com.galaxytrucker.galaxytruckerreloaded.Server;
 
+import com.galaxytrucker.galaxytruckerreloaded.Model.User;
+
 import java.io.*;
 import java.net.Socket;
 
@@ -26,6 +28,15 @@ public class ClientHandler implements Runnable {
     /** ObjectInputStream for receiving objects */
     private ObjectInputStream receiveObject;
 
+    /** Username */
+    private String username;
+
+    /** Game running */
+    private boolean gameActive = true;
+
+    /** User */
+    private User user;
+
     /** Constructor
      * @param clientSocket - the client's socket
      * @param server - the server */
@@ -37,6 +48,7 @@ public class ClientHandler implements Runnable {
             receiveObject = new ObjectInputStream(clientSocket.getInputStream());
             send = new PrintWriter(clientSocket.getOutputStream(),true);
             receive = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
+            serverServiceCommunicator = ServerServiceCommunicator.getInstance();
         }
         catch (Exception e){
             e.printStackTrace();
@@ -45,7 +57,55 @@ public class ClientHandler implements Runnable {
     }
 
     /** Run */
+    @Override
     public void run(){
+        System.out.println("\n========== HANDLER RUNNING ==========\n");
+        // ==================== 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]");
+                        // TODO WAIT FOR SHIP TYPE
 
+                        //=========================
+                        user.setFirstGame(false);
+                    }
+                    // ==================== UPDATE LOGIN ====================
+                    user.setLoggedIn(true);
+                    serverServiceCommunicator.getUserService().updateUser(user);
+                    // ==================== FETCH SHIP ====================
+                    try {
+                        send.println("[FETCH-SHIP]");
+                        sendObject.writeObject(user.getUserShip());
+                    }
+                    catch (Exception f){
+                        f.printStackTrace();
+                        send.println("[EXCEPTION]:[FETCH-SHIP]:[USERNAME]:"+username);
+                        throw new IllegalArgumentException(f.getMessage());
+                    }
+                }
+                catch (Exception e){
+                    e.printStackTrace();
+                    send.println("[EXCEPTION]:[NEW-GAME]:[USERNAME]:"+username);
+                }
+
+                // ==================== RUNNING ====================
+                while (gameActive){
+                    //TODO SEND AND RECEIVE DATA
+                }
+            }
+        }
+        catch (Exception e){
+            e.printStackTrace();
+            send.println("[EXCEPTION]:[LOGIN]:[USERNAME]:"+username);
+        }
     }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java
index 8379a87b60a6b39c27ae7d608cec1cdb3949c3e0..8c340831d8c27216f782a6248f6ae3dc76273df9 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java
@@ -1,9 +1,14 @@
 package com.galaxytrucker.galaxytruckerreloaded.Server;
 
+import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew;
+import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet;
+import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.List;
+
 @Getter
 @Setter
 public class RequestObject {
@@ -16,4 +21,18 @@ public class RequestObject {
 
     /** Ship */
     private Ship ship;
+
+    /** Trader */
+    private Trader trader;
+
+    /** Planet */
+    private Planet planet;
+
+    /** Crew */
+    private Crew crew;
+
+    /** List of crew */
+    private List<Crew> moreCrew;
+
+
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java
index 8615f415376d09c38d244fd0d47c6b020a5fe848..59033b7bbbf373d463a12d8d1988ca41e5572f11 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java
@@ -1,5 +1,5 @@
 package com.galaxytrucker.galaxytruckerreloaded.Server;
 
 public enum RequestType {
-    LOGIN
+
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java
index 53554153ed9148388ba6d69b4df3fe53159bd34f..f926efaa66d24242b884f08ff39fd98085eb6deb 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java
@@ -39,6 +39,7 @@ public class Server implements Runnable{
             System.out.println(f);
         }
         Client client = new Client("localhost",5050);
+        boolean a = client.login("ahmad");
     }
 
     /** Start server on specified port
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java
index 709b20aded5250f06778d8b0a14af1555a1997ec..171b7c28c1489e3a2681c3a08bb1e67fbba5f196 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java
@@ -1,12 +1,23 @@
 package com.galaxytrucker.galaxytruckerreloaded.Server;
 
 import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
+import com.galaxytrucker.galaxytruckerreloaded.Model.User;
+import com.galaxytrucker.galaxytruckerreloaded.Server.Exception.UserNotFoundException;
+import com.galaxytrucker.galaxytruckerreloaded.Server.Services.UserService;
 import lombok.AccessLevel;
+import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 
+/** ServerServiceCommunicator for executing logic using services, singleton */
 @RequiredArgsConstructor(access = AccessLevel.PUBLIC)
+@Getter
 public class ServerServiceCommunicator {
 
+    /** ServerServiceCommunicator */
+    private static ServerServiceCommunicator serverServiceCommunicator = null;
+
+    /** User service */
+    private UserService userService = new UserService();
 
     /** Take a request from the client side, pass it through the services
      * and return a response
@@ -25,8 +36,29 @@ public class ServerServiceCommunicator {
     /** Login
      * @param username - the user that wants to login
      * @return if the client is allowed to login */
-    public String login(String username){
-        return null;
+    public boolean isLoggedIn(String username) throws IllegalArgumentException {
+        try {
+            return userService.getUser(username).isLoggedIn();
+        }
+        catch (Exception e){
+            System.out.println("[NEW-USER]:[USERNAME]:"+username);
+            try {
+                userService.addUser(username);
+                return false;
+            }
+            catch (Exception f){
+                f.printStackTrace();
+                throw new IllegalArgumentException();
+            }
+        }
+    }
+
+    /** Get instance */
+    public static ServerServiceCommunicator getInstance(){
+        if (serverServiceCommunicator == null){
+            serverServiceCommunicator = new ServerServiceCommunicator();
+        }
+        return serverServiceCommunicator;
     }
 
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/BattleService.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/BattleService.java
index d925996d21cd9bef296a4d6267f099dfbf27c2db..beb4cad26c2045d98236e900a897955cd745adf7 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/BattleService.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/BattleService.java
@@ -1,6 +1,5 @@
 package com.galaxytrucker.galaxytruckerreloaded.Server.Services;
 
-import com.badlogic.gdx.scenes.scene2d.ui.List;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
 import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room;
 import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon;
@@ -10,6 +9,8 @@ import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.ShipDAO;
 import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.WeaponDAO;
 import lombok.*;
 
+import java.util.List;
+
 /** This class handles battle logic on the server side */
 @Getter
 @Setter
@@ -47,13 +48,19 @@ public class BattleService {
     private RewardService rewardService;
 
     /** Change the ship which's round it is */
-    public void nextRound(){}
+    public void nextRound(){
+        for (Ship s : participants){
+            if (!s.getAssociatedUser().equals(currentRound.getAssociatedUser())){
+                currentRound = s;
+            }
+        }
+    }
 
     /** Validate user input by checking if it's his round to play
      * @param s - the ship which wants to play
      * @return true if it is it's round else false */
     public boolean validMove(Ship s){
-        return false;
+        return currentRound.getAssociatedUser().equals(s.getAssociatedUser());
     }
 
     /** Make one ship attack another's section
@@ -61,7 +68,10 @@ public class BattleService {
      * @param opponent - the opponent's ship
      * @param weapon - the weapon attacking
      * @param room - the room being attacked */
-    public void attack(Ship attacker, Ship opponent, Weapon weapon, Room room){}
+    public void attack(Ship attacker, Ship opponent, Weapon weapon, Room room){
+        if (validMove(attacker)){
+        }
+    }
 
     /** Heal a ship
      * @param ship - the ship to heal
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/UserService.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/UserService.java
index bfa05acd078cc161677fc64736b5a24f38e367aa..85bf355e4ebada1a7f6f8b6fe3ebe18620bd317e 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/UserService.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/UserService.java
@@ -5,12 +5,17 @@ import com.galaxytrucker.galaxytruckerreloaded.Server.Exception.DuplicateUserExc
 import com.galaxytrucker.galaxytruckerreloaded.Server.Exception.UserNotFoundException;
 import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.UserDAO;
 
+import javax.persistence.EntityManager;
+
 public class UserService {
 
     /**
      * The userDAO used to store and fetch data
      */
-    private UserDAO userDAO;
+    private UserDAO userDAO = new UserDAO();
+
+    /** Entity Manager */
+    private EntityManager entityManager = userDAO.entityManager;
 
     /**
      * add a new user to the database
@@ -20,6 +25,7 @@ public class UserService {
      * @throws DuplicateUserException if the user already exists
      */
     public void addUser(String username) throws DuplicateUserException {
+        userDAO.persist(new User(username));
     }
 
     /**
@@ -30,7 +36,10 @@ public class UserService {
      * @throws UserNotFoundException if the user couldn't be found
      */
     public User getUser(String username) throws UserNotFoundException {
-        return null;
+        entityManager.getTransaction().begin();
+        User u = entityManager.find(User.class,username);
+        entityManager.getTransaction().commit();
+        return u;
     }
 
     /**
@@ -40,6 +49,7 @@ public class UserService {
      * @throws UserNotFoundException if the user cannot be found in the database
      */
     public void updateUser(User u) throws UserNotFoundException {
+        userDAO.update(u);
     }
 
     /**
@@ -50,6 +60,9 @@ public class UserService {
      * @throws UserNotFoundException if the user cannot be found
      */
     public void removeUserByUsername(String username) throws UserNotFoundException {
+        entityManager.getTransaction().begin();
+        entityManager.remove(getUser(username));
+        entityManager.getTransaction().commit();
     }
 
     /**
@@ -59,15 +72,4 @@ public class UserService {
      */
     public void saveGame(String username) throws UserNotFoundException {
     }
-
-    /**
-     * Login
-     *
-     * @param username - the username of the user
-     * @return true - if the login was successful else return false
-     *
-     */
-    public boolean login(String username) {
-        return false;
-    }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/CrewDAOTest.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/CrewDAOTest.java
index 4d91f5c23833197c81865562a46bddb020b053b6..943f53ae70714319c137694d68f216dcba233268 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/CrewDAOTest.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/CrewDAOTest.java
@@ -12,6 +12,7 @@ import javax.persistence.EntityManager;
 import javax.xml.crypto.Data;
 import java.util.UUID;
 
+/** Test the crew database access object */
 public class CrewDAOTest {
 
 
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/OverworldDAOTest.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/OverworldDAOTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f0688aa00bc5f830b3ee2a5907a4027af4bf59d6
--- /dev/null
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/OverworldDAOTest.java
@@ -0,0 +1,54 @@
+package com.galaxytrucker.galaxytruckerreloaded.Test.Server.Persistence;
+
+import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld;
+import com.galaxytrucker.galaxytruckerreloaded.Server.Database.Database;
+import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.OverworldDAO;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.persistence.EntityManager;
+import java.util.UUID;
+
+/** Test the overworld database access object */
+public class OverworldDAOTest {
+
+    /** EntityManager */
+    private EntityManager entityManager = Database.getEntityManager();
+
+    /** OverworldDAO */
+    private OverworldDAO overworldDAO = new OverworldDAO();
+
+    /** Test adding a new overworld to the database */
+    @Test
+    public void testPersist() {
+        try {
+            Overworld overworld = new Overworld(UUID.randomUUID().hashCode(), UUID.randomUUID().hashCode(), "test");
+            overworldDAO.persist(overworld);
+            entityManager.getTransaction().begin();
+            Overworld o2 = entityManager.find(Overworld.class,overworld.getId());
+            entityManager.getTransaction().commit();
+            Assert.assertEquals(overworld.getSeed(),o2.getSeed());
+        }
+        catch (Exception e){
+            e.printStackTrace();
+            throw new IllegalArgumentException(e.getMessage());
+        }
+    }
+
+    /** Test removing an existing overworld from the database */
+    @Test
+    public void testRemove(){
+        try {
+            Overworld overworld = new Overworld(UUID.randomUUID().hashCode(),UUID.randomUUID().hashCode(),"test");
+            overworldDAO.persist(overworld);
+            overworldDAO.remove(overworld);
+            entityManager.getTransaction().begin();
+            Assert.assertNull(entityManager.find(Overworld.class,overworld.getId()));
+            entityManager.getTransaction().commit();
+        }
+        catch (Exception e){
+            e.printStackTrace();
+            throw new IllegalArgumentException(e.getMessage());
+        }
+    }
+}
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/PlanetDAOTest.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/PlanetDAOTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..bd51e4fbc536e1900de873429a2a8b8f91633209
--- /dev/null
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/PlanetDAOTest.java
@@ -0,0 +1,73 @@
+package com.galaxytrucker.galaxytruckerreloaded.Test.Server.Persistence;
+
+import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet;
+import com.galaxytrucker.galaxytruckerreloaded.Model.Map.PlanetEvent;
+import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
+import com.galaxytrucker.galaxytruckerreloaded.Server.Database.Database;
+import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.PlanetDAO;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.persistence.EntityManager;
+import java.util.ArrayList;
+
+/** Test the planet database access object */
+public class PlanetDAOTest {
+
+    /** Entity manager */
+    private EntityManager entityManager = Database.getEntityManager();
+
+    /** Planet DAO */
+    private PlanetDAO planetDAO = new PlanetDAO();
+
+    /** Test adding a new planet to the database */
+    @Test
+    public void testPersist(){
+        Planet planet = new Planet(TraderDAOTest.planetNameGenerator(),0,0, PlanetEvent.VOID,new ArrayList<Ship>());
+        try {
+            planetDAO.persist(planet);
+            entityManager.getTransaction().begin();
+            Assert.assertEquals(planet.getName(),entityManager.find(Planet.class,planet.getName()).getName());
+            entityManager.getTransaction().commit();
+        }
+        catch (Exception e){
+            e.printStackTrace();
+            throw new IllegalArgumentException(e.getMessage());
+        }
+    }
+
+    /** Test editing a planet in the database */
+    @Test
+    public void testEdit(){
+        Planet planet = new Planet(TraderDAOTest.planetNameGenerator(),0,0, PlanetEvent.VOID,new ArrayList<Ship>());
+        try {
+            planetDAO.persist(planet);
+            planet.setEvent(PlanetEvent.SHOP);
+            planetDAO.update(planet);
+            entityManager.getTransaction().begin();
+            Assert.assertEquals(PlanetEvent.SHOP,entityManager.find(Planet.class,planet.getName()).getEvent());
+            entityManager.getTransaction().commit();
+        }
+        catch (Exception e){
+            e.printStackTrace();
+            throw new IllegalArgumentException(e.getMessage());
+        }
+    }
+
+    /** Test removing a planet from the database */
+    @Test
+    public void testRemove(){
+        Planet planet = new Planet(TraderDAOTest.planetNameGenerator(),0,0, PlanetEvent.VOID,new ArrayList<Ship>());
+        try {
+            planetDAO.persist(planet);
+            planetDAO.remove(planet);
+            entityManager.getTransaction().begin();
+            Assert.assertNull(entityManager.find(Planet.class,planet.getName()));
+            entityManager.getTransaction().commit();
+        }
+        catch (Exception e){
+            e.printStackTrace();
+            throw new IllegalArgumentException(e.getMessage());
+        }
+    }
+}
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/TraderDAOTest.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/TraderDAOTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..72f50bfc18a41933eea6bf8138668b58fa13d03f
--- /dev/null
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/TraderDAOTest.java
@@ -0,0 +1,111 @@
+package com.galaxytrucker.galaxytruckerreloaded.Test.Server.Persistence;
+
+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.Weapons.Weapon;
+import com.galaxytrucker.galaxytruckerreloaded.Server.Database.Database;
+import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.TraderDAO;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.persistence.EntityManager;
+import java.util.ArrayList;
+import java.util.Random;
+import java.util.UUID;
+
+/**
+ * Test the trader database access object
+ */
+public class TraderDAOTest {
+
+    /**
+     * EntityManager
+     */
+    private EntityManager entityManager = Database.getEntityManager();
+
+    /**
+     * Trader DAO
+     */
+    private TraderDAO traderDAO = new TraderDAO();
+
+    /**
+     * Test adding a new trader to the database
+     */
+    @Test
+    public void testPersist() {
+        Trader trader = new Trader(UUID.randomUUID().hashCode(), new Planet(planetNameGenerator(), 10, 10,
+                PlanetEvent.SHOP, new ArrayList<Ship>()), new ArrayList<Weapon>(), 0, 0, new ArrayList<Crew>());
+        try {
+            traderDAO.persist(trader);
+            entityManager.getTransaction().begin();
+            Trader trader1 = entityManager.find(Trader.class, trader.getId());
+            entityManager.getTransaction().commit();
+            Assert.assertEquals(trader1.getId(), trader.getId());
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new IllegalArgumentException();
+        }
+    }
+
+    /**
+     * Test editing an existing trader in the database
+     */
+    @Test
+    public void testEdit() {
+        Trader trader = new Trader(UUID.randomUUID().hashCode(), new Planet(planetNameGenerator(), 10, 10,
+                PlanetEvent.SHOP, new ArrayList<Ship>()), new ArrayList<Weapon>(), 0, 0, new ArrayList<Crew>());
+        try {
+            traderDAO.persist(trader);
+            entityManager.getTransaction().begin();
+            Trader trader1 = entityManager.find(Trader.class, trader.getId());
+            trader1.setFuelStock(10);
+            traderDAO.update(trader1);
+            entityManager.getTransaction().commit();
+            Assert.assertEquals(trader1.getFuelStock(), 10);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new IllegalArgumentException();
+        }
+    }
+
+    /**
+     * Test removing an existing trader from the database
+     */
+    @Test
+    public void testRemove() {
+        Trader trader = new Trader(UUID.randomUUID().hashCode(), new Planet(planetNameGenerator(), 10, 10,
+                PlanetEvent.SHOP, new ArrayList<Ship>()), new ArrayList<Weapon>(), 0, 0, new ArrayList<Crew>());
+        try {
+            traderDAO.persist(trader);
+            traderDAO.remove(trader);
+            entityManager.getTransaction().begin();
+            Trader trader1 = entityManager.find(Trader.class,trader.getId());
+            entityManager.getTransaction().commit();
+            Assert.assertNull(trader1);
+        }
+        catch (Exception e){
+            e.printStackTrace();
+            throw new IllegalArgumentException();
+        }
+    }
+
+
+    /** Random planet name generator
+     * @return a random planet name */
+    public static String planetNameGenerator(){
+        Random random = new Random();
+        String alphabet = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
+        alphabet = alphabet.replace(',',' ');
+        StringBuilder builder = new StringBuilder();
+        for (int i=0;i<100;i++){
+            builder.append(alphabet.toCharArray()[random.nextInt(alphabet.length())]);
+        }
+        return builder.toString();
+    }
+
+}
diff --git a/core/src/main/resources/META-INF/persistence.xml b/core/src/main/resources/META-INF/persistence.xml
index 4c58c8089a776ec7cda39e824d734f97cbd5551f..7c239e2dde412c4cbe1a907b6f398321cdd563bb 100644
--- a/core/src/main/resources/META-INF/persistence.xml
+++ b/core/src/main/resources/META-INF/persistence.xml
@@ -4,8 +4,15 @@
              version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
 
     <persistence-unit name="database" transaction-type="RESOURCE_LOCAL">
-        <class>com.galaxytrucker.galaxytruckerreloaded.Model.User</class>
         <class>com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.System</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.Ship</class>
+        <class>com.galaxytrucker.galaxytruckerreloaded.Model.User</class>
         <properties>
             <property name="javax.persistence.jdbc.url" value="jdbc:h2:./database;DB_CLOSE_ON_EXIT=FALSE;" />
             <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
diff --git a/database.mv.db b/database.mv.db
new file mode 100644
index 0000000000000000000000000000000000000000..503530ed591b0a4d036233340864f4b4e79db998
Binary files /dev/null and b/database.mv.db differ
diff --git a/exceptions.md b/exceptions.md
new file mode 100644
index 0000000000000000000000000000000000000000..553715e01d34de7acdd31abf3c9829942f30525f
--- /dev/null
+++ b/exceptions.md
@@ -0,0 +1,13 @@
+# Exceptions and Solutions
+
+## Persistence:
+
+### Exception: java.lang.ClassCastException 
+* stack trace: class org.hibernate.mapping.SingleTableSubclass cannot be cast to class org.hibernate.mapping.RootClass
+* Possible Solution: Remove @Id Tags from Subclasses.
+
+### Exception: Unmapped class
+* Solution: Add class to persistence mapping in META-INF/persistence.xml
+
+### Exception: Primary key violation
+* Solution: an entity with this key already exists you idiot, change it!