diff --git a/src/jamidht/conversationrepository.cpp b/src/jamidht/conversationrepository.cpp
index 7c3c02b6e255f657e1f91c7cd3c8f610e3f99930..eaca9417c983121fa59a9e12eaa0302438f3e378 100644
--- a/src/jamidht/conversationrepository.cpp
+++ b/src/jamidht/conversationrepository.cpp
@@ -855,7 +855,7 @@ ConversationRepository::Impl::checkVote(const std::string& userDevice,
     std::string votedFile = "";
     for (const auto& changedFile : changedFiles) {
         // NOTE: libgit2 return a diff with /, not DIR_SEPARATOR_DIR
-        if (changedFile == std::string("devices") + "/" + userDevice + ".crt") {
+        if (changedFile == fmt::format("devices/{}.crt", userDevice)) {
             deviceFile = changedFile;
         } else if (changedFile.find("votes") == 0) {
             votedFile = changedFile;
@@ -931,13 +931,13 @@ ConversationRepository::Impl::checkVote(const std::string& userDevice,
 
     // Check that peer voted is only other device or other member
     if (type == "members") {
-        // Voted uri = not self
         if (votedUri == userUri) {
             JAMI_ERR("Detected vote for self: %s", votedUri.c_str());
             return false;
         }
-        // file in members or admin
-        if (!memberCertificate(votedUri, treeOld)) {
+        // file in members or admin or invited
+        auto invitedFile = fmt::format("invited/{}", votedUri);
+        if (!memberCertificate(votedUri, treeOld) && !fileAtTree(invitedFile, treeOld)) {
             JAMI_ERR("No member file found for vote: %s", votedUri.c_str());
             return false;
         }
@@ -948,7 +948,7 @@ ConversationRepository::Impl::checkVote(const std::string& userDevice,
             return false;
         }
         // File in devices
-        deviceFile = std::string("devices") + "/" + votedUri + ".crt";
+        deviceFile = fmt::format("devices/{}.crt", votedUri);
         if (!fileAtTree(deviceFile, treeOld)) {
             JAMI_ERR("No device file found for vote: %s", votedUri.c_str());
             return false;
@@ -1126,10 +1126,11 @@ ConversationRepository::Impl::checkValidRemove(const std::string& userDevice,
 
     auto changedFiles = ConversationRepository::changedFiles(diffStats(commitId, parentId));
     // NOTE: libgit2 return a diff with /, not DIR_SEPARATOR_DIR
-    std::string deviceFile = std::string("devices") + "/" + userDevice + ".crt";
-    std::string adminFile = std::string("admins") + "/" + uriMember + ".crt";
-    std::string memberFile = std::string("members") + "/" + uriMember + ".crt";
-    std::string crlFile = std::string("CRLs") + "/" + uriMember;
+    std::string deviceFile = fmt::format("devices/{}.crt", userDevice);
+    std::string adminFile = fmt::format("admins/{}.crt", uriMember);
+    std::string memberFile = fmt::format("members/{}.crt", uriMember);
+    std::string crlFile = fmt::format("CRLs/{}", uriMember);
+    std::string invitedFile = fmt::format("invited/{}", uriMember);
     std::vector<std::string> voters;
     std::vector<std::string> devicesRemoved;
     std::vector<std::string> bannedFiles;
@@ -1140,8 +1141,9 @@ ConversationRepository::Impl::checkValidRemove(const std::string& userDevice,
     const std::regex regex_banned("banned.(members|devices).(\\w+)\\.crt");
     std::smatch base_match;
     for (const auto& f : changedFiles) {
-        if (f == deviceFile || f == adminFile || f == memberFile || f == crlFile) {
+        if (f == deviceFile || f == adminFile || f == memberFile || f == crlFile || f == invitedFile) {
             // Ignore
+            continue;
         } else if (std::regex_match(f, base_match, regex_votes)) {
             if (base_match.size() != 4 or base_match[2] != uriMember) {
                 JAMI_ERR("Invalid vote file detected: %s", f.c_str());
@@ -1170,7 +1172,7 @@ ConversationRepository::Impl::checkValidRemove(const std::string& userDevice,
 
     // Check that removed devices are for removed member (or directly uriMember)
     for (const auto& deviceUri : devicesRemoved) {
-        deviceFile = std::string("devices") + "/" + deviceUri + ".crt";
+        deviceFile = fmt::format("devices/{}.crt", deviceUri);
         if (!fileAtTree(deviceFile, treeOld)) {
             JAMI_ERR("device not found added (%s)", deviceFile.c_str());
             return false;
@@ -3072,18 +3074,17 @@ ConversationRepository::resolveVote(const std::string& uri, bool isDevice)
         return {};
     std::string repoPath = git_repository_workdir(repo.get());
     std::string adminsPath = repoPath + "admins";
+    std::string invitedPath = repoPath + "invited";
     std::string membersPath = repoPath + "members";
     std::string devicesPath = repoPath + "devices";
     std::string bannedPath = repoPath + "banned";
     auto isAdmin = fileutils::isFile(fileutils::getFullPath(adminsPath, uri + ".crt"));
-    std::string type = "members";
-    if (isDevice)
-        type = "devices";
-    else if (isAdmin)
-        type = "admins";
-
-    auto voteDirectory = repoPath + DIR_SEPARATOR_STR + "votes" + DIR_SEPARATOR_STR
-                         + (isDevice ? "devices" : "members") + DIR_SEPARATOR_STR + uri;
+    auto isInvited = fileutils::isFile(fileutils::getFullPath(invitedPath, uri));
+
+    auto voteDirectory = fmt::format("{}/votes/{}/{}",
+                                     repoPath,
+                                     (isDevice ? "devices" : "members"),
+                                     uri);
     for (const auto& certificate : fileutils::readDirectory(adminsPath)) {
         if (certificate.find(".crt") == std::string::npos) {
             JAMI_WARN("Incorrect file found: %s/%s", adminsPath.c_str(), certificate.c_str());
@@ -3102,14 +3103,16 @@ ConversationRepository::resolveVote(const std::string& uri, bool isDevice)
         fileutils::removeAll(voteDirectory, true);
 
         // Move from device or members file into banned
-        std::string originFilePath = membersPath;
+        std::string originFilePath = fmt::format("{}/{}.crt", membersPath, uri);
         if (isDevice)
-            originFilePath = devicesPath;
+            originFilePath = fmt::format("{}/{}.crt", devicesPath, uri);
         else if (isAdmin)
-            originFilePath = adminsPath;
-        originFilePath += DIR_SEPARATOR_STR + uri + ".crt";
+            originFilePath = fmt::format("{}/{}.crt", adminsPath, uri);
+        else if (isInvited)
+            originFilePath = fmt::format("{}/{}", invitedPath, uri);
+
         auto destPath = bannedPath + DIR_SEPARATOR_STR + (isDevice ? "devices" : "members");
-        auto destFilePath = destPath + DIR_SEPARATOR_STR + uri + ".crt";
+        auto destFilePath = fmt::format("{}/{}.crt", destPath, uri);
         if (!fileutils::recursive_mkdir(destPath, 0700)) {
             JAMI_ERR("Error when creating %s. Abort resolving vote", destPath.c_str());
             return {};
diff --git a/test/unitTest/conversation/conversationMembersEvent.cpp b/test/unitTest/conversation/conversationMembersEvent.cpp
index 194ea0bf538d7fa084ecd8d05383d2df30562ba3..a9abc80512b939f2ea854e03ea91ffc12f548269 100644
--- a/test/unitTest/conversation/conversationMembersEvent.cpp
+++ b/test/unitTest/conversation/conversationMembersEvent.cpp
@@ -38,6 +38,7 @@
 #include "conversation/conversationcommon.h"
 
 using namespace std::string_literals;
+using namespace std::literals::chrono_literals;
 using namespace DRing::Account;
 
 namespace jami {
@@ -61,6 +62,7 @@ public:
     void testAddOfflineMemberThenConnects();
     void testGetMembers();
     void testRemoveMember();
+    void testRemoveInvitedMember();
     void testMemberBanNoBadFile();
     void testMemberTryToRemoveAdmin();
     void testBannedMemberCannotSendMessage();
@@ -92,6 +94,7 @@ private:
     CPPUNIT_TEST(testAddOfflineMemberThenConnects);
     CPPUNIT_TEST(testGetMembers);
     CPPUNIT_TEST(testRemoveMember);
+    CPPUNIT_TEST(testRemoveInvitedMember);
     CPPUNIT_TEST(testMemberBanNoBadFile);
     CPPUNIT_TEST(testMemberTryToRemoveAdmin);
     CPPUNIT_TEST(testBannedMemberCannotSendMessage);
@@ -212,7 +215,7 @@ ConversationMembersEventTest::testRemoveConversationNoMember()
 
     // Start conversation
     auto convId = DRing::startConversation(aliceId);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return conversationReady; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return conversationReady; }));
 
     // Assert that repository exists
     auto repoPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + aliceAccount->getAccountID()
@@ -280,8 +283,7 @@ ConversationMembersEventTest::testRemoveConversationWithMember()
     DRing::registerSignalHandlers(confHandlers);
 
     DRing::addConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(
-        cv.wait_for(lk, std::chrono::seconds(30), [&]() { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated; }));
 
     // Assert that repository exists
     auto repoPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + aliceAccount->getAccountID()
@@ -291,23 +293,22 @@ ConversationMembersEventTest::testRemoveConversationWithMember()
     auto bobInvitedFile = repoPath + DIR_SEPARATOR_STR + "invited" + DIR_SEPARATOR_STR + bobUri;
     CPPUNIT_ASSERT(fileutils::isFile(bobInvitedFile));
 
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return requestReceived; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return requestReceived; }));
     memberMessageGenerated = false;
     DRing::acceptConversationRequest(bobId, convId);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return conversationReady; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return conversationReady; }));
     auto clonedPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + bobAccount->getAccountID()
                       + DIR_SEPARATOR_STR + "conversations" + DIR_SEPARATOR_STR + convId;
     CPPUNIT_ASSERT(fileutils::isDirectory(clonedPath));
     bobInvitedFile = clonedPath + DIR_SEPARATOR_STR + "invited" + DIR_SEPARATOR_STR + bobUri;
     CPPUNIT_ASSERT(!fileutils::isFile(bobInvitedFile));
     // Remove conversation from alice once member confirmed
-    CPPUNIT_ASSERT(
-        cv.wait_for(lk, std::chrono::seconds(30), [&]() { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated; }));
 
     bobSeeAliceRemoved = false;
     DRing::removeConversation(aliceId, convId);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return bobSeeAliceRemoved; }));
-    std::this_thread::sleep_for(std::chrono::seconds(3));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return bobSeeAliceRemoved; }));
+    std::this_thread::sleep_for(3s);
     CPPUNIT_ASSERT(!fileutils::isDirectory(repoPath));
 }
 
@@ -349,8 +350,7 @@ ConversationMembersEventTest::testAddMember()
         }));
     DRing::registerSignalHandlers(confHandlers);
     DRing::addConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(
-        cv.wait_for(lk, std::chrono::seconds(30), [&]() { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated; }));
     // Assert that repository exists
     auto repoPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + aliceAccount->getAccountID()
                     + DIR_SEPARATOR_STR + "conversations" + DIR_SEPARATOR_STR + convId;
@@ -358,9 +358,9 @@ ConversationMembersEventTest::testAddMember()
     // Check created files
     auto bobInvited = repoPath + DIR_SEPARATOR_STR + "invited" + DIR_SEPARATOR_STR + bobUri;
     CPPUNIT_ASSERT(fileutils::isFile(bobInvited));
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return requestReceived; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return requestReceived; }));
     DRing::acceptConversationRequest(bobId, convId);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return conversationReady; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return conversationReady; }));
     auto clonedPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + bobAccount->getAccountID()
                       + DIR_SEPARATOR_STR + "conversations" + DIR_SEPARATOR_STR + convId;
     CPPUNIT_ASSERT(fileutils::isDirectory(clonedPath));
@@ -414,10 +414,10 @@ ConversationMembersEventTest::testMemberAddedNoBadFile()
     aliceAccount->sendTextMessage(bobUri,
                                   {{"application/invite+json",
                                     "{\"conversationId\":\"" + convId + "\"}"}});
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return requestReceived; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return requestReceived; }));
     errorDetected = false;
     DRing::acceptConversationRequest(bobId, convId);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return errorDetected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return errorDetected; }));
     DRing::unregisterSignalHandlers();
 }
 
@@ -454,10 +454,10 @@ ConversationMembersEventTest::testAddOfflineMemberThenConnects()
 
     DRing::addConversationMember(aliceId, convId, carlaUri);
     Manager::instance().sendRegister(carlaId, true);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(60), [&] { return requestReceived; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return requestReceived; }));
 
     DRing::acceptConversationRequest(carlaId, convId);
-    cv.wait_for(lk, std::chrono::seconds(30), [&]() { return conversationReady; });
+    cv.wait_for(lk, 30s, [&]() { return conversationReady; });
     auto clonedPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + carlaAccount->getAccountID()
                       + DIR_SEPARATOR_STR + "conversations" + DIR_SEPARATOR_STR + convId;
     CPPUNIT_ASSERT(fileutils::isDirectory(clonedPath));
@@ -508,7 +508,7 @@ ConversationMembersEventTest::testGetMembers()
 
     messageReceived = false;
     DRing::addConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(60), [&]() { return messageReceived; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&]() { return messageReceived; }));
 
     // Assert that repository exists
     auto repoPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + aliceAccount->getAccountID()
@@ -522,13 +522,13 @@ ConversationMembersEventTest::testGetMembers()
     CPPUNIT_ASSERT(members[1]["uri"] == bobUri);
     CPPUNIT_ASSERT(members[1]["role"] == "invited");
 
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return requestReceived; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return requestReceived; }));
     messageReceived = false;
     DRing::acceptConversationRequest(bobId, convId);
-    cv.wait_for(lk, std::chrono::seconds(30), [&]() { return conversationReady; });
+    cv.wait_for(lk, 30s, [&]() { return conversationReady; });
     members = DRing::getConversationMembers(bobId, convId);
     CPPUNIT_ASSERT(members.size() == 2);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(60), [&]() { return messageReceived; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&]() { return messageReceived; }));
     members = DRing::getConversationMembers(aliceId, convId);
     CPPUNIT_ASSERT(members.size() == 2);
     CPPUNIT_ASSERT(members[0]["uri"] == aliceAccount->getUsername());
@@ -582,19 +582,17 @@ ConversationMembersEventTest::testRemoveMember()
         }));
     DRing::registerSignalHandlers(confHandlers);
     DRing::addConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return requestReceived; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return requestReceived; }));
     memberMessageGenerated = false;
     DRing::acceptConversationRequest(bobId, convId);
-    CPPUNIT_ASSERT(
-        cv.wait_for(lk, std::chrono::seconds(30), [&]() { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated; }));
 
     // Now check that alice, has the only admin, can remove bob
     memberMessageGenerated = false;
     voteMessageGenerated = false;
     DRing::removeConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return memberMessageGenerated && voteMessageGenerated;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated && voteMessageGenerated; }));
     auto members = DRing::getConversationMembers(aliceId, convId);
     CPPUNIT_ASSERT(members.size() == 1);
     CPPUNIT_ASSERT(members[0]["uri"] == aliceAccount->getUsername());
@@ -602,6 +600,96 @@ ConversationMembersEventTest::testRemoveMember()
     DRing::unregisterSignalHandlers();
 }
 
+void
+ConversationMembersEventTest::testRemoveInvitedMember()
+{
+    auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
+    auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
+    auto carlaAccount = Manager::instance().getAccount<JamiAccount>(carlaId);
+    auto aliceUri = aliceAccount->getUsername();
+    auto bobUri = bobAccount->getUsername();
+    auto carlaUri = carlaAccount->getUsername();
+    auto convId = DRing::startConversation(aliceId);
+
+    std::mutex mtx;
+    std::unique_lock<std::mutex> lk {mtx};
+    std::condition_variable cv;
+    std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers;
+    bool conversationReady = false, requestReceived = false;
+    confHandlers.insert(
+        DRing::exportable_callback<DRing::ConversationSignal::ConversationRequestReceived>(
+            [&](const std::string& /*accountId*/,
+                const std::string& /* conversationId */,
+                std::map<std::string, std::string> /*metadatas*/) {
+                requestReceived = true;
+                cv.notify_one();
+            }));
+    bool carlaConnected = false;
+    confHandlers.insert(
+        DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
+            [&](const std::string&, const std::map<std::string, std::string>&) {
+                auto details = carlaAccount->getVolatileAccountDetails();
+                auto deviceAnnounced = details[DRing::Account::VolatileProperties::DEVICE_ANNOUNCED];
+                if (deviceAnnounced == "true") {
+                    carlaConnected = true;
+                    cv.notify_one();
+                }
+            }));
+    confHandlers.insert(DRing::exportable_callback<DRing::ConversationSignal::ConversationReady>(
+        [&](const std::string& accountId, const std::string& conversationId) {
+            if (accountId == bobId && conversationId == convId) {
+                conversationReady = true;
+                cv.notify_one();
+            }
+        }));
+    bool voteMessageGenerated = false, memberMessageGenerated = false, carlaMessageReceived;
+    confHandlers.insert(
+        DRing::exportable_callback<DRing::ConversationSignal::MessageReceived>(
+            [&](const std::string& accountId,
+                const std::string& conversationId,
+                std::map<std::string, std::string> message) {
+                if (accountId == aliceId && conversationId == convId && message["type"] == "vote")
+                    voteMessageGenerated = true;
+                else if (accountId == aliceId && conversationId == convId
+                           && message["type"] == "member")
+                    memberMessageGenerated = true;
+                else if (accountId == carlaId && message["type"] == "text/plain" && message["body"] == "hi")
+                    carlaMessageReceived = true;
+                cv.notify_one();
+            }));
+    DRing::registerSignalHandlers(confHandlers);
+
+    // Add carla
+    Manager::instance().sendRegister(carlaId, true);
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return carlaConnected; }));
+    DRing::addConversationMember(aliceId, convId, carlaUri);
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return requestReceived; }));
+    memberMessageGenerated = false;
+    DRing::acceptConversationRequest(carlaId, convId);
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated; }));
+
+    // Invite Alice
+    requestReceived = false;
+    DRing::addConversationMember(aliceId, convId, bobUri);
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return requestReceived; }));
+    auto members = DRing::getConversationMembers(aliceId, convId);
+    CPPUNIT_ASSERT(members.size() == 3);
+
+    // Now check that alice, has the only admin, can remove bob
+    memberMessageGenerated = false;
+    voteMessageGenerated = false;
+    DRing::removeConversationMember(aliceId, convId, bobUri);
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated && voteMessageGenerated; }));
+    members = DRing::getConversationMembers(aliceId, convId);
+    CPPUNIT_ASSERT(members.size() == 2);
+
+    // Check that Carla is still able to sync
+    DRing::sendMessage(aliceId, convId, "hi"s, "");
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return carlaMessageReceived; }));
+    DRing::unregisterSignalHandlers();
+}
+
 void
 ConversationMembersEventTest::testMemberBanNoBadFile()
 {
@@ -671,32 +759,28 @@ ConversationMembersEventTest::testMemberBanNoBadFile()
         }));
     DRing::registerSignalHandlers(confHandlers);
     Manager::instance().sendRegister(carlaId, true);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(60), [&] { return carlaConnected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return carlaConnected; }));
     DRing::addConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return requestReceived && memberMessageGenerated;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return requestReceived && memberMessageGenerated; }));
     memberMessageGenerated = false;
     DRing::acceptConversationRequest(bobId, convId);
-    CPPUNIT_ASSERT(
-        cv.wait_for(lk, std::chrono::seconds(30), [&]() { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated; }));
     requestReceived = false;
     DRing::addConversationMember(aliceId, convId, carlaUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return requestReceived && memberMessageGenerated;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return requestReceived && memberMessageGenerated; }));
     memberMessageGenerated = false;
     messageBobReceived = false;
     DRing::acceptConversationRequest(carlaId, convId);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return memberMessageGenerated && messageBobReceived;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated && messageBobReceived; }));
 
     memberMessageGenerated = false;
     voteMessageGenerated = false;
     addFile(aliceAccount, convId, "BADFILE");
     DRing::removeConversationMember(aliceId, convId, carlaUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return errorDetected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return errorDetected; }));
     DRing::unregisterSignalHandlers();
 }
 
@@ -738,13 +822,11 @@ ConversationMembersEventTest::testMemberTryToRemoveAdmin()
         }));
     DRing::registerSignalHandlers(confHandlers);
     DRing::addConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return requestReceived && memberMessageGenerated;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return requestReceived && memberMessageGenerated; }));
     memberMessageGenerated = false;
     DRing::acceptConversationRequest(bobId, convId);
-    CPPUNIT_ASSERT(
-        cv.wait_for(lk, std::chrono::seconds(30), [&]() { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated; }));
 
     // Now check that alice, has the only admin, can remove bob
     memberMessageGenerated = false;
@@ -800,28 +882,24 @@ ConversationMembersEventTest::testBannedMemberCannotSendMessage()
         }));
     DRing::registerSignalHandlers(confHandlers);
     DRing::addConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return requestReceived && memberMessageGenerated;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return requestReceived && memberMessageGenerated; }));
     memberMessageGenerated = false;
     DRing::acceptConversationRequest(bobId, convId);
-    CPPUNIT_ASSERT(
-        cv.wait_for(lk, std::chrono::seconds(30), [&]() { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated; }));
 
     memberMessageGenerated = false;
     voteMessageGenerated = false;
     DRing::removeConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return memberMessageGenerated && voteMessageGenerated;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated && voteMessageGenerated; }));
     auto members = DRing::getConversationMembers(aliceId, convId);
     CPPUNIT_ASSERT(members.size() == 1);
 
     // Now check that alice doesn't receive a message from Bob
     aliceMessageReceived = false;
     DRing::sendMessage(bobId, convId, "hi"s, "");
-    CPPUNIT_ASSERT(
-        !cv.wait_for(lk, std::chrono::seconds(30), [&]() { return aliceMessageReceived; }));
+    CPPUNIT_ASSERT(!cv.wait_for(lk, 30s, [&]() { return aliceMessageReceived; }));
     DRing::unregisterSignalHandlers();
 }
 
@@ -869,27 +947,23 @@ ConversationMembersEventTest::testAddBannedMember()
         }));
     DRing::registerSignalHandlers(confHandlers);
     DRing::addConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return requestReceived && memberMessageGenerated;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return requestReceived && memberMessageGenerated; }));
     memberMessageGenerated = false;
     DRing::acceptConversationRequest(bobId, convId);
-    CPPUNIT_ASSERT(
-        cv.wait_for(lk, std::chrono::seconds(30), [&]() { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated; }));
 
     // Now check that alice, has the only admin, can remove bob
     memberMessageGenerated = false;
     voteMessageGenerated = false;
     DRing::removeConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return memberMessageGenerated && voteMessageGenerated;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated && voteMessageGenerated; }));
 
     // Then check that bobUri cannot be re-added
     memberMessageGenerated = false;
     DRing::addConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(
-        !cv.wait_for(lk, std::chrono::seconds(30), [&]() { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(!cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated; }));
     DRing::unregisterSignalHandlers();
 }
 
@@ -960,37 +1034,33 @@ ConversationMembersEventTest::testMemberCannotBanOther()
         }));
     DRing::registerSignalHandlers(confHandlers);
     Manager::instance().sendRegister(carlaId, true);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(60), [&] { return carlaConnected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return carlaConnected; }));
     DRing::addConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return requestReceived && memberMessageGenerated;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return requestReceived && memberMessageGenerated; }));
     memberMessageGenerated = false;
     DRing::acceptConversationRequest(bobId, convId);
-    CPPUNIT_ASSERT(
-        cv.wait_for(lk, std::chrono::seconds(30), [&]() { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated; }));
     requestReceived = false;
     memberMessageGenerated = false;
     DRing::addConversationMember(aliceId, convId, carlaUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return requestReceived && memberMessageGenerated;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return requestReceived && memberMessageGenerated; }));
     memberMessageGenerated = false;
     messageBobReceived = false;
     DRing::acceptConversationRequest(carlaId, convId);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return memberMessageGenerated && messageBobReceived;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated && messageBobReceived; }));
 
     // Now Carla remove Bob as a member
     errorDetected = false;
     messageBobReceived = false;
     // remove from member & add into banned without voting for the ban
     simulateRemoval(carlaAccount, convId, bobUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return errorDetected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return errorDetected; }));
 
     DRing::sendMessage(aliceId, convId, "hi"s, "");
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return messageBobReceived; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return messageBobReceived; }));
 }
 
 void
@@ -1062,31 +1132,27 @@ ConversationMembersEventTest::testCheckAdminFakeAVoteIsDetected()
         }));
     DRing::registerSignalHandlers(confHandlers);
     Manager::instance().sendRegister(carlaId, true);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(60), [&] { return carlaConnected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return carlaConnected; }));
     DRing::addConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return requestReceived && memberMessageGenerated;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return requestReceived && memberMessageGenerated; }));
     memberMessageGenerated = false;
     DRing::acceptConversationRequest(bobId, convId);
-    CPPUNIT_ASSERT(
-        cv.wait_for(lk, std::chrono::seconds(30), [&]() { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated; }));
     requestReceived = false;
     DRing::addConversationMember(aliceId, convId, carlaUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return requestReceived && memberMessageGenerated;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return requestReceived && memberMessageGenerated; }));
     memberMessageGenerated = false;
     messageBobReceived = false;
     DRing::acceptConversationRequest(carlaId, convId);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return memberMessageGenerated && messageBobReceived;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return memberMessageGenerated && messageBobReceived; }));
 
     // Now Alice remove Carla without a vote. Bob will not receive the message
     errorDetected = false;
     simulateRemoval(aliceAccount, convId, carlaUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return errorDetected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return errorDetected; }));
 }
 
 void
@@ -1195,18 +1261,17 @@ ConversationMembersEventTest::testCommitUnauthorizedUser()
     auto convId = DRing::startConversation(aliceId);
 
     DRing::addConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return requestReceived; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return requestReceived; }));
 
     DRing::acceptConversationRequest(bobId, convId);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return conversationReady; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return conversationReady; }));
 
     // Assert that repository exists
     auto repoPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + bobAccount->getAccountID()
                     + DIR_SEPARATOR_STR + "conversations" + DIR_SEPARATOR_STR + convId;
     CPPUNIT_ASSERT(fileutils::isDirectory(repoPath));
     // Wait that alice sees Bob
-    CPPUNIT_ASSERT(
-        cv.wait_for(lk, std::chrono::seconds(30), [&]() { return messageAliceReceived == 2; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return messageAliceReceived == 2; }));
 
     // Add commit from invalid user
     Json::Value root;
@@ -1220,7 +1285,7 @@ ConversationMembersEventTest::testCommitUnauthorizedUser()
 
     errorDetected = false;
     DRing::sendMessage(bobId, convId, "hi"s, "");
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return errorDetected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return errorDetected; }));
     DRing::unregisterSignalHandlers();
 }
 
@@ -1277,7 +1342,7 @@ ConversationMembersEventTest::testMemberJoinsNoBadFile()
     DRing::registerSignalHandlers(confHandlers);
 
     aliceAccount->convModule()->addConversationMember(convId, carlaUri, false);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(5), [&] { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 5s, [&] { return memberMessageGenerated; }));
 
     // Cp conversations & convInfo
     auto repoPathAlice = fileutils::get_data_dir() + DIR_SEPARATOR_STR
@@ -1299,12 +1364,12 @@ ConversationMembersEventTest::testMemberJoinsNoBadFile()
     // Start Carla, should merge and all messages should be there
     carlaAccount->convModule()->loadConversations(); // Because of the copy
     Manager::instance().sendRegister(carlaId, true);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&] { return carlaConnected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return carlaConnected; }));
 
     errorDetected = false;
     DRing::sendMessage(carlaId, convId, "hi"s, "");
 
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(60), [&] { return errorDetected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return errorDetected; }));
     DRing::unregisterSignalHandlers();
 }
 
@@ -1361,7 +1426,7 @@ ConversationMembersEventTest::testMemberAddedNoCertificate()
     DRing::registerSignalHandlers(confHandlers);
 
     aliceAccount->convModule()->addConversationMember(convId, carlaUri, false);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(5), [&] { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 5s, [&] { return memberMessageGenerated; }));
 
     // Cp conversations & convInfo
     auto repoPathAlice = fileutils::get_data_dir() + DIR_SEPARATOR_STR
@@ -1393,12 +1458,12 @@ ConversationMembersEventTest::testMemberAddedNoCertificate()
     // Start Carla, should merge and all messages should be there
     carlaAccount->convModule()->loadConversations(); // Because of the copy
     Manager::instance().sendRegister(carlaId, true);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&] { return carlaConnected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return carlaConnected; }));
 
     DRing::sendMessage(carlaId, convId, "hi"s, "");
     errorDetected = false;
 
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(60), [&] { return errorDetected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return errorDetected; }));
     DRing::unregisterSignalHandlers();
 }
 
@@ -1455,7 +1520,7 @@ ConversationMembersEventTest::testMemberJoinsInviteRemoved()
     DRing::registerSignalHandlers(confHandlers);
 
     aliceAccount->convModule()->addConversationMember(convId, carlaUri, false);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(5), [&] { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 5s, [&] { return memberMessageGenerated; }));
 
     // Cp conversations & convInfo
     auto repoPathAlice = fileutils::get_data_dir() + DIR_SEPARATOR_STR
@@ -1492,12 +1557,12 @@ ConversationMembersEventTest::testMemberJoinsInviteRemoved()
     // Start Carla, should merge and all messages should be there
     carlaAccount->convModule()->loadConversations(); // Because of the copy
     Manager::instance().sendRegister(carlaId, true);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&] { return carlaConnected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return carlaConnected; }));
 
     DRing::sendMessage(carlaId, convId, "hi"s, "");
     errorDetected = false;
 
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(60), [&] { return errorDetected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return errorDetected; }));
     DRing::unregisterSignalHandlers();
 }
 
@@ -1547,11 +1612,10 @@ ConversationMembersEventTest::testFailAddMemberInOneToOne()
     DRing::registerSignalHandlers(confHandlers);
     aliceAccount->addContact(bobUri);
     aliceAccount->sendTrustRequest(bobUri, {});
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(5), [&]() { return !convId.empty(); }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 5s, [&]() { return !convId.empty(); }));
     memberMessageGenerated = false;
     DRing::addConversationMember(aliceId, convId, carlaUri);
-    CPPUNIT_ASSERT(
-        !cv.wait_for(lk, std::chrono::seconds(5), [&]() { return memberMessageGenerated; }));
+    CPPUNIT_ASSERT(!cv.wait_for(lk, 5s, [&]() { return memberMessageGenerated; }));
 }
 
 void
@@ -1613,18 +1677,15 @@ ConversationMembersEventTest::testOneToOneFetchWithNewMemberRefused()
     DRing::registerSignalHandlers(confHandlers);
     aliceAccount->addContact(bobUri);
     aliceAccount->sendTrustRequest(bobUri, {});
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return !convId.empty() && requestReceived;
-    }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return !convId.empty() && requestReceived; }));
     CPPUNIT_ASSERT(bobAccount->acceptTrustRequest(aliceUri));
     memberMessageGenerated = false;
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() {
-        return conversationReady && memberMessageGenerated;
-    }));
+    CPPUNIT_ASSERT(
+        cv.wait_for(lk, 30s, [&]() { return conversationReady && memberMessageGenerated; }));
 
     errorDetected = false;
     generateFakeInvite(aliceAccount, convId, carlaUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return errorDetected; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return errorDetected; }));
 }
 
 void
@@ -1668,7 +1729,7 @@ ConversationMembersEventTest::testConversationMemberEvent()
             }));
     DRing::registerSignalHandlers(confHandlers);
     DRing::addConversationMember(aliceId, convId, bobUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return memberAddGenerated; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return memberAddGenerated; }));
     // Assert that repository exists
     auto repoPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + aliceAccount->getAccountID()
                     + DIR_SEPARATOR_STR + "conversations" + DIR_SEPARATOR_STR + convId;
@@ -1676,9 +1737,9 @@ ConversationMembersEventTest::testConversationMemberEvent()
     // Check created files
     auto bobInvited = repoPath + DIR_SEPARATOR_STR + "invited" + DIR_SEPARATOR_STR + bobUri;
     CPPUNIT_ASSERT(fileutils::isFile(bobInvited));
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return requestReceived; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return requestReceived; }));
     DRing::acceptConversationRequest(bobId, convId);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return conversationReady; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return conversationReady; }));
     auto clonedPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + bobAccount->getAccountID()
                       + DIR_SEPARATOR_STR + "conversations" + DIR_SEPARATOR_STR + convId;
     CPPUNIT_ASSERT(fileutils::isDirectory(clonedPath));
@@ -1724,7 +1785,7 @@ ConversationMembersEventTest::testGetConversationsMembersWhileSyncing()
     DRing::registerSignalHandlers(confHandlers);
     aliceAccount->addContact(bobUri);
     aliceAccount->sendTrustRequest(bobUri, {});
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return requestReceived; }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return requestReceived; }));
 
     Manager::instance().sendRegister(aliceId, false); // This avoid to sync immediately
     CPPUNIT_ASSERT(bobAccount->acceptTrustRequest(aliceUri));
@@ -1758,7 +1819,7 @@ ConversationMembersEventTest::testGetConversationMembersWithSelfOneOne()
         }));
     DRing::registerSignalHandlers(confHandlers);
     aliceAccount->addContact(aliceUri);
-    CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(5), [&]() { return !convId.empty(); }));
+    CPPUNIT_ASSERT(cv.wait_for(lk, 5s, [&]() { return !convId.empty(); }));
 
     auto members = DRing::getConversationMembers(aliceId, convId);
     CPPUNIT_ASSERT(members.size() == 1);