diff --git a/src/network/protocols/client_lobby_room_protocol.cpp b/src/network/protocols/client_lobby_room_protocol.cpp
index 90638b7c7..ef3779e45 100644
--- a/src/network/protocols/client_lobby_room_protocol.cpp
+++ b/src/network/protocols/client_lobby_room_protocol.cpp
@@ -147,6 +147,7 @@ void ClientLobbyRoomProtocol::newPlayer(Event* event)
 
     if (global_id == Online::CurrentUser::acquire()->getUserID())
     {
+        Online::CurrentUser::release();
         Log::error("ClientLobbyRoomProtocol", "The server notified me that i'm a new player in the room (not normal).");
     }
     else if (m_setup->getProfile(race_id) == NULL || m_setup->getProfile(global_id) == NULL)
@@ -218,6 +219,7 @@ void ClientLobbyRoomProtocol::connectionAccepted(Event* event)
     uint32_t global_id = event->data.gui32(8);
     if (global_id == Online::CurrentUser::acquire()->getUserID())
     {
+        Online::CurrentUser::release();
         Log::info("ClientLobbyRoomProtocol", "The server accepted the connection.");
 
         // self profile
@@ -225,6 +227,7 @@ void ClientLobbyRoomProtocol::connectionAccepted(Event* event)
         profile->kart_name = "";
         profile->race_id = event->data.gui8(1);
         profile->user_profile = Online::CurrentUser::acquire();
+        Online::CurrentUser::release();
         m_setup->addPlayer(profile);
         // connection token
         uint32_t token = event->data.gui32(3);
diff --git a/src/network/protocols/get_peer_address.cpp b/src/network/protocols/get_peer_address.cpp
index 77893cab6..449096c91 100644
--- a/src/network/protocols/get_peer_address.cpp
+++ b/src/network/protocols/get_peer_address.cpp
@@ -52,7 +52,9 @@ void GetPeerAddress::asynchronousUpdate()
         m_request = new Online::XMLRequest();
         m_request->setURL((std::string)UserConfigParams::m_server_multiplayer + "address-management.php");
         m_request->setParameter("id",Online::CurrentUser::acquire()->getUserID());
+        Online::CurrentUser::release();
         m_request->setParameter("token",Online::CurrentUser::acquire()->getToken());
+        Online::CurrentUser::release();
         m_request->setParameter("peer_id",m_peer_id);
         m_request->setParameter("action","get");
 
diff --git a/src/network/protocols/hide_public_address.cpp b/src/network/protocols/hide_public_address.cpp
index 8792cca10..65aaefa90 100644
--- a/src/network/protocols/hide_public_address.cpp
+++ b/src/network/protocols/hide_public_address.cpp
@@ -48,7 +48,9 @@ void HidePublicAddress::asynchronousUpdate()
         m_request = new Online::XMLRequest();
         m_request->setURL((std::string)UserConfigParams::m_server_multiplayer + "address-management.php");
         m_request->setParameter("id",Online::CurrentUser::acquire()->getUserID());
+        Online::CurrentUser::release();
         m_request->setParameter("token",Online::CurrentUser::acquire()->getToken());
+        Online::CurrentUser::release();
         m_request->setParameter("action","unset");
 
         Online::HTTPManager::get()->addRequest(m_request);
diff --git a/src/network/protocols/quick_join_protocol.cpp b/src/network/protocols/quick_join_protocol.cpp
index d4f3390b9..57b17601e 100644
--- a/src/network/protocols/quick_join_protocol.cpp
+++ b/src/network/protocols/quick_join_protocol.cpp
@@ -50,7 +50,9 @@ void QuickJoinProtocol::asynchronousUpdate()
         m_request = new Online::XMLRequest();
         m_request->setURL((std::string)UserConfigParams::m_server_multiplayer + "address-management.php");
         m_request->setParameter("id",Online::CurrentUser::acquire()->getUserID());
+        Online::CurrentUser::release();
         m_request->setParameter("token",Online::CurrentUser::acquire()->getToken());
+        Online::CurrentUser::release();
         m_request->setParameter("action","quick-join");
 
         Online::HTTPManager::get()->addRequest(m_request);
diff --git a/src/network/protocols/request_connection.cpp b/src/network/protocols/request_connection.cpp
index b7f018229..acd5e4cf7 100644
--- a/src/network/protocols/request_connection.cpp
+++ b/src/network/protocols/request_connection.cpp
@@ -50,7 +50,9 @@ void RequestConnection::asynchronousUpdate()
             m_request = new Online::XMLRequest();
             m_request->setURL((std::string)UserConfigParams::m_server_multiplayer + "address-management.php");
             m_request->setParameter("id",Online::CurrentUser::acquire()->getUserID());
+            Online::CurrentUser::release();
             m_request->setParameter("token",Online::CurrentUser::acquire()->getToken());
+            Online::CurrentUser::release();
             m_request->setParameter("server_id",m_server_id);
             m_request->setParameter("action","request-connection");
 
diff --git a/src/network/protocols/server_lobby_room_protocol.cpp b/src/network/protocols/server_lobby_room_protocol.cpp
index c8c6eca00..ea227325e 100644
--- a/src/network/protocols/server_lobby_room_protocol.cpp
+++ b/src/network/protocols/server_lobby_room_protocol.cpp
@@ -116,7 +116,9 @@ void ServerLobbyRoomProtocol::update()
             Online::XMLRequest* request = new Online::XMLRequest();
             request->setURL((std::string)UserConfigParams::m_server_multiplayer + "address-management.php");
             request->setParameter("id",Online::CurrentUser::acquire()->getUserID());
+            Online::CurrentUser::release();
             request->setParameter("token",Online::CurrentUser::acquire()->getToken());
+            Online::CurrentUser::release();
             request->setParameter("address",addr.ip);
             request->setParameter("port",addr.port);
             request->setParameter("action","poll-connection-requests");
diff --git a/src/network/protocols/show_public_address.cpp b/src/network/protocols/show_public_address.cpp
index bbf4a0338..143ab6af6 100644
--- a/src/network/protocols/show_public_address.cpp
+++ b/src/network/protocols/show_public_address.cpp
@@ -49,7 +49,9 @@ void ShowPublicAddress::asynchronousUpdate()
         m_request = new Online::XMLRequest();
         m_request->setURL((std::string)UserConfigParams::m_server_multiplayer + "address-management.php");
         m_request->setParameter("id",Online::CurrentUser::acquire()->getUserID());
+        Online::CurrentUser::release();
         m_request->setParameter("token",Online::CurrentUser::acquire()->getToken());
+        Online::CurrentUser::release();
         m_request->setParameter("address",addr.ip);
         m_request->setParameter("port",addr.port);
         m_request->setParameter("action","set");
diff --git a/src/network/protocols/start_game_protocol.cpp b/src/network/protocols/start_game_protocol.cpp
index 730b2ec74..dc3d410d5 100644
--- a/src/network/protocols/start_game_protocol.cpp
+++ b/src/network/protocols/start_game_protocol.cpp
@@ -104,6 +104,7 @@ void StartGameProtocol::update()
         for (unsigned int i = 0; i < players.size(); i++)
         {
             bool is_me = (players[i]->user_profile == Online::CurrentUser::acquire());
+            Online::CurrentUser::release();
             if (is_me)
             {
                 NetworkPlayerProfile* profile = players[i];
@@ -128,6 +129,7 @@ void StartGameProtocol::update()
         for (unsigned int i = 0; i < players.size(); i++)
         {
             bool is_me = (players[i]->user_profile == Online::CurrentUser::acquire());
+            Online::CurrentUser::release();
             NetworkPlayerProfile* profile = players[i];
             RemoteKartInfo rki(profile->race_id, profile->kart_name,
                 profile->user_profile->getUserName(), profile->race_id, !is_me);
diff --git a/src/network/protocols/start_server.cpp b/src/network/protocols/start_server.cpp
index 029cd009a..6680a0708 100644
--- a/src/network/protocols/start_server.cpp
+++ b/src/network/protocols/start_server.cpp
@@ -48,7 +48,9 @@ void StartServer::asynchronousUpdate()
         m_request = new Online::XMLRequest();
         m_request->setURL((std::string)UserConfigParams::m_server_multiplayer + "address-management.php");
         m_request->setParameter("id",Online::CurrentUser::acquire()->getUserID());
+        Online::CurrentUser::release();
         m_request->setParameter("token",Online::CurrentUser::acquire()->getToken());
+        Online::CurrentUser::release();
         m_request->setParameter("address",addr.ip);
         m_request->setParameter("port",addr.port);
         m_request->setParameter("max_players",UserConfigParams::m_server_max_players);
diff --git a/src/network/protocols/stop_server.cpp b/src/network/protocols/stop_server.cpp
index 69bf442c4..c9c9c94d9 100644
--- a/src/network/protocols/stop_server.cpp
+++ b/src/network/protocols/stop_server.cpp
@@ -48,7 +48,9 @@ void StopServer::asynchronousUpdate()
         m_request = new Online::XMLRequest();
         m_request->setURL((std::string)UserConfigParams::m_server_multiplayer + "address-management.php");
         m_request->setParameter("id",Online::CurrentUser::acquire()->getUserID());
+        Online::CurrentUser::release();
         m_request->setParameter("token",Online::CurrentUser::acquire()->getToken());
+        Online::CurrentUser::release();
         m_request->setParameter("address",addr.ip);
         m_request->setParameter("port",addr.port);
         m_request->setParameter("action","stop-server");
diff --git a/src/online/current_user.cpp b/src/online/current_user.cpp
index bfa9ea70c..72fc682b9 100644
--- a/src/online/current_user.cpp
+++ b/src/online/current_user.cpp
@@ -221,7 +221,6 @@ namespace Online{
         request->setParameter("token", m_token);
         request->setParameter("id", m_id);
         request->setParameter("server_id", server_id);
-        HTTPManager::get()->addRequest(request);
         return request;
     }
 
diff --git a/src/states_screens/online_screen.cpp b/src/states_screens/online_screen.cpp
index 2577e3fa1..114db84a3 100644
--- a/src/states_screens/online_screen.cpp
+++ b/src/states_screens/online_screen.cpp
@@ -231,20 +231,33 @@ void OnlineScreen::eventCallback(Widget* widget, const std::string& name, const
         //FIXME temporary and the request join + join sequence should be placed in one method somewhere
         // refresh server list
         Online::ServersManager::RefreshRequest* request = ServersManager::acquire()->refreshRequest();
-        //Online::HTTPManager::get()->synchronousRequest(request);
-        request->execute();
+        ServersManager::release();
+        Online::HTTPManager::get()->synchronousRequest(request);
         delete request;
         // select first one
         Server * server = ServersManager::acquire()->getQuickPlay();
-        if (Online::CurrentUser::acquire()->requestServerJoin( server->getServerId()))
+        ServersManager::release();
+
+        Online::CurrentUser::ServerJoinRequest* request2 = Online::CurrentUser::acquire()->requestServerJoin( server->getServerId());
+        Online::CurrentUser::release();
+        if (request2)
         {
-            StateManager::get()->pushScreen(NetworkingLobby::getInstance());
+            Online::HTTPManager::get()->synchronousRequest(request2);
+            if (request2->isSuccess())
+            {
+                delete request;
+                StateManager::get()->pushScreen(NetworkingLobby::getInstance());
+                ProtocolManager::getInstance()->requestStart(new ConnectToServer(server->getServerId()));
+            }
+            else
+            {
+                sfx_manager->quickSound( "anvil" );
+            }
         }
         else
         {
             sfx_manager->quickSound( "anvil" );
         }
-        ProtocolManager::getInstance()->requestStart(new ConnectToServer(server->getServerId()));
     }
 
 }   // eventCallback