diff --git a/CMakeLists.txt b/CMakeLists.txt
index b513e297efe3314127ee328ea301900d64d52f2e..6f8c167cb1c4d42fbf28b218c9250cd8834e6b2b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -41,6 +41,7 @@ endif()
 find_package(Qt5Widgets REQUIRED)
 find_package(Qt5Network REQUIRED)
 find_package(Qt5LinguistTools REQUIRED)
+find_package(Qt5Concurrent REQUIRED)
 
 if (APPLE)
     find_package(Qt5MacExtras REQUIRED)
@@ -318,9 +319,9 @@ if (BUILD_TESTS)
 endif()
 
 if(APPVEYOR_BUILD)
-    set (NHEKO_LIBS matrix_events Qt5::Widgets Qt5::Network lmdb)
+    set (NHEKO_LIBS matrix_events Qt5::Widgets Qt5::Network Qt5::Concurrent lmdb)
 else()
-    set (NHEKO_LIBS matrix_events Qt5::Widgets Qt5::Network ${LMDB_LIBRARY})
+    set (NHEKO_LIBS matrix_events Qt5::Widgets Qt5::Network Qt5::Concurrent ${LMDB_LIBRARY})
 endif()
 
 set (NHEKO_DEPS ${OS_BUNDLE} ${SRC_FILES} ${UI_HEADERS} ${MOC_HEADERS} ${QRC} ${LANG_QRC} ${QM_SRC})
diff --git a/src/Cache.cc b/src/Cache.cc
index 3f7b141b6bf64525c2d00e799e2ba50a4d5626ea..010b4aa9024b53087d2490330cc74f7d3dd9d6d0 100644
--- a/src/Cache.cc
+++ b/src/Cache.cc
@@ -102,14 +102,21 @@ Cache::setState(const QString &nextBatchToken, const QMap<QString, RoomState> &s
         if (!isMounted_)
                 return;
 
-        auto txn = lmdb::txn::begin(env_);
+        try {
+                auto txn = lmdb::txn::begin(env_);
 
-        setNextBatchToken(txn, nextBatchToken);
+                setNextBatchToken(txn, nextBatchToken);
 
-        for (auto it = states.constBegin(); it != states.constEnd(); it++)
-                insertRoomState(txn, it.key(), it.value());
+                for (auto it = states.constBegin(); it != states.constEnd(); it++)
+                        insertRoomState(txn, it.key(), it.value());
 
-        txn.commit();
+                txn.commit();
+        } catch (const lmdb::error &e) {
+                qCritical() << "The cache couldn't be updated: " << e.what();
+
+                unmount();
+                deleteData();
+        }
 }
 
 void
diff --git a/src/ChatPage.cc b/src/ChatPage.cc
index 5df8dec2e9c6b1770a874e6b681c9080601225c0..65fef9de8de3acec86831edd9f10d0ba17424e92 100644
--- a/src/ChatPage.cc
+++ b/src/ChatPage.cc
@@ -18,6 +18,7 @@
 #include <QApplication>
 #include <QDebug>
 #include <QSettings>
+#include <QtConcurrent>
 
 #include "AvatarProvider.h"
 #include "ChatPage.h"
@@ -196,6 +197,11 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
                 this,
                 SLOT(initialSyncCompleted(const SyncResponse &)));
         connect(client_.data(), &MatrixClient::initialSyncFailed, this, [=](const QString &msg) {
+                if (client_->getHomeServer().isEmpty()) {
+                        deleteConfigs();
+                        return;
+                }
+
                 initialSyncFailures += 1;
 
                 if (initialSyncFailures >= MAX_INITIAL_SYNC_FAILURES) {
@@ -426,14 +432,7 @@ ChatPage::syncCompleted(const SyncResponse &response)
                 }
         }
 
-        try {
-                cache_->setState(response.nextBatch(), state_manager_);
-        } catch (const lmdb::error &e) {
-                qCritical() << "The cache couldn't be updated: " << e.what();
-                // TODO: Notify the user.
-                cache_->unmount();
-                cache_->deleteData();
-        }
+        QtConcurrent::run(cache_.data(), &Cache::setState, response.nextBatch(), state_manager_);
 
         client_->setNextBatchToken(response.nextBatch());
 
@@ -479,16 +478,10 @@ ChatPage::initialSyncCompleted(const SyncResponse &response)
                 QApplication::processEvents();
         }
 
-        try {
-                cache_->setState(response.nextBatch(), state_manager_);
-        } catch (const lmdb::error &e) {
-                qCritical() << "The cache couldn't be initialized: " << e.what();
-                cache_->unmount();
-                cache_->deleteData();
-        }
-
         client_->setNextBatchToken(response.nextBatch());
 
+        QtConcurrent::run(cache_.data(), &Cache::setState, response.nextBatch(), state_manager_);
+
         // Populate timelines with messages.
         view_manager_->initialize(response.rooms());
 
diff --git a/src/MatrixClient.cc b/src/MatrixClient.cc
index 4ececd0136f9edfe76dece42488c3ad3115371d1..f0b3bd26af1f4c67988761d0d98e310adfae7e08 100644
--- a/src/MatrixClient.cc
+++ b/src/MatrixClient.cc
@@ -56,9 +56,9 @@ MatrixClient::MatrixClient(QString server, QObject *parent)
 void
 MatrixClient::reset() noexcept
 {
-        next_batch_ = "";
-        server_     = "";
-        token_      = "";
+        next_batch_.clear();
+        server_.clear();
+        token_.clear();
 
         txn_id_ = 0;
 }