diff --git a/daemon/src/iax/iaxvoiplink.cpp b/daemon/src/iax/iaxvoiplink.cpp
index 4cb44a96612c5230e0f90b4551775ace22f02200..0e6e6376338113c88c357b9afece434017ee5b97 100644
--- a/daemon/src/iax/iaxvoiplink.cpp
+++ b/daemon/src/iax/iaxvoiplink.cpp
@@ -41,7 +41,7 @@
 #include "array_size.h"
 
 #include <cmath>
-#include <dlfcn.h>
+#include <algorithm>
 
 AccountMap IAXVoIPLink::iaxAccountMap_;
 IAXCallMap IAXVoIPLink::iaxCallMap_;
@@ -716,3 +716,10 @@ void IAXVoIPLink::iaxHandlePrecallEvent(iax_event* event)
             break;
     }
 }
+
+void
+IAXVoIPLink::unloadAccountMap()
+{
+    std::for_each(iaxAccountMap_.begin(), iaxAccountMap_.end(), unloadAccount);
+    iaxAccountMap_.clear();
+}
diff --git a/daemon/src/iax/iaxvoiplink.h b/daemon/src/iax/iaxvoiplink.h
index 325c2459e4026753dd94ab7b265be6d7082fea9f..b230cd8e19f99bc61709c3fd239d9be71e8b89b9 100644
--- a/daemon/src/iax/iaxvoiplink.h
+++ b/daemon/src/iax/iaxvoiplink.h
@@ -72,10 +72,15 @@ class IAXVoIPLink : public VoIPLink {
         virtual bool getEvent();
 
         /**
-         * Return the internal account map for this VOIP link
+         * Return the internal account map for all VOIP links
          */
         static AccountMap &getAccounts() { return iaxAccountMap_; }
 
+        /**
+         * Empty the account map for all VOIP links
+         */
+        static void unloadAccountMap();
+
         /**
          * Init the voip link
          */
diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp
index ddd7943346de9d89e3fc74c3c2ca537cd0338d2d..f80738ac02fc60fa43ba057c50d855c3a0aa09e2 100644
--- a/daemon/src/managerimpl.cpp
+++ b/daemon/src/managerimpl.cpp
@@ -163,9 +163,9 @@ void ManagerImpl::finish()
     unregisterAllAccounts();
 
     SIPVoIPLink::destroy();
-    // Unload account map AFTER destroying
-    // the SIPVoIPLink, the link still needs the accounts for pjsip cleanup
-    unloadAccountMap();
+#if HAVE_IAX
+    IAXVoIPLink::unloadAccountMap();
+#endif
 
     {
         ost::MutexLock lock(audioLayerMutex_);
@@ -2582,15 +2582,6 @@ namespace {
         item.second->unregisterVoIPLink();
     }
 
-    void unloadAccount(std::pair<const std::string, Account*> &item)
-    {
-        // avoid deleting IP2IP account twice
-        if (not item.first.empty()) {
-            delete item.second;
-            item.second = 0;
-        }
-    }
-
     SIPAccount *createIP2IPAccount()
     {
         SIPAccount *ip2ip = new SIPAccount(SIPAccount::IP2IP_PROFILE);
@@ -2681,17 +2672,6 @@ void ManagerImpl::unregisterAllAccounts()
 #endif
 }
 
-void ManagerImpl::unloadAccountMap()
-{
-    std::for_each(SIPVoIPLink::instance()->getAccounts().begin(), SIPVoIPLink::instance()->getAccounts().end(), unloadAccount);
-    SIPVoIPLink::instance()->getAccounts().clear();
-
-#if HAVE_IAX
-    std::for_each(IAXVoIPLink::getAccounts().begin(), IAXVoIPLink::getAccounts().end(), unloadAccount);
-    IAXVoIPLink::getAccounts().clear();
-#endif
-}
-
 bool ManagerImpl::accountExists(const std::string &accountID)
 {
     bool ret = false;
diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h
index 457c544f66a1b81a43848eb8a43e2b91163194d9..a46d53b0226190de8be2a6ecd243943a670fb227 100644
--- a/daemon/src/managerimpl.h
+++ b/daemon/src/managerimpl.h
@@ -994,11 +994,6 @@ class ManagerImpl {
          */
         void loadDefaultAccountMap();
 
-        /**
-         * Unload the account (delete them)
-         */
-        void unloadAccountMap();
-
         /**
          * Instance of the MainBuffer for the whole application
          *
diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp
index b9028fb11aa49e77f36cd0edaeae292a6c37c629..f60f4435e5264d6bf0ec36791504004fa4755964 100644
--- a/daemon/src/sip/sipvoiplink.cpp
+++ b/daemon/src/sip/sipvoiplink.cpp
@@ -74,6 +74,7 @@
 #include <istream>
 // #include <fstream>
 #include <utility> // for std::pair
+#include <algorithm>
 
 #include <map>
 
@@ -517,6 +518,9 @@ SIPVoIPLink::~SIPVoIPLink()
 
     pj_shutdown();
     clearSipCallMap();
+
+    std::for_each(sipAccountMap_.begin(), sipAccountMap_.end(), unloadAccount);
+    sipAccountMap_.clear();
 }
 
 SIPVoIPLink* SIPVoIPLink::instance()
diff --git a/daemon/src/voiplink.cpp b/daemon/src/voiplink.cpp
index cd95b30612e8ccaaf674bdb4ac6d03e6d5993033..8225400b42a565ff166ae198e3c76a650fd19f66 100644
--- a/daemon/src/voiplink.cpp
+++ b/daemon/src/voiplink.cpp
@@ -31,10 +31,17 @@
  *  as that of the covered work.
  */
 
-#include "call.h"
-#include "logger.h"
 #include "voiplink.h"
 
 VoIPLink::VoIPLink() : handlingEvents_(false) {}
 
 VoIPLink::~VoIPLink() {}
+
+void VoIPLink::unloadAccount(std::pair<const std::string, Account*> &item)
+{
+    // avoid deleting a nameless account twice
+    if (not item.first.empty()) {
+        delete item.second;
+        item.second = 0;
+    }
+}
diff --git a/daemon/src/voiplink.h b/daemon/src/voiplink.h
index cd1ea16029dba6fb24d8a466a610996254748b04..d8cef2fe328179fdb8a160f60732e0901681d4c8 100644
--- a/daemon/src/voiplink.h
+++ b/daemon/src/voiplink.h
@@ -35,10 +35,7 @@
 #define __VOIP_LINK_H__
 
 #include <stdexcept>
-#include <map>
-
-#include "cc_thread.h" // for ost::Mutex
-#include "account.h"
+#include <string>
 
 class Call;
 class Account;
@@ -166,7 +163,7 @@ class VoIPLink {
 #endif
 
     protected:
-
+        static void unloadAccount(std::pair<const std::string, Account*> &item);
         bool handlingEvents_;
 };