diff --git a/src/sip/sipcall.cpp b/src/sip/sipcall.cpp
index 440d7808cecd515d70d6065c5796690d6b807de6..14008b565795b46817f6059b2b07e38571efbd38 100644
--- a/src/sip/sipcall.cpp
+++ b/src/sip/sipcall.cpp
@@ -1000,13 +1000,8 @@ SIPCall::onReceiveOffer(const pjmedia_sdp_session* offer)
         acc.getActiveAccountCodecInfoList(MEDIA_AUDIO),
         acc.getActiveAccountCodecInfoList(acc.isVideoEnabled() ? MEDIA_VIDEO : MEDIA_NONE),
         acc.getSrtpKeyExchange(),
-        getState() == CallState::HOLD
-    );
-    auto ice_attrs = Sdp::getIceAttributes(offer);
-    if (not ice_attrs.ufrag.empty() and not ice_attrs.pwd.empty()) {
-        if (initIceTransport(false))
-            setupLocalSDPFromIce();
-    }
+        getState() == CallState::HOLD);
+    setRemoteSdp(offer);
     sdp_->startNegotiation();
     pjsip_inv_set_sdp_answer(inv.get(), sdp_->getLocalSdpSession());
 }
@@ -1136,4 +1131,20 @@ SIPCall::merge(const std::shared_ptr<SIPCall>& scall)
         waitForIceAndStartMedia();
 }
 
+void
+SIPCall::setRemoteSdp(const pjmedia_sdp_session* sdp)
+{
+    if (!sdp)
+        return;
+
+    auto ice_attrs = Sdp::getIceAttributes(sdp);
+    if (not ice_attrs.ufrag.empty() and not ice_attrs.pwd.empty()) {
+        if (not getIceTransport()) {
+            RING_DBG("Initializing ICE transport");
+            initIceTransport(false);
+        }
+        setupLocalSDPFromIce();
+    }
+}
+
 } // namespace ring
diff --git a/src/sip/sipcall.h b/src/sip/sipcall.h
index c7542f6ffc336c9bcc1bbd08ef49a7dafb14fc2d..d5bc13a97a030208bb029275d0822409d368b347 100644
--- a/src/sip/sipcall.h
+++ b/src/sip/sipcall.h
@@ -224,6 +224,12 @@ class SIPCall : public Call
             peerRegistredName_ = name;
         }
 
+        /**
+         * Give peer SDP to the call for handling
+         * @param sdp pointer on PJSIP sdp structure, could be nullptr (acts as no-op in such case)
+         */
+        void setRemoteSdp(const pjmedia_sdp_session* sdp);
+
     private:
         NON_COPYABLE(SIPCall);
 
diff --git a/src/sip/sipvoiplink.cpp b/src/sip/sipvoiplink.cpp
index 548b91ba2d64207d1fa4f50973a397459839c59b..413ab8682e0c0b0731837b45a7b980252c42dd3f 100644
--- a/src/sip/sipvoiplink.cpp
+++ b/src/sip/sipvoiplink.cpp
@@ -335,16 +335,8 @@ transaction_request_cb(pjsip_rx_data *rdata)
     call->getSDP().receiveOffer(r_sdp,
         account->getActiveAccountCodecInfoList(MEDIA_AUDIO),
         account->getActiveAccountCodecInfoList(account->isVideoEnabled() ? MEDIA_VIDEO : MEDIA_NONE),
-        account->getSrtpKeyExchange()
-    );
-    auto ice_attrs = Sdp::getIceAttributes(r_sdp);
-    if (not ice_attrs.ufrag.empty() and not ice_attrs.pwd.empty()) {
-        if (not call->getIceTransport()) {
-            RING_DBG("Initializing ICE transport");
-            call->initIceTransport(false);
-        }
-        call->setupLocalSDPFromIce();
-    }
+        account->getSrtpKeyExchange());
+    call->setRemoteSdp(r_sdp);
 
     pjsip_dialog *dialog = nullptr;
     if (pjsip_dlg_create_uas_and_inc_lock(pjsip_ua_instance(), rdata, nullptr, &dialog) != PJ_SUCCESS) {