diff --git a/CMakeLists.txt b/CMakeLists.txt
index a663d8035c02fce2e0e3384532d5eede444d4430..e153dce034871ed46f2f9a8cfebd1766d6b0fb78 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -338,7 +338,7 @@ if(MSVC)
            "${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/restinio/dev;"
            "${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/fmt/include;"
            "${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/http_parser;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/natpmp/include"
+           "${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/natpmp/include;"
            "${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/msgpack-c/include;"
            "${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/opendht/include;"
            "${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/libarchive/libarchive;"
@@ -353,7 +353,8 @@ if(MSVC)
            "${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/webrtc-audio-processing;"
            "${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/portaudio/include;"
            "${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjmedia/include;"
-           "${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/libgit2/include"
+           "${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/libgit2/include;"
+           "${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/dhtnet/include;"
        )
    endif()
 
@@ -467,6 +468,7 @@ if(MSVC)
         ${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/webrtc-audio-processing/build/Release/webrtc-audio-processing.lib
         ${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/portaudio/build/Release/portaudio_static_x64.lib
         ${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/libgit2/build/Release/git2.lib
+        ${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/dhtnet/build/Release/dhtnet.lib
         /ignore:4006"
    )
 
diff --git a/compat/msvc/package.json b/compat/msvc/package.json
index 6f85d2f1e0acdcf97f914226f2bc1d7cbde607b0..72d09ff464d9da3da1c56ea9ba5f54f5e35d72e5 100644
--- a/compat/msvc/package.json
+++ b/compat/msvc/package.json
@@ -13,7 +13,8 @@
         "yaml-cpp",
         "libarchive",
         "webrtc-audio-processing",
-        "libgit2"
+        "libgit2",
+        "dhtnet"
     ],
     "configuration": "ReleaseLib_win32",
     "use_cmake": true
diff --git a/compat/msvc/winmake.py b/compat/msvc/winmake.py
index 58c4032d51e2fedc1fc11eaac67e73e7e031b42f..ee144a6744995030ac73e5efb14caae10ff3e821 100644
--- a/compat/msvc/winmake.py
+++ b/compat/msvc/winmake.py
@@ -377,15 +377,21 @@ def remove_archive_if_needed(pkg_build_path, dirty_path):
         getSHrunner().exec_batch('rmdir', ['/s', '/q', dirty_path])
 
 
-def extract_tar(pkg_build_path, name, path):
+def extract_tar(pkg_build_path, name, path, pkg_name):
     with tarfile.open(path, 'r', encoding="utf8", errors='ignore') as tarball:
         tar_common_prefix = os.path.commonprefix(tarball.getnames())
-        dirty_path = contrib_build_dir + '\\' + tar_common_prefix
+        prefix = tar_common_prefix
+        if prefix == "":
+            prefix = pkg_name
+        dirty_path = contrib_build_dir + '\\' + prefix
         remove_archive_if_needed(pkg_build_path, dirty_path)
         log.debug('Decompressing ' + name + ' to ' + pkg_build_path)
-        tarball.extractall(contrib_build_dir)
-        os.rename(contrib_build_dir + '\\' + tar_common_prefix,
-                  pkg_build_path)
+        if tar_common_prefix == "":
+            tarball.extractall(dirty_path)
+        else:
+            tarball.extractall(contrib_build_dir)
+            os.rename(contrib_build_dir + '\\' + tar_common_prefix,
+                    pkg_build_path)
         return True
     return False
 
@@ -406,7 +412,7 @@ def extract_zip(pkg_build_path, name, path):
 def extract_archive(pkg_name, name, path):
     pkg_build_path = contrib_build_dir + '\\' + pkg_name
     if tarfile.is_tarfile(path):
-        return extract_tar(pkg_build_path, name, path)
+        return extract_tar(pkg_build_path, name, path, pkg_name)
     elif zipfile.is_zipfile(path):
         return extract_zip(pkg_build_path, name, path)
 
diff --git a/contrib/src/asio/package.json b/contrib/src/asio/package.json
index 23df6ff8ecfc11a812e06ffdf628e52268172a3f..c81580b6b3d73aaab155db7bf431bdcc659460e7 100644
--- a/contrib/src/asio/package.json
+++ b/contrib/src/asio/package.json
@@ -1,6 +1,6 @@
 {
     "name": "asio",
-    "version": "asio-1-12-2",
+    "version": "asio-1-22-2",
     "url": "https://github.com/chriskohlhoff/asio/archive/__VERSION__.tar.gz",
     "deps": ["openssl"],
     "patches": [],
diff --git a/contrib/src/dhtnet/libjami-testable.patch b/contrib/src/dhtnet/libjami-testable.patch
index 0c8f18fc265672d53a604487f41c0059ed83c368..41107ac8916f8939869e7715b6ae5f0230b6743e 100644
--- a/contrib/src/dhtnet/libjami-testable.patch
+++ b/contrib/src/dhtnet/libjami-testable.patch
@@ -5,17 +5,16 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt
 index d14bc98..e5ad5c6 100644
 --- a/CMakeLists.txt
 +++ b/CMakeLists.txt
-@@ -14,6 +14,13 @@ set (libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
- set (includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
- set (VERSION ${CMAKE_PROJECT_VERSION})
- 
-+OPTION(LIBJAMI_TESTABLE "Enable API for tests" ON)
-+
-+IF(LIBJAMI_TESTABLE)
-+    ADD_DEFINITIONS(-DLIBJAMI_TESTABLE)
-+ENDIF(LIBJAMI_TESTABLE)
+@@ -20,6 +20,12 @@ option(DHTNET_TESTABLE "Enable API for tests" ON)
+ option(BUILD_TOOLS "Build tools" ON)
+
+ if (NOT MSVC)
++    OPTION(LIBJAMI_TESTABLE "Enable API for tests" ON)
 +
++    IF(LIBJAMI_TESTABLE)
++        ADD_DEFINITIONS(-DLIBJAMI_TESTABLE)
++    ENDIF(LIBJAMI_TESTABLE)
 +
- find_package (PkgConfig REQUIRED)
- 
- find_package(msgpack-cxx CONFIG)
+     find_package (PkgConfig REQUIRED)
+
+     find_package(msgpack-cxx CONFIG)
diff --git a/contrib/src/dhtnet/package.json b/contrib/src/dhtnet/package.json
index d0b13618d0fe32421e2806dd6f21c5f883d66caf..fe9b38da24557d15bf6c5c3382706349c160e573 100644
--- a/contrib/src/dhtnet/package.json
+++ b/contrib/src/dhtnet/package.json
@@ -1,11 +1,14 @@
 {
     "name": "dhtnet",
-    "version": "64bb00fc77f1322c4e0f5c1c7bc54e2fee81f0a6",
+    "version": "24cc01e3deacb1332745929840268af06ebe9068",
     "url": "https://review.jami.net/plugins/gitiles/dhtnet/+archive/__VERSION__.tar.gz",
     "deps": [
         "opendht",
         "pjproject",
-        "asio"
+        "msgpack",
+        "asio",
+        "upnp",
+        "natpmp"
     ],
     "use_cmake" : true,
     "defines": [
@@ -17,8 +20,13 @@
     "project_paths": [],
     "with_env" : "",
     "custom_scripts": {
-        "pre_build": [],
+        "pre_build": [
+            "rmdir /S /Q \"%DAEMON_DIR%\\contrib\\msvc\\include\\dhtnet\""
+        ],
         "build": [],
-        "post_build": []
+        "post_build": [
+            "mkdir \"%DAEMON_DIR%\\contrib\\msvc\\include\\dhtnet\"",
+            "xcopy /S /Y \"include\" \"%DAEMON_DIR%\\contrib\\msvc\\include\\dhtnet\""
+        ]
     }
 }
\ No newline at end of file
diff --git a/contrib/src/dhtnet/rules.mak b/contrib/src/dhtnet/rules.mak
index 17a7f2388f6227300240bdf0cf858a6cef0a64dc..737645140ce272942c7ea0b66d2a721624e9b5c3 100644
--- a/contrib/src/dhtnet/rules.mak
+++ b/contrib/src/dhtnet/rules.mak
@@ -1,5 +1,5 @@
 # DHTNET
-DHTNET_VERSION := 64bb00fc77f1322c4e0f5c1c7bc54e2fee81f0a6
+DHTNET_VERSION := 24cc01e3deacb1332745929840268af06ebe9068
 DHTNET_URL := https://review.jami.net/plugins/gitiles/dhtnet/+archive/$(DHTNET_VERSION).tar.gz
 
 PKGS += dhtnet
diff --git a/contrib/src/libgit2/package.json b/contrib/src/libgit2/package.json
index 0152347245c7e1f953ff395e5a720eca9c542edb..fff9df0045a588c9769afec27f215c9192768648 100644
--- a/contrib/src/libgit2/package.json
+++ b/contrib/src/libgit2/package.json
@@ -10,6 +10,7 @@
         "BUILD_SHARED_LIBS=OFF",
         "USE_SSH=OFF",
         "WINHTTP=OFF",
+        "USE_WINHTTP=OFF",
         "BUILD_TESTS=OFF",
         "BUILD_CLI=OFF",
         "USE_SSH=OFF"
diff --git a/src/jamidht/archive_account_manager.cpp b/src/jamidht/archive_account_manager.cpp
index 63fa1e11b1bbb864823fc6455c12a6a3c2595314..b945fe8ee55c1643d3f094e8568b24d81c6332c7 100644
--- a/src/jamidht/archive_account_manager.cpp
+++ b/src/jamidht/archive_account_manager.cpp
@@ -66,7 +66,7 @@ ArchiveAccountManager::initAuthentication(const std::string& accountId,
         return;
     }
 
-    dht::ThreadPool::computation().run([ctx = std::move(ctx), w = weak_from_this()] mutable {
+    dht::ThreadPool::computation().run([ctx = std::move(ctx), w = weak_from_this()] {
         auto this_ = std::static_pointer_cast<ArchiveAccountManager>(w.lock());
         if (not this_) return;
         try {
@@ -668,7 +668,7 @@ generatePIN(size_t length = 16, size_t split = 8)
 void
 ArchiveAccountManager::addDevice(const std::string& password, AddDeviceCallback cb)
 {
-    dht::ThreadPool::computation().run([password, cb = std::move(cb), w=weak_from_this()] mutable {
+    dht::ThreadPool::computation().run([password, cb = std::move(cb), w=weak_from_this()] {
         auto this_ = std::static_pointer_cast<ArchiveAccountManager>(w.lock());
         if (not this_) return;