diff --git a/daemon/src/call.cpp b/daemon/src/call.cpp
index 218fbaa555fc8bf13c02dfc340556b683a79d057..dd3356177da3b582b74c2c1a6a18ac1308f64567 100644
--- a/daemon/src/call.cpp
+++ b/daemon/src/call.cpp
@@ -306,16 +306,8 @@ void
 Call::initIceTransport(bool master, unsigned channel_num)
 {
     auto& iceTransportFactory = Manager::instance().getIceTransportFactory();
-    const auto& on_initdone = [this, master](ring::IceTransport& iceTransport, bool done) {
-        if (done) {
-            if (master)
-                iceTransport.setInitiatorSession();
-            else
-                iceTransport.setSlaveSession();
-        }
-    };
     iceTransport_ = iceTransportFactory.createTransport(getCallId().c_str(), channel_num,
-                                                        on_initdone);
+                                                        master);
 }
 
 int
diff --git a/daemon/src/ice_transport.cpp b/daemon/src/ice_transport.cpp
index 52b9a2becf1c775ac0203ef42d5e7a2c885778fc..c0f07097133edc9680d9d6b637d0c278607a524f 100644
--- a/daemon/src/ice_transport.cpp
+++ b/daemon/src/ice_transport.cpp
@@ -94,6 +94,7 @@ IceTransport::cb_on_ice_complete(pj_ice_strans* ice_st,
 }
 
 IceTransport::IceTransport(const char* name, int component_count,
+                           bool master,
                            IceTransportCompleteCb on_initdone_cb,
                            IceTransportCompleteCb on_negodone_cb)
     : pool_(nullptr, pj_pool_release)
@@ -101,6 +102,7 @@ IceTransport::IceTransport(const char* name, int component_count,
     , on_negodone_cb_(on_negodone_cb)
     , component_count_(component_count)
     , compIO_(component_count)
+    , initiator_session_(master)
 {
     auto& iceTransportFactory = Manager::instance().getIceTransportFactory();
 
@@ -146,6 +148,12 @@ IceTransport::onComplete(pj_ice_strans* ice_st, pj_ice_strans_op op,
         RING_DBG("ICE %s with %s", opname, done?"success":"error");
         if (op == PJ_ICE_STRANS_OP_INIT) {
             iceTransportInitDone_ = done;
+            if (iceTransportInitDone_) {
+                if (initiator_session_)
+                    setInitiatorSession();
+                else
+                    setSlaveSession();
+            }
             if (on_initdone_cb_)
                 on_initdone_cb_(*this, done);
         } else if (op == PJ_ICE_STRANS_OP_NEGOTIATION) {
@@ -192,6 +200,7 @@ bool
 IceTransport::setInitiatorSession()
 {
     RING_DBG("ICE as master");
+    initiator_session_ = true;
     if (isInitialized()) {
         auto status = pj_ice_strans_change_role(icest_.get(), PJ_ICE_SESS_ROLE_CONTROLLING);
         if (status != PJ_SUCCESS) {
@@ -208,6 +217,7 @@ bool
 IceTransport::setSlaveSession()
 {
     RING_DBG("ICE as slave");
+    initiator_session_ = false;
     if (isInitialized()) {
         auto status = pj_ice_strans_change_role(icest_.get(), PJ_ICE_SESS_ROLE_CONTROLLED);
         if (status != PJ_SUCCESS) {
@@ -684,10 +694,11 @@ IceTransportFactory::handleEvents(unsigned max_msec, unsigned *p_count)
 std::shared_ptr<IceTransport>
 IceTransportFactory::createTransport(const char* name,
                                      int component_count,
+                                     bool master,
                                      IceTransportCompleteCb&& on_initdone_cb,
                                      IceTransportCompleteCb&& on_negodone_cb)
 {
-    return std::make_shared<IceTransport>(name, component_count,
+    return std::make_shared<IceTransport>(name, component_count, master,
                                           std::forward<IceTransportCompleteCb>(on_initdone_cb),
                                           std::forward<IceTransportCompleteCb>(on_negodone_cb));
 }
diff --git a/daemon/src/ice_transport.h b/daemon/src/ice_transport.h
index 5d5a389ecb5f4d456a5382795cc751e92c38e824..a268f0303fe7c131d42404e112a184fb2c831bae 100644
--- a/daemon/src/ice_transport.h
+++ b/daemon/src/ice_transport.h
@@ -65,6 +65,7 @@ class IceTransport {
          * Constructor
          */
         IceTransport(const char* name, int component_count,
+                     bool master,
                      IceTransportCompleteCb on_initdone_cb={},
                      IceTransportCompleteCb on_negodone_cb={});
 
@@ -206,6 +207,8 @@ class IceTransport {
                 IceRecvCb cb;
         };
         std::vector<ComponentIO> compIO_;
+
+        bool initiator_session_ {true};
 };
 
 class IceTransportFactory {
@@ -215,6 +218,7 @@ class IceTransportFactory {
 
         std::shared_ptr<IceTransport> createTransport(const char* name,
                                                       int component_count,
+                                                      bool master,
                                                       IceTransportCompleteCb&& on_initdone_cb={},
                                                       IceTransportCompleteCb&& on_negodone_cb={});
 
diff --git a/daemon/src/ringdht/ringaccount.cpp b/daemon/src/ringdht/ringaccount.cpp
index c7c884110801285c84e719dedfbe5ef3112b0cb3..775203b3cec7360fa8ef74c47b88303d36c9ac56 100644
--- a/daemon/src/ringdht/ringaccount.cpp
+++ b/daemon/src/ringdht/ringaccount.cpp
@@ -149,14 +149,14 @@ RingAccount::newOutgoingCall(const std::string& id, const std::string& toUrl)
     auto& iceTransportFactory = Manager::instance().getIceTransportFactory();
     auto ice = iceTransportFactory.createTransport(
         ("sip:"+call->getCallId()).c_str(),
-        ICE_COMPONENTS
+        ICE_COMPONENTS,
+        true
     );
     if (not ice or ice->waitForInitialization(ICE_INIT_TIMEOUT) <= 0) {
         call->setConnectionState(Call::DISCONNECTED);
         call->setState(Call::MERROR);
         return call;
     }
-    ice->setInitiatorSession();
 
     call->setState(Call::INACTIVE);
     call->setConnectionState(Call::TRYING);
@@ -647,11 +647,11 @@ void RingAccount::doRegister()
                         auto& iceTransportFactory = Manager::instance().getIceTransportFactory();
                         auto ice = iceTransportFactory.createTransport(
                             ("sip:"+call->getCallId()).c_str(),
-                            ICE_COMPONENTS
+                            ICE_COMPONENTS,
+                            false
                         );
                         if (ice->waitForInitialization(ICE_INIT_TIMEOUT) <= 0)
                             throw std::runtime_error("Can't initialize ICE..");
-                        ice->setSlaveSession();
 
                         this_.dht_.putEncrypted(
                             listenKey,