diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java
index 11a370e432391d9598d87499cb6349e0e131231c..b05b700bfa6354463857b213bd26ad77b9749bd1 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java
@@ -1,44 +1,80 @@
 package com.galaxytrucker.galaxytruckerreloaded.Communication;
 
+import com.galaxytrucker.galaxytruckerreloaded.Server.RequestObject;
+import com.galaxytrucker.galaxytruckerreloaded.Server.ResponseObject;
+import lombok.NonNull;
+
+import java.io.*;
 import java.net.Socket;
 
 public class Client {
 
+    /**
+     * Client socket for network communication
+     */
     private Socket socket;
 
-    private ClientControllerCommunicator clientControllerCommunicator;
+    /**
+     * Used to send data
+     */
+    private PrintWriter send;
 
     /**
-     * - Request and Response from and to the server.
-     * */
-    public String sendAndReceive(){
-        // View clicks something
-        // Controller issues a request
-        // Client ships request to server
-        // receive response
-        // give response to controller
-        // update views
-        // return server response as string
-        return null;
-    }
+     * Used to receive data
+     */
+    private BufferedReader receive;
 
-    /** Constructor
-     *  Loop for receiving Data
-     * */
-    public Client(){
-        clientControllerCommunicator = new ClientControllerCommunicator();
-        // Connect to server
+    /**
+     * ObjectOutputStream for sending objects
+     */
+    private ObjectOutputStream sendObject;
+
+    /**
+     * ObjectInputStream for receiving objects
+     */
+    private ObjectInputStream receiveObject;
+
+    /**
+     * Send a request to the server
+     * @return the server's response
+     */
+    public ResponseObject sendAndReceive(RequestObject requestObject) throws IllegalArgumentException {
         try {
-            // Send login request
-            // receive true/false
-            // send ship request
-            //clientControllerCommunicator.setClientShip();
+            sendObject.writeObject(requestObject);
+            return (ResponseObject) receiveObject.readObject();
         }
         catch (Exception e){
+            e.printStackTrace();
+            throw new IllegalArgumentException(e.getMessage());
+        }
+    }
 
+    /**
+     * Login
+     */
+    public boolean login(String username) throws IllegalArgumentException {
+        try {
+            send.println("[LOGIN]:" + username);
+            return receive.readLine().equals("[ACCEPTED]");
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new IllegalArgumentException(e.getMessage());
         }
-        while (true){
-            sendAndReceive();
+    }
+
+    /**
+     * Constructor
+     */
+    public Client(@NonNull String ipAddress, @NonNull int port) throws IllegalArgumentException {
+        try {
+            socket = new Socket(ipAddress, port);
+            send = new PrintWriter(socket.getOutputStream(), true);
+            receive = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+            sendObject = new ObjectOutputStream(socket.getOutputStream());
+            receiveObject = new ObjectInputStream(socket.getInputStream());
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new IllegalArgumentException("Couldn't initialize connection to server");
         }
     }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..32c776cb91e787e81d33f34dc5e06c6fe01ff3e5
--- /dev/null
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java
@@ -0,0 +1,51 @@
+package com.galaxytrucker.galaxytruckerreloaded.Server;
+
+import java.io.*;
+import java.net.Socket;
+
+public class ClientHandler implements Runnable {
+
+    /** Client socket */
+    private Socket clientSocket;
+
+    /** The server */
+    public Server server;
+
+    /** ServerServiceCommunicator */
+    private ServerServiceCommunicator serverServiceCommunicator;
+
+    /** Used to send data */
+    private PrintWriter send;
+
+    /** Used to receive data */
+    private BufferedReader receive;
+
+    /** ObjectOutputStream for sending objects */
+    private ObjectOutputStream sendObject;
+
+    /** ObjectInputStream for receiving objects */
+    private ObjectInputStream receiveObject;
+
+    /** Constructor
+     * @param clientSocket - the client's socket
+     * @param server - the server */
+    public ClientHandler(Socket clientSocket,Server server) throws IllegalArgumentException {
+        this.clientSocket = clientSocket;
+        this.server = server;
+        try {
+            sendObject = new ObjectOutputStream(clientSocket.getOutputStream());
+            receiveObject = new ObjectInputStream(clientSocket.getInputStream());
+            send = new PrintWriter(clientSocket.getOutputStream(),true);
+            receive = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
+        }
+        catch (Exception e){
+            e.printStackTrace();
+            throw new IllegalArgumentException();
+        }
+    }
+
+    /** Run */
+    public void run(){
+
+    }
+}
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java
new file mode 100644
index 0000000000000000000000000000000000000000..8379a87b60a6b39c27ae7d608cec1cdb3949c3e0
--- /dev/null
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java
@@ -0,0 +1,19 @@
+package com.galaxytrucker.galaxytruckerreloaded.Server;
+
+import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class RequestObject {
+
+    /** Type of Request */
+    private RequestType requestType;
+
+    /** Username */
+    private String username;
+
+    /** Ship */
+    private Ship ship;
+}
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java
new file mode 100644
index 0000000000000000000000000000000000000000..8615f415376d09c38d244fd0d47c6b020a5fe848
--- /dev/null
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java
@@ -0,0 +1,5 @@
+package com.galaxytrucker.galaxytruckerreloaded.Server;
+
+public enum RequestType {
+    LOGIN
+}
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ResponseObject.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ResponseObject.java
new file mode 100644
index 0000000000000000000000000000000000000000..e4456aae02ee651e2198baedb375eb7c1971c196
--- /dev/null
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ResponseObject.java
@@ -0,0 +1,4 @@
+package com.galaxytrucker.galaxytruckerreloaded.Server;
+
+public class ResponseObject {
+}
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java
index 3bcc4ce105e70d2f97b45a0c49ebe5819ccafa43..53554153ed9148388ba6d69b4df3fe53159bd34f 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java
@@ -1,28 +1,104 @@
 package com.galaxytrucker.galaxytruckerreloaded.Server;
 
 
+import com.galaxytrucker.galaxytruckerreloaded.Communication.Client;
+
+import java.net.ServerSocket;
 import java.net.Socket;
 
 /**
  * This class creates the game server and handles storing the data
  */
-public class Server {
+public class Server implements Runnable{
+
+    /** Server socket for network communication  */
+    private ServerSocket serverSocket;
+
+    /** Server thread */
+    private Thread serverThread;
 
-    /** Server service communicator */
+    /** ServerServiceCommunicator */
     private ServerServiceCommunicator serverServiceCommunicator;
 
+    /** Server port */
+    private int port;
+
+    /** Is the server running? */
+    private boolean running = true;
+
     /** Main method */
-    public static void main(String[] args){}
+    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){
+            System.out.println(f);
+        }
+        Client client = new Client("localhost",5050);
+    }
 
-    /** Client handler
-     * @param socket - the client's socket */
-    private void clientHandler(Socket socket){
+    /** Start server on specified port
+     * @param port - the port to bind */
+    private void bindPort(int port) {
+        try {
+            this.serverSocket = new ServerSocket(port);
+        }
+        catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    /** Is the server running? */
+    private synchronized boolean isRunning(){
+        return this.running;
+    }
 
+    /** Kill server */
+    public synchronized void killServer(){
+        try {
+            this.serverSocket.close();
+            this.running = false;
+        }
+        catch (Exception e){
+            e.printStackTrace();
+        }
     }
 
-    /** Receive some data from the client and return a response
-     * @param socket - the client socket */
-    private void receiveAndSendData(Socket socket){
+    /** Get the serverServiceCommunicator */
+    public synchronized ServerServiceCommunicator getServerServiceCommunicator(){
+        return this.serverServiceCommunicator;
     }
 
+    /** Run the server */
+    public void run(){
+        synchronized (this){
+            this.serverThread = Thread.currentThread();
+        }
+        bindPort(this.port);
+        System.out.println("Server initialized on " + serverSocket.getInetAddress().getHostAddress() + ":" + this.port + ", listening for connections...");
+        while (isRunning()){
+            Socket clientSocket = null;
+            try {
+                clientSocket = serverSocket.accept();
+                System.out.println("Accepted new connection from "+ clientSocket.getInetAddress().getHostAddress());
+            }
+            catch (Exception e){
+                e.printStackTrace();
+            }
+            Server server = this;
+            new Thread(
+                  new ClientHandler(clientSocket,server)
+            ).start();
+        }
+    }
+
+    /** Set the server port
+     * @param port - the server port */
+    public void setPort(int port){
+        this.port = port;
+    }
 }
diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java
index 59ddc12cfbad4b698a080f3a44f1432c1d3f4e2e..709b20aded5250f06778d8b0a14af1555a1997ec 100644
--- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java
+++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java
@@ -2,7 +2,6 @@ package com.galaxytrucker.galaxytruckerreloaded.Server;
 
 import com.galaxytrucker.galaxytruckerreloaded.Model.Ship;
 import lombok.AccessLevel;
-import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 
 @RequiredArgsConstructor(access = AccessLevel.PUBLIC)