diff --git a/src/jamidht/multiplexed_socket.cpp b/src/jamidht/multiplexed_socket.cpp
index b2e512590c1ffd62c3ad278e1d9b3a44b5d12049..3422b9a3372169d45d610fb3a151a6c7b10b494e 100644
--- a/src/jamidht/multiplexed_socket.cpp
+++ b/src/jamidht/multiplexed_socket.cpp
@@ -45,14 +45,13 @@ public:
         : parent_(parent)
         , deviceId(deviceId)
         , endpoint(std::move(endpoint))
-        , eventLoopFut_ {std::async(std::launch::async, [this] {
+        , eventLoopThread_ {[this] {
             try {
-                stop.store(false);
                 eventLoop();
             } catch (const std::exception& e) {
                 JAMI_ERR() << "[CNX] peer connection event loop failure: " << e.what();
             }
-        })}
+        }}
     {}
 
     ~Impl()
@@ -69,6 +68,7 @@ public:
             }
             sockets.clear();
         }
+        eventLoopThread_.join();
     }
 
     void shutdown()
@@ -129,8 +129,8 @@ public:
     std::map<uint16_t, onChannelReadyCb> channelCbs {};
 
     // Main loop to parse incoming packets
-    std::future<void> eventLoopFut_ {};
-    std::atomic_bool stop {};
+    std::atomic_bool stop {false};
+    std::thread eventLoopThread_ {};
 
     // Multiplexed available datas
     std::map<uint16_t, std::unique_ptr<ChannelInfo>> channelDatas_ {};
@@ -197,7 +197,7 @@ MultiplexedSocket::Impl::handleControlPacket(const std::vector<uint8_t>&& pkt)
             size_t off = 0;
             while (off != pkt.size()) {
                 msgpack::unpacked result;
-                msgpack::unpack(result, (const char*)pkt.data(), pkt.size(), off);
+                msgpack::unpack(result, (const char*) pkt.data(), pkt.size(), off);
                 auto req = result.get().as<ChannelRequest>();
                 if (req.state == ChannelRequestState::ACCEPT) {
                     std::lock_guard<std::mutex> lkSockets(socketsMutex);