diff --git a/daemon/src/dbus/callmanager.cpp b/daemon/src/dbus/callmanager.cpp
index d30cc7b12078c08f6f6d73014223a669cc684276..598b4e24f77bbab8d49731e10ffccaaf460a718d 100644
--- a/daemon/src/dbus/callmanager.cpp
+++ b/daemon/src/dbus/callmanager.cpp
@@ -364,9 +364,11 @@ sfl::AudioZrtpSession * CallManager::getAudioZrtpSession (const std::string& cal
         throw CallManagerException("Failed to get sip link");
     }
 
-    SIPCall *call = link->getSIPCall (callID);
-
-    if (!call) {
+    SIPCall *call;
+    try {
+        call = link->getSIPCall (callID);
+    }
+    catch (const VoipLinkException &e) {
         throw CallManagerException("Call id " + callID + " is not valid");
     }
 
diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp
index 63e7f2f2649f092154475e5433365ec07235c248..2219b03331d0dc61cfb232921a142f2ef31f7f90 100644
--- a/daemon/src/sip/sipvoiplink.cpp
+++ b/daemon/src/sip/sipvoiplink.cpp
@@ -550,14 +550,11 @@ void SIPVoIPLink::sendUnregister (Account *a)
 
 Call *SIPVoIPLink::newOutgoingCall (const std::string& id, const std::string& toUrl)
 {
-    SIPAccount * account = NULL;
-    std::string localAddr, addrSdp;
-
     // Create a new SIP call
     SIPCall* call = new SIPCall (id, Call::Outgoing, _cp);
 
     // Find the account associated to this call
-    account = dynamic_cast<SIPAccount *> (Manager::instance().getAccount (Manager::instance().getAccountFromCall (id)));
+    SIPAccount *account = dynamic_cast<SIPAccount *> (Manager::instance().getAccount (Manager::instance().getAccountFromCall (id)));
     if (account == NULL) {
     	_error ("UserAgent: Error: Could not retrieving account to make call with");
     	call->setConnectionState (Call::Disconnected);
@@ -579,7 +576,7 @@ Call *SIPVoIPLink::newOutgoingCall (const std::string& id, const std::string& to
     call->setPeerNumber (toUri);
     _debug ("UserAgent: New outgoing call %s to %s", id.c_str(), toUri.c_str());
 
-    localAddr = getInterfaceAddrFromName (account->getLocalInterface ());
+    std::string localAddr(getInterfaceAddrFromName (account->getLocalInterface ()));
     _debug ("UserAgent: Local address for thi call: %s", localAddr.c_str());
 
     if (localAddr == "0.0.0.0")
@@ -588,7 +585,9 @@ Call *SIPVoIPLink::newOutgoingCall (const std::string& id, const std::string& to
     setCallMediaLocal (call, localAddr);
 
     // May use the published address as well
-    account->isStunEnabled () ? addrSdp = account->getPublishedAddress () : addrSdp = getInterfaceAddrFromName (account->getLocalInterface ());
+    std::string addrSdp = account->isStunEnabled() ?
+        account->getPublishedAddress() :
+        getInterfaceAddrFromName(account->getLocalInterface ());
 
     if (addrSdp == "0.0.0.0")
 		addrSdp = loadSIPLocalIP();
@@ -620,12 +619,12 @@ Call *SIPVoIPLink::newOutgoingCall (const std::string& id, const std::string& to
 
 	// Building the local SDP offer
 	call->getLocalSDP()->setLocalIP (addrSdp);
-	if (call->getLocalSDP()->createOffer (account->getActiveCodecs ()) != PJ_SUCCESS) {
+	if (call->getLocalSDP()->createOffer(account->getActiveCodecs()) != PJ_SUCCESS) {
 		delete call;
 		throw VoipLinkException ("Could not create local sdp offer for new call");
 	}
 
-	if (SIPStartCall (call)) {
+	if (SIPStartCall(call)) {
 		call->setConnectionState (Call::Progressing);
 		call->setState (Call::Active);
 		addCall (call);
@@ -644,7 +643,7 @@ SIPVoIPLink::answer (Call *c)
 
     _debug ("UserAgent: Answering call");
 
-    SIPCall *call = (SIPCall*)c;
+    SIPCall *call = dynamic_cast<SIPCall*>(c);
 
     pjsip_inv_session *inv_session = call->getInvSession();
 
@@ -663,11 +662,9 @@ SIPVoIPLink::answer (Call *c)
 void
 SIPVoIPLink::hangup (const std::string& id)
 {
-    SIPCall* call = getSIPCall (id);
-    if (call == NULL)
-        throw VoipLinkException("Call is NULL while hanging up");
+    SIPCall* call = getSIPCall(id);
 
-    std::string account_id = Manager::instance().getAccountFromCall (id);
+    std::string account_id(Manager::instance().getAccountFromCall(id));
     SIPAccount *account = dynamic_cast<SIPAccount *> (Manager::instance().getAccount (account_id));
     if (account == NULL)
     	throw VoipLinkException("Could not find account for this call");
@@ -710,9 +707,7 @@ SIPVoIPLink::peerHungup (const std::string& id)
 {
     _info ("UserAgent: Peer hungup");
 
-    SIPCall* call = getSIPCall (id);
-    if (!call)
-        throw VoipLinkException("Call does not exist");
+    SIPCall* call = getSIPCall(id);
 
     // User hangup current call. Notify peer
     pjsip_tx_data *tdata = NULL;
@@ -744,10 +739,6 @@ SIPVoIPLink::cancel (const std::string& id)
 {
     _info ("UserAgent: Cancel call %s", id.c_str());
 
-    SIPCall* call = getSIPCall (id);
-    if (!call)
-    	throw VoipLinkException("Call does not exist");
-
     removeCall (id);
 }
 
@@ -755,9 +746,7 @@ SIPVoIPLink::cancel (const std::string& id)
 bool
 SIPVoIPLink::onhold (const std::string& id)
 {
-    SIPCall *call = getSIPCall (id);
-    if (!call)
-    	throw VoipLinkException("Could not find call");
+    SIPCall *call = getSIPCall(id);
 
     // Stop sound
     call->setState (Call::Hold);
@@ -790,8 +779,6 @@ SIPVoIPLink::offhold (const std::string& id)
     _debug ("UserAgent: retrive call from hold status");
 
     SIPCall *call = getSIPCall (id);
-    if (call == NULL)
-    	throw VoipLinkException("Could not find call");
 
 	Sdp *sdpSession = call->getLocalSDP();
     if (sdpSession == NULL)
@@ -845,10 +832,13 @@ bool
 SIPVoIPLink::sendTextMessage (sfl::InstantMessaging *module, const std::string& callID, const std::string& message, const std::string& from)
 {
     _debug ("SipVoipLink: Send text message to %s, from %s", callID.c_str(), from.c_str());
-
-    SIPCall *call = getSIPCall (callID);
-    if (!call)
-    	return !PJ_SUCCESS;
+    SIPCall *call;
+    try {
+        call = getSIPCall (callID);
+    }
+    catch (const VoipLinkException &e) {
+        return !PJ_SUCCESS;
+    }
 
 	/* Send IM message */
 	sfl::InstantMessaging::UriList list;
@@ -865,9 +855,7 @@ SIPVoIPLink::sendTextMessage (sfl::InstantMessaging *module, const std::string&
 bool
 SIPVoIPLink::transfer (const std::string& id, const std::string& to)
 {
-    SIPCall *call = getSIPCall (id);
-    if (call == NULL)
-    	throw VoipLinkException("Could not find call");
+    SIPCall *call = getSIPCall(id);
 
     call->stopRecording();
 
@@ -914,13 +902,12 @@ SIPVoIPLink::transfer (const std::string& id, const std::string& to)
 
     // Put SIP call id in map in order to retrieve call during transfer callback
     std::string callidtransfer(call->getInvSession()->dlg->call_id->id.ptr, call->getInvSession()->dlg->call_id->id.slen);
-    transferCallID.insert (std::pair<std::string, std::string> (callidtransfer, call->getCallId()));
+    transferCallID[callidtransfer] = call->getCallId();
 
     /* Send. */
     status = pjsip_xfer_send_request (sub, tdata);
-    if (status != PJ_SUCCESS) {
+    if (status != PJ_SUCCESS)
     	throw VoipLinkException("Could not send xfer request");
-    }
 
     return true;
 }
@@ -931,7 +918,7 @@ bool SIPVoIPLink::attendedTransfer(const std::string& transferId, const std::str
 
 	_debug("UserAgent: Attended transfer");
 
-	pjsip_dialog *target_dlg = getSIPCall (targetId)->getInvSession()->dlg;
+	pjsip_dialog *target_dlg = getSIPCall(targetId)->getInvSession()->dlg;
 
     /* Print URI */
 	pj_str_t str_dest = { NULL, 0 };
@@ -959,7 +946,7 @@ bool SIPVoIPLink::attendedTransfer(const std::string& transferId, const std::str
     str_dest.ptr = str_dest_buf;
     str_dest.slen += len;
 
-    SIPCall *transferCall = getSIPCall (transferId);
+    SIPCall *transferCall = getSIPCall(transferId);
 
     /* Create xfer client subscription. */
 	struct pjsip_evsub_user xfer_cb;
@@ -992,7 +979,7 @@ bool SIPVoIPLink::attendedTransfer(const std::string& transferId, const std::str
     std::string callidtransfer (transferCall->getInvSession()->dlg->call_id->id.ptr,
     							transferCall->getInvSession()->dlg->call_id->id.slen);
     _debug ("%s", callidtransfer.c_str());
-    transferCallID.insert (std::pair<std::string, std::string> (callidtransfer, transferCall->getCallId()));
+    transferCallID[callidtransfer] = transferCall->getCallId();
 
     /* Send. */
     return pjsip_xfer_send_request (sub, tdata) == PJ_SUCCESS;
@@ -1001,21 +988,18 @@ bool SIPVoIPLink::attendedTransfer(const std::string& transferId, const std::str
 bool
 SIPVoIPLink::refuse (const std::string& id)
 {
-    SIPCall *call;
-    pj_status_t status;
-    pjsip_tx_data *tdata;
-
     _debug ("UserAgent: Refuse call %s", id.c_str());
-
-    call = getSIPCall (id);
-
-    if (call==0) {
-        _error ("UserAgent: Error: Call doesn't exist");
+    SIPCall *call;
+    try {
+        call = getSIPCall (id);
+    }
+    catch (const VoipLinkException &e) {
+        _error ("UserAgent: Error: %s", e.what());
         return false;
     }
 
     // can't refuse outgoing call or connected
-    if (!call->isIncoming() || call->getConnectionState() == Call::Connected) {
+    if (!call->isIncoming() or call->getConnectionState() == Call::Connected) {
         _debug ("UserAgent: Call %s is not in state incoming, or is already answered");
         return false;
     }
@@ -1024,7 +1008,8 @@ SIPVoIPLink::refuse (const std::string& id)
     call->getAudioRtp()->stop();
 
     // User refuse current call. Notify peer
-    status = pjsip_inv_end_session (call->getInvSession(), PJSIP_SC_DECLINE, NULL, &tdata);   //603
+    pjsip_tx_data *tdata;
+    pj_status_t status = pjsip_inv_end_session (call->getInvSession(), PJSIP_SC_DECLINE, NULL, &tdata);   //603
 
     if (status != PJ_SUCCESS)
         return false;
@@ -1035,12 +1020,11 @@ SIPVoIPLink::refuse (const std::string& id)
         return false;
 
     // Make sure the pointer is NULL in callbacks
-    call->getInvSession()->mod_data[getModId() ] = NULL;
+    call->getInvSession()->mod_data[getModId()] = NULL;
 
     removeCall (id);
 
     _debug ("UserAgent: Refuse call completed");
-
     return true;
 }
 
@@ -1062,10 +1046,13 @@ SIPVoIPLink::getCurrentCodecName(Call *call) const
 bool
 SIPVoIPLink::carryingDTMFdigits (const std::string& id, char code)
 {
-    SIPCall *call = getSIPCall (id);
-
-    if (!call)
+    SIPCall *call;
+    try {
+        call = getSIPCall (id);
+    }
+    catch (VoipLinkException &e) {
         return false;
+    }
 
     std::string accountID(Manager::instance().getAccountFromCall (id));
     SIPAccount *account = static_cast<SIPAccount*>(Manager::instance().getAccount(accountID));
@@ -1123,7 +1110,7 @@ SIPVoIPLink::dtmfSipInfo (SIPCall *call, char code)
 
     int duration = Manager::instance().voipPreferences.getPulseLength();
     char dtmf_body[1000];
-    snprintf (dtmf_body, sizeof dtmf_body - 1, "Signal=%c\r\nDuration=%d\r\n", code, duration);
+    snprintf(dtmf_body, sizeof dtmf_body - 1, "Signal=%c\r\nDuration=%d\r\n", code, duration);
 
     /* Create "application/dtmf-relay" message body. */
     pj_str_t content;
@@ -1291,23 +1278,6 @@ SIPVoIPLink::SIPCallClosed (SIPCall *call)
     removeCall (id);
 }
 
-void
-SIPVoIPLink::SIPCallReleased (SIPCall *call)
-{
-    if (!call)
-        return;
-
-    // if we are here.. something when wrong before...
-    _debug ("UserAgent: SIP call release");
-
-    std::string id(call->getCallId());
-
-    Manager::instance().callFailure (id);
-
-    removeCall (id);
-}
-
-
 void
 SIPVoIPLink::SIPCallAnswered (SIPCall *call, pjsip_rx_data *rdata UNUSED)
 {
@@ -1331,7 +1301,10 @@ SIPVoIPLink::SIPCallAnswered (SIPCall *call, pjsip_rx_data *rdata UNUSED)
 SIPCall*
 SIPVoIPLink::getSIPCall (const std::string& id)
 {
-    return dynamic_cast<SIPCall*> (getCall (id));
+    SIPCall *result = dynamic_cast<SIPCall*> (getCall (id));
+    if (result == 0)
+        throw VoipLinkException("Could not find SIPCall " + id);
+    return result;
 }
 
 bool SIPVoIPLink::SIPNewIpToIpCall (const std::string& id, const std::string& to)
diff --git a/daemon/src/sip/sipvoiplink.h b/daemon/src/sip/sipvoiplink.h
index c695eb8531ebcd1548299c448bbd31003f264b86..06299732eb36ca686c02d3a81412b49d08a77237 100644
--- a/daemon/src/sip/sipvoiplink.h
+++ b/daemon/src/sip/sipvoiplink.h
@@ -187,13 +187,6 @@ class SIPVoIPLink : public VoIPLink
          */
         virtual bool carryingDTMFdigits (const std::string& id, char code);
 
-        /**
-         * Start a SIP Call
-         * @param call  The current call
-         * @return true if all is correct
-         */
-        bool SIPStartCall (SIPCall* call);
-
         /**
          * Start a new SIP call using the IP2IP profile
          * @param The call id
@@ -219,13 +212,6 @@ class SIPVoIPLink : public VoIPLink
          */
         void SIPCallClosed (SIPCall *call);
 
-        /**
-         * The call pointer was released
-         * If the call was not cleared before, report an error
-         * @param sip call
-         */
-        void SIPCallReleased (SIPCall *call);
-
         pj_caching_pool *getMemoryPoolFactory();
 
         /**
@@ -326,6 +312,12 @@ class SIPVoIPLink : public VoIPLink
         void createDefaultSipTlsListener();
 
     private:
+        /**
+         * Start a SIP Call
+         * @param call  The current call
+         * @return true if all is correct
+         */
+        bool SIPStartCall (SIPCall* call);
         /**
          * Send Dtmf using SIP INFO message
          */