diff --git a/tools/dnc/dnc.cpp b/tools/dnc/dnc.cpp
index 8fce1de3632a59c4c5b53dda09a78c78d1b6aca9..db2147739ffdab8ecc522ab8a585b623b68ff925 100644
--- a/tools/dnc/dnc.cpp
+++ b/tools/dnc/dnc.cpp
@@ -67,16 +67,7 @@ Dnc::Dnc(dht::crypto::Identity identity,
     ioContext(std::make_shared<asio::io_context>()),
     iceFactory(std::make_shared<IceTransportFactory>(logger))
 {
-    ioContextRunner = std::thread([context = ioContext, logger = logger] {
-        try {
-            auto work = asio::make_work_guard(*context);
-            context->run();
-        } catch (const std::exception& ex) {
-            if (logger)
-                logger->error("Error in ioContextRunner: {}", ex.what());
-        }
-    });
-
+    
     certStore = std::make_shared<tls::CertificateStore>(cachePath()/"certStore", logger);
     trustStore = std::make_shared<tls::TrustStore>(*certStore);
 
@@ -254,6 +245,5 @@ Dnc::run()
 Dnc::~Dnc()
 {
     ioContext->stop();
-    ioContextRunner.join();
 }
 } // namespace dhtnet
diff --git a/tools/dnc/dnc.h b/tools/dnc/dnc.h
index 7d03cc97ca224b621354aa59d772a19a27fe3f9b..93132b6271289c24f6829fd5e5cbb5661a0ddcc9 100644
--- a/tools/dnc/dnc.h
+++ b/tools/dnc/dnc.h
@@ -65,7 +65,6 @@ private:
     std::shared_ptr<tls::CertificateStore> certStore;
     std::shared_ptr<IceTransportFactory> iceFactory;
     std::shared_ptr<asio::io_context> ioContext;
-    std::thread ioContextRunner;
     std::shared_ptr<tls::TrustStore> trustStore;
 
     std::pair<std::string, std::string> parseName(const std::string_view name);
diff --git a/tools/dsh/dsh.cpp b/tools/dsh/dsh.cpp
index 84566128757ffea9b890745a03f1af9edea310fa..5f32d4e9509850f9c9b49805a97d6b104cfbad28 100644
--- a/tools/dsh/dsh.cpp
+++ b/tools/dsh/dsh.cpp
@@ -92,22 +92,12 @@ dhtnet::Dsh::Dsh(dht::crypto::Identity identity,
                  const std::string& turn_pass,
                  const std::string& turn_realm,
                  bool anonymous)
-    :logger(dht::log::getStdLogger())
-    , ioContext(std::make_shared<asio::io_context>()),
+    :logger(dht::log::getStdLogger()),
+    ioContext(std::make_shared<asio::io_context>()),
     iceFactory(std::make_shared<IceTransportFactory>(logger)),
     certStore(std::make_shared<tls::CertificateStore>(cachePath()/"certstore", logger)),
     trustStore(std::make_shared<tls::TrustStore>(*certStore))
 {
-    ioContext = std::make_shared<asio::io_context>();
-    ioContextRunner = std::thread([context = ioContext, logger = logger] {
-        try {
-            auto work = asio::make_work_guard(*context);
-            context->run();
-        } catch (const std::exception& ex) {
-            if (logger)
-                logger->error("Error in ioContextRunner: {}", ex.what());
-        }
-    });
     auto ca = identity.second->issuer;
     trustStore->setCertificateStatus(ca->getId().toString(), tls::TrustStore::PermissionStatus::ALLOWED);
     // Build a server
@@ -272,7 +262,6 @@ dhtnet::Dsh::run()
 dhtnet::Dsh::~Dsh()
 {
     ioContext->stop();
-    ioContextRunner.join();
 }
 
 } // namespace dhtnet
\ No newline at end of file
diff --git a/tools/dsh/dsh.h b/tools/dsh/dsh.h
index ec983a2f79acb41dcb461f7aa33bd563b1733d47..1c8759e31b9d4e0ce9d50c44859994a55754474b 100644
--- a/tools/dsh/dsh.h
+++ b/tools/dsh/dsh.h
@@ -52,7 +52,6 @@ private:
     std::shared_ptr<tls::CertificateStore> certStore {nullptr};
     std::shared_ptr<dhtnet::IceTransportFactory> iceFactory {nullptr};
     std::shared_ptr<asio::io_context> ioContext;
-    std::thread ioContextRunner;
     std::shared_ptr<tls::TrustStore> trustStore;
 
 };
diff --git a/tools/dvpn/dvpn.cpp b/tools/dvpn/dvpn.cpp
index f6214a34b1ce9c9f3a9419ddabbffdaa1826a92b..ac4536fd9b2483bb43aebea6cef993bd2e4f8077 100644
--- a/tools/dvpn/dvpn.cpp
+++ b/tools/dvpn/dvpn.cpp
@@ -169,15 +169,6 @@ dhtnet::Dvpn::Dvpn(dht::crypto::Identity identity,
     certStore(std::make_shared<tls::CertificateStore>(cachePath()/"certstore", logger)),
     trustStore(std::make_shared<tls::TrustStore>(*certStore))
 {
-    ioContextRunner = std::thread([context = ioContext, logger = logger] {
-        try {
-            auto work = asio::make_work_guard(*context);
-            context->run();
-        } catch (const std::exception& ex) {
-            if (logger)
-                logger->error("Error in ioContextRunner: {}", ex.what());
-        }
-    });
     auto ca = identity.second->issuer;
     trustStore->setCertificateStatus(ca->getId().toString(), tls::TrustStore::PermissionStatus::ALLOWED);
 
@@ -386,5 +377,4 @@ dhtnet::Dvpn::run()
 dhtnet::Dvpn::~Dvpn()
 {
     ioContext->stop();
-    ioContextRunner.join();
 }
diff --git a/tools/dvpn/dvpn.h b/tools/dvpn/dvpn.h
index e17775aac043a57a4e63ea1e6aa584e743946db5..0db11b2fc9938354d467b60617285008b0fb9188 100644
--- a/tools/dvpn/dvpn.h
+++ b/tools/dvpn/dvpn.h
@@ -63,7 +63,6 @@ public:
     std::shared_ptr<tls::CertificateStore> certStore;
     std::shared_ptr<IceTransportFactory> iceFactory;
     std::shared_ptr<asio::io_context> ioContext;
-    std::thread ioContextRunner;
     enum class CommunicationState { METADATA, DATA };
     std::shared_ptr<tls::TrustStore> trustStore;
 };