diff --git a/frontend/core/src/com/game/tankwars/Callback.java b/frontend/core/src/com/game/tankwars/Callback.java
index cefc5efa35cc2e5ca9b2e13a2cc7ea9f8d680603..869b75cbcbbd30ac32aeca45109a5477a7df69f1 100644
--- a/frontend/core/src/com/game/tankwars/Callback.java
+++ b/frontend/core/src/com/game/tankwars/Callback.java
@@ -2,14 +2,22 @@ package com.game.tankwars;
 
 import com.badlogic.gdx.Net;
 
+/**
+ * This interface defines two methods to handle the different responses from an HTTP request
+ */
 public interface Callback {
-    // This interface defines two methods to handle the different responses from an HTTP request
 
-    // Method to handle a successful response
-    // Takes a String parameter containing the response body
-    void onResult(Net.HttpResponse result);
+    /**
+     * Method to handle a successful response
+     * @param result the response body
+     * @return true if response was accepted
+     *         false if the request should be resent
+     */
+    boolean onResult(Net.HttpResponse result);
 
-    // Method to handle a failed response
-    // Takes a Throwable parameter containing the exception that caused the failure
+    /**
+     * Method to handle a failed response
+     * @param t Throwable containing the exception that caused the failure
+     */
     void onFailed(Throwable t);
 }
\ No newline at end of file
diff --git a/frontend/core/src/com/game/tankwars/HTTPRequestHandler.java b/frontend/core/src/com/game/tankwars/HTTPRequestHandler.java
index 9dfc274094a23d876b876713ae33e15665b406a6..64b8d35b3bdd545c7050c9c5f0eee31b8355ccab 100644
--- a/frontend/core/src/com/game/tankwars/HTTPRequestHandler.java
+++ b/frontend/core/src/com/game/tankwars/HTTPRequestHandler.java
@@ -11,11 +11,6 @@ import com.badlogic.gdx.Net.HttpResponse;
  * a few times with increasing backoff time between resends.
  */
 public class HTTPRequestHandler implements Net.HttpResponseListener {
-
-    public static final String PROTOCOL = "http";
-    public static final String HOST = "localhost";
-    public static final int PORT = 3000;
-
     private final Callback callback;
     private final Net.HttpRequest request;
     private int attempts = 0;
@@ -34,6 +29,7 @@ public class HTTPRequestHandler implements Net.HttpResponseListener {
         Gdx.net.sendHttpRequest(request, this);
     }
 
+
     /**
      * Request was successful and response received. Passes response body
      * to callback.
@@ -41,7 +37,9 @@ public class HTTPRequestHandler implements Net.HttpResponseListener {
      * @param httpResponse The {@link HttpResponse} with the HTTP response values.
      */
     public void handleHttpResponse(HttpResponse httpResponse) {
-        callback.onResult(httpResponse);
+        if (!callback.onResult(httpResponse))
+            failed(new Throwable("Response returned with status code " +
+                    httpResponse.getStatus().getStatusCode()));
     }
 
     /**
@@ -57,12 +55,13 @@ public class HTTPRequestHandler implements Net.HttpResponseListener {
             try {
                 Thread.sleep((long) attempts * BACKOFF_TIME);
                 sendRequest();
+                return;
             } catch(InterruptedException e) {
                 System.err.println(e.getMessage());
             }
-        } else {
-            callback.onFailed(t);
         }
+
+        callback.onFailed(t);
     }
 
     /**
diff --git a/frontend/core/src/com/game/tankwars/controller/FindGameController.java b/frontend/core/src/com/game/tankwars/controller/FindGameController.java
index 2008a9e8a78749fbb9921c4cb25482b004e41228..9b8a7ccbb52cb668b8f4d63e00b30dc54243e65a 100644
--- a/frontend/core/src/com/game/tankwars/controller/FindGameController.java
+++ b/frontend/core/src/com/game/tankwars/controller/FindGameController.java
@@ -199,7 +199,9 @@ public class FindGameController {
 
         new HTTPRequestHandler(new Callback() {
             @Override
-            public void onResult(Net.HttpResponse response) {
+            public boolean onResult(Net.HttpResponse response) {
+                if (response.getStatus().getStatusCode() == -1) return false;
+
                 HttpStatus status = response.getStatus();
 
                 if (status.getStatusCode() == HttpStatus.SC_CREATED ||
@@ -211,10 +213,9 @@ public class FindGameController {
                     screen.showWaitingWindow();
 
                     checkLobbyStatus();
-                } else {
-                    System.err.println("Join lobby request failed with status code " +
-                            status.getStatusCode());
+                    return true;
                 }
+                return false;
             }
 
             @Override
@@ -241,23 +242,27 @@ public class FindGameController {
 
         new HTTPRequestHandler(new Callback() {
             @Override
-            public void onResult(Net.HttpResponse response) {
+            public boolean onResult(Net.HttpResponse response) {
+                if (response.getStatus().getStatusCode() == -1) return false;
+
                 HttpStatus status = response.getStatus();
 
                 if (status.getStatusCode() == HttpStatus.SC_OK && !response.getResultAsString().isEmpty()) {
                     CurrentUser.getCurrentUser().setGameId(response.getResultAsString());
                     Gdx.app.postRunnable(gameScreenTransition);
-                } else {
-                    System.out.println("Awaiting opponent...");
-
-                    try {
-                        Thread.sleep(1500);
-                        if (lobbyId != null) checkLobbyStatus();
-                    } catch (InterruptedException e) {
-                        System.out.println(e.getMessage());
-                        exitLobby();
-                    }
+                    return true;
                 }
+
+                System.out.println("Awaiting opponent...");
+
+                try {
+                    Thread.sleep(1500);
+                } catch (InterruptedException e) {
+                    System.out.println(e.getMessage());
+                }
+
+                if (lobbyId != null) checkLobbyStatus();
+                return true;
             }
 
             @Override
@@ -282,22 +287,20 @@ public class FindGameController {
 
         new HTTPRequestHandler(new Callback() {
             @Override
-            public void onResult(Net.HttpResponse response) {
+            public boolean onResult(Net.HttpResponse response) {
+                if (response.getStatus().getStatusCode() == -1) return false;
+
                 removeWaitingWindowListeners();
                 setMainListeners();
 
                 lobbyId = null;
                 screen.hideWaitingWindow();
+                return true;
             }
 
             @Override
             public void onFailed(Throwable t) {
                 System.err.println("Exit lobby request failed:\n" + t);
-                removeWaitingWindowListeners();
-                setMainListeners();
-
-                lobbyId = null;
-                screen.hideWaitingWindow();
             }
         }, new HttpRequestBuilder()
                 .newRequest()
diff --git a/frontend/core/src/com/game/tankwars/controller/LeaderboardController.java b/frontend/core/src/com/game/tankwars/controller/LeaderboardController.java
index e58eae5de29f10e84236cb71209baaddeb38d914..291c9bbc94e97c8082fc161330b0c6812472e835 100644
--- a/frontend/core/src/com/game/tankwars/controller/LeaderboardController.java
+++ b/frontend/core/src/com/game/tankwars/controller/LeaderboardController.java
@@ -48,12 +48,15 @@ public class LeaderboardController {
         new HTTPRequestHandler(
                 new Callback() {
                     @Override
-                    public void onResult(Net.HttpResponse response) {
+                    public boolean onResult(Net.HttpResponse response) {
+                        if (response.getStatus().getStatusCode() == -1) return false;
+
                         Json json = new Json();
                         // Convert the response body to an Array of User objects using the Json instance
                         Array<User> leaderboardUsers = json.fromJson(Array.class, User.class, response.getResultAsString());
 
                         screen.setLeaderBoard(leaderboardUsers);
+                        return true;
                     }
 
                     @Override
diff --git a/frontend/core/src/com/game/tankwars/controller/LoginController.java b/frontend/core/src/com/game/tankwars/controller/LoginController.java
index 94780e9aebbb0d79871093632738724ecd790f0f..d20c9544c5bf7fea575a652bbf1a31787c8fd457 100644
--- a/frontend/core/src/com/game/tankwars/controller/LoginController.java
+++ b/frontend/core/src/com/game/tankwars/controller/LoginController.java
@@ -60,7 +60,7 @@ public class LoginController {
         loginButton.addListener(new InputListener() {
             @Override
             public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
-                handleInput(usernameField.getText());
+                fetchUser(usernameField.getText());
                 return true;
             }
         });
@@ -97,18 +97,17 @@ public class LoginController {
         });
     }
 
-    public void handleInput(String username) {
-        fetchUser(username);
-    }
-
     public void fetchUser(final String username) {
         new HTTPRequestHandler(new Callback() {
             @Override
-            public void onResult(Net.HttpResponse response) {
+            public boolean onResult(Net.HttpResponse response) {
+                if (response.getStatus().getStatusCode() == -1) return false;
+
                 Json json = new Json();
                 User user = json.fromJson(User.class, response.getResultAsString());
                 currentUser.setUser(user);
                 Gdx.app.postRunnable(mainMenuScreenTransition);
+                return true;
             }
 
             @Override