diff --git a/include/tls_session.h b/include/tls_session.h
index d0adb63820fcf37ca9c2517cb1ada789b8bb1834..448378771401fa37e2b2a0bc13a8d8a020408fdd 100644
--- a/include/tls_session.h
+++ b/include/tls_session.h
@@ -133,8 +133,6 @@ public:
 
     int maxPayload() const override;
 
-    void waitForReady(const duration& timeout = {});
-
     /// Synchronous writing.
     /// Return a positive number for number of bytes write, or 0 and \a ec set in case of error.
     std::size_t write(const ValueType* data, std::size_t size, std::error_code& ec) override;
diff --git a/src/connectionmanager.cpp b/src/connectionmanager.cpp
index 68f40b1704854a36af3d7136f19a3889ad167337..7c3c8d22cdfd12797cc17fd63ded5443f2a8e4f8 100644
--- a/src/connectionmanager.cpp
+++ b/src/connectionmanager.cpp
@@ -1185,6 +1185,13 @@ ConnectionManager::Impl::onTlsNegotiationDone(const std::shared_ptr<DeviceInfo>&
                                        vid);
             dinfo->executePendingOperations(vid, nullptr);
         }
+
+        std::unique_lock<std::mutex> lk(dinfo->mtx_);
+        dinfo->info.erase(vid);
+
+        if (dinfo->empty()) {
+            infos_.removeDeviceInfo(dinfo->deviceId);
+        }
     } else {
         // The socket is ready, store it
         if (isDhtRequest) {
diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp
index 1c8ae3e888fc1426dcc0b411bcde018a865df29c..3fbd8205e94fb7ee1e966f3eb4243904142fda4a 100644
--- a/src/peer_connection.cpp
+++ b/src/peer_connection.cpp
@@ -382,15 +382,6 @@ TlsSocketEndpoint::peerCertificate() const
     return pimpl_->tls->peerCertificate();
 }
 
-void
-TlsSocketEndpoint::waitForReady(const std::chrono::milliseconds& timeout)
-{
-    if (!pimpl_->tls) {
-        return;
-    }
-    pimpl_->tls->waitForReady(timeout);
-}
-
 int
 TlsSocketEndpoint::waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const
 {
diff --git a/src/peer_connection.h b/src/peer_connection.h
index c6f01973232dce7abdabdf0b828cebb64ee3b5fb..7d91d04191d7b6dc7fb3472961a74b21aad976b0 100644
--- a/src/peer_connection.h
+++ b/src/peer_connection.h
@@ -123,8 +123,6 @@ public:
     }
     int waitForData(std::chrono::milliseconds timeout, std::error_code&) const override;
 
-    void waitForReady(const std::chrono::milliseconds& timeout = {});
-
     void setOnStateChange(OnStateChangeCb&& cb);
     void setOnReady(OnReadyCb&& cb);
 
diff --git a/src/security/tls_session.cpp b/src/security/tls_session.cpp
index de0347fbb5f5ba13aad265890fcb700376a5ec50..1d7b24d002e54d310d058a82bf1a3b40c0ae7833 100644
--- a/src/security/tls_session.cpp
+++ b/src/security/tls_session.cpp
@@ -1737,24 +1737,6 @@ TlsSession::read(ValueType* data, std::size_t size, std::error_code& ec)
     return 0;
 }
 
-void
-TlsSession::waitForReady(const duration& timeout)
-{
-    auto ready = [this]() -> bool {
-        auto state = pimpl_->state_.load();
-        return state == TlsSessionState::ESTABLISHED or state == TlsSessionState::SHUTDOWN;
-    };
-    std::unique_lock<std::mutex> lk(pimpl_->stateMutex_);
-    if (timeout == duration::zero())
-        pimpl_->stateCondition_.wait(lk, ready);
-    else
-        pimpl_->stateCondition_.wait_for(lk, timeout, ready);
-
-    if (!ready())
-        throw std::logic_error("Invalid state in TlsSession::waitForReady: "
-                               + std::to_string((int) pimpl_->state_.load()));
-}
-
 int
 TlsSession::waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const
 {