diff --git a/src/network/room.cpp b/src/network/room.cpp
index 3caa3aeae7..6dc7db341a 100644
--- a/src/network/room.cpp
+++ b/src/network/room.cpp
@@ -2,6 +2,7 @@
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 
+#include <algorithm>
 #include <atomic>
 #include <random>
 #include <thread>
@@ -104,6 +105,12 @@ public:
      * @param event The ENet event containing the data
      */
     void HandleWifiPacket(const ENetEvent* event);
+
+    /**
+     * Removes the client from the members list if it was in it and announces the change
+     * to all other clients.
+     */
+    void HandleClientDisconnection(ENetPeer* client);
 };
 
 // RoomImpl
@@ -125,7 +132,7 @@ void Room::RoomImpl::ServerLoop() {
                 enet_packet_destroy(event.packet);
                 break;
             case ENET_EVENT_TYPE_DISCONNECT:
-                // TODO(B3N30): Handle the disconnect from a client
+                HandleClientDisconnection(event.peer);
                 break;
             }
         }
@@ -264,6 +271,16 @@ void Room::RoomImpl::HandleWifiPacket(const ENetEvent* event) {
     enet_host_flush(server);
 }
 
+void Room::RoomImpl::HandleClientDisconnection(ENetPeer* client) {
+    // Remove the client from the members list.
+    members.erase(std::remove_if(members.begin(), members.end(),
+                                 [&](const Member& member) { return member.peer == client; }),
+                  members.end());
+
+    // Announce the change to all clients.
+    BroadcastRoomInformation();
+}
+
 // Room
 Room::Room() : room_impl{std::make_unique<RoomImpl>()} {}