diff --git a/daemon/src/sip/siptransport.cpp b/daemon/src/sip/siptransport.cpp
index 75891639dc538b40d1bf684a53ffeb33af6a04b5..2eed77e57e76a58018b8f4f5103f60a8140acbf6 100644
--- a/daemon/src/sip/siptransport.cpp
+++ b/daemon/src/sip/siptransport.cpp
@@ -269,6 +269,17 @@ SipTransportBroker::findTransport(pjsip_transport* t)
     }
 }
 
+void
+SipTransportBroker::shutdown()
+{
+    std::unique_lock<std::mutex> lock(transportMapMutex_);
+    for (auto& t : transports_) {
+        if (auto transport = t.second.lock()) {
+            pjsip_transport_shutdown(transport->get());
+        }
+    }
+}
+
 void
 SipTransportBroker::waitForReleased(const SipTransportDescr& tp, std::function<void(bool)> released_cb)
 {
diff --git a/daemon/src/sip/siptransport.h b/daemon/src/sip/siptransport.h
index 23dbece6f2e79b0d73ea5bc3edf3d789644e5999..f65a087dabd9364f21d1c84f68fd17f608a9386e 100644
--- a/daemon/src/sip/siptransport.h
+++ b/daemon/src/sip/siptransport.h
@@ -198,6 +198,11 @@ public:
      */
     void waitForReleased(const SipTransportDescr& tp, std::function<void(bool)> released_cb);
 
+    /**
+     * Start gracefull shutdown procedure for all transports
+     */
+    void shutdown();
+
 private:
     NON_COPYABLE(SipTransportBroker);
 
diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp
index 349b49145b9cb689fc06127d08d19d3eead5fe67..6646d1c809d746af35cabc8de229af00b399458e 100644
--- a/daemon/src/sip/sipvoiplink.cpp
+++ b/daemon/src/sip/sipvoiplink.cpp
@@ -627,11 +627,11 @@ SIPVoIPLink::~SIPVoIPLink()
 
     const int MAX_TIMEOUT_ON_LEAVING = 5;
 
+    sipTransport->shutdown();
+
     for (int timeout = 0; pjsip_tsx_layer_get_tsx_count() and timeout < MAX_TIMEOUT_ON_LEAVING; timeout++)
         sleep(1);
 
-    Manager::instance().unregisterEventHandler((uintptr_t)this);
-
     const pj_time_val tv = {0, 10};
     pjsip_endpt_handle_events(endpt_, &tv);
 
@@ -639,11 +639,12 @@ SIPVoIPLink::~SIPVoIPLink()
         RING_ERR("%d SIP calls remains!",
               Manager::instance().callFactory.callCount<SIPCall>());
 
-    pjsip_endpt_destroy(endpt_);
-
-    // destroy SIP transport after endpoint
+    // destroy SIP transport before endpoint
     sipTransport.reset();
 
+    Manager::instance().unregisterEventHandler((uintptr_t)this);
+
+    pjsip_endpt_destroy(endpt_);
     pj_pool_release(pool_);
     pj_caching_pool_destroy(cp_);