diff --git a/daemon/src/Makefile.am b/daemon/src/Makefile.am
index 3ffa2b7c0fa107ce0393114913d98102da765115..83e3652fb4bc8c2930a3201edc8c35bcb94f3f76 100644
--- a/daemon/src/Makefile.am
+++ b/daemon/src/Makefile.am
@@ -102,4 +102,5 @@ libsflphone_la_SOURCES = conference.cpp \
 		sfl_types.h \
 		array_size.h \
 		account_schema.h \
-		registration_states.h
+		registration_states.h \
+		map_utils.h
diff --git a/daemon/src/iax/iaxvoiplink.cpp b/daemon/src/iax/iaxvoiplink.cpp
index 5a7ae52acd813afb97ed27e4650695d9f4eac5ae..6ff8a6e2e7749a5f792bd3a5b1ddc5cdd0b38ae6 100644
--- a/daemon/src/iax/iaxvoiplink.cpp
+++ b/daemon/src/iax/iaxvoiplink.cpp
@@ -44,6 +44,7 @@
 #include "audio/samplerateconverter.h"
 #include "array_size.h"
 #include "scoped_lock.h"
+#include "map_utils.h"
 
 AccountMap IAXVoIPLink::iaxAccountMap_;
 IAXCallMap IAXVoIPLink::iaxCallMap_;
@@ -168,6 +169,16 @@ IAXVoIPLink::getEvent()
     return handlingEvents_;
 }
 
+std::vector<std::string>
+IAXVoIPLink::getCallIDs()
+{
+    std::vector<std::string> v;
+    sfl::ScopedLock m(iaxCallMapMutex_);
+
+    map_utils::vectorFromMapKeys(iaxCallMap_, v);
+    return v;
+}
+
 void
 IAXVoIPLink::sendAudioFromMic()
 {
diff --git a/daemon/src/iax/iaxvoiplink.h b/daemon/src/iax/iaxvoiplink.h
index f2a3ed02b4cca1caa569aebee4ddc2b85631a3aa..d6f9ba14d54565ef74c6e6a34dee08f535e89821 100644
--- a/daemon/src/iax/iaxvoiplink.h
+++ b/daemon/src/iax/iaxvoiplink.h
@@ -72,6 +72,11 @@ class IAXVoIPLink : public VoIPLink {
          */
         virtual bool getEvent();
 
+
+        /* Returns a list of all callIDs */
+        static std::vector<std::string>
+        getCallIDs();
+
         /**
          * Return the internal account map for all VOIP links
          */
diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp
index 0aa4e7ded4eea8fcf789bac6edc17b09c9d420b4..eb11f5659c6216daaa15674e3879a8471210db49 100644
--- a/daemon/src/managerimpl.cpp
+++ b/daemon/src/managerimpl.cpp
@@ -43,6 +43,7 @@
 #include "dbus/callmanager.h"
 #include "global.h"
 #include "fileutils.h"
+#include "map_utils.h"
 #include "sip/sipvoiplink.h"
 #include "sip/sipaccount.h"
 #include "sip/sipcall.h"
@@ -2796,20 +2797,14 @@ std::vector<std::map<std::string, std::string> > ManagerImpl::getHistory()
     return history_.getSerialized();
 }
 
-namespace {
-template <typename M, typename V>
-void vectorFromMapKeys(const M &m, V &v)
-{
-    for (typename M::const_iterator it = m.begin(); it != m.end(); ++it)
-        v.push_back(it->first);
-}
-}
-
-// FIXME: get call ids from voiplinks
-std::vector<std::string> ManagerImpl::getCallList() const
+std::vector<std::string>
+ManagerImpl::getCallList() const
 {
-    std::vector<std::string> v;
-    // vectorFromMapKeys(callAccountMap_, v);
+    std::vector<std::string> v(SIPVoIPLink::instance()->getCallIDs());
+#if HAVE_IAX
+    const std::vector<std::string> iaxCalls(IAXVoIPLink::getCallIDs());
+    v.insert(v.end(), iaxCalls.begin(), iaxCalls.end());
+#endif
     return v;
 }
 
@@ -2830,7 +2825,7 @@ std::map<std::string, std::string> ManagerImpl::getConferenceDetails(
 std::vector<std::string> ManagerImpl::getConferenceList() const
 {
     std::vector<std::string> v;
-    vectorFromMapKeys(conferenceMap_, v);
+    map_utils::vectorFromMapKeys(conferenceMap_, v);
     return v;
 }
 
diff --git a/daemon/src/map_utils.h b/daemon/src/map_utils.h
index 9cb8bde4f820777d2a3087bf34cd09d12aa5c101..eed64396c3de44ca59c90ad1a0a63df5823af0fb 100644
--- a/daemon/src/map_utils.h
+++ b/daemon/src/map_utils.h
@@ -32,6 +32,7 @@
 #define MAP_UTILS_H_
 
 #include <vector>
+#include <map>
 
 namespace map_utils {
 template <typename M, typename V>
diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp
index aa0f2496de42512fb3d142f23247759c8e985ffe..b2da24f37421eb10c964f40a4d4666912723cd92 100644
--- a/daemon/src/sip/sipvoiplink.cpp
+++ b/daemon/src/sip/sipvoiplink.cpp
@@ -40,6 +40,7 @@
 #include "sipvoiplink.h"
 #include "array_size.h"
 #include "manager.h"
+#include "map_utils.h"
 #include "logger.h"
 #include "scoped_lock.h"
 
@@ -1150,6 +1151,17 @@ SIPVoIPLink::clearSipCallMap()
     sipCallMap_.clear();
 }
 
+
+std::vector<std::string>
+SIPVoIPLink::getCallIDs()
+{
+    std::vector<std::string> v;
+    sfl::ScopedLock m(sipCallMapMutex_);
+
+    map_utils::vectorFromMapKeys(sipCallMap_, v);
+    return v;
+}
+
 void SIPVoIPLink::addSipCall(SIPCall* call)
 {
     if (!call)
diff --git a/daemon/src/sip/sipvoiplink.h b/daemon/src/sip/sipvoiplink.h
index 0dbd058d76e68223ffdb0ffe5769fd4974371bec..b37c05f4c3deed1e6410398e34409c3f9366fe62 100644
--- a/daemon/src/sip/sipvoiplink.h
+++ b/daemon/src/sip/sipvoiplink.h
@@ -96,6 +96,10 @@ class SIPVoIPLink : public VoIPLink {
          */
         virtual bool getEvent();
 
+        /* Returns a list of all callIDs */
+        std::vector<std::string>
+        getCallIDs();
+
         /**
          * Return the internal account map for this VOIP link
          */