diff --git a/src/jamidht/account_manager.cpp b/src/jamidht/account_manager.cpp
index 010ac1859f4c44c94c9b305d793868cd83253846..61e8e0278ab7034e8912c471bebe91f84c5ac122 100644
--- a/src/jamidht/account_manager.cpp
+++ b/src/jamidht/account_manager.cpp
@@ -26,6 +26,7 @@
 #include "libdevcrypto/Common.h"
 
 #include <opendht/thread_pool.h>
+#include <opendht/crypto.h>
 
 #include <exception>
 #include <future>
@@ -33,6 +34,19 @@
 
 namespace jami {
 
+AccountManager::CertRequest
+AccountManager::buildRequest(PrivateKey fDeviceKey)
+{
+    return dht::ThreadPool::computation().get<std::unique_ptr<dht::crypto::CertificateRequest>>([fDeviceKey]{
+        auto request = std::make_unique<dht::crypto::CertificateRequest>();
+        request->setName("Jami device");
+        auto deviceKey = fDeviceKey.get();
+        request->setUID(deviceKey->getPublicKey().getId().toString());
+        request->sign(*deviceKey);
+        return request;
+    });
+}
+
 dht::crypto::Identity
 AccountManager::loadIdentity(const std::string& crt_path, const std::string& key_path, const std::string& key_pwd) const
 {
diff --git a/src/jamidht/account_manager.h b/src/jamidht/account_manager.h
index 4aa1e1822d3fe6514cb2d68e13b18d472191586e..4ce18ade1c86c73925cf455a6c326a57034b5a8b 100644
--- a/src/jamidht/account_manager.h
+++ b/src/jamidht/account_manager.h
@@ -101,6 +101,9 @@ public:
     using AuthFailureCallback = std::function<void(AuthError error, const std::string& message)>;
     using DeviceSyncCallback = std::function<void(DeviceSync&& syncData)>;
     using CertRequest = std::future<std::unique_ptr<dht::crypto::CertificateRequest>>;
+    using PrivateKey = std::shared_future<std::shared_ptr<dht::crypto::PrivateKey>>;
+
+    CertRequest buildRequest(PrivateKey fDeviceKey);
 
     struct AccountCredentials {
         std::string scheme;
@@ -110,7 +113,7 @@ public:
     };
 
     virtual void initAuthentication(
-        CertRequest request,
+        PrivateKey request,
         std::string deviceName,
         std::unique_ptr<AccountCredentials> credentials,
         AuthSuccessCallback onSuccess,
diff --git a/src/jamidht/archive_account_manager.cpp b/src/jamidht/archive_account_manager.cpp
index c5f1202773e70920b156fadaf6132656e3c2cc17..7fb81a473165fcdc6110d6867611d048567a6383 100644
--- a/src/jamidht/archive_account_manager.cpp
+++ b/src/jamidht/archive_account_manager.cpp
@@ -36,7 +36,7 @@ const constexpr auto EXPORT_KEY_RENEWAL_TIME = std::chrono::minutes(20);
 
 void
 ArchiveAccountManager::initAuthentication(
-    CertRequest request,
+    PrivateKey key,
     std::string deviceName,
     std::unique_ptr<AccountCredentials> credentials,
     AuthSuccessCallback onSuccess,
@@ -44,7 +44,8 @@ ArchiveAccountManager::initAuthentication(
     OnChangeCallback onChange)
 {
     auto ctx = std::make_shared<AuthContext>();
-    ctx->request = std::move(request);
+    ctx->key = key;
+    ctx->request = buildRequest(key);
     ctx->deviceName = std::move(deviceName);
     ctx->credentials = dynamic_unique_cast<ArchiveAccountCredentials>(std::move(credentials));
     ctx->onSuccess = std::move(onSuccess);
@@ -324,6 +325,7 @@ ArchiveAccountManager::onArchiveLoaded(
     auto receiptSignature = a.id.first->sign({receipt.first.begin(), receipt.first.end()});
 
     auto info = std::make_unique<AccountInfo>();
+    info->identity.first = ctx.key.get();
     info->identity.second = deviceCertificate;
     info->accountId = a.id.second->getId().toString();
     info->deviceId = deviceCertificate->getPublicKey().getId().toString();
diff --git a/src/jamidht/archive_account_manager.h b/src/jamidht/archive_account_manager.h
index ef7778aa1c41621774f663843de8c49fa7b011bc..55b5ef063ca5e258ba5314da13f98ab4a8275995 100644
--- a/src/jamidht/archive_account_manager.h
+++ b/src/jamidht/archive_account_manager.h
@@ -43,7 +43,7 @@ public:
     };
 
     void initAuthentication(
-        CertRequest request,
+        PrivateKey request,
         std::string deviceName,
         std::unique_ptr<AccountCredentials> credentials,
         AuthSuccessCallback onSuccess,
@@ -71,6 +71,7 @@ public:
 private:
     struct DhtLoadContext;
     struct AuthContext {
+        PrivateKey key;
         CertRequest request;
         std::string deviceName;
         std::unique_ptr<ArchiveAccountCredentials> credentials;
diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp
index 080d979acbdeaaf4e55fe03a670a4d50c07cdd81..b92bceac4b023585b494543e800f19d6cbb8e416 100644
--- a/src/jamidht/jamiaccount.cpp
+++ b/src/jamidht/jamiaccount.cpp
@@ -1118,15 +1118,6 @@ JamiAccount::loadAccount(const std::string& archive_password, const std::string&
                 return std::make_shared<dht::crypto::PrivateKey>(dht::crypto::PrivateKey::generate());
             });
 
-            auto fReq = dht::ThreadPool::computation().get<std::unique_ptr<dht::crypto::CertificateRequest>>([fDeviceKey]{
-                auto request = std::make_unique<dht::crypto::CertificateRequest>();
-                request->setName("Jami device");
-                auto deviceKey = fDeviceKey.get();
-                request->setUID(deviceKey->getPublicKey().getId().toString());
-                request->sign(*deviceKey);
-                return request;
-            });
-
             std::unique_ptr<AccountManager::AccountCredentials> creds;
             if (managerUri_.empty()) {
                 auto acreds = std::make_unique<ArchiveAccountManager::ArchiveAccountCredentials>();
@@ -1164,7 +1155,7 @@ JamiAccount::loadAccount(const std::string& archive_password, const std::string&
             bool isManaged = !managerUri_.empty();
 
             accountManager_->initAuthentication(
-                std::move(fReq),
+                fDeviceKey,
                 ip_utils::getDeviceName(),
                 std::move(creds),
                 [this, fDeviceKey, migrating](const AccountInfo& info,
diff --git a/src/jamidht/server_account_manager.cpp b/src/jamidht/server_account_manager.cpp
index cc913fbc5246be68adca07345107b7d134939186..688db1677a093b22b7c9c69f29f22584bc059a19 100644
--- a/src/jamidht/server_account_manager.cpp
+++ b/src/jamidht/server_account_manager.cpp
@@ -58,7 +58,7 @@ ServerAccountManager::setAuthHeaderFields(Request& request) const {
 
 void
 ServerAccountManager::initAuthentication(
-    CertRequest csrRequest,
+    PrivateKey key,
     std::string deviceName,
     std::unique_ptr<AccountCredentials> credentials,
     AuthSuccessCallback onSuccess,
@@ -66,7 +66,8 @@ ServerAccountManager::initAuthentication(
     OnChangeCallback onChange)
 {
     auto ctx = std::make_shared<AuthContext>();
-    ctx->request = std::move(csrRequest);
+    ctx->key = key;
+    ctx->request = buildRequest(key);
     ctx->deviceName = std::move(deviceName);
     ctx->credentials = dynamic_unique_cast<ServerAccountCredentials>(std::move(credentials));
     ctx->onSuccess = std::move(onSuccess);
@@ -125,6 +126,7 @@ ServerAccountManager::initAuthentication(
                                 auto receiptSignature = base64::decode(json["receiptSignature"].asString());
 
                                 auto info = std::make_unique<AccountInfo>();
+                                info->identity.first = ctx->key.get();
                                 info->identity.second = cert;
                                 info->deviceId = cert->getPublicKey().getId().toString();
                                 info->accountId = accountCert->getId().toString();
diff --git a/src/jamidht/server_account_manager.h b/src/jamidht/server_account_manager.h
index f510cf4b1522208b45136031435d5fee8324d9fa..6b33cb41abf62f550d1040f2bc89cd3d7035a0df 100644
--- a/src/jamidht/server_account_manager.h
+++ b/src/jamidht/server_account_manager.h
@@ -39,7 +39,7 @@ public:
     };
 
     void initAuthentication(
-        CertRequest request,
+        PrivateKey request,
         std::string deviceName,
         std::unique_ptr<AccountCredentials> credentials,
         AuthSuccessCallback onSuccess,
@@ -59,6 +59,7 @@ public:
 
 private:
     struct AuthContext {
+        PrivateKey key;
         CertRequest request;
         std::string deviceName;
         std::unique_ptr<ServerAccountCredentials> credentials;