diff --git a/src/ringdht/p2p.cpp b/src/ringdht/p2p.cpp
index df817169f39e49c1a6a1c81641a618634f795620..9d09b05145f4c42027612ba8a564cd9ad89201e0 100644
--- a/src/ringdht/p2p.cpp
+++ b/src/ringdht/p2p.cpp
@@ -380,6 +380,7 @@ private:
 
     std::atomic_bool connected_ {false};
     std::mutex listenersMutex_;
+    std::mutex turnMutex_;
     std::vector<ListenerFunction> listeners_;
 
     std::future<void> processTask_;
@@ -392,7 +393,10 @@ private:
 void
 DhtPeerConnector::Impl::turnConnect()
 {
-    if (turnAuthv4_ || turnAuthv6_)
+    std::lock_guard<std::mutex> lock(clientsMutex_);
+    // Don't retry to reconnect to the TURN server if already connected
+    if (turnAuthv4_ && turnAuthv4_->isReady()
+        && turnAuthv6_ && turnAuthv6_->isReady())
         return;
 
     auto details = account.getAccountDetails();
@@ -414,6 +418,13 @@ DhtPeerConnector::Impl::turnConnect()
         else
             ctrl << makeMsg<CtrlMsgType::TURN_PEER_DISCONNECT>(peer_addr);
     };
+
+    // If a previous turn server exists, but is not ready, we should try to reconnect
+    if (turnAuthv4_ && !turnAuthv4_->isReady())
+        turnAuthv4_.release();
+    if (turnAuthv6_ && !turnAuthv6_->isReady())
+        turnAuthv6_.release();
+
     turn_param_v4.authorized_family = PJ_AF_INET;
     turnAuthv4_ = std::make_unique<TurnTransport>(turn_param_v4);
     auto turn_param_v6 = turn_param_v4;