diff --git a/tests/dhtproxytester.cpp b/tests/dhtproxytester.cpp
index f8c06a2bdbfab65703f6d6ecef15aa43ed96c7c7..4be467949cb0538ec9b12b113baa546f08c9de22 100644
--- a/tests/dhtproxytester.cpp
+++ b/tests/dhtproxytester.cpp
@@ -60,9 +60,19 @@ void
 DhtProxyTester::tearDown() {
     nodePeer.join();
     nodeClient.join();
-    nodeProxy->shutdown();
+
+    bool done = false;
+    std::condition_variable cv;
+    std::mutex cv_m;
+    nodeProxy->shutdown([&]{
+        std::lock_guard<std::mutex> lk(cv_m);
+        done = true;
+        cv.notify_all();
+    });
+    std::unique_lock<std::mutex> lk(cv_m);
+    CPPUNIT_ASSERT(cv.wait_for(lk, 5s, [&]{ return done; }));
     serverProxy.reset();
-    nodeProxy->join();
+    nodeProxy.reset();
 }
 
 void
@@ -77,12 +87,12 @@ DhtProxyTester::testGetPut() {
     dht::Value val {"Hey! It's been a long time. How have you been?"};
     auto val_data = val.data;
     {
-        std::unique_lock<std::mutex> lk(cv_m);
         nodePeer.put(key, std::move(val), [&](bool) {
             std::lock_guard<std::mutex> lk(cv_m);
             done = true;
             cv.notify_all();
         });
+        std::unique_lock<std::mutex> lk(cv_m);
         CPPUNIT_ASSERT(cv.wait_for(lk, 10s, [&]{ return done; }));
     }
 
diff --git a/tests/dhtrunnertester.cpp b/tests/dhtrunnertester.cpp
index 87c43838abfd4b9d06785efd9bb76db942eeab0c..c84ee7fddcac8de18a140ef81bc6bfcae857a7e8 100644
--- a/tests/dhtrunnertester.cpp
+++ b/tests/dhtrunnertester.cpp
@@ -22,19 +22,32 @@
 #include <chrono>
 #include <mutex>
 #include <condition_variable>
+using namespace std::chrono_literals;
 
 namespace test {
 CPPUNIT_TEST_SUITE_REGISTRATION(DhtRunnerTester);
 
 void
 DhtRunnerTester::setUp() {
-    node1.run(42222, {}, true);
-    node2.run(42232, {}, true);
+    node1.run(42222);
+    node2.run(42232);
     node2.bootstrap(node1.getBound());
 }
 
 void
 DhtRunnerTester::tearDown() {
+    unsigned done {0};
+    std::condition_variable cv;
+    std::mutex cv_m;
+    auto shutdown = [&]{
+        std::lock_guard<std::mutex> lk(cv_m);
+        done++;
+        cv.notify_all();
+    };
+    node1.shutdown(shutdown);
+    node2.shutdown(shutdown);
+    std::unique_lock<std::mutex> lk(cv_m);
+    CPPUNIT_ASSERT(cv.wait_for(lk, 5s, [&]{ return done == 2; }));
     node1.join();
     node2.join();
 }
@@ -90,27 +103,22 @@ DhtRunnerTester::testListen() {
 
     for (unsigned i=0; i<N; i++) {
         node2.put(a, dht::Value("v1"), [&](bool ok) {
-            {
-                std::lock_guard<std::mutex> lock(mutex);
-                putCount++;
-                if (ok) putOkCount++;
-            }
+            std::lock_guard<std::mutex> lock(mutex);
+            putCount++;
+            if (ok) putOkCount++;
             cv.notify_all();
         });
         node2.put(b, dht::Value("v2"), [&](bool ok) {
-            {
-                std::lock_guard<std::mutex> lock(mutex);
-                putCount++;
-                if (ok) putOkCount++;
-            }
+            std::lock_guard<std::mutex> lock(mutex);
+            putCount++;
+            if (ok) putOkCount++;
             cv.notify_all();
         });
     }
 
     {
         std::unique_lock<std::mutex> lk(mutex);
-        cv.wait_for(lk, std::chrono::seconds(30), [&]{ return putCount == N * 2u; });
-        CPPUNIT_ASSERT_EQUAL(N * 2u, putCount);
+        CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]{ return putCount == N * 2u; }));
         CPPUNIT_ASSERT_EQUAL(N * 2u, putOkCount);
     }