diff --git a/src/jamidht/sips_transport_ice.cpp b/src/jamidht/sips_transport_ice.cpp
index dc87790fe6a07b84d1b80e839fc25bef6801cf5b..ed8c083a6ee590ec353c9e02fb581eeab953767c 100644
--- a/src/jamidht/sips_transport_ice.cpp
+++ b/src/jamidht/sips_transport_ice.cpp
@@ -249,16 +249,6 @@ SipsIceTransport::SipsIceTransport(pjsip_endpoint* endpt,
 
     if (pjsip_transport_register(base.tpmgr, &base) != PJ_SUCCESS)
         throw std::runtime_error("Can't register PJSIP transport.");
-
-    if (PJSIP_TRANSPORT_IS_RELIABLE(&trData_.base)) {
-        eventLoop_ = std::thread([this] {
-            try {
-                eventLoop();
-            } catch (const std::exception& e) {
-                JAMI_ERR() << "SipIceTransport: eventLoop() failure: " << e.what();
-            }
-        });
-    }
 }
 
 SipsIceTransport::~SipsIceTransport()
@@ -312,12 +302,24 @@ SipsIceTransport::handleEvents()
         for (auto& evdata : eventDataQueue) {
             evdata.tls_info.ssl_sock_info = &evdata.ssl_info;
             evdata.state_info.ext_info = &evdata.tls_info;
+            if (evdata.state == PJSIP_TP_STATE_CONNECTED) {
+                if (PJSIP_TRANSPORT_IS_RELIABLE(&trData_.base)) {
+                    eventLoop_ = std::thread([this] {
+                        try {
+                            eventLoop();
+                        } catch (const std::exception& e) {
+                            JAMI_ERR() << "SipIceTransport: eventLoop() failure: " << e.what();
+                        }
+                    });
+                }
+            }
             if (evdata.state != PJSIP_TP_STATE_DISCONNECTED) {
                 (*state_cb)(&trData_.base, evdata.state, &evdata.state_info);
             } else {
                 JAMI_WARN("[SIPS] got disconnected event!");
                 disconnectedEvent = std::move(evdata);
                 disconnected = true;
+                stopLoop_ = true;
                 break;
             }
         }
@@ -410,7 +412,7 @@ SipsIceTransport::pushChangeStateEvent(ChangeStateEventData&& ev)
 
 // - DO NOT BLOCK - (Called in TlsSession thread)
 void
-SipsIceTransport::onTlsStateChange(UNUSED TlsSessionState state)
+SipsIceTransport::onTlsStateChange(TlsSessionState state)
 {
     if (state == TlsSessionState::ESTABLISHED)
         updateTransportState(PJSIP_TP_STATE_CONNECTED);