diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5b583c4d367465c421bdcd2dbc0948edd4088f51..f03a39fd0c735b0e7f46a02d2080948a4b17d74b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,23 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [1.4.1-SNAPSHOT] - 2020-01-04
+
+### Added
+- Added response Response with Status.OK on incomming ExceptionMessages
+- Added response Response with Status.OK on incomming LeaveMessages
+- Added response Response with Status.OK on incomming AkkaSystemJoinedMessages
+- Added response Response with Status.OK on incomming AkkaSystemLeaveMessages
+- Added response Response with Status.OK on incomming ForwardableP2PMessages
+- Added response Response with Status.OK on incomming InitCompleteMessages
+- Added response Response with Status.OK on incomming PeerOfflineMessages
+- Added response Response with Status.NOT_IMPLEMENTED on incomming HandoffCompletedMessages
+
+### Changed
+- Changed the response by an already open connection from ExceptionMessage to a Response with an ExceptionMessage
+- Removed the LeaveMessage from the NetworkTool.alive() method, because this is no longer needed (the relay recognizes the broken connection)
+- Corrected the JavaDoc of the Client
+
 ## [1.4.0-SNAPSHOT] - 2019-12-27
 
 ### Upgrade notice
diff --git a/README.md b/README.md
index a3abbf6b3e32ef05b41f2699bfe49d2164800123..bfa547b3dabbb76599ecde3b170c7aed19ca5e2d 100644
--- a/README.md
+++ b/README.md
@@ -15,9 +15,13 @@ A monitoring website is by default activated and listening on port `8080`. Remem
 ## Usage
 
 To establish a connection to the relay, a [JoinMessage](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/blob/master/common/src/main/java/city/sane/relay/common/messages/JoinMessage.java) must be sent as a handshake.
-If the mediator has been successfully registered with the relay, it responds with a [Status.OK](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/blob/master/common/src/main/java/city/sane/relay/common/messages/Status.java) packed in a [Response](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/blob/master/common/src/main/java/city/sane/relay/common/messages/Response.java).
+If the mediator has been successfully registered with the relay, it responds with a [BackupRelayServersMessage](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/blob/master/common/src/main/java/city/sane/relay/common/messages/BackupRelayServersMessage.java) packed in a [Response](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/blob/master/common/src/main/java/city/sane/relay/common/messages/Response.java).
 No messages from or to the mediator are forwarded before the handshake. **If a handshake is not successfully performed within 30s, the connection is disconnected. If a non-valid message is sent before a handshake, the connection is also closed because an incorrect protocol/client is assumed.**
 
+See also this diagram:
+![JoinMessageAction-sequence-diagram](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/raw/master/docs/diagrams/pdf/JoinMessageAction-sequence-diagram.pdf)
+
+
 A dummy client can be found [here](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/blob/master/server/src/test/java/city/sane/relay/server/dummy/DummyClient.java).
 How this is used can be seen in this [JUnit test](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/blob/master/server/src/test/java/city/sane/relay/server/ClientTest.java).
 
diff --git a/common/src/main/java/city/sane/relay/common/tools/NetworkTool.java b/common/src/main/java/city/sane/relay/common/tools/NetworkTool.java
index fb71873d7515ef2809e993363323ff9209f88e40..97e575607f2ab1f2c454fd801a5b7b48b84af76a 100644
--- a/common/src/main/java/city/sane/relay/common/tools/NetworkTool.java
+++ b/common/src/main/java/city/sane/relay/common/tools/NetworkTool.java
@@ -3,15 +3,10 @@ package city.sane.relay.common.tools;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.io.PrintWriter;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.net.URL;
 
-import org.apache.commons.codec.Charsets;
-
-import city.sane.relay.common.messages.LeaveMessage;
-
 public final class NetworkTool {
     /**
      * The minimum server port number.
@@ -96,8 +91,6 @@ public final class NetworkTool {
     /**
      * Checks to see if a specific host:port is available.
      * 
-     * Sends a LeaveMessage to avoid using unnecessary resources.
-     * 
      * @param host host name or IP address to check for availability
      * @param port the port number to check for availability
      * @throws IllegalArgumentException is thrown if the port number is out of range
@@ -108,8 +101,6 @@ public final class NetworkTool {
             throw new IllegalArgumentException("Invalid port: " + port);
 
         try (Socket s = new Socket(host, port)) {
-            PrintWriter out = new PrintWriter(s.getOutputStream(), true, Charsets.UTF_8);
-            out.println(MessageJSONTool.getGson().toJson(new LeaveMessage()));
             return true;
         } catch (IOException e) {
             // Do nothing
diff --git a/docs/diagrams/ForwardableMessageAction-sequence-diagram.drawio b/docs/diagrams/ForwardableMessageAction-sequence-diagram.drawio
new file mode 100644
index 0000000000000000000000000000000000000000..748c1fa0624e9d9259152014e8236a531b4bacf7
--- /dev/null
+++ b/docs/diagrams/ForwardableMessageAction-sequence-diagram.drawio
@@ -0,0 +1 @@
+<mxfile host="Electron" modified="2020-01-05T00:56:39.723Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/12.4.2 Chrome/78.0.3904.130 Electron/7.1.4 Safari/537.36" etag="1H6kZJtl_hSw3gVc7NBq" version="12.4.2" type="device" pages="1"><diagram id="jNmw1OtuLjn-EWaEBNeS" name="Seite-1">7Vhbc5s4FP41PCbDxeD40Zek3Z1mtk1mtu1TR4ZjrIlArBCx3V+/RyDumJI23stM/GL0gS6c7ztHnzCcdXR8J0iyv+cBMMM2g6PhbAzbtk3Pxj+FnDTiuFaBhIIGBdYAHul30KCp0YwGkLYelJwzSZM26PM4Bl+2MCIEP7Qf23HWnjUhIfSAR5+wPvqZBnJfoDf2vMbfAw335cyWtyjuRKR8WL9JuicBPzQg59Zw1oJzWVxFxzUwFb0yLkW/uzN3q4UJiOWUDr99+rr69mHD39u///FsP9x9jpbx1awY5ZmwTL+w4SwfgJGTXrQ8lZHA9SfqMovYB7oDRmNsrRIQNAIJAu8wDX+ssdVhTyU8JsRXXQ8oEsT2MmLYsvASaZMEu4iqzRhJUrrNZzUREeBnIqXP8ABpoQ6F8kyqmdYV6/mjPIsDCPRQVbzNfNyI+vqakS2wFfGfwrzDmjOupo95/kKpFPyp4loNtMM13pGIMqXhP0EEJCYa1nq1MGorwmgYY8NHPvJX16EFIeF4ljOrUgLmEHAMm8DQm7qDN1tce3Oz+ukBdDJdOZ7W1qGWpmVqbN+QpbfQINHpEFZT1YrBCy2aFwjI7QuoK5wG3QmnscyX4K4Md9PRDxdyz0MeE9ZUUM2q+b9h9XyunaV65ra4rWhsUdtndn4pYr2hynAPASUSA/tWHP794jAzTSwOEyqCO6Qb71LCmb9VhKkVwRvlt0ztF1YE72LM3vSYTSEOELnj4kAwXpiY95CmylKNUK4iRdFhLXUgt1xKHuENHGypLJvCGPefcggX/kUTmje+TmJ3IpcQoNnTiwS25YfbGljlAN4o11tRrXqN5yy+Os+EDz9OE0lECGMacYc1ItCjSSx8bcM7wLju+lHlWa0t1zbHjIXtdjRUvI4epCOjalU/r6zFQM3wmFTbAa7MC9XVI/yVQYwxxdMEJaEgUe7nhQo2KofGoVrvGTXioUEH7VSOjAutB+/pFXNZtnejomB0dUYZ60C9+tDVe0SDIBfY0PbXrm2vYSGR6ba1uJpZ/UoyG7KN9qUqSbmAtrvoE7f0JeXxm9v4D7iNxVS3MV9cO84/eQSxrDfHMdVxWOYoyTc/dwhxL8ftwDGky23DNviMpKmio5nYlYe4Mq9NlHDTSCCwKIHNsekzNqdmqyGGRmF+FSPgTjQC1pn8bHAzZPRL7BcNw8Bhw+6yfsYk9MZaeOPmo7vtFKG5mPmw+ieWNWF+hvFC5+CRSG0U8TZNii0AMIginWAYphsBofYTUm80/RJ1vrgYtrPLf2N1QX8d1VMYVYR/XC/GjyiYUXbHXFivIjfb7IzqtUfgu10KL1QDNuuvrcXj9Udr5/Zv</diagram></mxfile>
\ No newline at end of file
diff --git a/docs/diagrams/JoinMessageAction-sequence-diagram.drawio b/docs/diagrams/JoinMessageAction-sequence-diagram.drawio
new file mode 100644
index 0000000000000000000000000000000000000000..5bb0015d5f7aa2de0550047b3dee95da143d0fc7
--- /dev/null
+++ b/docs/diagrams/JoinMessageAction-sequence-diagram.drawio
@@ -0,0 +1 @@
+<mxfile host="Electron" modified="2020-01-04T21:05:56.588Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/12.4.2 Chrome/78.0.3904.130 Electron/7.1.4 Safari/537.36" etag="2PvFMpCWPjXDKACj6eKU" version="12.4.2" type="device" pages="1"><diagram name="Page-1" id="13e1069c-82ec-6db2-03f1-153e76fe0fe0">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</diagram></mxfile>
\ No newline at end of file
diff --git a/docs/diagrams/pdf/JoinMessageAction-sequence-diagram.pdf b/docs/diagrams/pdf/JoinMessageAction-sequence-diagram.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..90bf62c901c6dcef99176c19fede7a50e3d5ee84
Binary files /dev/null and b/docs/diagrams/pdf/JoinMessageAction-sequence-diagram.pdf differ
diff --git a/server/src/main/java/city/sane/relay/server/actions/ExceptionMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/ExceptionMessageAction.java
index 750516c6bdb34f6b9e8ccbceca051973f85f8dd7..1c1ab15fcf020cc18083232f39d3f846dec324d1 100644
--- a/server/src/main/java/city/sane/relay/server/actions/ExceptionMessageAction.java
+++ b/server/src/main/java/city/sane/relay/server/actions/ExceptionMessageAction.java
@@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory;
 
 import city.sane.relay.common.messages.ExceptionMessage;
 import city.sane.relay.common.messages.Response;
+import city.sane.relay.common.messages.Status;
 import city.sane.relay.server.RelayServer;
 import city.sane.relay.server.actions.p2p.MessageAction;
 import city.sane.relay.server.client.Client;
@@ -17,7 +18,7 @@ public class ExceptionMessageAction implements RelayAction<ExceptionMessage> {
     @Override
     public void onMessage(ExceptionMessage message, Client client2, RelayServer relay2) {
         LOG.error("Received exception message: {}", message.getException());
-
+        client2.sendMessage(new Response(Status.OK, message.messageID));
     }
 
     @Override
diff --git a/server/src/main/java/city/sane/relay/server/actions/JoinMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/JoinMessageAction.java
index 675c15e7b839f2dc4c5376c0e956ee02945b6d54..ef290bab216d3010005ee9602c40f82607b0ea49 100644
--- a/server/src/main/java/city/sane/relay/server/actions/JoinMessageAction.java
+++ b/server/src/main/java/city/sane/relay/server/actions/JoinMessageAction.java
@@ -48,9 +48,11 @@ public class JoinMessageAction implements RelayAction<JoinMessage> {
                 client.close(false);
             }
         } else {
-            client.sendException(new ExceptionMessage(
-                    "This akka system has already an open connection to this relay server. Can't open more sockets."));
-            client.close(false);
+            client.sendExceptionAsResponse(new ExceptionMessage(
+                    "This akka system has already an open connection to this relay server. Can't open more sockets."),
+                    message.messageID);
+            if (!client.isInitialized())
+                client.close(false);
         }
     }
 
diff --git a/server/src/main/java/city/sane/relay/server/actions/LeaveMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/LeaveMessageAction.java
index 61a4f7f35081cb67e16f31163ddaf1a5cefffc75..dcdd37677e5b7e1709ecd2dd4ddffb200dd83602 100644
--- a/server/src/main/java/city/sane/relay/server/actions/LeaveMessageAction.java
+++ b/server/src/main/java/city/sane/relay/server/actions/LeaveMessageAction.java
@@ -2,6 +2,7 @@ package city.sane.relay.server.actions;
 
 import city.sane.relay.common.messages.LeaveMessage;
 import city.sane.relay.common.messages.Response;
+import city.sane.relay.common.messages.Status;
 import city.sane.relay.server.RelayServer;
 import city.sane.relay.server.actions.p2p.MessageAction;
 import city.sane.relay.server.client.Client;
@@ -11,6 +12,7 @@ public class LeaveMessageAction implements RelayAction<LeaveMessage> {
 
     @Override
     public void onMessage(LeaveMessage message, Client client, RelayServer relay) {
+        client.sendMessage(new Response(Status.OK, message.messageID));
         client.close(true);
     }
 
diff --git a/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemJoinedMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemJoinedMessageAction.java
index 0527a6eb66a2a26397e96170f9a24c5316cb3417..36bfa906b574d33ec8b59dae938433609e8bc961 100644
--- a/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemJoinedMessageAction.java
+++ b/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemJoinedMessageAction.java
@@ -4,6 +4,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import city.sane.relay.common.messages.Response;
+import city.sane.relay.common.messages.Status;
 import city.sane.relay.common.messages.p2p.AkkaSystemJoinedMessage;
 import city.sane.relay.server.RelayServer;
 import city.sane.relay.server.actions.RelayAction;
@@ -19,6 +20,7 @@ public class AkkaSystemJoinedMessageAction implements RelayAction<AkkaSystemJoin
         relay.getNewAkkaSystemsBucket().add(message.getAkkaSystemId());
         LOG.debug("Added the Akka system {} with the channels {} to the remote client bucket.", message.getAkkaSystemId(),
                 message.getChannels());
+        client.sendMessage(new Response(Status.OK, message.messageID));
     }
 
     @Override
diff --git a/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemLeaveMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemLeaveMessageAction.java
index 1fdaf27063132ffb004cbb10151474759cd599c9..89a6cb9a65386c94a9251b7393eb68537d637ee4 100644
--- a/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemLeaveMessageAction.java
+++ b/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemLeaveMessageAction.java
@@ -4,6 +4,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import city.sane.relay.common.messages.Response;
+import city.sane.relay.common.messages.Status;
 import city.sane.relay.common.messages.p2p.AkkaSystemLeaveMessage;
 import city.sane.relay.server.RelayServer;
 import city.sane.relay.server.actions.RelayAction;
@@ -18,6 +19,7 @@ public class AkkaSystemLeaveMessageAction implements RelayAction<AkkaSystemLeave
     public void onMessage(AkkaSystemLeaveMessage message, Client client, RelayServer relay) {
         relay.getClientBucket().removeClient(message.getAkkaSystemId());
         LOG.debug("Removed the Akka system {} from the local client bucket.", message.getAkkaSystemId());
+        client.sendMessage(new Response(Status.OK, message.messageID));
     }
 
     @Override
diff --git a/server/src/main/java/city/sane/relay/server/actions/p2p/ForwardableP2PMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/p2p/ForwardableP2PMessageAction.java
index e31d1d05918e1ad4dd28fab7203eb005f8e98f88..19c3e5b000ea6b0827620de0a9c9a1ffa93c0a0b 100644
--- a/server/src/main/java/city/sane/relay/server/actions/p2p/ForwardableP2PMessageAction.java
+++ b/server/src/main/java/city/sane/relay/server/actions/p2p/ForwardableP2PMessageAction.java
@@ -8,6 +8,7 @@ import city.sane.relay.common.messages.ForwardableMessage;
 import city.sane.relay.common.messages.p2p.ForwardableP2PMessage;
 import city.sane.relay.common.models.AkkaId;
 import city.sane.relay.common.messages.Response;
+import city.sane.relay.common.messages.Status;
 import city.sane.relay.server.RelayServer;
 import city.sane.relay.server.actions.RelayAction;
 import city.sane.relay.server.client.Client;
@@ -27,6 +28,7 @@ public class ForwardableP2PMessageAction implements RelayAction<ForwardableP2PMe
         localAkkaSystems.keySet().retainAll(AkkaSystemFilter.filter(sender, receiver, localAkkaSystems.keySet()));
 
         relay.broadcastMessageLocally(fwdMessage, localAkkaSystems);
+        client.sendMessage(new Response(Status.OK, message.messageID));
     }
 
     @Override
diff --git a/server/src/main/java/city/sane/relay/server/actions/p2p/HandoffCompletedMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/p2p/HandoffCompletedMessageAction.java
index 4ccbf42dea1a343b21c79f9a73fb04710470669f..45804a1266accb04700cab2296dbc155f818b526 100644
--- a/server/src/main/java/city/sane/relay/server/actions/p2p/HandoffCompletedMessageAction.java
+++ b/server/src/main/java/city/sane/relay/server/actions/p2p/HandoffCompletedMessageAction.java
@@ -1,6 +1,7 @@
 package city.sane.relay.server.actions.p2p;
 
 import city.sane.relay.common.messages.Response;
+import city.sane.relay.common.messages.Status;
 import city.sane.relay.common.messages.p2p.HandoffCompletedMessage;
 import city.sane.relay.server.RelayServer;
 import city.sane.relay.server.actions.RelayAction;
@@ -11,7 +12,7 @@ public class HandoffCompletedMessageAction implements RelayAction<HandoffComplet
 
     @Override
     public void onMessage(HandoffCompletedMessage message, Client client, RelayServer relay) {
-        // This message does not comes from the relay server
+        client.sendMessage(new Response(Status.NOT_IMPLEMENTED, message.messageID));
     }
 
     @Override
diff --git a/server/src/main/java/city/sane/relay/server/actions/p2p/InitCompleteMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/p2p/InitCompleteMessageAction.java
index 42964a730d6fb99aa467c3973a7d452e21efcd8c..4e8a261c4fd2a4538e9f95723a4ce62827da70ee 100644
--- a/server/src/main/java/city/sane/relay/server/actions/p2p/InitCompleteMessageAction.java
+++ b/server/src/main/java/city/sane/relay/server/actions/p2p/InitCompleteMessageAction.java
@@ -1,6 +1,7 @@
 package city.sane.relay.server.actions.p2p;
 
 import city.sane.relay.common.messages.Response;
+import city.sane.relay.common.messages.Status;
 import city.sane.relay.common.messages.p2p.InitCompleteMessage;
 import city.sane.relay.server.RelayServer;
 import city.sane.relay.server.actions.RelayAction;
@@ -15,6 +16,7 @@ public class InitCompleteMessageAction implements RelayAction<InitCompleteMessag
     @Override
     public void onMessage(InitCompleteMessage message, Client client, RelayServer relay) {
         relay.getRelayP2PAgent().checkIfRelocationNeeded();
+        client.sendMessage(new Response(Status.OK, message.messageID));
     }
 
     @Override
diff --git a/server/src/main/java/city/sane/relay/server/actions/p2p/PeerOfflineMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/p2p/PeerOfflineMessageAction.java
index 99a59a0076b1ae09e1c39c369a88564a4150d69e..539666fe31911c7d8b7fde81bcdda6fa5867a65a 100644
--- a/server/src/main/java/city/sane/relay/server/actions/p2p/PeerOfflineMessageAction.java
+++ b/server/src/main/java/city/sane/relay/server/actions/p2p/PeerOfflineMessageAction.java
@@ -8,6 +8,7 @@ import org.slf4j.LoggerFactory;
 import com.google.common.collect.Sets;
 
 import city.sane.relay.common.messages.Response;
+import city.sane.relay.common.messages.Status;
 import city.sane.relay.common.messages.p2p.PeerOfflineMessage;
 import city.sane.relay.common.models.AkkaId;
 import city.sane.relay.server.RelayServer;
@@ -29,6 +30,7 @@ public class PeerOfflineMessageAction implements RelayAction<PeerOfflineMessage>
             relay.getClientBucket().removeClients(akkaSystemsToRemove);
             LOG.debug("Removed received akka system IDs from the client bucket: {}", akkaSystemsToRemove);
         }
+        client.sendMessage(new Response(Status.OK, message.messageID));
     }
 
     @Override
diff --git a/server/src/main/java/city/sane/relay/server/client/Client.java b/server/src/main/java/city/sane/relay/server/client/Client.java
index c48904f7a5be800153cf532f9bfe18fafbeb08e6..55bff3a9f682d3d6669260b814b351064c02f07e 100644
--- a/server/src/main/java/city/sane/relay/server/client/Client.java
+++ b/server/src/main/java/city/sane/relay/server/client/Client.java
@@ -100,7 +100,6 @@ public class Client extends Thread {
                 }
 
                 if (!isInitialized() && !socket.isClosed() && !isClosed) {
-
                     sendException(new ExceptionMessage(
                             "Handshake did not take place successfully in " + timeout + " ms. Connection is closed."));
                     close(false);
@@ -237,7 +236,8 @@ public class Client extends Thread {
      * Sends a message to the remote host without any response.
      *
      * @param message message that should be sent
-     * @throws IllegalStateException if the client has not yet been initialized.
+     * @throws IllegalStateException if the client has already been prompted to
+     *                               close
      */
     public void sendMessage(Message message) {
         if (isClosed) {
@@ -257,7 +257,8 @@ public class Client extends Thread {
      *                      have been sent and a response received
      * @param responseClass the class of the response object, to avoid
      *                      ClassCastExceptions
-     * @throws IllegalStateException if the client has not yet been initialized.
+     * @throws IllegalStateException if the client has already been prompted to
+     *                               close
      * @return a future that can be fulfilled with a {@link Message response} to the
      *         message
      */
@@ -282,7 +283,7 @@ public class Client extends Thread {
                     futures.remove(message.messageID);
                     futuresTimeouted++;
                 }
-                    
+
             });
 
             outputQueue.add(gson.toJson(message));
@@ -298,7 +299,8 @@ public class Client extends Thread {
      * @param message       message that should be sent
      * @param responseClass the class of the response object, to avoid
      *                      ClassCastExceptions
-     * @throws IllegalStateException if the client has not yet been initialized.
+     * @throws IllegalStateException if the client has already been prompted to
+     *                               close
      * @return a future that can be fulfilled with a {@link Message response} to the
      *         message
      */
@@ -352,42 +354,42 @@ public class Client extends Thread {
     public IPAddress getClientsIP() {
         return clientsIP;
     }
-    
+
     /**
      * @return the boot timestamp
      */
     public long getBootTime() {
         return bootTime;
     }
-    
+
     /**
      * @return true if the client is terminated/dead
      */
     public boolean isTerminated() {
         return isTerminated;
     }
-    
+
     /**
      * @return the amount of pending futures
      */
     public int pendingFutures() {
         return futures.size();
     }
-    
+
     /**
      * @return the amount of futures that have time outed
      */
     public int timoutedFutures() {
         return futuresTimeouted;
     }
-    
+
     /**
      * @return the amount of pending out messages
      */
     public int pendingOutMsg() {
         return outputQueue.size();
     }
-    
+
     /**
      * @return the amount of pending in messages
      */
@@ -595,8 +597,9 @@ public class Client extends Thread {
                 processIncomingMessage(message);
             }
         } catch (IOException e) {
-            LOG.debug("[Client-{}] Closed input socket.", uid);
+            //
         } finally {
+            LOG.debug("[Client-{}] Closed input socket.", uid);
             close(true);
         }
     }
diff --git a/server/src/test/java/city/sane/relay/server/actions/JoinMessageActionTest.java b/server/src/test/java/city/sane/relay/server/actions/JoinMessageActionTest.java
index c39d2bf5ff59047d80e87e6fde5bcb0de07e9d8e..c14b87254f62ad0ab8632a4b8e9ae5aaa4c4b7fe 100644
--- a/server/src/test/java/city/sane/relay/server/actions/JoinMessageActionTest.java
+++ b/server/src/test/java/city/sane/relay/server/actions/JoinMessageActionTest.java
@@ -57,11 +57,12 @@ public class JoinMessageActionTest extends ActionTest {
         JoinMessage msg = new JoinMessage(AkkaId.of("akkaSystem"), new HashSet<>());
         classUnderTest.onMessage(msg, mockClient, mockRelay);
 
-        verify(mockClient, times(1)).sendException(new ExceptionMessage(
-                "This akka system has already an open connection to this relay server. Can't open more sockets."));
+        verify(mockClient, times(1)).sendExceptionAsResponse(new ExceptionMessage(
+                "This akka system has already an open connection to this relay server. Can't open more sockets."),
+                msg.messageID);
         verify(mockClient, never()).setInitialized(anyBoolean());
         verify(mockClient, never()).setUID(any());
-        verify(mockClient, times(1)).close(false);
+        verify(mockClient, never()).close(false);
     }
 
     @Test
@@ -72,8 +73,9 @@ public class JoinMessageActionTest extends ActionTest {
         JoinMessage msg = new JoinMessage(AkkaId.of("akkaSystem"), new HashSet<>());
         classUnderTest.onMessage(msg, mockClient, mockRelay);
 
-        verify(mockClient, times(1)).sendException(new ExceptionMessage(
-                "This akka system has already an open connection to this relay server. Can't open more sockets."));
+        verify(mockClient, times(1)).sendExceptionAsResponse(new ExceptionMessage(
+                "This akka system has already an open connection to this relay server. Can't open more sockets."),
+                msg.messageID);
         verify(mockClient, never()).setInitialized(anyBoolean());
         verify(mockClient, never()).setUID(any());
         verify(mockClient, times(1)).close(false);
diff --git a/server/src/test/java/city/sane/relay/server/client/ClientIntegrationTest.java b/server/src/test/java/city/sane/relay/server/client/ClientIntegrationTest.java
index 65010ceee4c03f4cc38d45da2ba8ccb64eb88589..7b85d34fb7714e6f362f0fdc2d4b2a9acc8f0544 100644
--- a/server/src/test/java/city/sane/relay/server/client/ClientIntegrationTest.java
+++ b/server/src/test/java/city/sane/relay/server/client/ClientIntegrationTest.java
@@ -460,11 +460,15 @@ public class ClientIntegrationTest {
                 });
 
                 client2.addListener(msg -> {
-                    if (msg instanceof ExceptionMessage) {
-                        ExceptionMessage s = (ExceptionMessage) msg;
-                        if (s.getException().equals("This akka system has already an open "
-                                + "connection to this relay server. Can't open more sockets.")) {
-                            lock.countDown();
+                    if (msg instanceof Response) {
+                        Response f = (Response) msg;
+
+                        if (f.getMessageObj() instanceof ExceptionMessage) {
+                            ExceptionMessage s = (ExceptionMessage) f.getMessageObj();
+                            if (s.getException().equals("This akka system has already an open "
+                                    + "connection to this relay server. Can't open more sockets.")) {
+                                lock.countDown();
+                            }
                         }
                     }
                 });
@@ -501,16 +505,12 @@ public class ClientIntegrationTest {
                         if (f.getMessageObj() instanceof BackupRelayServersMessage) {
                             lock.countDown();
                             client.sendMessage(new JoinMessage(AkkaId.of("testID1"), channels));
-                        }
-                    }
-                });
-
-                client.addListener(msg -> {
-                    if (msg instanceof ExceptionMessage) {
-                        ExceptionMessage s = (ExceptionMessage) msg;
-                        if (s.getException().equals("This akka system has already an open "
-                                + "connection to this relay server. Can't open more sockets.")) {
-                            lock.countDown();
+                        } else if (f.getMessageObj() instanceof ExceptionMessage) {
+                            ExceptionMessage s = (ExceptionMessage) f.getMessageObj();
+                            if (s.getException().equals("This akka system has already an open "
+                                    + "connection to this relay server. Can't open more sockets.")) {
+                                lock.countDown();
+                            }
                         }
                     }
                 });