diff --git a/daemon/src/call.h b/daemon/src/call.h
index 2a4b8da43b2a4241127832b1bb66d8fad5479912..281f8967241f487d96d3bc2790c735a78592052d 100644
--- a/daemon/src/call.h
+++ b/daemon/src/call.h
@@ -173,6 +173,8 @@ class Call : public Recordable {
             isIPToIP_ = IPToIP;
         }
 
+        virtual void answer() = 0;
+
         /**
          * Set my IP [not protected]
          * @param ip  The local IP address
diff --git a/daemon/src/iax/iaxcall.h b/daemon/src/iax/iaxcall.h
index d9dfde77009e8ebaf08a259e03cb9ec0a4d38465..739f7b90a743d0e81fe163262a68840b28e7cedd 100644
--- a/daemon/src/iax/iaxcall.h
+++ b/daemon/src/iax/iaxcall.h
@@ -71,11 +71,11 @@ class IAXCall : public Call {
 
         int getAudioCodec() const;
 
-        void answer();
-
         int format;
         iax_session* session;
     private:
+        void answer();
+
         NON_COPYABLE(IAXCall);
 };
 
diff --git a/daemon/src/iax/iaxvoiplink.cpp b/daemon/src/iax/iaxvoiplink.cpp
index 0518937d6e839d140ff4683992ecf0b53390f1d9..aaf1333cf26eb123af2f7ba986d1cb7af55a72fe 100644
--- a/daemon/src/iax/iaxvoiplink.cpp
+++ b/daemon/src/iax/iaxvoiplink.cpp
@@ -278,7 +278,7 @@ IAXVoIPLink::answer(Call *call)
     Manager::instance().addStream(call->getCallId());
 
     mutexIAX_.enter();
-    static_cast<IAXCall*>(call)->answer();
+    call->answer();
     mutexIAX_.leave();
 
     call->setState(Call::ACTIVE);
diff --git a/daemon/src/sip/sipcall.cpp b/daemon/src/sip/sipcall.cpp
index c324d92001dcf33d10954d095489f6b7f00a9722..fe1d91ea0c8566ab60f65eb8c745e9dbad34154d 100644
--- a/daemon/src/sip/sipcall.cpp
+++ b/daemon/src/sip/sipcall.cpp
@@ -62,13 +62,14 @@ SIPCall::~SIPCall()
     pj_pool_release(pool_);
 }
 
-void SIPCall::answer(bool needsSdp)
+void SIPCall::answer()
 {
     pjsip_tx_data *tdata;
     if (!inv->last_answer)
         throw std::runtime_error("Should only be called for initial answer");
 
-    if (pjsip_inv_answer(inv, PJSIP_SC_OK, NULL, needsSdp ? local_sdp_->getLocalSdpSession() : NULL, &tdata) != PJ_SUCCESS)
+    // answer with SDP if no SDP was given in initial invite (i.e. inv->neg is NULL)
+    if (pjsip_inv_answer(inv, PJSIP_SC_OK, NULL, !inv->neg ? local_sdp_->getLocalSdpSession() : NULL, &tdata) != PJ_SUCCESS)
         throw std::runtime_error("Could not init invite request answer (200 OK)");
 
     if (pjsip_inv_send_msg(inv, tdata) != PJ_SUCCESS)
diff --git a/daemon/src/sip/sipcall.h b/daemon/src/sip/sipcall.h
index edd56b6afe15f5ad9871e012dd48b386cf5d1a65..186abbf381f0eadda9a36c6e3def58dce767fbd2 100644
--- a/daemon/src/sip/sipcall.h
+++ b/daemon/src/sip/sipcall.h
@@ -100,9 +100,7 @@ class SIPCall : public Call {
             return pool_;
         }
 
-        // @param needsSdp: true if the invite was received without an SDP
-        // and thus one must been added, false otherwise
-        void answer(bool needsSdp);
+        void answer();
 
         /**
          * The invite session to be reused in case of transfer
diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp
index e75e5d4ac48a04ae6c913ce8db567475fd2df2d9..b42be97263c58d784a6090cdcc70a570d6b343b1 100644
--- a/daemon/src/sip/sipvoiplink.cpp
+++ b/daemon/src/sip/sipvoiplink.cpp
@@ -913,15 +913,13 @@ SIPVoIPLink::answer(Call *call)
         return;
 
     SIPCall *sipCall = static_cast<SIPCall*>(call);
-    bool needsSdp = false;
     if (!sipCall->inv->neg) {
         WARN("Negotiator is NULL, we've received an INVITE without an SDP");
         pjmedia_sdp_session *dummy;
         sdp_create_offer_cb(sipCall->inv, &dummy);
-        needsSdp = true;
     }
 
-    sipCall->answer(needsSdp);
+    call->answer();
 }
 
 namespace {