diff --git a/test/unitTest/call/call.cpp b/test/unitTest/call/call.cpp
index 23db702083fa496413ce3ba9490ebcd59433aced..5b5a54b81ed5ec86a2ba6987f8376331976f4adf 100644
--- a/test/unitTest/call/call.cpp
+++ b/test/unitTest/call/call.cpp
@@ -31,6 +31,8 @@
 #include "dring.h"
 #include "account_const.h"
 
+#include "common.h"
+
 using namespace DRing::Account;
 
 namespace jami {
@@ -97,29 +99,8 @@ CallTest::setUp()
     JAMI_INFO("Initialize account...");
     auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
     auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
-    std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    std::mutex mtx;
-    std::unique_lock<std::mutex> lk {mtx};
-    std::condition_variable cv;
-    std::atomic_bool accountsReady {false};
-    confHandlers.insert(
-        DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
-            [&](const std::string&, const std::map<std::string, std::string>&) {
-                bool ready = false;
-                auto details = aliceAccount->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready = (daemonStatus == "REGISTERED");
-                details = bobAccount->getVolatileAccountDetails();
-                daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready &= (daemonStatus == "REGISTERED");
-                if (ready) {
-                    accountsReady = true;
-                    cv.notify_one();
-                }
-            }));
-    DRing::registerSignalHandlers(confHandlers);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&] { return accountsReady.load(); }));
-    DRing::unregisterSignalHandlers();
+
+    wait_for_announcement_of({aliceId, bobId});
 }
 
 void
@@ -161,10 +142,6 @@ CallTest::tearDown()
 void
 CallTest::testCall()
 {
-    // TODO remove. This sleeps is because it take some time for the DHT to be connected
-    // and account announced
-    JAMI_INFO("Waiting....");
-    std::this_thread::sleep_for(std::chrono::seconds(10));
     auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
     auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
     auto bobUri = bobAccount->getUsername();
@@ -206,10 +183,6 @@ CallTest::testCall()
 void
 CallTest::testCachedCall()
 {
-    std::this_thread::sleep_for(std::chrono::seconds(5));
-    // TODO remove. This sleeps is because it take some time for the DHT to be connected
-    // and account announced
-    JAMI_INFO("Waiting....");
     auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
     auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
     auto bobUri = bobAccount->getUsername();
@@ -264,10 +237,6 @@ CallTest::testCachedCall()
 void
 CallTest::testStopSearching()
 {
-    JAMI_INFO("Waiting....");
-    // TODO remove. This sleeps is because it take some time for the DHT to be connected
-    // and account announced
-    std::this_thread::sleep_for(std::chrono::seconds(5));
     auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
     auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
     auto bobUri = bobAccount->getUsername();
@@ -325,29 +294,7 @@ CallTest::testDeclineMultiDevice()
     details[ConfProperties::ARCHIVE_PATH] = bobArchive;
     bob2Id = Manager::instance().addAccount(details);
 
-    bool ready = false;
-    confHandlers.insert(
-        DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
-            [&](const std::string&, const std::map<std::string, std::string>&) {
-                auto bob2Account = Manager::instance().getAccount<JamiAccount>(bob2Id);
-                if (!bob2Account)
-                    return;
-                auto details = bob2Account->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                if (daemonStatus == "REGISTERED") {
-                    ready = true;
-                    cv.notify_one();
-                }
-            }));
-    DRing::registerSignalHandlers(confHandlers);
-
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(20), [&] { return ready; }));
-    DRing::unregisterSignalHandlers();
-
-    // TODO remove. This sleeps is because it take some time for the DHT to be connected
-    // and account announced
-    JAMI_INFO("Waiting....");
-    std::this_thread::sleep_for(std::chrono::seconds(5));
+    wait_for_announcement_of(bob2Id);
 
     std::atomic<int> callReceived {0};
     std::atomic<int> callStopped {0};
diff --git a/test/unitTest/common.h b/test/unitTest/common.h
new file mode 100644
index 0000000000000000000000000000000000000000..e14552e28a0c5514917bb2ee9818ab9507a5cb1c
--- /dev/null
+++ b/test/unitTest/common.h
@@ -0,0 +1,79 @@
+/*
+ *  Copyright (C) 2021 Savoir-faire Linux Inc.
+ *
+ *  Author: Olivier Dion <olivier.dion>@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
+ */
+
+#pragma once
+
+static void
+wait_for_announcement_of(const std::vector<std::string> accountIDs,
+                         std::chrono::seconds timeout = std::chrono::seconds(30))
+{
+    std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
+    std::mutex mtx;
+    std::unique_lock<std::mutex> lk {mtx};
+    std::condition_variable cv;
+    std::vector<std::atomic_bool> accountsReady(accountIDs.size());
+
+    confHandlers.insert(
+        DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
+            [&](const std::string& accountID, const std::map<std::string, std::string>& details) {
+                for (size_t i = 0; i < accountIDs.size(); ++i) {
+                    if (accountIDs[i] != accountID) {
+                        continue;
+                    }
+
+                    try {
+                        if ("true"
+                            != details.at(DRing::Account::VolatileProperties::DEVICE_ANNOUNCED)) {
+                            continue;
+                        }
+                    } catch (const std::out_of_range&) {
+                        continue;
+                    }
+
+                    accountsReady[i] = true;
+                    cv.notify_one();
+                }
+            }));
+
+    JAMI_DBG("Waiting for %zu account to be announced...", accountIDs.size());
+
+    DRing::registerSignalHandlers(confHandlers);
+
+    CPPUNIT_ASSERT(cv.wait_for(lk, timeout, [&] {
+        for (const auto& rdy : accountsReady) {
+            if (not rdy) {
+                return false;
+            }
+        }
+
+        return true;
+    }));
+
+    DRing::unregisterSignalHandlers();
+
+    JAMI_DBG("%zu account announced!", accountIDs.size());
+}
+
+static void
+wait_for_announcement_of(const std::string& accountID,
+                         std::chrono::seconds timeout = std::chrono::seconds(30))
+{
+        wait_for_announcement_of({accountID}, timeout);
+}
diff --git a/test/unitTest/connectionManager/connectionManager.cpp b/test/unitTest/connectionManager/connectionManager.cpp
index ecf87d224cb05cc6f9598875bd9d9db6afd32937..261dcb0e86e7b4019a9125b1337032d1fea97f4d 100644
--- a/test/unitTest/connectionManager/connectionManager.cpp
+++ b/test/unitTest/connectionManager/connectionManager.cpp
@@ -29,6 +29,7 @@
 #include "../../test_runner.h"
 #include "dring.h"
 #include "account_const.h"
+#include "common.h"
 
 using namespace DRing::Account;
 
@@ -123,26 +124,7 @@ ConnectionManagerTest::setUp()
     bobId = Manager::instance().addAccount(details);
 
     JAMI_INFO("Initialize account...");
-    auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
-    auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
-    std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    std::mutex mtx;
-    std::unique_lock<std::mutex> lk {mtx};
-    std::condition_variable cv;
-    confHandlers.insert(
-        DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
-            [&](const std::string&, const std::map<std::string, std::string>&) {
-                bool ready = false;
-                auto details = aliceAccount->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready = (daemonStatus == "REGISTERED");
-                details = bobAccount->getVolatileAccountDetails();
-                daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready &= (daemonStatus == "REGISTERED");
-            }));
-    DRing::registerSignalHandlers(confHandlers);
-    cv.wait_for(lk, std::chrono::seconds(30));
-    DRing::unregisterSignalHandlers();
+    wait_for_announcement_of({aliceId, bobId});
 }
 
 void
diff --git a/test/unitTest/conversation/conversation.cpp b/test/unitTest/conversation/conversation.cpp
index 5bc91e99c2cb0119fa1eac3b36fc00c56895e9e2..ef03c7721a9d89e99a37f7470e91dddf75289bd2 100644
--- a/test/unitTest/conversation/conversation.cpp
+++ b/test/unitTest/conversation/conversation.cpp
@@ -37,6 +37,7 @@
 #include "base64.h"
 #include "fileutils.h"
 #include "account_const.h"
+#include "common.h"
 
 using namespace std::string_literals;
 using namespace DRing::Account;
@@ -245,28 +246,8 @@ ConversationTest::setUp()
     carlaId = Manager::instance().addAccount(details);
 
     JAMI_INFO("Initialize account...");
-    auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
-    auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
-    auto carlaAccount = Manager::instance().getAccount<JamiAccount>(carlaId);
     Manager::instance().sendRegister(carlaId, false);
-    std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    std::mutex mtx;
-    std::unique_lock<std::mutex> lk {mtx};
-    std::condition_variable cv;
-    confHandlers.insert(
-        DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
-            [&](const std::string&, const std::map<std::string, std::string>&) {
-                bool ready = false;
-                auto details = aliceAccount->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready = (daemonStatus == "REGISTERED");
-                details = bobAccount->getVolatileAccountDetails();
-                daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready &= (daemonStatus == "REGISTERED");
-            }));
-    DRing::registerSignalHandlers(confHandlers);
-    cv.wait_for(lk, std::chrono::seconds(30));
-    DRing::unregisterSignalHandlers();
+    wait_for_announcement_of({aliceId, bobId});
 }
 
 void
diff --git a/test/unitTest/conversationRepository/conversationRepository.cpp b/test/unitTest/conversationRepository/conversationRepository.cpp
index 470449676668254588e6510cf4f2c0b377d25cee..87001200d29831f366f36ab345d0c402471be57c 100644
--- a/test/unitTest/conversationRepository/conversationRepository.cpp
+++ b/test/unitTest/conversationRepository/conversationRepository.cpp
@@ -35,6 +35,7 @@
 #include "base64.h"
 #include "fileutils.h"
 #include "account_const.h"
+#include "common.h"
 
 #include <git2.h>
 #include <filesystem>
@@ -129,26 +130,7 @@ ConversationRepositoryTest::setUp()
     bobId = Manager::instance().addAccount(details);
 
     JAMI_INFO("Initialize account...");
-    auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
-    auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
-    std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    std::mutex mtx;
-    std::unique_lock<std::mutex> lk {mtx};
-    std::condition_variable cv;
-    confHandlers.insert(
-        DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
-            [&](const std::string&, const std::map<std::string, std::string>&) {
-                bool ready = false;
-                auto details = aliceAccount->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready = (daemonStatus == "REGISTERED");
-                details = bobAccount->getVolatileAccountDetails();
-                daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready &= (daemonStatus == "REGISTERED");
-            }));
-    DRing::registerSignalHandlers(confHandlers);
-    cv.wait_for(lk, std::chrono::seconds(30));
-    DRing::unregisterSignalHandlers();
+    wait_for_announcement_of({aliceId, bobId});
 }
 
 void
diff --git a/test/unitTest/fileTransfer/fileTransfer.cpp b/test/unitTest/fileTransfer/fileTransfer.cpp
index 90d806fbb2fa0673687e6e7e5d6b1bea57ff966f..47379680df18fbf7e43a59fbbd0ba63f808f28ac 100644
--- a/test/unitTest/fileTransfer/fileTransfer.cpp
+++ b/test/unitTest/fileTransfer/fileTransfer.cpp
@@ -31,6 +31,7 @@
 #include "data_transfer.h"
 #include "dring/datatransfer_interface.h"
 #include "account_const.h"
+#include "common.h"
 
 using namespace DRing::Account;
 
@@ -109,26 +110,7 @@ FileTransferTest::setUp()
     bobId = Manager::instance().addAccount(details);
 
     JAMI_INFO("Initialize account...");
-    auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
-    auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
-    std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    std::mutex mtx;
-    std::unique_lock<std::mutex> lk {mtx};
-    std::condition_variable cv;
-    confHandlers.insert(
-        DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
-            [&](const std::string&, const std::map<std::string, std::string>&) {
-                bool ready = false;
-                auto details = aliceAccount->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready = (daemonStatus == "REGISTERED");
-                details = bobAccount->getVolatileAccountDetails();
-                daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready &= (daemonStatus == "REGISTERED");
-            }));
-    DRing::registerSignalHandlers(confHandlers);
-    cv.wait_for(lk, std::chrono::seconds(30));
-    DRing::unregisterSignalHandlers();
+    wait_for_announcement_of({aliceId, bobId});
 }
 
 void
@@ -160,10 +142,6 @@ FileTransferTest::tearDown()
 void
 FileTransferTest::testCachedFileTransfer()
 {
-    std::this_thread::sleep_for(std::chrono::seconds(5));
-    // TODO remove. This sleeps is because it take some time for the DHT to be connected
-    // and account announced
-    JAMI_INFO("Waiting....");
     auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
     auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
     auto bobUri = bobAccount->getUsername();
@@ -233,10 +211,6 @@ FileTransferTest::testCachedFileTransfer()
 void
 FileTransferTest::testMultipleFileTransfer()
 {
-    std::this_thread::sleep_for(std::chrono::seconds(5));
-    // TODO remove. This sleeps is because it take some time for the DHT to be connected
-    // and account announced
-    JAMI_INFO("Waiting....");
     auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
     auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
     auto bobUri = bobAccount->getUsername();
diff --git a/test/unitTest/ice/ice_sdp_parser.cpp b/test/unitTest/ice/ice_sdp_parser.cpp
index 0b24caf4e9673e318c699f6bb4a08be0d0e5184c..0d983be17d5794c94c2dc7a3050483baf7f98db1 100644
--- a/test/unitTest/ice/ice_sdp_parser.cpp
+++ b/test/unitTest/ice/ice_sdp_parser.cpp
@@ -34,6 +34,8 @@
 #include "media/audio/audio_rtp_session.h"
 #include "media/audio/audio_receive_thread.h"
 
+#include "common.h"
+
 using namespace DRing::Account;
 using namespace DRing::Call;
 
@@ -196,29 +198,7 @@ IceSdpParsingTest::setUp()
     auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobData_.accountId_);
     bobAccount->enableMultiStream(true);
 
-    std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    std::mutex mtx;
-    std::unique_lock<std::mutex> lk {mtx};
-    std::condition_variable cv;
-    std::atomic_bool accountsReady {false};
-    confHandlers.insert(
-        DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
-            [&](const std::string&, const std::map<std::string, std::string>&) {
-                bool ready = false;
-                auto details = aliceAccount->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready = (daemonStatus == "REGISTERED");
-                details = bobAccount->getVolatileAccountDetails();
-                daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready &= (daemonStatus == "REGISTERED");
-                if (ready) {
-                    accountsReady = true;
-                    cv.notify_one();
-                }
-            }));
-    DRing::registerSignalHandlers(confHandlers);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&] { return accountsReady.load(); }));
-    DRing::unregisterSignalHandlers();
+    wait_for_announcement_of({aliceAccount->getAccountID(), bobAccount->getAccountID()});
 }
 
 void
@@ -531,11 +511,6 @@ IceSdpParsingTest::configureTest(CallData& aliceData, CallData& bobData)
 void
 IceSdpParsingTest::audio_video_call()
 {
-    JAMI_INFO("Waiting for accounts setup ...");
-    // TODO remove. This sleeps is because it take some time for the DHT to be connected
-    // and account announced
-    std::this_thread::sleep_for(std::chrono::seconds(10));
-
     configureTest(aliceData_, bobData_);
 
     JAMI_INFO("=== Start a call and validate ===");
diff --git a/test/unitTest/media_control/media_control.cpp b/test/unitTest/media_control/media_control.cpp
index d801912202a75e20a3b00d7b74075a33899c2024..29dc40386e4c500156eed9987a7aae47d6b7dd3d 100644
--- a/test/unitTest/media_control/media_control.cpp
+++ b/test/unitTest/media_control/media_control.cpp
@@ -32,6 +32,8 @@
 #include <condition_variable>
 #include <string>
 
+#include "common.h"
+
 using namespace DRing::Account;
 using namespace DRing::Call;
 
@@ -142,31 +144,8 @@ MediaControlTest::setUp()
     bobAccountId_ = Manager::instance().addAccount(details);
 
     JAMI_INFO("Initialize account...");
-    auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceAccountId_);
-    auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobAccountId_);
-    std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    std::mutex mtx;
-    std::unique_lock<std::mutex> lk {mtx};
-    std::condition_variable cv;
-    std::atomic_bool accountsReady {false};
-    confHandlers.insert(
-        DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
-            [&](const std::string&, const std::map<std::string, std::string>&) {
-                bool ready = false;
-                auto details = aliceAccount->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready = (daemonStatus == "REGISTERED");
-                details = bobAccount->getVolatileAccountDetails();
-                daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready &= (daemonStatus == "REGISTERED");
-                if (ready) {
-                    accountsReady = true;
-                    cv.notify_one();
-                }
-            }));
-    DRing::registerSignalHandlers(confHandlers);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&] { return accountsReady.load(); }));
-    DRing::unregisterSignalHandlers();
+
+    wait_for_announcement_of({aliceAccountId_, bobAccountId_});
 }
 
 void
@@ -378,11 +357,6 @@ MediaControlTest::testWithScenario(CallData& aliceData,
 void
 MediaControlTest::testCallWithMediaList()
 {
-    JAMI_INFO("Waiting....");
-    // TODO remove. This sleeps is because it take some time for the DHT to be connected
-    // and account announced
-    std::this_thread::sleep_for(std::chrono::seconds(5));
-
     std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> signalHandlers;
 
     CallData aliceData;
diff --git a/test/unitTest/media_negotiation/media_negotiation.cpp b/test/unitTest/media_negotiation/media_negotiation.cpp
index ec05202d18fcf4513f96bd3101638de0e0036916..92d3452ec55d8306022682f3daf426ece7643f2e 100644
--- a/test/unitTest/media_negotiation/media_negotiation.cpp
+++ b/test/unitTest/media_negotiation/media_negotiation.cpp
@@ -34,6 +34,8 @@
 #include "sip/sipcall.h"
 #include "sip/sdp.h"
 
+#include "common.h"
+
 using namespace DRing::Account;
 using namespace DRing::Call;
 
@@ -184,36 +186,7 @@ MediaNegotiationTest::setUp()
     auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobData_.accountId_);
     bobAccount->enableMultiStream(true);
 
-    std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    std::mutex mtx;
-    std::unique_lock<std::mutex> lk {mtx};
-    std::condition_variable cv;
-    std::atomic_bool accountsReady {false};
-    confHandlers.insert(DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
-        [&cv,
-         &accountsReady,
-         aliceAccW = aliceAccount->weak(),
-         bobAccW = bobAccount->weak()](const std::string&,
-                                       const std::map<std::string, std::string>&) {
-            bool ready = false;
-            if (auto acc = aliceAccW.lock()) {
-                auto details = acc->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready = (daemonStatus == "REGISTERED");
-            }
-            if (auto acc = aliceAccW.lock()) {
-                auto details = acc->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready &= (daemonStatus == "REGISTERED");
-            }
-            if (ready) {
-                accountsReady = true;
-                cv.notify_one();
-            }
-        }));
-    DRing::registerSignalHandlers(confHandlers);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&] { return accountsReady.load(); }));
-    DRing::unregisterSignalHandlers();
+    wait_for_announcement_of({aliceAccount->getAccountID(), bobAccount->getAccountID()});
 }
 
 void
@@ -731,11 +704,6 @@ MediaNegotiationTest::audio_and_video_then_mute_video()
 {
     JAMI_INFO("=== Begin test %s ===", __FUNCTION__);
 
-    JAMI_INFO("Waiting for accounts setup ...");
-    // TODO remove. This sleeps is because it take some time for the DHT to be connected
-    // and account announced
-    std::this_thread::sleep_for(std::chrono::seconds(10));
-
     configureScenario(aliceData_, bobData_);
 
     MediaAttribute defaultAudio(MediaType::MEDIA_AUDIO);
@@ -779,11 +747,6 @@ MediaNegotiationTest::audio_only_then_add_video()
 {
     JAMI_INFO("=== Begin test %s ===", __FUNCTION__);
 
-    JAMI_INFO("Waiting for accounts setup ...");
-    // TODO remove. This sleeps is because it take some time for the DHT to be connected
-    // and account announced
-    std::this_thread::sleep_for(std::chrono::seconds(10));
-
     configureScenario(aliceData_, bobData_);
 
     MediaAttribute defaultAudio(MediaType::MEDIA_AUDIO);
@@ -822,11 +785,6 @@ MediaNegotiationTest::audio_and_video_then_mute_audio()
 {
     JAMI_INFO("=== Begin test %s ===", __FUNCTION__);
 
-    JAMI_INFO("Waiting for accounts setup ...");
-    // TODO remove. This sleeps is because it take some time for the DHT to be connected
-    // and account announced
-    std::this_thread::sleep_for(std::chrono::seconds(10));
-
     configureScenario(aliceData_, bobData_);
 
     MediaAttribute defaultAudio(MediaType::MEDIA_AUDIO);
diff --git a/test/unitTest/syncHistory/syncHistory.cpp b/test/unitTest/syncHistory/syncHistory.cpp
index 9a1c93c9d11d9f0be3acab55b1bd7f8749832af7..e31a4df8910bedbf8f1e964a491456e2ad0b1c9b 100644
--- a/test/unitTest/syncHistory/syncHistory.cpp
+++ b/test/unitTest/syncHistory/syncHistory.cpp
@@ -31,6 +31,7 @@
 #include "../../test_runner.h"
 #include "dring.h"
 #include "account_const.h"
+#include "common.h"
 
 using namespace DRing::Account;
 
@@ -106,28 +107,7 @@ SyncHistoryTest::setUp()
     bobId = Manager::instance().addAccount(details);
 
     JAMI_INFO("Initialize account...");
-    auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
-    auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
-    std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    std::mutex mtx;
-    std::unique_lock<std::mutex> lk {mtx};
-    std::condition_variable cv;
-    confHandlers.insert(
-        DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
-            [&](const std::string&, const std::map<std::string, std::string>&) {
-                bool ready = false;
-                auto details = aliceAccount->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready = (daemonStatus == "REGISTERED");
-                details = bobAccount->getVolatileAccountDetails();
-                daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                ready &= (daemonStatus == "REGISTERED");
-                if (ready)
-                    cv.notify_one();
-            }));
-    DRing::registerSignalHandlers(confHandlers);
-    cv.wait_for(lk, std::chrono::seconds(30));
-    DRing::unregisterSignalHandlers();
+    wait_for_announcement_of({aliceId, bobId});
     alice2Id = "";
 }
 
@@ -183,25 +163,12 @@ SyncHistoryTest::testCreateConversationThenSync()
     details[ConfProperties::ARCHIVE_PATH] = aliceArchive;
     alice2Id = Manager::instance().addAccount(details);
 
+    wait_for_announcement_of(alice2Id);
+
     std::mutex mtx;
     std::unique_lock<std::mutex> lk {mtx};
     std::condition_variable cv;
     std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    confHandlers.insert(
-        DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
-            [&](const std::string&, const std::map<std::string, std::string>&) {
-                auto alice2Account = Manager::instance().getAccount<JamiAccount>(alice2Id);
-                auto details = alice2Account->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                if (daemonStatus == "REGISTERED")
-                    cv.notify_one();
-            }));
-    DRing::registerSignalHandlers(confHandlers);
-
-    cv.wait_for(lk, std::chrono::seconds(30));
-    DRing::unregisterSignalHandlers();
-    confHandlers.clear();
-
     auto conversationReady = false;
     confHandlers.insert(DRing::exportable_callback<DRing::ConversationSignal::ConversationReady>(
         [&](const std::string& accountId, const std::string& conversationId) {
@@ -232,25 +199,12 @@ SyncHistoryTest::testCreateConversationWithOnlineDevice()
     details[ConfProperties::ARCHIVE_PIN] = "";
     details[ConfProperties::ARCHIVE_PATH] = aliceArchive;
     alice2Id = Manager::instance().addAccount(details);
+    wait_for_announcement_of(alice2Id);
 
     std::mutex mtx;
     std::unique_lock<std::mutex> lk {mtx};
     std::condition_variable cv;
     std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    confHandlers.insert(
-        DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
-            [&](const std::string&, const std::map<std::string, std::string>&) {
-                auto alice2Account = Manager::instance().getAccount<JamiAccount>(alice2Id);
-                auto details = alice2Account->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                if (daemonStatus == "REGISTERED")
-                    cv.notify_one();
-            }));
-    DRing::registerSignalHandlers(confHandlers);
-
-    cv.wait_for(lk, std::chrono::seconds(30));
-    DRing::unregisterSignalHandlers();
-    confHandlers.clear();
 
     // Start conversation now
     auto convId = aliceAccount->startConversation();
@@ -498,25 +452,12 @@ SyncHistoryTest::testRemoveConversationOnAllDevices()
     details[ConfProperties::ARCHIVE_PIN] = "";
     details[ConfProperties::ARCHIVE_PATH] = aliceArchive;
     alice2Id = Manager::instance().addAccount(details);
+    wait_for_announcement_of(alice2Id);
 
     std::mutex mtx;
     std::unique_lock<std::mutex> lk {mtx};
     std::condition_variable cv;
     std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
-    confHandlers.insert(
-        DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
-            [&](const std::string&, const std::map<std::string, std::string>&) {
-                auto alice2Account = Manager::instance().getAccount<JamiAccount>(alice2Id);
-                auto details = alice2Account->getVolatileAccountDetails();
-                auto daemonStatus = details[DRing::Account::ConfProperties::Registration::STATUS];
-                if (daemonStatus == "REGISTERED")
-                    cv.notify_one();
-            }));
-    DRing::registerSignalHandlers(confHandlers);
-
-    cv.wait_for(lk, std::chrono::seconds(30));
-    DRing::unregisterSignalHandlers();
-    confHandlers.clear();
 
     // Start conversation now
     auto convId = aliceAccount->startConversation();