diff --git a/native/cpp/CommonCpp/NativeModules/CommCoreModule.h b/native/cpp/CommonCpp/NativeModules/CommCoreModule.h
--- a/native/cpp/CommonCpp/NativeModules/CommCoreModule.h
+++ b/native/cpp/CommonCpp/NativeModules/CommCoreModule.h
@@ -14,8 +14,6 @@
 
 class CommCoreModule : public facebook::react::CommCoreModuleSchemaCxxSpecJSI {
   const int codeVersion{147};
-
-  std::unique_ptr<WorkerThread> databaseThread;
   std::unique_ptr<WorkerThread> cryptoThread;
 
   CommSecureStore secureStore;
diff --git a/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp b/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp
--- a/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp
+++ b/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp
@@ -1,6 +1,7 @@
 #include "CommCoreModule.h"
 #include "DatabaseManager.h"
 #include "GRPCStreamHostObject.h"
+#include "InternalModules/GlobalDBSingleton.h"
 #include "InternalModules/GlobalNetworkSingleton.h"
 #include "InternalModules/NetworkModule.h"
 #include "Logger.h"
@@ -23,7 +24,7 @@
     jsi::Runtime &rt,
     std::function<T()> task) {
   std::promise<T> promise;
-  this->databaseThread->scheduleTask([&promise, &task]() {
+  GlobalDBSingleton::instance.scheduleOrRun([&promise, &task]() {
     try {
       promise.set_value(task());
     } catch (const std::exception &e) {
@@ -61,7 +62,7 @@
             promise->resolve(std::move(draft));
           });
         };
-        this->databaseThread->scheduleTask(job);
+        GlobalDBSingleton::instance.scheduleOrRun(job);
       });
 }
 
@@ -86,7 +87,7 @@
             }
           });
         };
-        this->databaseThread->scheduleTask(job);
+        GlobalDBSingleton::instance.scheduleOrRun(job);
       });
 }
 
@@ -116,7 +117,7 @@
             }
           });
         };
-        this->databaseThread->scheduleTask(job);
+        GlobalDBSingleton::instance.scheduleOrRun(job);
       });
 }
 
@@ -156,7 +157,7 @@
             promise->resolve(std::move(jsiDrafts));
           });
         };
-        this->databaseThread->scheduleTask(job);
+        GlobalDBSingleton::instance.scheduleOrRun(job);
       });
 }
 
@@ -178,7 +179,7 @@
             promise->resolve(jsi::Value::undefined());
           });
         };
-        this->databaseThread->scheduleTask(job);
+        GlobalDBSingleton::instance.scheduleOrRun(job);
       });
 }
 
@@ -308,7 +309,7 @@
                 promise->resolve(std::move(jsiMessages));
               });
         };
-        this->databaseThread->scheduleTask(job);
+        GlobalDBSingleton::instance.scheduleOrRun(job);
       });
 }
 
@@ -399,7 +400,7 @@
             }
           });
         };
-        this->databaseThread->scheduleTask(job);
+        GlobalDBSingleton::instance.scheduleOrRun(job);
       });
 }
 
@@ -419,7 +420,7 @@
     return false;
   }
 
-  this->databaseThread->scheduleTask(
+  GlobalDBSingleton::instance.scheduleOrRun(
       [=, &messageStoreOps, &operationsResult, &rt]() {
         std::string error = operationsError;
         if (!error.size()) {
@@ -442,7 +443,7 @@
 jsi::Value CommCoreModule::getAllThreads(jsi::Runtime &rt) {
   return createPromiseAsJSIValue(
       rt, [=](jsi::Runtime &innerRt, std::shared_ptr<Promise> promise) {
-        this->databaseThread->scheduleTask([=, &innerRt]() {
+        GlobalDBSingleton::instance.scheduleOrRun([=, &innerRt]() {
           std::string error;
           std::vector<Thread> threadsVector;
           size_t numThreads;
@@ -705,7 +706,7 @@
   }
   return createPromiseAsJSIValue(
       rt, [=](jsi::Runtime &innerRt, std::shared_ptr<Promise> promise) {
-        this->databaseThread->scheduleTask([=]() {
+        GlobalDBSingleton::instance.scheduleOrRun([=]() {
           std::string error = operationsError;
           if (!error.size()) {
             try {
@@ -743,7 +744,7 @@
   } catch (std::runtime_error &e) {
     return false;
   }
-  this->databaseThread->scheduleTask(
+  GlobalDBSingleton::instance.scheduleOrRun(
       [=, &threadStoreOps, &operationsResult, &rt]() {
         std::string error = operationsError;
         if (!error.size()) {
@@ -777,7 +778,7 @@
 
   return createPromiseAsJSIValue(
       rt, [=](jsi::Runtime &innerRt, std::shared_ptr<Promise> promise) {
-        this->databaseThread->scheduleTask([=]() {
+        GlobalDBSingleton::instance.scheduleOrRun([=]() {
           crypto::Persist persist;
           std::string error;
           try {
@@ -809,7 +810,7 @@
             if (persist.isEmpty()) {
               crypto::Persist newPersist =
                   this->cryptoModule->storeAsB64(storedSecretKey.value());
-              this->databaseThread->scheduleTask([=]() {
+              GlobalDBSingleton::instance.scheduleOrRun([=]() {
                 std::string error;
                 try {
                   DatabaseManager::getQueryExecutor().storeOlmPersistData(
@@ -908,8 +909,8 @@
 CommCoreModule::CommCoreModule(
     std::shared_ptr<facebook::react::CallInvoker> jsInvoker)
     : facebook::react::CommCoreModuleSchemaCxxSpecJSI(jsInvoker),
-      databaseThread(std::make_unique<WorkerThread>("database")),
       cryptoThread(std::make_unique<WorkerThread>("crypto")) {
+  GlobalDBSingleton::instance.enableMultithreading();
   GlobalNetworkSingleton::instance.enableMultithreading();
 }
 
@@ -924,29 +925,30 @@
       rt,
       [this,
        notifyToken](jsi::Runtime &innerRt, std::shared_ptr<Promise> promise) {
-        this->databaseThread->scheduleTask([this, notifyToken, promise]() {
-          std::string error;
-          try {
-            DatabaseManager::getQueryExecutor().setNotifyToken(notifyToken);
-          } catch (std::system_error &e) {
-            error = e.what();
-          }
+        GlobalDBSingleton::instance.scheduleOrRun(
+            [this, notifyToken, promise]() {
+              std::string error;
+              try {
+                DatabaseManager::getQueryExecutor().setNotifyToken(notifyToken);
+              } catch (std::system_error &e) {
+                error = e.what();
+              }
 
-          this->jsInvoker_->invokeAsync([error, promise]() {
-            if (error.size()) {
-              promise->reject(error);
-            } else {
-              promise->resolve(jsi::Value::undefined());
-            }
-          });
-        });
+              this->jsInvoker_->invokeAsync([error, promise]() {
+                if (error.size()) {
+                  promise->reject(error);
+                } else {
+                  promise->resolve(jsi::Value::undefined());
+                }
+              });
+            });
       });
 }
 
 jsi::Value CommCoreModule::clearNotifyToken(jsi::Runtime &rt) {
   return createPromiseAsJSIValue(
       rt, [this](jsi::Runtime &innerRt, std::shared_ptr<Promise> promise) {
-        this->databaseThread->scheduleTask([this, promise]() {
+        GlobalDBSingleton::instance.scheduleOrRun([this, promise]() {
           std::string error;
           try {
             DatabaseManager::getQueryExecutor().clearNotifyToken();
@@ -971,7 +973,9 @@
       rt,
       [this,
        currentUserID](jsi::Runtime &innerRt, std::shared_ptr<Promise> promise) {
-        this->databaseThread->scheduleTask([this, promise, currentUserID]() {
+        GlobalDBSingleton::instance.scheduleOrRun([this,
+                                                   promise,
+                                                   currentUserID]() {
           std::string error;
           try {
             DatabaseManager::getQueryExecutor().setCurrentUserID(currentUserID);
@@ -992,7 +996,7 @@
 jsi::Value CommCoreModule::getCurrentUserID(jsi::Runtime &rt) {
   return createPromiseAsJSIValue(
       rt, [this](jsi::Runtime &innerRt, std::shared_ptr<Promise> promise) {
-        this->databaseThread->scheduleTask([this, &innerRt, promise]() {
+        GlobalDBSingleton::instance.scheduleOrRun([this, &innerRt, promise]() {
           std::string error;
           std::string result;
           try {
@@ -1014,7 +1018,7 @@
 jsi::Value CommCoreModule::clearSensitiveData(jsi::Runtime &rt) {
   return createPromiseAsJSIValue(
       rt, [this](jsi::Runtime &innerRt, std::shared_ptr<Promise> promise) {
-        this->databaseThread->scheduleTask([this, promise]() {
+        GlobalDBSingleton::instance.scheduleOrRun([this, promise]() {
           std::string error;
           try {
             DatabaseManager::getQueryExecutor().clearSensitiveData();