diff --git a/src/ice_transport.cpp b/src/ice_transport.cpp
index 1dd69350ed34f7c3afcf3437b86fea8075475fcf..8ed964325987b418d127362c09173863e08955a3 100644
--- a/src/ice_transport.cpp
+++ b/src/ice_transport.cpp
@@ -402,14 +402,19 @@ IceTransport::Impl::Impl(const char* name, int component_count, bool master,
 
 IceTransport::Impl::~Impl()
 {
+    JAMI_WARN("[ice:%p] IceTransport::Impl::~Impl() %p", this);
     sip_utils::register_thread();
-
-    icest_.reset(); // must be done before ioqueue/timer destruction
-
     threadTerminateFlags_ = true;
+    iceCV_.notify_all();
+
     if (thread_.joinable())
         thread_.join();
 
+    {
+        std::lock_guard<std::mutex> lk {iceMutex_};
+        icest_.reset(); // must be done before ioqueue/timer destruction
+    }
+
     if (config_.stun_cfg.ioqueue)
         pj_ioqueue_destroy(config_.stun_cfg.ioqueue);
 
@@ -1337,11 +1342,11 @@ IceTransport::waitForInitialization(std::chrono::milliseconds timeout)
 {
     std::unique_lock<std::mutex> lk(pimpl_->iceMutex_);
     if (!pimpl_->iceCV_.wait_for(lk, timeout,
-                                 [this]{ return pimpl_->_isInitialized() or pimpl_->_isFailed(); })) {
+                                 [this]{ return pimpl_->threadTerminateFlags_ or pimpl_->_isInitialized() or pimpl_->_isFailed(); })) {
         JAMI_WARN("[ice:%p] waitForInitialization: timeout", this);
         return -1;
     }
-    return not pimpl_->_isFailed();
+    return not (pimpl_->threadTerminateFlags_ or pimpl_->_isFailed());
 }
 
 int
@@ -1349,11 +1354,11 @@ IceTransport::waitForNegotiation(std::chrono::milliseconds timeout)
 {
     std::unique_lock<std::mutex> lk(pimpl_->iceMutex_);
     if (!pimpl_->iceCV_.wait_for(lk, timeout,
-                         [this]{ return pimpl_->_isRunning() or pimpl_->_isFailed(); })) {
+                         [this]{ return pimpl_->threadTerminateFlags_ or pimpl_->_isRunning() or pimpl_->_isFailed(); })) {
         JAMI_WARN("[ice:%p] waitForIceNegotiation: timeout", this);
         return -1;
     }
-    return not pimpl_->_isFailed();
+    return not (pimpl_->threadTerminateFlags_ or pimpl_->_isFailed());
 }
 
 ssize_t