diff --git a/daemon/src/call.cpp b/daemon/src/call.cpp
index bd0668da3ffed2740b020e2873abfcba3f0ce7f6..deb9ca0d6d75f312d45d017af3cd5f4ed4d0638a 100644
--- a/daemon/src/call.cpp
+++ b/daemon/src/call.cpp
@@ -34,7 +34,7 @@
 #include "history/historyitem.h"
 #include "scoped_lock.h"
 
-Call::Call(const std::string& id, Call::CallType type)
+Call::Call(const std::string& id, Call::CallType type, const std::string &accountID)
     : callMutex_()
     , localIPAddress_("")
     , localAudioPort_(0)
@@ -42,6 +42,7 @@ Call::Call(const std::string& id, Call::CallType type)
     , id_(id)
     , confID_()
     , type_(type)
+    , accountID_(accountID)
     , connectionState_(Call::DISCONNECTED)
     , callState_(Call::INACTIVE)
     , isIPToIP_(false)
@@ -203,7 +204,7 @@ std::map<std::string, std::string> Call::createHistoryEntry() const
     using sfl::HistoryItem;
     std::map<std::string, std::string> result;
 
-    result[HistoryItem::ACCOUNT_ID_KEY] = Manager::instance().getAccountFromCall(id_);
+    result[HistoryItem::ACCOUNT_ID_KEY] = accountID_;
     result[HistoryItem::CONFID_KEY] = confID_;
     result[HistoryItem::CALLID_KEY] = id_;
     result[HistoryItem::DISPLAY_NAME_KEY] = displayName_;
@@ -230,6 +231,7 @@ Call::getDetails()
     details["CALL_STATE"] = getStateStr();
     details["CONF_ID"] = confID_;
     details["TIMESTAMP_START"] = timestamp_to_string(timestamp_start_);
+    details["ACCOUNTID"] = accountID_;
     return details;
 }
 
diff --git a/daemon/src/call.h b/daemon/src/call.h
index c637c311cd137f1d7d729f870e7e47a49a827286..eee2e15db73392976e7f3cfb169cedda50660ea8 100644
--- a/daemon/src/call.h
+++ b/daemon/src/call.h
@@ -72,7 +72,7 @@ class Call : public Recordable {
          * @param id Unique identifier of the call
          * @param type set definitely this call as incoming/outgoing
          */
-        Call(const std::string& id, Call::CallType type);
+        Call(const std::string& id, Call::CallType type, const std::string &accountID);
         virtual ~Call();
 
         /**
@@ -95,6 +95,10 @@ class Call : public Recordable {
             confID_ = id;
         }
 
+        std::string getAccountId() const {
+            return accountID_;
+        }
+
         CallType getCallType() const {
             return type_;
         }
@@ -251,6 +255,9 @@ class Call : public Recordable {
         /** Type of the call */
         CallType type_;
 
+        /** Associate account ID */
+        std::string accountID_;
+
         /** Disconnected/Progressing/Trying/Ringing/Connected */
         ConnectionState connectionState_;
 
diff --git a/daemon/src/iax/iaxcall.cpp b/daemon/src/iax/iaxcall.cpp
index 1fcbffd762a0d53647059a135296ba49ac1de9c4..934ab02a92cb5bba7015e0eda6a97364a90883d0 100644
--- a/daemon/src/iax/iaxcall.cpp
+++ b/daemon/src/iax/iaxcall.cpp
@@ -60,7 +60,7 @@ int codecToASTFormat(int c)
 }
 }
 
-IAXCall::IAXCall(const std::string& id, Call::CallType type) : Call(id, type),
+IAXCall::IAXCall(const std::string& id, Call::CallType type, const std::string &account_id) : Call(id, type, account_id),
     format(0), session(NULL)
 {}
 
diff --git a/daemon/src/iax/iaxcall.h b/daemon/src/iax/iaxcall.h
index 739f7b90a743d0e81fe163262a68840b28e7cedd..5a68cde3533a8f7662440f97de89a870b1a0d8a5 100644
--- a/daemon/src/iax/iaxcall.h
+++ b/daemon/src/iax/iaxcall.h
@@ -47,7 +47,7 @@ class IAXCall : public Call {
          * @param id  The unique ID of the call
          * @param type  The type of the call
          */
-        IAXCall(const std::string& id, Call::CallType type);
+        IAXCall(const std::string& id, Call::CallType type, const std::string &account_id);
 
         /**
          * @return int  The bitwise list of supported formats
diff --git a/daemon/src/iax/iaxvoiplink.cpp b/daemon/src/iax/iaxvoiplink.cpp
index 8a416dd47b20475b2b048d08c3ef6c2e963efd3a..67fc6984fc3c6bef6134d64c3f415d0020409447 100644
--- a/daemon/src/iax/iaxvoiplink.cpp
+++ b/daemon/src/iax/iaxvoiplink.cpp
@@ -96,6 +96,13 @@ IAXVoIPLink::init()
     }
 }
 
+bool
+IAXVoIPLink::hasCalls()
+{
+    sfl::ScopedLock m(iaxCallMapMutex_);
+    return not iaxCallMap_.empty();
+}
+
 void
 IAXVoIPLink::terminate()
 {
@@ -271,9 +278,9 @@ IAXVoIPLink::sendUnregister(Account *a)
 }
 
 Call*
-IAXVoIPLink::newOutgoingCall(const std::string& id, const std::string& toUrl)
+IAXVoIPLink::newOutgoingCall(const std::string& id, const std::string& toUrl, const std::string &account_id)
 {
-    IAXCall* call = new IAXCall(id, Call::OUTGOING);
+    IAXCall* call = new IAXCall(id, Call::OUTGOING, account_id);
 
     call->setPeerNumber(toUrl);
     call->initRecFilename(toUrl);
@@ -696,7 +703,7 @@ void IAXVoIPLink::iaxHandlePrecallEvent(iax_event* event)
         case IAX_EVENT_CONNECT:
             id = Manager::instance().getNewCallID();
 
-            call = new IAXCall(id, Call::INCOMING);
+            call = new IAXCall(id, Call::INCOMING, accountID_);
             call->session = event->session;
             call->setConnectionState(Call::PROGRESSING);
 
diff --git a/daemon/src/iax/iaxvoiplink.h b/daemon/src/iax/iaxvoiplink.h
index f60df681e0b485c428ae99978eb5df6112624658..74e07f492df31980eafccb2ce8fcbfc910245374 100644
--- a/daemon/src/iax/iaxvoiplink.h
+++ b/daemon/src/iax/iaxvoiplink.h
@@ -72,6 +72,8 @@ class IAXVoIPLink : public VoIPLink {
          */
         virtual bool getEvent();
 
+        bool hasCalls();
+
         /**
          * Return the internal account map for all VOIP links
          */
@@ -110,7 +112,7 @@ class IAXVoIPLink : public VoIPLink {
          * @param toUrl The address to call
          * @return Call*  A pointer on the call
          */
-        virtual Call* newOutgoingCall(const std::string& id, const std::string& toUrl);
+        virtual Call* newOutgoingCall(const std::string& id, const std::string& toUrl, const std::string &account_id);
 
         /**
          * Answer a call
diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp
index 6430f0c31e749b782f23479dcd3951ca9a982aaf..646543eef32fe481cf74f14b091c6cb7c8ad198a 100644
--- a/daemon/src/managerimpl.cpp
+++ b/daemon/src/managerimpl.cpp
@@ -91,8 +91,7 @@ ManagerImpl::ManagerImpl() :
     currentCallId_(), currentCallMutex_(), audiodriver_(0), dtmfKey_(),
     toneMutex_(), telephoneTone_(), audiofile_(), audioLayerMutex_(),
     waitingCall_(), waitingCallMutex_(), nbIncomingWaitingCall_(0), path_(),
-    callAccountMap_(), callAccountMapMutex_(), IPToIPMap_(),
-    mainBuffer_(), conferenceMap_(), history_(), finished_(false)
+    IPToIPMap_(), mainBuffer_(), conferenceMap_(), history_(), finished_(false)
 {
     pthread_mutex_init(&currentCallMutex_, NULL);
     pthread_mutex_init(&toneMutex_, NULL);
@@ -294,14 +293,12 @@ bool ManagerImpl::outgoingCall(const std::string& account_id,
         use_account_id = account_id;
     }
 
-    associateCallToAccount(call_id, use_account_id);
-
     try {
-        Call *call = getAccountLink(account_id)->newOutgoingCall(call_id, to_cleaned);
+        Call *call = getAccountLink(account_id)->newOutgoingCall(call_id, to_cleaned, use_account_id);
 
         // try to reverse match the peer name using the cache
         if (call->getDisplayName().empty()) {
-            const std::string pseudo_contact_name(HistoryNameCache::getInstance().getNameFromHistory(call->getPeerNumber(), getAccountFromCall(call_id)));
+            const std::string pseudo_contact_name(HistoryNameCache::getInstance().getNameFromHistory(call->getPeerNumber(), call->getAccountId()));
             if (not pseudo_contact_name.empty())
                 call->setDisplayName(pseudo_contact_name);
         }
@@ -359,8 +356,7 @@ bool ManagerImpl::answerCall(const std::string& call_id)
     }
 
     try {
-        const std::string account_id = getAccountFromCall(call_id);
-        VoIPLink *link = getAccountLink(account_id);
+        VoIPLink *link = getAccountLink(call->getAccountId());
         if (link)
             link->answer(call);
     } catch (const std::runtime_error &e) {
@@ -438,13 +434,11 @@ bool ManagerImpl::hangupCall(const std::string& callId)
             return false;
         }
     } else {
-        std::string accountId(getAccountFromCall(callId));
         Call * call = getCallFromCallID(callId);
         if (call) {
             history_.addCall(call, preferences.getHistoryLimit());
-            VoIPLink *link = getAccountLink(accountId);
+            VoIPLink *link = getAccountLink(call->getAccountId());
             link->hangup(callId, 0);
-            removeCallAccount(callId);
             saveHistory();
         }
     }
@@ -551,12 +545,10 @@ bool ManagerImpl::offHoldCall(const std::string& callId)
         SIPVoIPLink::instance()->offhold(callId);
     else {
         /* Classic call, attached to an account */
-        const std::string accountId(getAccountFromCall(callId));
-        DEBUG("Setting offhold, Account %s, callid %s", accountId.c_str(), callId.c_str());
         Call * call = getCallFromCallID(callId);
 
         if (call)
-            getAccountLink(accountId)->offhold(callId);
+            getAccountLink(call->getAccountId())->offhold(callId);
         else
             result = false;
     }
@@ -656,8 +648,6 @@ bool ManagerImpl::refuseCall(const std::string& id)
             return false;
 
         getAccountLink(accountid)->refuse(id);
-
-        removeCallAccount(id);
     }
 
     removeWaitingCall(id);
@@ -1458,8 +1448,6 @@ void ManagerImpl::incomingCall(Call &call, const std::string& accountId)
     stopTone();
     const std::string callID(call.getCallId());
 
-    associateCallToAccount(callID, accountId);
-
     if (accountId.empty())
         setIPToIPForCall(callID, true);
     else {
@@ -1673,7 +1661,6 @@ void ManagerImpl::peerHungupCall(const std::string& call_id)
     dbus_.getCallManager()->callStateChanged(call_id, "HUNGUP");
 
     removeWaitingCall(call_id);
-    removeCallAccount(call_id);
     removeStream(call_id);
 
     if (getCallList().empty()) {
@@ -1694,7 +1681,6 @@ void ManagerImpl::callBusy(const std::string& id)
         unsetCurrentCall();
     }
 
-    removeCallAccount(id);
     removeWaitingCall(id);
 }
 
@@ -1714,7 +1700,6 @@ void ManagerImpl::callFailure(const std::string& call_id)
         removeParticipant(call_id);
     }
 
-    removeCallAccount(call_id);
     removeWaitingCall(call_id);
 }
 
@@ -2524,42 +2509,21 @@ void ManagerImpl::removeAccount(const std::string& accountID)
     dbus_.getConfigurationManager()->accountsChanged();
 }
 
-// ACCOUNT handling
-void ManagerImpl::associateCallToAccount(const std::string& callID,
-        const std::string& accountID)
-{
-    sfl::ScopedLock m(callAccountMapMutex_);
-    callAccountMap_[callID] = accountID;
-    DEBUG("Associate Call %s with Account %s", callID.data(), accountID.data());
-}
-
 std::string ManagerImpl::getAccountFromCall(const std::string& callID)
 {
-    sfl::ScopedLock m(callAccountMapMutex_);
-    CallAccountMap::iterator iter = callAccountMap_.find(callID);
-
-    return (iter == callAccountMap_.end()) ? "" : iter->second;
-}
-
-void ManagerImpl::removeCallAccount(const std::string& callID)
-{
-    sfl::ScopedLock m(callAccountMapMutex_);
-    callAccountMap_.erase(callID);
-
-    // Stop audio layer if there is no call anymore
-    if (callAccountMap_.empty()) {
-        sfl::ScopedLock lock(audioLayerMutex_);
-
-        if (audiodriver_)
-            audiodriver_->stopStream();
-    }
-
+    Call *call = getCallFromCallID(callID);
+    if (call)
+        return call->getAccountId();
+    else
+        return "";
 }
 
+// FIXME: get rid of this, there's no guarantee that
+// a Call will still exist after this has been called.
 bool ManagerImpl::isValidCall(const std::string& callID)
 {
-    sfl::ScopedLock m(callAccountMapMutex_);
-    return callAccountMap_.find(callID) != callAccountMap_.end();
+    Call *call = getCallFromCallID(callID);
+    return call != 0;
 }
 
 std::string ManagerImpl::getNewCallID()
@@ -2837,16 +2801,11 @@ std::map<std::string, std::string> ManagerImpl::getCallDetails(const std::string
     // To achieve that, we need to get the voip link attached to the call
     // But to achieve that, we need to get the account the call was made with
 
-    // So first we fetch the account
-    const std::string accountid(getAccountFromCall(callID));
-
     // Then the VoIP link this account is linked with (IAX2 or SIP)
     Call *call = getCallFromCallID(callID);
 
     if (call) {
-        std::map<std::string, std::string> details(call->getDetails());
-        details["ACCOUNTID"] = accountid;
-        return details;
+        return call->getDetails();
     } else {
         ERROR("Call is NULL");
         // FIXME: is this even useful?
@@ -2868,10 +2827,11 @@ void vectorFromMapKeys(const M &m, V &v)
 }
 }
 
+// FIXME: get call ids from voiplinks
 std::vector<std::string> ManagerImpl::getCallList() const
 {
     std::vector<std::string> v;
-    vectorFromMapKeys(callAccountMap_, v);
+    // vectorFromMapKeys(callAccountMap_, v);
     return v;
 }
 
diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h
index b1d0ca2ff0d992e43cf008164e9134182bf6ab7d..b65468ffa8a7ba7be5fc2247b6b51ddd067a14d8 100644
--- a/daemon/src/managerimpl.h
+++ b/daemon/src/managerimpl.h
@@ -84,10 +84,6 @@ class Account;
 class SIPAccount;
 class IAXAccount;
 
-
-/** Define a type for a std::string to std::string Map inside ManagerImpl */
-typedef std::map<std::string, std::string> CallAccountMap;
-
 /** To send multiple string */
 typedef std::list<std::string> TokenList;
 
@@ -359,8 +355,7 @@ class ManagerImpl {
         void stopTone();
 
         /**
-         * When receiving a new incoming call, add it to the callaccount map
-         * and notify user
+         * Handle incoming call and notify user
          * @param call A call pointer
          * @param accountId an account id
          */
@@ -926,12 +921,6 @@ class ManagerImpl {
         DNSService *DNSService_;
 #endif
 
-        /** Map to associate a CallID to the good account */
-        CallAccountMap callAccountMap_;
-
-        /** Mutex to lock the call account map (main thread + voiplink thread) */
-        pthread_mutex_t callAccountMapMutex_;
-
         std::map<std::string, bool> IPToIPMap_;
 
         bool isIPToIP(const std::string& callID) const;
@@ -958,14 +947,6 @@ class ManagerImpl {
 
         void setIPToIPForCall(const std::string& callID, bool IPToIP);
 
-        /** Associate a new std::string to a std::string
-         * Protected by mutex
-         * @param callID the new CallID not in the list yet
-         * @param accountID the known accountID present in accountMap
-         * @return bool True if the new association is create
-         */
-        void associateCallToAccount(const std::string& callID, const std::string& accountID);
-
         /**
          * Test if call is a valid call, i.e. have been created and stored in
          * call-account map
diff --git a/daemon/src/sip/sipcall.cpp b/daemon/src/sip/sipcall.cpp
index 7e26b67dd4581ba475d1d1176eb64e9342c68c99..904daadcf5ce32a9a7b7c9d4c41e2d8a23499bd8 100644
--- a/daemon/src/sip/sipcall.cpp
+++ b/daemon/src/sip/sipcall.cpp
@@ -45,7 +45,8 @@ namespace {
 }
 
 SIPCall::SIPCall(const std::string& id, Call::CallType type,
-                 pj_caching_pool *caching_pool) : Call(id, type)
+        pj_caching_pool *caching_pool, const std::string &account_id) :
+    Call(id, type, account_id)
     , inv(NULL)
     , audiortp_(this)
 #ifdef SFL_VIDEO
diff --git a/daemon/src/sip/sipcall.h b/daemon/src/sip/sipcall.h
index aa5111821926148df8d234f514790a84f27ab5fa..e97b6851c2892e00beb81a9c0932ec28e40a1f00 100644
--- a/daemon/src/sip/sipcall.h
+++ b/daemon/src/sip/sipcall.h
@@ -63,7 +63,8 @@ class SIPCall : public Call {
          * @param type  The type of the call. Could be Incoming
          *						 Outgoing
          */
-        SIPCall(const std::string& id, Call::CallType type, pj_caching_pool *caching_pool);
+        SIPCall(const std::string& id, Call::CallType type,
+                pj_caching_pool *caching_pool, const std::string &account_id);
 
         /**
          * Destructor
diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp
index a40937da2e345cf7135f46059d032ef9af3f206b..c1fbb45fd3017db1df38a94cf0a788d777eaee80 100644
--- a/daemon/src/sip/sipvoiplink.cpp
+++ b/daemon/src/sip/sipvoiplink.cpp
@@ -271,8 +271,7 @@ pj_bool_t transaction_request_cb(pjsip_rx_data *rdata)
 
     Manager::instance().hookPreference.runHook(rdata->msg_info.msg);
 
-    SIPCall* call = new SIPCall(Manager::instance().getNewCallID(), Call::INCOMING, cp_);
-    Manager::instance().associateCallToAccount(call->getCallId(), account_id);
+    SIPCall* call = new SIPCall(Manager::instance().getNewCallID(), Call::INCOMING, cp_, account_id);
 
     // May use the published address as well
     std::string addrToUse = SipTransport::getInterfaceAddrFromName(account->getLocalInterface());
@@ -786,7 +785,7 @@ bool isValidIpAddress(const std::string &address)
 }
 
 
-Call *SIPVoIPLink::newOutgoingCall(const std::string& id, const std::string& toUrl)
+Call *SIPVoIPLink::newOutgoingCall(const std::string& id, const std::string& toUrl, const std::string &account_id)
 {
     DEBUG("New outgoing call to %s", toUrl.c_str());
     std::string toCpy = toUrl;
@@ -797,10 +796,9 @@ Call *SIPVoIPLink::newOutgoingCall(const std::string& id, const std::string& toU
     Manager::instance().setIPToIPForCall(id, IPToIP);
 
     if (IPToIP) {
-        Manager::instance().associateCallToAccount(id, SIPAccount::IP2IP_PROFILE);
         return SIPNewIpToIpCall(id, toUrl);
     } else {
-        return newRegisteredAccountCall(id, toUrl);
+        return newRegisteredAccountCall(id, toUrl, account_id);
     }
 }
 
@@ -813,7 +811,7 @@ Call *SIPVoIPLink::SIPNewIpToIpCall(const std::string& id, const std::string& to
     if (!account)
         throw VoipLinkException("Could not retrieve default account for IP2IP call");
 
-    SIPCall *call = new SIPCall(id, Call::OUTGOING, cp_);
+    SIPCall *call = new SIPCall(id, Call::OUTGOING, cp_, SIPAccount::IP2IP_PROFILE);
 
     call->setIPToIP(true);
     call->initRecFilename(to);
@@ -854,16 +852,16 @@ Call *SIPVoIPLink::SIPNewIpToIpCall(const std::string& id, const std::string& to
     return call;
 }
 
-Call *SIPVoIPLink::newRegisteredAccountCall(const std::string& id, const std::string& toUrl)
+Call *SIPVoIPLink::newRegisteredAccountCall(const std::string& id, const std::string& toUrl, const std::string &account_id)
 {
     DEBUG("UserAgent: New registered account call to %s", toUrl.c_str());
 
-    SIPAccount *account = Manager::instance().getSipAccount(Manager::instance().getAccountFromCall(id));
+    SIPAccount *account = Manager::instance().getSipAccount(account_id);
 
     if (account == NULL) // TODO: We should investigate how we could get rid of this error and create a IP2IP call instead
         throw VoipLinkException("Could not get account for this call");
 
-    SIPCall* call = new SIPCall(id, Call::OUTGOING, cp_);
+    SIPCall* call = new SIPCall(id, Call::OUTGOING, cp_, account->getAccountID());
 
     // If toUri is not a well formatted sip URI, use account information to process it
     std::string toUri;
@@ -954,7 +952,7 @@ SIPVoIPLink::hangup(const std::string& id, int reason)
     if (!call)
         return;
 
-    std::string account_id(Manager::instance().getAccountFromCall(id));
+    std::string account_id(call->getAccountId());
     SIPAccount *account = Manager::instance().getSipAccount(account_id);
 
     if (account == NULL)
@@ -1176,6 +1174,13 @@ void SIPVoIPLink::removeSipCall(const std::string& id)
     sipCallMap_.erase(id);
 }
 
+bool
+SIPVoIPLink::hasCalls()
+{
+    sfl::ScopedLock m(sipCallMapMutex_);
+    return not sipCallMap_.empty();
+}
+
 SIPCall*
 SIPVoIPLink::getSipCall(const std::string& id)
 {
@@ -1257,7 +1262,7 @@ SIPVoIPLink::transfer(const std::string& id, const std::string& to)
 
     call->stopRecording();
 
-    std::string account_id(Manager::instance().getAccountFromCall(id));
+    std::string account_id(call->getAccountId());
     SIPAccount *account = Manager::instance().getSipAccount(account_id);
 
     if (account == NULL)
@@ -1449,14 +1454,15 @@ SIPVoIPLink::requestKeyframe(const std::string &callID)
 void
 SIPVoIPLink::carryingDTMFdigits(const std::string& id, char code)
 {
-    std::string accountID(Manager::instance().getAccountFromCall(id));
+    SIPCall *call = getSipCall(id);
+    if (!call)
+        return;
+
+    const std::string accountID(call->getAccountId());
     SIPAccount *account = Manager::instance().getSipAccount(accountID);
     if (!account)
         return;
 
-    SIPCall *call = getSipCall(id);
-    if (!call)
-        return;
     dtmfSend(*call, code, account->getDtmfType());
 }
 
@@ -1464,8 +1470,8 @@ SIPVoIPLink::carryingDTMFdigits(const std::string& id, char code)
 bool
 SIPVoIPLink::SIPStartCall(SIPCall *call)
 {
-    std::string id(Manager::instance().getAccountFromCall(call->getCallId()));
-    SIPAccount *account = Manager::instance().getSipAccount(id);
+    std::string account_id(call->getAccountId());
+    SIPAccount *account = Manager::instance().getSipAccount(account_id);
 
     if (account == NULL) {
         ERROR("Account is NULL in SIPStartCall");
@@ -1614,7 +1620,7 @@ void invite_session_state_changed_cb(pjsip_inv_session *inv, pjsip_event *ev)
         // After we sent or received a ACK - The connection is established
         link->SIPCallAnswered(call, ev->body.tsx_state.src.rdata);
     } else if (inv->state == PJSIP_INV_STATE_DISCONNECTED) {
-        std::string accId(Manager::instance().getAccountFromCall(call->getCallId()));
+        std::string accId(call->getAccountId());
 
         switch (inv->cause) {
                 // The call terminates normally - BYE / CANCEL
@@ -1651,7 +1657,7 @@ void sdp_request_offer_cb(pjsip_inv_session *inv, const pjmedia_sdp_session *off
     if (!call)
         return;
 
-    std::string accId(Manager::instance().getAccountFromCall(call->getCallId()));
+    std::string accId(call->getAccountId());
     SIPAccount *account = Manager::instance().getSipAccount(accId);
     if (!account)
         return;
@@ -1669,7 +1675,7 @@ void sdp_create_offer_cb(pjsip_inv_session *inv, pjmedia_sdp_session **p_offer)
     SIPCall *call = static_cast<SIPCall*>(inv->mod_data[mod_ua_.id]);
     if (!call)
         return;
-    std::string accountid(Manager::instance().getAccountFromCall(call->getCallId()));
+    std::string accountid(call->getAccountId());
 
     SIPAccount *account = Manager::instance().getSipAccount(accountid);
     if (!account)
@@ -1813,7 +1819,7 @@ void sdp_media_update_cb(pjsip_inv_session *inv, pj_status_t status)
         call->getAudioRtp().stop();
         call->getAudioRtp().setSrtpEnabled(false);
 
-        std::string accountID = Manager::instance().getAccountFromCall(call->getCallId());
+        const std::string accountID = call->getAccountId();
 
         SIPAccount *sipaccount = Manager::instance().getSipAccount(accountID);
         if (sipaccount and sipaccount->getSrtpFallback())
@@ -2141,7 +2147,8 @@ void onCallTransfered(pjsip_inv_session *inv, pjsip_rx_data *rdata)
     }
 
     try {
-        SIPVoIPLink::instance()->newOutgoingCall(Manager::instance().getNewCallID(), std::string(refer_to->hvalue.ptr, refer_to->hvalue.slen));
+        SIPVoIPLink::instance()->newOutgoingCall(Manager::instance().getNewCallID(),
+                std::string(refer_to->hvalue.ptr, refer_to->hvalue.slen), currentCall->getAccountId());
         Manager::instance().hangupCall(currentCall->getCallId());
     } catch (const VoipLinkException &e) {
         ERROR("%s", e.what());
@@ -2230,7 +2237,7 @@ namespace {
 
 void setCallMediaLocal(SIPCall* call, const std::string &localIP)
 {
-    std::string account_id(Manager::instance().getAccountFromCall(call->getCallId()));
+    std::string account_id(call->getAccountId());
     SIPAccount *account = Manager::instance().getSipAccount(account_id);
     if (!account)
         return;
diff --git a/daemon/src/sip/sipvoiplink.h b/daemon/src/sip/sipvoiplink.h
index bd6585f97a4129a201c8ef6636ced19fb44ad8c9..1664c182926933e49bf144ef29ba1357b12be891 100644
--- a/daemon/src/sip/sipvoiplink.h
+++ b/daemon/src/sip/sipvoiplink.h
@@ -128,7 +128,7 @@ class SIPVoIPLink : public VoIPLink {
          * @param toUrl  The Sip address of the recipient of the call
          * @return Call* The current call
          */
-        virtual Call* newOutgoingCall(const std::string& id, const std::string& toUrl);
+        virtual Call* newOutgoingCall(const std::string& id, const std::string& toUrl, const std::string &account_id);
 
         /**
          * Start a new SIP call using the IP2IP profile
@@ -142,7 +142,7 @@ class SIPVoIPLink : public VoIPLink {
          * @param The call id
          * @param The target sip uri
          */
-        Call *newRegisteredAccountCall(const std::string& id, const std::string& toUrl);
+        Call *newRegisteredAccountCall(const std::string& id, const std::string& toUrl, const std::string &account_id);
 
         /**
          * Answer the call
@@ -268,6 +268,8 @@ class SIPVoIPLink : public VoIPLink {
 #endif
         void clearSipCallMap();
         void addSipCall(SIPCall* call);
+        bool hasCalls();
+
         SIPCall* getSipCall(const std::string& id);
         SIPCall* tryGetSipCall(const std::string& id);
         void removeSipCall(const std::string &id);
diff --git a/daemon/src/voiplink.h b/daemon/src/voiplink.h
index 8f53edaec7f9ea8b9aa10b8168cb4ac0ca202fcb..4ec28a3c0cdd2b3f404052b6c4d8f8a1d77c3777 100644
--- a/daemon/src/voiplink.h
+++ b/daemon/src/voiplink.h
@@ -80,7 +80,8 @@ class VoIPLink {
          * @return Call* The current call
          */
         virtual Call* newOutgoingCall(const std::string &id,
-                                      const std::string &toUrl) = 0;
+                                      const std::string &toUrl,
+                                      const std::string &account_id) = 0;
 
         /**
          * Answer the call
@@ -149,6 +150,8 @@ class VoIPLink {
         virtual std::string getCurrentVideoCodecName(Call *call) const = 0;
         virtual std::string getCurrentAudioCodecNames(Call *call) const = 0;
 
+        virtual bool hasCalls() = 0;
+
         /**
          * Send a message to a call identified by its callid
          *