diff --git a/daemon/src/sip/siptransport.cpp b/daemon/src/sip/siptransport.cpp
index 2c661ff0dbfce876a3ed2edf9835eea6178a09b9..fe2019e091ddf29406379a67041f3c48a48abc56 100644
--- a/daemon/src/sip/siptransport.cpp
+++ b/daemon/src/sip/siptransport.cpp
@@ -167,13 +167,6 @@ SipTransportBroker::SipTransportBroker(pjsip_endpoint *endpt,
                                        pj_caching_pool& cp, pj_pool_t& pool)
     : cp_(cp), pool_(pool), endpt_(endpt)
 {
-    auto status = pjsip_tpmgr_set_state_cb(pjsip_endpt_get_tpmgr(endpt_),
-                                           SipTransportBroker::tp_state_callback);
-    if (status != PJ_SUCCESS) {
-        RING_ERR("Can't set transport callback");
-        sip_utils::sip_strerror(status);
-    }
-
 #if HAVE_DHT
     pjsip_transport_register_type(PJSIP_TRANSPORT_DATAGRAM, "ICE",
                                   pjsip_transport_get_default_port_for_type(PJSIP_TRANSPORT_UDP),
@@ -186,7 +179,6 @@ SipTransportBroker::~SipTransportBroker()
     RING_DBG("~SipTransportBroker@%p", this);
 
     shutdown();
-    pjsip_tpmgr_set_state_cb(pjsip_endpt_get_tpmgr(endpt_), nullptr);
 
     udpTransports_.clear();
     transports_.clear();
@@ -202,23 +194,6 @@ SipTransportBroker::~SipTransportBroker()
     RING_DBG("destroying SipTransportBroker@%p", this);
 }
 
-/** static method (so C callable) used by PJSIP making interface to C++ */
-void
-SipTransportBroker::tp_state_callback(pjsip_transport* tp,
-                                      pjsip_transport_state state,
-                                      const pjsip_transport_state_info* info)
-{
-    // There is no way (at writing) to link a user data to a PJSIP transport.
-    // So we obtain it from the global SIPVoIPLink instance that owns it.
-    // Be sure the broker's owner is not deleted during proccess
-    if (auto sipLink = getSIPVoIPLink()) {
-        if (auto& broker = sipLink->sipTransportBroker)
-            broker->transportStateChanged(tp, state, info);
-        else
-            RING_ERR("SIPVoIPLink with invalid SipTransportBroker");
-    }
-}
-
 void
 SipTransportBroker::transportStateChanged(pjsip_transport* tp,
                                           pjsip_transport_state state,
diff --git a/daemon/src/sip/siptransport.h b/daemon/src/sip/siptransport.h
index 646117f34b15f17a891489849b166b2bbeeddbda..a5e36538f7160195528a506fcdd60e76d02fc06d 100644
--- a/daemon/src/sip/siptransport.h
+++ b/daemon/src/sip/siptransport.h
@@ -172,6 +172,8 @@ public:
      */
     void shutdown();
 
+    void transportStateChanged(pjsip_transport*, pjsip_transport_state, const pjsip_transport_state_info*);
+
 private:
     NON_COPYABLE(SipTransportBroker);
 
@@ -183,10 +185,6 @@ private:
     */
     std::shared_ptr<SipTransport> createUdpTransport(const SipTransportDescr&);
 
-    static void tp_state_callback(pjsip_transport*, pjsip_transport_state, const pjsip_transport_state_info*);
-
-    void transportStateChanged(pjsip_transport*, pjsip_transport_state, const pjsip_transport_state_info*);
-
     /**
      * List of transports so we can bubble the events up.
      */
diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp
index ebf0954dbc56064a5879e698ec3b51fdcb45ed83..3b00037b414b8675a0cb3fdb5f0786c58472b1f7 100644
--- a/daemon/src/sip/sipvoiplink.cpp
+++ b/daemon/src/sip/sipvoiplink.cpp
@@ -463,6 +463,22 @@ transaction_request_cb(pjsip_rx_data *rdata)
     return PJ_FALSE;
 }
 
+static void
+tp_state_callback(pjsip_transport* tp, pjsip_transport_state state,
+                  const pjsip_transport_state_info* info)
+{
+    // There is no way (at writing) to link a user data to a PJSIP transport.
+    // So we obtain it from the global SIPVoIPLink instance that owns it.
+    // Be sure the broker's owner is not deleted during proccess
+    if (auto sipLink = getSIPVoIPLink()) {
+        if (auto& broker = sipLink->sipTransportBroker)
+            broker->transportStateChanged(tp, state, info);
+        else
+            RING_ERR("SIPVoIPLink with invalid SipTransportBroker");
+    } else
+        RING_ERR("no more VoIP link");
+}
+
 /*************************************************************************************************/
 
 pjsip_endpoint * SIPVoIPLink::getEndpoint()
@@ -513,6 +529,13 @@ SIPVoIPLink::SIPVoIPLink()
 
     sipTransportBroker.reset(new SipTransportBroker(endpt_, *cp_, *pool_));
 
+    auto status = pjsip_tpmgr_set_state_cb(pjsip_endpt_get_tpmgr(endpt_),
+                                           tp_state_callback);
+    if (status != PJ_SUCCESS) {
+        RING_ERR("Can't set transport callback");
+        sip_utils::sip_strerror(status);
+    }
+
     if (!ip_utils::getLocalAddr())
         throw VoipLinkException("UserAgent: Unable to determine network capabilities");
 
@@ -594,6 +617,8 @@ SIPVoIPLink::~SIPVoIPLink()
         RING_ERR("%d SIP calls remains!",
               Manager::instance().callFactory.callCount<SIPCall>());
 
+    pjsip_tpmgr_set_state_cb(pjsip_endpt_get_tpmgr(endpt_), nullptr);
+
     // destroy SIP transport before endpoint
     sipTransportBroker.reset();