diff --git a/src/Cache.cpp b/src/Cache.cpp
index d651b1820420ae93825ba8227bf546df96518203..4c24a7126f44548274674413aa476da58aa129ac 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -715,32 +715,29 @@ Cache::restoreOlmAccount()
 }
 
 void
-Cache::storeSecret(const std::string &name, const std::string &secret)
+Cache::storeSecret(const std::string name, const std::string secret)
 {
         auto settings = UserSettings::instance();
-        QKeychain::WritePasswordJob job(QCoreApplication::applicationName());
-        job.setAutoDelete(false);
-        job.setInsecureFallback(true);
-        job.setKey("matrix." +
-                   QString(QCryptographicHash::hash(settings->profile().toUtf8(),
-                                                    QCryptographicHash::Sha256)) +
-                   "." + name.c_str());
-        job.setTextData(QString::fromStdString(secret));
-        QEventLoop loop;
-        job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit);
-        job.start();
-        loop.exec();
-
-        if (job.error()) {
-                nhlog::db()->warn(
-                  "Storing secret '{}' failed: {}", name, job.errorString().toStdString());
-        } else {
-                emit secretChanged(name);
-        }
+        auto job      = new QKeychain::WritePasswordJob(QCoreApplication::applicationName());
+        job->setInsecureFallback(true);
+        job->setKey("matrix." +
+                    QString(QCryptographicHash::hash(settings->profile().toUtf8(),
+                                                     QCryptographicHash::Sha256)) +
+                    "." + name.c_str());
+        job->setTextData(QString::fromStdString(secret));
+        QObject::connect(job, &QKeychain::Job::finished, job, [name, this](QKeychain::Job *job) {
+                if (job->error()) {
+                        nhlog::db()->warn(
+                          "Storing secret '{}' failed: {}", name, job->errorString().toStdString());
+                } else {
+                        emit secretChanged(name);
+                }
+        });
+        job->start();
 }
 
 void
-Cache::deleteSecret(const std::string &name)
+Cache::deleteSecret(const std::string name)
 {
         auto settings = UserSettings::instance();
         QKeychain::DeletePasswordJob job(QCoreApplication::applicationName());
@@ -750,6 +747,8 @@ Cache::deleteSecret(const std::string &name)
                    QString(QCryptographicHash::hash(settings->profile().toUtf8(),
                                                     QCryptographicHash::Sha256)) +
                    "." + name.c_str());
+        // FIXME(Nico): Nested event loops are dangerous. Some other slots may resume in the mean
+        // time!
         QEventLoop loop;
         job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit);
         job.start();
@@ -759,7 +758,7 @@ Cache::deleteSecret(const std::string &name)
 }
 
 std::optional<std::string>
-Cache::secret(const std::string &name)
+Cache::secret(const std::string name)
 {
         auto settings = UserSettings::instance();
         QKeychain::ReadPasswordJob job(QCoreApplication::applicationName());
@@ -769,6 +768,8 @@ Cache::secret(const std::string &name)
                    QString(QCryptographicHash::hash(settings->profile().toUtf8(),
                                                     QCryptographicHash::Sha256)) +
                    "." + name.c_str());
+        // FIXME(Nico): Nested event loops are dangerous. Some other slots may resume in the mean
+        // time!
         QEventLoop loop;
         job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit);
         job.start();
diff --git a/src/Cache_p.h b/src/Cache_p.h
index c9d42202b9d7e5a996d215c6ee792c566efbe818..89c8892574e452c16ff8ed1ef432ba01d42f09bc 100644
--- a/src/Cache_p.h
+++ b/src/Cache_p.h
@@ -285,9 +285,9 @@ public:
         void saveOlmAccount(const std::string &pickled);
         std::string restoreOlmAccount();
 
-        void storeSecret(const std::string &name, const std::string &secret);
-        void deleteSecret(const std::string &name);
-        std::optional<std::string> secret(const std::string &name);
+        void storeSecret(const std::string name, const std::string secret);
+        void deleteSecret(const std::string name);
+        std::optional<std::string> secret(const std::string name);
 
         template<class T>
         static constexpr bool isStateEvent(const mtx::events::StateEvent<T> &)