diff --git a/daemon/src/call.cpp b/daemon/src/call.cpp
index 0873fe8ef46853862b21edb5a811f3d9099e7ee5..b326657875139583f1af224cecdc35686cc8d650 100644
--- a/daemon/src/call.cpp
+++ b/daemon/src/call.cpp
@@ -265,12 +265,13 @@ Call::getNullDetails()
     };
 }
 
-void
+bool
 Call::initIceTransport(bool master, unsigned channel_num)
 {
     auto& iceTransportFactory = Manager::instance().getIceTransportFactory();
     iceTransport_ = iceTransportFactory.createTransport(getCallId().c_str(), channel_num,
                                                         master, account_.getUPnPActive());
+    return static_cast<bool>(iceTransport_);
 }
 
 int
diff --git a/daemon/src/call.h b/daemon/src/call.h
index 1ad4c207dfaa89e7e10815dcf21d11256a0a3f0e..d148a40e362f73cef4fb4691fba24309265b8c83 100644
--- a/daemon/src/call.h
+++ b/daemon/src/call.h
@@ -303,7 +303,7 @@ class Call : public Recordable, public std::enable_shared_from_this<Call> {
 
         void removeCall();
 
-        void initIceTransport(bool master, unsigned channel_num=4);
+        bool initIceTransport(bool master, unsigned channel_num=4);
 
         int waitForIceInitialization(unsigned timeout);
 
diff --git a/daemon/src/ice_transport.cpp b/daemon/src/ice_transport.cpp
index afa7e6a6dfda87c754a90d533640e623add0407d..d0e9afbd7f6de3752e1358b757c0d884e67de178 100644
--- a/daemon/src/ice_transport.cpp
+++ b/daemon/src/ice_transport.cpp
@@ -835,9 +835,14 @@ IceTransportFactory::createTransport(const char* name,
                                      IceTransportCompleteCb&& on_initdone_cb,
                                      IceTransportCompleteCb&& on_negodone_cb)
 {
-    return std::make_shared<IceTransport>(name, component_count, master, upnp_enabled,
-                                          std::forward<IceTransportCompleteCb>(on_initdone_cb),
-                                          std::forward<IceTransportCompleteCb>(on_negodone_cb));
+    try {
+        return std::make_shared<IceTransport>(name, component_count, master, upnp_enabled,
+                                              std::forward<IceTransportCompleteCb>(on_initdone_cb),
+                                              std::forward<IceTransportCompleteCb>(on_negodone_cb));
+    } catch(const std::exception& e) {
+        RING_ERR("%s",e.what());
+        return nullptr;
+    }
 }
 
 void
diff --git a/daemon/src/sip/sipaccount.cpp b/daemon/src/sip/sipaccount.cpp
index 018e1d9b897067877f98b55aefdbd820a58337d9..d7703763a46867d7c1ac1a864372ca46e0a680d4 100644
--- a/daemon/src/sip/sipaccount.cpp
+++ b/daemon/src/sip/sipaccount.cpp
@@ -330,7 +330,7 @@ SIPAccount::newOutgoingCall(const std::string& toUrl)
 bool
 SIPAccount::SIPStartCall(std::shared_ptr<SIPCall>& call)
 {
-    // Add Ice headers to local SDP
+    // Add Ice headers to local SDP if ice transport exist
     call->setupLocalSDPFromIce();
 
     std::string toUri(call->getPeerNumber()); // expecting a fully well formed sip uri
diff --git a/daemon/src/sip/sipcall.cpp b/daemon/src/sip/sipcall.cpp
index af66eeb21e74a2852c544f58cbf5a52075e2163f..c7d17c0539b779b9b3b9345bac07650b6bbfa042 100644
--- a/daemon/src/sip/sipcall.cpp
+++ b/daemon/src/sip/sipcall.cpp
@@ -230,8 +230,9 @@ SIPCall::SIPSessionReinvite()
                       acc.getActiveAccountCodecInfoList(acc.isVideoEnabled() ? MEDIA_VIDEO : MEDIA_NONE),
                       acc.getSrtpKeyExchange(),
                       getState() == Call::HOLD);
-    initIceTransport(true);
-    setupLocalSDPFromIce();
+    if (initIceTransport(true))
+        setupLocalSDPFromIce();
+
     pjmedia_sdp_session *local_sdp = sdp_->getLocalSdpSession();
 
     pjsip_tx_data *tdata;
@@ -701,6 +702,11 @@ SIPCall::onAnswered()
 void
 SIPCall::setupLocalSDPFromIce()
 {
+    if (not iceTransport_) {
+        RING_WARN("null icetransport: no attributes added to SDP");
+        return;
+    }
+
     if (waitForIceInitialization(DEFAULT_ICE_INIT_TIMEOUT) <= 0) {
         RING_ERR("ICE init failed, ICE will not be used for medias");
         return;
@@ -879,8 +885,8 @@ SIPCall::onReceiveOffer(const pjmedia_sdp_session* offer)
     );
     auto ice_attrs = Sdp::getIceAttributes(offer);
     if (not ice_attrs.ufrag.empty() and not ice_attrs.pwd.empty()) {
-        initIceTransport(false);
-        setupLocalSDPFromIce();
+        if (initIceTransport(false))
+            setupLocalSDPFromIce();
     }
     sdp_->startNegotiation();
     pjsip_inv_set_sdp_answer(inv.get(), sdp_->getLocalSdpSession());