diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3948bc4b09a0619a1b2969e74a3e0aa200393e1b..f81f5dbaa055727da466772966e8c78effbfb279 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,38 @@
 cmake_minimum_required(VERSION 3.11)
 
+
+set(
+    CMAKE_TOOLCHAIN_FILE
+    "${CMAKE_CURRENT_LIST_DIR}/toolchain.cmake"
+    CACHE
+    FILEPATH
+    "Default toolchain"
+)
+
+
+option(HUNTER_ENABLED "Enable Hunter package manager" OFF)
+include("cmake/HunterGate.cmake")
+#set(HUNTER_ENABLED OFF)
+HunterGate(
+    URL "https://github.com/cpp-pm/hunter/archive/v0.23.242.tar.gz"
+    SHA1 "503b149d0ebdbc598e498f1669ae828a2136b838"
+)
+
+option(USE_BUNDLED_BOOST "Use the bundled version of Boost." ${HUNTER_ENABLED})
+option(USE_BUNDLED_SPDLOG "Use the bundled version of spdlog."
+        ${HUNTER_ENABLED})
+option(USE_BUNDLED_OLM "Use the bundled version of libolm." ${HUNTER_ENABLED})
+option(USE_BUNDLED_GTEST "Use the bundled version of Google Test."
+        ${HUNTER_ENABLED})
+option(USE_BUNDLED_JSON "Use the bundled version of nlohmann json."
+        ${HUNTER_ENABLED})
+option(USE_BUNDLED_OPENSSL "Use the bundled version of OpenSSL."
+        ${HUNTER_ENABLED})
+option(USE_BUNDLED_SODIUM "Use the bundled version of libsodium."
+        ${HUNTER_ENABLED})
+option(USE_BUNDLED_ZLIB "Use the bundled version of zlib."
+        ${HUNTER_ENABLED})
+
 project(matrix_client VERSION 0.3.0 LANGUAGES CXX C)
 
 option(ASAN "Compile with address sanitizers" OFF)
@@ -9,10 +42,7 @@ option(COVERAGE "Calculate test coverage" OFF)
 option(IWYU "Check headers with include-what-you-use" OFF)
 option(BUILD_SHARED_LIBS "Specifies whether to build mtxclient as a shared library lib or not" ON)
 
-set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
-set(CMAKE_CXX_STANDARD 17)
-set(CMAKE_CXX_STANDARD_REQUIRED ON)
-set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake")
 
 if(NOT MSVC)
   set(
@@ -43,13 +73,19 @@ endif()
 
 include(FeatureSummary)
 
-find_package(OpenSSL)
+if(USE_BUNDLED_OPENSSL)
+        hunter_add_package(OpenSSL)
+endif()
+find_package(OpenSSL REQUIRED)
 set_package_properties(OpenSSL PROPERTIES
     DESCRIPTION "Open source SSL and TLS implementation and cryptographic library"
     URL "https://www.openssl.org/"
     TYPE REQUIRED
 )
 
+if(USE_BUNDLED_ZLIB)
+        hunter_add_package(ZLIB)
+endif()
 find_package(ZLIB)
 set_package_properties(ZLIB PROPERTIES
     DESCRIPTION "A free compression library unencumbered by patents"
@@ -57,20 +93,37 @@ set_package_properties(ZLIB PROPERTIES
     TYPE REQUIRED
 )
 
-find_package(Olm 2)
+if(USE_BUNDLED_OLM)
+	include(FetchContent)
+	FetchContent_Declare(
+		Olm
+		GIT_REPOSITORY https://gitlab.matrix.org/matrix-org/olm.git
+		GIT_TAG        3.1.4
+		)
+	FetchContent_MakeAvailable(Olm)
+endif()
+find_package(Olm 3)
 set_package_properties(Olm PROPERTIES
     DESCRIPTION "An implementation of the Double Ratchet cryptographic ratchet"
     URL "https://git.matrix.org/git/olm/about/"
     TYPE REQUIRED
 )
 
-find_package(sodium 1.0.14)
-set_package_properties(sodium PROPERTIES
-    DESCRIPTION "A modern, portable, easy to use crypto library"
-    URL "https://github.com/jedisct1/libsodium"
-    TYPE REQUIRED
-)
+if(USE_BUNDLED_SODIUM)
+        hunter_add_package(libsodium)
+	find_package(libsodium 1.0.14)
+else()
+	find_package(sodium 1.0.14)
+	set_package_properties(sodium PROPERTIES
+		DESCRIPTION "A modern, portable, easy to use crypto library"
+		URL "https://github.com/jedisct1/libsodium"
+		TYPE REQUIRED
+		)
+endif()
 
+if(USE_BUNDLED_JSON)
+        hunter_add_package(nlohmann_json)
+endif()
 find_package(nlohmann_json 3.2.0)
 set_package_properties(nlohmann_json PROPERTIES
     DESCRIPTION "JSON for Modern C++, a C++11 header-only JSON class"
@@ -78,90 +131,108 @@ set_package_properties(nlohmann_json PROPERTIES
     TYPE REQUIRED
 )
 
-set(Boost_USE_STATIC_LIBS OFF)
-set(Boost_USE_STATIC_RUNTIME OFF)
-set(Boost_USE_MULTITHREADED ON)
+if(USE_BUNDLED_BOOST)
+        hunter_add_package(Boost
+                           COMPONENTS atomic
+                                      chrono
+                                      date_time
+                                      iostreams
+                                      random
+                                      regex
+                                      system
+                                      thread)
+endif()
+#set(Boost_USE_STATIC_LIBS OFF)
+#set(Boost_USE_STATIC_RUNTIME OFF)
+#set(Boost_USE_MULTITHREADED ON)
 find_package(Boost 1.70
-             COMPONENTS atomic
-                        chrono
-                        date_time
-                        iostreams
-                        random
-                        regex
-                        system
-                        thread)
+     COMPONENTS atomic
+                chrono
+                date_time
+                iostreams
+                random
+                regex
+                system
+                thread)
 set_package_properties(Boost PROPERTIES
-    DESCRIPTION "Free peer-reviewed portable C++ source libraries"
-    URL "https://www.boost.org/"
-    TYPE REQUIRED
+DESCRIPTION "Free peer-reviewed portable C++ source libraries"
+URL "https://www.boost.org/"
+TYPE REQUIRED
 )
 
 add_library(matrix_client
-            lib/http/client.cpp
-            lib/http/session.cpp
-            lib/crypto/client.cpp
-            lib/crypto/utils.cpp
-            lib/utils.cpp
-            lib/log.cpp
-            lib/structs/common.cpp
-            lib/structs/errors.cpp
-            lib/structs/events.cpp
-            lib/structs/requests.cpp
-            lib/structs/events/aliases.cpp
-            lib/structs/events/avatar.cpp
-            lib/structs/events/canonical_alias.cpp
-            lib/structs/events/common.cpp
-            lib/structs/events/collections.cpp
-            lib/structs/events/create.cpp
-            lib/structs/events/encrypted.cpp
-            lib/structs/events/encryption.cpp
-            lib/structs/events/guest_access.cpp
-            lib/structs/events/history_visibility.cpp
-            lib/structs/events/join_rules.cpp
-            lib/structs/events/member.cpp
-            lib/structs/events/name.cpp
-            lib/structs/events/pinned_events.cpp
-            lib/structs/events/power_levels.cpp
-            lib/structs/events/redaction.cpp
-            lib/structs/events/tag.cpp
-            lib/structs/events/tombstone.cpp
-            lib/structs/events/topic.cpp
-            lib/structs/events/messages/audio.cpp
-            lib/structs/events/messages/emote.cpp
-            lib/structs/events/messages/file.cpp
-            lib/structs/events/messages/image.cpp
-            lib/structs/events/messages/notice.cpp
-            lib/structs/events/messages/text.cpp
-            lib/structs/events/messages/video.cpp
-            lib/structs/responses/common.cpp
-            lib/structs/responses/create_room.cpp
-            lib/structs/responses/crypto.cpp
-            lib/structs/responses/empty.cpp
-            lib/structs/responses/login.cpp
-            lib/structs/responses/media.cpp
-            lib/structs/responses/messages.cpp
-            lib/structs/responses/notifications.cpp
-            lib/structs/responses/profile.cpp
-            lib/structs/responses/register.cpp
-            lib/structs/responses/sync.cpp
-            lib/structs/responses/version.cpp
-            lib/structs/responses/well-known.cpp)
+    lib/http/client.cpp
+    lib/http/session.cpp
+    lib/crypto/client.cpp
+    lib/crypto/utils.cpp
+    lib/utils.cpp
+    lib/log.cpp
+    lib/structs/common.cpp
+    lib/structs/errors.cpp
+    lib/structs/events.cpp
+    lib/structs/requests.cpp
+    lib/structs/events/aliases.cpp
+    lib/structs/events/avatar.cpp
+    lib/structs/events/canonical_alias.cpp
+    lib/structs/events/common.cpp
+    lib/structs/events/collections.cpp
+    lib/structs/events/create.cpp
+    lib/structs/events/encrypted.cpp
+    lib/structs/events/encryption.cpp
+    lib/structs/events/guest_access.cpp
+    lib/structs/events/history_visibility.cpp
+    lib/structs/events/join_rules.cpp
+    lib/structs/events/member.cpp
+    lib/structs/events/name.cpp
+    lib/structs/events/pinned_events.cpp
+    lib/structs/events/power_levels.cpp
+    lib/structs/events/redaction.cpp
+    lib/structs/events/tag.cpp
+    lib/structs/events/tombstone.cpp
+    lib/structs/events/topic.cpp
+    lib/structs/events/messages/audio.cpp
+    lib/structs/events/messages/emote.cpp
+    lib/structs/events/messages/file.cpp
+    lib/structs/events/messages/image.cpp
+    lib/structs/events/messages/notice.cpp
+    lib/structs/events/messages/text.cpp
+    lib/structs/events/messages/video.cpp
+    lib/structs/responses/common.cpp
+    lib/structs/responses/create_room.cpp
+    lib/structs/responses/crypto.cpp
+    lib/structs/responses/empty.cpp
+    lib/structs/responses/login.cpp
+    lib/structs/responses/media.cpp
+    lib/structs/responses/messages.cpp
+    lib/structs/responses/notifications.cpp
+    lib/structs/responses/profile.cpp
+    lib/structs/responses/register.cpp
+    lib/structs/responses/sync.cpp
+    lib/structs/responses/version.cpp
+    lib/structs/responses/well-known.cpp)
 add_library(MatrixClient::MatrixClient ALIAS matrix_client)
 target_include_directories(matrix_client
-                           SYSTEM
-                           PUBLIC
-                           ${Boost_INCLUDE_DIRS}
-                           ${OPENSSL_INCLUDE_DIR}
-                           ${sodium_INCLUDE_DIR})
+                   SYSTEM
+                   PUBLIC
+                   ${Boost_INCLUDE_DIRS}
+                   ${OPENSSL_INCLUDE_DIR}
+                   ${sodium_INCLUDE_DIR})
 target_include_directories(
-  matrix_client
-  PUBLIC
-  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
-  $<INSTALL_INTERFACE:include>)
+matrix_client
+PUBLIC
+$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+$<INSTALL_INTERFACE:include>)
 target_link_libraries(matrix_client
-                      PUBLIC
-                      ${Boost_LIBRARIES}
-                      ${sodium_LIBRARY_RELEASE}
+              PUBLIC
+                      Boost::atomic
+                      Boost::chrono
+                      Boost::date_time
+                      Boost::iostreams
+                      Boost::random
+                      Boost::regex
+                      Boost::system
+                      Boost::thread
+                      libsodium::libsodium
                       OpenSSL::Crypto
                       OpenSSL::SSL
                       Olm::Olm
@@ -176,11 +247,11 @@ if(COVERAGE)
   include(CodeCoverage)
   add_custom_target(ctest COMMAND ${CMAKE_CTEST_COMMAND})
   target_compile_options(matrix_client PUBLIC
-	  -O0        # no optimization
-	  -g         # generate debug info
-	  --coverage # sets all required flags
-	  -fprofile-arcs -ftest-coverage # just to be sure, for clang!
-	  )
+          -O0        # no optimization
+          -g         # generate debug info
+          --coverage # sets all required flags
+          -fprofile-arcs -ftest-coverage # just to be sure, for clang!
+          )
   target_link_options(matrix_client PUBLIC --coverage)
   setup_target_for_coverage(test_coverage ctest coverage)
 endif()
@@ -256,6 +327,9 @@ set_property(TARGET matrix_client PROPERTY SOVERSION ${PROJECT_VERSION})
 if(BUILD_LIB_TESTS)
   enable_testing()
 
+  if(USE_BUNDLED_GTEST)
+	  hunter_add_package(GTest)
+  endif()
   find_package(GTest REQUIRED)
 
   file(COPY tests/fixtures DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
diff --git a/cmake/FindOlm.cmake b/cmake/FindOlm.cmake
deleted file mode 100644
index aaccdb0c108e847531b087a756db5fba5f87b991..0000000000000000000000000000000000000000
--- a/cmake/FindOlm.cmake
+++ /dev/null
@@ -1,40 +0,0 @@
-#
-# CMake module to search for the olm library
-#
-# On success, the macro sets the following variables:
-# OLM_FOUND       = if the library found
-# OLM_LIBRARY     = full path to the library
-# OLM_INCLUDE_DIR = where to find the library headers
-#
-
-find_path(OLM_INCLUDE_DIR
-          NAMES olm/olm.h
-          PATHS /usr/include
-                /usr/local/include
-                $ENV{LIB_DIR}/include
-                $ENV{LIB_DIR}/include/olm)
-
-find_library(OLM_LIBRARY
-             NAMES olm
-             PATHS /usr/lib /usr/local/lib $ENV{LIB_DIR}/lib)
-
-if(OLM_FOUND)
-  set(OLM_INCLUDE_DIRS ${OLM_INCLUDE_DIR})
-
-  if(NOT OLM_LIBRARIES)
-    set(OLM_LIBRARIES ${OLM_LIBRARY})
-  endif()
-endif()
-
-if(NOT TARGET Olm::Olm)
-  add_library(Olm::Olm UNKNOWN IMPORTED)
-  set_target_properties(Olm::Olm
-                        PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
-                                   ${OLM_INCLUDE_DIR})
-  set_property(TARGET Olm::Olm APPEND PROPERTY IMPORTED_LOCATION ${OLM_LIBRARY})
-endif()
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(OLM DEFAULT_MSG OLM_INCLUDE_DIR OLM_LIBRARY)
-
-mark_as_advanced(OLM_LIBRARY OLM_INCLUDE_DIR)
diff --git a/cmake/Findsodium.cmake b/cmake/Findsodium.cmake
index c469c3f542e3408f7faae218541bab202d56816a..e061079c54f1f84ddf77a6e13dacd3581ced2f3c 100644
--- a/cmake/Findsodium.cmake
+++ b/cmake/Findsodium.cmake
@@ -17,13 +17,13 @@
 #
 # Once done the following variables will be defined:
 #
-#   sodium_FOUND
-#   sodium_INCLUDE_DIR
-#   sodium_LIBRARY_DEBUG
-#   sodium_LIBRARY_RELEASE
+#   libsodium_FOUND
+#   libsodium_INCLUDE_DIR
+#   libsodium_LIBRARY_DEBUG
+#   libsodium_LIBRARY_RELEASE
 #
 #
-# Furthermore an imported "sodium" target is created.
+# Furthermore an imported "libsodium" target is created.
 #
 
 if (CMAKE_C_COMPILER_ID STREQUAL "GNU"
@@ -32,16 +32,16 @@ if (CMAKE_C_COMPILER_ID STREQUAL "GNU"
 endif()
 
 # static library option
-if (NOT DEFINED sodium_USE_STATIC_LIBS)
-    option(sodium_USE_STATIC_LIBS "enable to statically link against sodium" OFF)
+if (NOT DEFINED libsodium_USE_STATIC_LIBS)
+    option(libsodium_USE_STATIC_LIBS "enable to statically link against libsodium" OFF)
 endif()
-if(NOT (sodium_USE_STATIC_LIBS EQUAL sodium_USE_STATIC_LIBS_LAST))
-    unset(sodium_LIBRARY CACHE)
-    unset(sodium_LIBRARY_DEBUG CACHE)
-    unset(sodium_LIBRARY_RELEASE CACHE)
-    unset(sodium_DLL_DEBUG CACHE)
-    unset(sodium_DLL_RELEASE CACHE)
-    set(sodium_USE_STATIC_LIBS_LAST ${sodium_USE_STATIC_LIBS} CACHE INTERNAL "internal change tracking variable")
+if(NOT (libsodium_USE_STATIC_LIBS EQUAL libsodium_USE_STATIC_LIBS_LAST))
+    unset(libsodium_LIBRARY CACHE)
+    unset(libsodium_LIBRARY_DEBUG CACHE)
+    unset(libsodium_LIBRARY_RELEASE CACHE)
+    unset(libsodium_DLL_DEBUG CACHE)
+    unset(libsodium_DLL_RELEASE CACHE)
+    set(libsodium_USE_STATIC_LIBS_LAST ${libsodium_USE_STATIC_LIBS} CACHE INTERNAL "internal change tracking variable")
 endif()
 
 
@@ -51,39 +51,39 @@ if (UNIX)
     # import pkg-config
     find_package(PkgConfig QUIET)
     if (PKG_CONFIG_FOUND)
-        pkg_check_modules(sodium_PKG QUIET libsodium)
+        pkg_check_modules(libsodium_PKG QUIET libsodium)
     endif()
 
-    if(sodium_USE_STATIC_LIBS)
-        foreach(_libname ${sodium_PKG_STATIC_LIBRARIES})
+    if(libsodium_USE_STATIC_LIBS)
+        foreach(_libname ${libsodium_PKG_STATIC_LIBRARIES})
             if (NOT _libname MATCHES "^lib.*\\.a$") # ignore strings already ending with .a
-                list(INSERT sodium_PKG_STATIC_LIBRARIES 0 "lib${_libname}.a")
+                list(INSERT libsodium_PKG_STATIC_LIBRARIES 0 "lib${_libname}.a")
             endif()
         endforeach()
-        list(REMOVE_DUPLICATES sodium_PKG_STATIC_LIBRARIES)
+        list(REMOVE_DUPLICATES libsodium_PKG_STATIC_LIBRARIES)
 
         # if pkgconfig for libsodium doesn't provide
         # static lib info, then override PKG_STATIC here..
-        if (sodium_PKG_STATIC_LIBRARIES STREQUAL "")
-            set(sodium_PKG_STATIC_LIBRARIES libsodium.a)
+        if (libsodium_PKG_STATIC_LIBRARIES STREQUAL "")
+            set(libsodium_PKG_STATIC_LIBRARIES libsodium.a)
         endif()
 
-        set(XPREFIX sodium_PKG_STATIC)
+        set(XPREFIX libsodium_PKG_STATIC)
     else()
-        if (sodium_PKG_LIBRARIES STREQUAL "")
-            set(sodium_PKG_LIBRARIES sodium)
+        if (libsodium_PKG_LIBRARIES STREQUAL "")
+            set(libsodium_PKG_LIBRARIES sodium)
         endif()
 
-        set(XPREFIX sodium_PKG)
+        set(XPREFIX libsodium_PKG)
     endif()
 
-    find_path(sodium_INCLUDE_DIR sodium.h
+    find_path(libsodium_INCLUDE_DIR sodium.h
         HINTS ${${XPREFIX}_INCLUDE_DIRS}
     )
-    find_library(sodium_LIBRARY_DEBUG NAMES ${${XPREFIX}_LIBRARIES}
+    find_library(libsodium_LIBRARY_DEBUG NAMES ${${XPREFIX}_LIBRARIES}
         HINTS ${${XPREFIX}_LIBRARY_DIRS}
     )
-    find_library(sodium_LIBRARY_RELEASE NAMES ${${XPREFIX}_LIBRARIES}
+    find_library(libsodium_LIBRARY_RELEASE NAMES ${${XPREFIX}_LIBRARIES}
         HINTS ${${XPREFIX}_LIBRARY_DIRS}
     )
 
@@ -91,11 +91,11 @@ if (UNIX)
 ########################################################################
 # Windows
 elseif (WIN32)
-    set(sodium_DIR "$ENV{sodium_DIR}" CACHE FILEPATH "sodium install directory")
-    mark_as_advanced(sodium_DIR)
+    set(libsodium_DIR "$ENV{libsodium_DIR}" CACHE FILEPATH "libsodium install directory")
+    mark_as_advanced(libsodium_DIR)
 
-    find_path(sodium_INCLUDE_DIR sodium.h
-        HINTS ${sodium_DIR}
+    find_path(libsodium_INCLUDE_DIR sodium.h
+        HINTS ${libsodium_DIR}
         PATH_SUFFIXES include
     )
 
@@ -131,7 +131,7 @@ elseif (WIN32)
         endif()
         string(APPEND _PLATFORM_PATH "/v${_VS_VERSION}")
 
-        if (sodium_USE_STATIC_LIBS)
+        if (libsodium_USE_STATIC_LIBS)
             string(APPEND _PLATFORM_PATH "/static")
         else()
             string(APPEND _PLATFORM_PATH "/dynamic")
@@ -140,59 +140,59 @@ elseif (WIN32)
         string(REPLACE "$$CONFIG$$" "Debug" _DEBUG_PATH_SUFFIX "${_PLATFORM_PATH}")
         string(REPLACE "$$CONFIG$$" "Release" _RELEASE_PATH_SUFFIX "${_PLATFORM_PATH}")
 
-        find_library(sodium_LIBRARY_DEBUG libsodium.lib
-            HINTS ${sodium_DIR}
+        find_library(libsodium_LIBRARY_DEBUG libsodium.lib
+            HINTS ${libsodium_DIR}
             PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX}
         )
-        find_library(sodium_LIBRARY_RELEASE libsodium.lib
-            HINTS ${sodium_DIR}
+        find_library(libsodium_LIBRARY_RELEASE libsodium.lib
+            HINTS ${libsodium_DIR}
             PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX}
         )
-        if (NOT sodium_USE_STATIC_LIBS)
+        if (NOT libsodium_USE_STATIC_LIBS)
             set(CMAKE_FIND_LIBRARY_SUFFIXES_BCK ${CMAKE_FIND_LIBRARY_SUFFIXES})
             set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll")
-            find_library(sodium_DLL_DEBUG libsodium
-                HINTS ${sodium_DIR}
+            find_library(libsodium_DLL_DEBUG libsodium
+                HINTS ${libsodium_DIR}
                 PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX}
             )
-            find_library(sodium_DLL_RELEASE libsodium
-                HINTS ${sodium_DIR}
+            find_library(libsodium_DLL_RELEASE libsodium
+                HINTS ${libsodium_DIR}
                 PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX}
             )
             set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_BCK})
         endif()
 
     elseif(_GCC_COMPATIBLE)
-        if (sodium_USE_STATIC_LIBS)
-            find_library(sodium_LIBRARY_DEBUG libsodium.a
-                HINTS ${sodium_DIR}
+        if (libsodium_USE_STATIC_LIBS)
+            find_library(libsodium_LIBRARY_DEBUG libsodium.a
+                HINTS ${libsodium_DIR}
                 PATH_SUFFIXES lib
             )
-            find_library(sodium_LIBRARY_RELEASE libsodium.a
-                HINTS ${sodium_DIR}
+            find_library(libsodium_LIBRARY_RELEASE libsodium.a
+                HINTS ${libsodium_DIR}
                 PATH_SUFFIXES lib
             )
         else()
-            find_library(sodium_LIBRARY_DEBUG libsodium.dll.a
-                HINTS ${sodium_DIR}
+            find_library(libsodium_LIBRARY_DEBUG libsodium.dll.a
+                HINTS ${libsodium_DIR}
                 PATH_SUFFIXES lib
             )
-            find_library(sodium_LIBRARY_RELEASE libsodium.dll.a
-                HINTS ${sodium_DIR}
+            find_library(libsodium_LIBRARY_RELEASE libsodium.dll.a
+                HINTS ${libsodium_DIR}
                 PATH_SUFFIXES lib
             )
 
             file(GLOB _DLL
                 LIST_DIRECTORIES false
-                RELATIVE "${sodium_DIR}/bin"
-                "${sodium_DIR}/bin/libsodium*.dll"
+                RELATIVE "${libsodium_DIR}/bin"
+                "${libsodium_DIR}/bin/libsodium*.dll"
             )
-            find_library(sodium_DLL_DEBUG ${_DLL} libsodium
-                HINTS ${sodium_DIR}
+            find_library(libsodium_DLL_DEBUG ${_DLL} libsodium
+                HINTS ${libsodium_DIR}
                 PATH_SUFFIXES bin
             )
-            find_library(sodium_DLL_RELEASE ${_DLL} libsodium
-                HINTS ${sodium_DIR}
+            find_library(libsodium_DLL_RELEASE ${_DLL} libsodium
+                HINTS ${libsodium_DIR}
                 PATH_SUFFIXES bin
             )
         endif()
@@ -211,14 +211,14 @@ endif()
 ########################################################################
 # common stuff
 
-# extract sodium version
-if (sodium_INCLUDE_DIR)
-    set(_VERSION_HEADER "${sodium_INCLUDE_DIR}/sodium/version.h")
+# extract libsodium version
+if (libsodium_INCLUDE_DIR)
+    set(_VERSION_HEADER "${libsodium_INCLUDE_DIR}/sodium/version.h")
     if (EXISTS "${_VERSION_HEADER}")
         file(READ "${_VERSION_HEADER}" _VERSION_HEADER_CONTENT)
         string(REGEX REPLACE ".*#[ \t]*define[ \t]*SODIUM_VERSION_STRING[ \t]*\"([^\n]*)\".*" "\\1"
-            sodium_VERSION "${_VERSION_HEADER_CONTENT}")
-        set(sodium_VERSION "${sodium_VERSION}")
+            libsodium_VERSION "${_VERSION_HEADER_CONTENT}")
+        set(libsodium_VERSION "${libsodium_VERSION}")
     endif()
 endif()
 
@@ -226,62 +226,63 @@ endif()
 include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(sodium
     REQUIRED_VARS
-        sodium_LIBRARY_RELEASE
-        sodium_LIBRARY_DEBUG
-        sodium_INCLUDE_DIR
+        libsodium_LIBRARY_RELEASE
+        libsodium_LIBRARY_DEBUG
+        libsodium_INCLUDE_DIR
     VERSION_VAR
-        sodium_VERSION
+        libsodium_VERSION
 )
 
 # mark file paths as advanced
-mark_as_advanced(sodium_INCLUDE_DIR)
-mark_as_advanced(sodium_LIBRARY_DEBUG)
-mark_as_advanced(sodium_LIBRARY_RELEASE)
+mark_as_advanced(libsodium_INCLUDE_DIR)
+mark_as_advanced(libsodium_LIBRARY_DEBUG)
+mark_as_advanced(libsodium_LIBRARY_RELEASE)
 if (WIN32)
-    mark_as_advanced(sodium_DLL_DEBUG)
-    mark_as_advanced(sodium_DLL_RELEASE)
+    mark_as_advanced(libsodium_DLL_DEBUG)
+    mark_as_advanced(libsodium_DLL_RELEASE)
 endif()
 
 # create imported target
-if(sodium_USE_STATIC_LIBS)
+if(libsodium_USE_STATIC_LIBS)
     set(_LIB_TYPE STATIC)
 else()
     set(_LIB_TYPE SHARED)
 endif()
-add_library(sodium ${_LIB_TYPE} IMPORTED)
+add_library(libsodium ${_LIB_TYPE} IMPORTED GLOBAL)
 
-set_target_properties(sodium PROPERTIES
-    INTERFACE_INCLUDE_DIRECTORIES "${sodium_INCLUDE_DIR}"
+set_target_properties(libsodium PROPERTIES
+    INTERFACE_INCLUDE_DIRECTORIES "${libsodium_INCLUDE_DIR}"
     IMPORTED_LINK_INTERFACE_LANGUAGES "C"
 )
+add_library(libsodium::libsodium ALIAS libsodium)
 
-if (sodium_USE_STATIC_LIBS)
-    set_target_properties(sodium PROPERTIES
+if (libsodium_USE_STATIC_LIBS)
+    set_target_properties(libsodium PROPERTIES
         INTERFACE_COMPILE_DEFINITIONS "SODIUM_STATIC"
-        IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}"
-        IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}"
+        IMPORTED_LOCATION "${libsodium_LIBRARY_RELEASE}"
+        IMPORTED_LOCATION_DEBUG "${libsodium_LIBRARY_DEBUG}"
     )
 else()
     if (UNIX)
-        set_target_properties(sodium PROPERTIES
-            IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}"
-            IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}"
+        set_target_properties(libsodium PROPERTIES
+            IMPORTED_LOCATION "${libsodium_LIBRARY_RELEASE}"
+            IMPORTED_LOCATION_DEBUG "${libsodium_LIBRARY_DEBUG}"
         )
     elseif (WIN32)
-        set_target_properties(sodium PROPERTIES
-            IMPORTED_IMPLIB "${sodium_LIBRARY_RELEASE}"
-            IMPORTED_IMPLIB_DEBUG "${sodium_LIBRARY_DEBUG}"
+        set_target_properties(libsodium PROPERTIES
+            IMPORTED_IMPLIB "${libsodium_LIBRARY_RELEASE}"
+            IMPORTED_IMPLIB_DEBUG "${libsodium_LIBRARY_DEBUG}"
         )
-        if (NOT (sodium_DLL_DEBUG MATCHES ".*-NOTFOUND"))
-            set_target_properties(sodium PROPERTIES
-                IMPORTED_LOCATION_DEBUG "${sodium_DLL_DEBUG}"
+        if (NOT (libsodium_DLL_DEBUG MATCHES ".*-NOTFOUND"))
+            set_target_properties(libsodium PROPERTIES
+                IMPORTED_LOCATION_DEBUG "${libsodium_DLL_DEBUG}"
             )
         endif()
-        if (NOT (sodium_DLL_RELEASE MATCHES ".*-NOTFOUND"))
-            set_target_properties(sodium PROPERTIES
-                IMPORTED_LOCATION_RELWITHDEBINFO "${sodium_DLL_RELEASE}"
-                IMPORTED_LOCATION_MINSIZEREL "${sodium_DLL_RELEASE}"
-                IMPORTED_LOCATION_RELEASE "${sodium_DLL_RELEASE}"
+        if (NOT (libsodium_DLL_RELEASE MATCHES ".*-NOTFOUND"))
+            set_target_properties(libsodium PROPERTIES
+                IMPORTED_LOCATION_RELWITHDEBINFO "${libsodium_DLL_RELEASE}"
+                IMPORTED_LOCATION_MINSIZEREL "${libsodium_DLL_RELEASE}"
+                IMPORTED_LOCATION_RELEASE "${libsodium_DLL_RELEASE}"
             )
         endif()
     endif()
diff --git a/cmake/HunterGate.cmake b/cmake/HunterGate.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..e78d3e8912a0dcce1a2f22763690e574d5c00e74
--- /dev/null
+++ b/cmake/HunterGate.cmake
@@ -0,0 +1,528 @@
+# Copyright (c) 2013-2019, Ruslan Baratov
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice, this
+#   list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright notice,
+#   this list of conditions and the following disclaimer in the documentation
+#   and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# This is a gate file to Hunter package manager.
+# Include this file using `include` command and add package you need, example:
+#
+#     cmake_minimum_required(VERSION 3.2)
+#
+#     include("cmake/HunterGate.cmake")
+#     HunterGate(
+#         URL "https://github.com/path/to/hunter/archive.tar.gz"
+#         SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d"
+#     )
+#
+#     project(MyProject)
+#
+#     hunter_add_package(Foo)
+#     hunter_add_package(Boo COMPONENTS Bar Baz)
+#
+# Projects:
+#     * https://github.com/hunter-packages/gate/
+#     * https://github.com/ruslo/hunter
+
+option(HUNTER_ENABLED "Enable Hunter package manager support" ON)
+
+if(HUNTER_ENABLED)
+  if(CMAKE_VERSION VERSION_LESS "3.2")
+    message(
+        FATAL_ERROR
+        "At least CMake version 3.2 required for Hunter dependency management."
+        " Update CMake or set HUNTER_ENABLED to OFF."
+    )
+  endif()
+endif()
+
+include(CMakeParseArguments) # cmake_parse_arguments
+
+option(HUNTER_STATUS_PRINT "Print working status" ON)
+option(HUNTER_STATUS_DEBUG "Print a lot info" OFF)
+option(HUNTER_TLS_VERIFY "Enable/disable TLS certificate checking on downloads" ON)
+
+set(HUNTER_ERROR_PAGE "https://docs.hunter.sh/en/latest/reference/errors")
+
+function(hunter_gate_status_print)
+  if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG)
+    foreach(print_message ${ARGV})
+      message(STATUS "[hunter] ${print_message}")
+    endforeach()
+  endif()
+endfunction()
+
+function(hunter_gate_status_debug)
+  if(HUNTER_STATUS_DEBUG)
+    foreach(print_message ${ARGV})
+      string(TIMESTAMP timestamp)
+      message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}")
+    endforeach()
+  endif()
+endfunction()
+
+function(hunter_gate_error_page error_page)
+  message("------------------------------ ERROR ------------------------------")
+  message("    ${HUNTER_ERROR_PAGE}/${error_page}.html")
+  message("-------------------------------------------------------------------")
+  message("")
+  message(FATAL_ERROR "")
+endfunction()
+
+function(hunter_gate_internal_error)
+  message("")
+  foreach(print_message ${ARGV})
+    message("[hunter ** INTERNAL **] ${print_message}")
+  endforeach()
+  message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
+  message("")
+  hunter_gate_error_page("error.internal")
+endfunction()
+
+function(hunter_gate_fatal_error)
+  cmake_parse_arguments(hunter "" "ERROR_PAGE" "" "${ARGV}")
+  if("${hunter_ERROR_PAGE}" STREQUAL "")
+    hunter_gate_internal_error("Expected ERROR_PAGE")
+  endif()
+  message("")
+  foreach(x ${hunter_UNPARSED_ARGUMENTS})
+    message("[hunter ** FATAL ERROR **] ${x}")
+  endforeach()
+  message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
+  message("")
+  hunter_gate_error_page("${hunter_ERROR_PAGE}")
+endfunction()
+
+function(hunter_gate_user_error)
+  hunter_gate_fatal_error(${ARGV} ERROR_PAGE "error.incorrect.input.data")
+endfunction()
+
+function(hunter_gate_self root version sha1 result)
+  string(COMPARE EQUAL "${root}" "" is_bad)
+  if(is_bad)
+    hunter_gate_internal_error("root is empty")
+  endif()
+
+  string(COMPARE EQUAL "${version}" "" is_bad)
+  if(is_bad)
+    hunter_gate_internal_error("version is empty")
+  endif()
+
+  string(COMPARE EQUAL "${sha1}" "" is_bad)
+  if(is_bad)
+    hunter_gate_internal_error("sha1 is empty")
+  endif()
+
+  string(SUBSTRING "${sha1}" 0 7 archive_id)
+
+  set(
+      hunter_self
+      "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked"
+  )
+
+  set("${result}" "${hunter_self}" PARENT_SCOPE)
+endfunction()
+
+# Set HUNTER_GATE_ROOT cmake variable to suitable value.
+function(hunter_gate_detect_root)
+  # Check CMake variable
+  string(COMPARE NOTEQUAL "${HUNTER_ROOT}" "" not_empty)
+  if(not_empty)
+    set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE)
+    hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable")
+    return()
+  endif()
+
+  # Check environment variable
+  string(COMPARE NOTEQUAL "$ENV{HUNTER_ROOT}" "" not_empty)
+  if(not_empty)
+    set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE)
+    hunter_gate_status_debug("HUNTER_ROOT detected by environment variable")
+    return()
+  endif()
+
+  # Check HOME environment variable
+  string(COMPARE NOTEQUAL "$ENV{HOME}" "" result)
+  if(result)
+    set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE)
+    hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable")
+    return()
+  endif()
+
+  # Check SYSTEMDRIVE and USERPROFILE environment variable (windows only)
+  if(WIN32)
+    string(COMPARE NOTEQUAL "$ENV{SYSTEMDRIVE}" "" result)
+    if(result)
+      set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE)
+      hunter_gate_status_debug(
+          "HUNTER_ROOT set using SYSTEMDRIVE environment variable"
+      )
+      return()
+    endif()
+
+    string(COMPARE NOTEQUAL "$ENV{USERPROFILE}" "" result)
+    if(result)
+      set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE)
+      hunter_gate_status_debug(
+          "HUNTER_ROOT set using USERPROFILE environment variable"
+      )
+      return()
+    endif()
+  endif()
+
+  hunter_gate_fatal_error(
+      "Can't detect HUNTER_ROOT"
+      ERROR_PAGE "error.detect.hunter.root"
+  )
+endfunction()
+
+function(hunter_gate_download dir)
+  string(
+      COMPARE
+      NOTEQUAL
+      "$ENV{HUNTER_DISABLE_AUTOINSTALL}"
+      ""
+      disable_autoinstall
+  )
+  if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL)
+    hunter_gate_fatal_error(
+        "Hunter not found in '${dir}'"
+        "Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'"
+        "Settings:"
+        "  HUNTER_ROOT: ${HUNTER_GATE_ROOT}"
+        "  HUNTER_SHA1: ${HUNTER_GATE_SHA1}"
+        ERROR_PAGE "error.run.install"
+    )
+  endif()
+  string(COMPARE EQUAL "${dir}" "" is_bad)
+  if(is_bad)
+    hunter_gate_internal_error("Empty 'dir' argument")
+  endif()
+
+  string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad)
+  if(is_bad)
+    hunter_gate_internal_error("HUNTER_GATE_SHA1 empty")
+  endif()
+
+  string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad)
+  if(is_bad)
+    hunter_gate_internal_error("HUNTER_GATE_URL empty")
+  endif()
+
+  set(done_location "${dir}/DONE")
+  set(sha1_location "${dir}/SHA1")
+
+  set(build_dir "${dir}/Build")
+  set(cmakelists "${dir}/CMakeLists.txt")
+
+  hunter_gate_status_debug("Locking directory: ${dir}")
+  file(LOCK "${dir}" DIRECTORY GUARD FUNCTION)
+  hunter_gate_status_debug("Lock done")
+
+  if(EXISTS "${done_location}")
+    # while waiting for lock other instance can do all the job
+    hunter_gate_status_debug("File '${done_location}' found, skip install")
+    return()
+  endif()
+
+  file(REMOVE_RECURSE "${build_dir}")
+  file(REMOVE_RECURSE "${cmakelists}")
+
+  file(MAKE_DIRECTORY "${build_dir}") # check directory permissions
+
+  # Disabling languages speeds up a little bit, reduces noise in the output
+  # and avoids path too long windows error
+  file(
+      WRITE
+      "${cmakelists}"
+      "cmake_minimum_required(VERSION 3.2)\n"
+      "project(HunterDownload LANGUAGES NONE)\n"
+      "include(ExternalProject)\n"
+      "ExternalProject_Add(\n"
+      "    Hunter\n"
+      "    URL\n"
+      "    \"${HUNTER_GATE_URL}\"\n"
+      "    URL_HASH\n"
+      "    SHA1=${HUNTER_GATE_SHA1}\n"
+      "    DOWNLOAD_DIR\n"
+      "    \"${dir}\"\n"
+      "    TLS_VERIFY\n"
+      "    ${HUNTER_TLS_VERIFY}\n"
+      "    SOURCE_DIR\n"
+      "    \"${dir}/Unpacked\"\n"
+      "    CONFIGURE_COMMAND\n"
+      "    \"\"\n"
+      "    BUILD_COMMAND\n"
+      "    \"\"\n"
+      "    INSTALL_COMMAND\n"
+      "    \"\"\n"
+      ")\n"
+  )
+
+  if(HUNTER_STATUS_DEBUG)
+    set(logging_params "")
+  else()
+    set(logging_params OUTPUT_QUIET)
+  endif()
+
+  hunter_gate_status_debug("Run generate")
+
+  # Need to add toolchain file too.
+  # Otherwise on Visual Studio + MDD this will fail with error:
+  # "Could not find an appropriate version of the Windows 10 SDK installed on this machine"
+  if(EXISTS "${CMAKE_TOOLCHAIN_FILE}")
+    get_filename_component(absolute_CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE)
+    set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${absolute_CMAKE_TOOLCHAIN_FILE}")
+  else()
+    # 'toolchain_arg' can't be empty
+    set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=")
+  endif()
+
+  string(COMPARE EQUAL "${CMAKE_MAKE_PROGRAM}" "" no_make)
+  if(no_make)
+    set(make_arg "")
+  else()
+    # Test case: remove Ninja from PATH but set it via CMAKE_MAKE_PROGRAM
+    set(make_arg "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}")
+  endif()
+
+  execute_process(
+      COMMAND
+      "${CMAKE_COMMAND}"
+      "-H${dir}"
+      "-B${build_dir}"
+      "-G${CMAKE_GENERATOR}"
+      "${toolchain_arg}"
+      ${make_arg}
+      WORKING_DIRECTORY "${dir}"
+      RESULT_VARIABLE download_result
+      ${logging_params}
+  )
+
+  if(NOT download_result EQUAL 0)
+    hunter_gate_internal_error(
+        "Configure project failed."
+        "To reproduce the error run: ${CMAKE_COMMAND} -H${dir} -B${build_dir} -G${CMAKE_GENERATOR} ${toolchain_arg} ${make_arg}"
+        "In directory ${dir}"
+    )
+  endif()
+
+  hunter_gate_status_print(
+      "Initializing Hunter workspace (${HUNTER_GATE_SHA1})"
+      "  ${HUNTER_GATE_URL}"
+      "  -> ${dir}"
+  )
+  execute_process(
+      COMMAND "${CMAKE_COMMAND}" --build "${build_dir}"
+      WORKING_DIRECTORY "${dir}"
+      RESULT_VARIABLE download_result
+      ${logging_params}
+  )
+
+  if(NOT download_result EQUAL 0)
+    hunter_gate_internal_error("Build project failed")
+  endif()
+
+  file(REMOVE_RECURSE "${build_dir}")
+  file(REMOVE_RECURSE "${cmakelists}")
+
+  file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}")
+  file(WRITE "${done_location}" "DONE")
+
+  hunter_gate_status_debug("Finished")
+endfunction()
+
+# Must be a macro so master file 'cmake/Hunter' can
+# apply all variables easily just by 'include' command
+# (otherwise PARENT_SCOPE magic needed)
+macro(HunterGate)
+  if(HUNTER_GATE_DONE)
+    # variable HUNTER_GATE_DONE set explicitly for external project
+    # (see `hunter_download`)
+    set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
+  endif()
+
+  # First HunterGate command will init Hunter, others will be ignored
+  get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET)
+
+  if(NOT HUNTER_ENABLED)
+    # Empty function to avoid error "unknown function"
+    function(hunter_add_package)
+    endfunction()
+
+    set(
+        _hunter_gate_disabled_mode_dir
+        "${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/disabled-mode"
+    )
+    if(EXISTS "${_hunter_gate_disabled_mode_dir}")
+      hunter_gate_status_debug(
+          "Adding \"disabled-mode\" modules: ${_hunter_gate_disabled_mode_dir}"
+      )
+      list(APPEND CMAKE_PREFIX_PATH "${_hunter_gate_disabled_mode_dir}")
+    endif()
+  elseif(_hunter_gate_done)
+    hunter_gate_status_debug("Secondary HunterGate (use old settings)")
+    hunter_gate_self(
+        "${HUNTER_CACHED_ROOT}"
+        "${HUNTER_VERSION}"
+        "${HUNTER_SHA1}"
+        _hunter_self
+    )
+    include("${_hunter_self}/cmake/Hunter")
+  else()
+    set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}")
+
+    string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name)
+    if(_have_project_name)
+      hunter_gate_fatal_error(
+          "Please set HunterGate *before* 'project' command. "
+          "Detected project: ${PROJECT_NAME}"
+          ERROR_PAGE "error.huntergate.before.project"
+      )
+    endif()
+
+    cmake_parse_arguments(
+        HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV}
+    )
+
+    string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1)
+    string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url)
+    string(
+        COMPARE
+        NOTEQUAL
+        "${HUNTER_GATE_UNPARSED_ARGUMENTS}"
+        ""
+        _have_unparsed
+    )
+    string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global)
+    string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath)
+
+    if(_have_unparsed)
+      hunter_gate_user_error(
+          "HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}"
+      )
+    endif()
+    if(_empty_sha1)
+      hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory")
+    endif()
+    if(_empty_url)
+      hunter_gate_user_error("URL suboption of HunterGate is mandatory")
+    endif()
+    if(_have_global)
+      if(HUNTER_GATE_LOCAL)
+        hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)")
+      endif()
+      if(_have_filepath)
+        hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)")
+      endif()
+    endif()
+    if(HUNTER_GATE_LOCAL)
+      if(_have_global)
+        hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)")
+      endif()
+      if(_have_filepath)
+        hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)")
+      endif()
+    endif()
+    if(_have_filepath)
+      if(_have_global)
+        hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)")
+      endif()
+      if(HUNTER_GATE_LOCAL)
+        hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)")
+      endif()
+    endif()
+
+    hunter_gate_detect_root() # set HUNTER_GATE_ROOT
+
+    # Beautify path, fix probable problems with windows path slashes
+    get_filename_component(
+        HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE
+    )
+    hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}")
+    if(NOT HUNTER_ALLOW_SPACES_IN_PATH)
+      string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces)
+      if(NOT _contain_spaces EQUAL -1)
+        hunter_gate_fatal_error(
+            "HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces."
+            "Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error"
+            "(Use at your own risk!)"
+            ERROR_PAGE "error.spaces.in.hunter.root"
+        )
+      endif()
+    endif()
+
+    string(
+        REGEX
+        MATCH
+        "[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*"
+        HUNTER_GATE_VERSION
+        "${HUNTER_GATE_URL}"
+    )
+    string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty)
+    if(_is_empty)
+      set(HUNTER_GATE_VERSION "unknown")
+    endif()
+
+    hunter_gate_self(
+        "${HUNTER_GATE_ROOT}"
+        "${HUNTER_GATE_VERSION}"
+        "${HUNTER_GATE_SHA1}"
+        _hunter_self
+    )
+
+    set(_master_location "${_hunter_self}/cmake/Hunter")
+    get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE)
+    set(_done_location "${_archive_id_location}/DONE")
+    set(_sha1_location "${_archive_id_location}/SHA1")
+
+    # Check Hunter already downloaded by HunterGate
+    if(NOT EXISTS "${_done_location}")
+      hunter_gate_download("${_archive_id_location}")
+    endif()
+
+    if(NOT EXISTS "${_done_location}")
+      hunter_gate_internal_error("hunter_gate_download failed")
+    endif()
+
+    if(NOT EXISTS "${_sha1_location}")
+      hunter_gate_internal_error("${_sha1_location} not found")
+    endif()
+    file(READ "${_sha1_location}" _sha1_value)
+    string(COMPARE EQUAL "${_sha1_value}" "${HUNTER_GATE_SHA1}" _is_equal)
+    if(NOT _is_equal)
+      hunter_gate_internal_error(
+          "Short SHA1 collision:"
+          "  ${_sha1_value} (from ${_sha1_location})"
+          "  ${HUNTER_GATE_SHA1} (HunterGate)"
+      )
+    endif()
+    if(NOT EXISTS "${_master_location}")
+      hunter_gate_user_error(
+          "Master file not found:"
+          "  ${_master_location}"
+          "try to update Hunter/HunterGate"
+      )
+    endif()
+    include("${_master_location}")
+    set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
+  endif()
+endmacro()
diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt
deleted file mode 100644
index d669e8a975e642e908ca1fd80b927af94ff7874b..0000000000000000000000000000000000000000
--- a/deps/CMakeLists.txt
+++ /dev/null
@@ -1,92 +0,0 @@
-cmake_minimum_required(VERSION 3.11)
-project(MTXCLIENT_DEPS)
-
-# Point CMake at any custom modules we may ship
-list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
-
-if(NOT CMAKE_BUILD_TYPE)
-  set(CMAKE_BUILD_TYPE Release)
-endif()
-
-set(DEPS_INSTALL_DIR "${CMAKE_BINARY_DIR}/usr"
-    CACHE PATH "Dependencies install directory.")
-set(DEPS_BIN_DIR "${DEPS_INSTALL_DIR}/bin"
-    CACHE PATH "Dependencies binary install directory.")
-set(DEPS_LIB_DIR "${DEPS_INSTALL_DIR}/lib"
-    CACHE PATH "Dependencies library install directory.")
-set(DEPS_BUILD_DIR "${CMAKE_BINARY_DIR}/build"
-    CACHE PATH "Dependencies build directory.")
-set(DEPS_DOWNLOAD_DIR "${DEPS_BUILD_DIR}/downloads"
-    CACHE PATH "Dependencies download directory.")
-
-option(USE_BUNDLED "Use bundled dependencies." ON)
-
-option(USE_BUNDLED_BOOST "Use the bundled version of Boost." ${USE_BUNDLED})
-option(USE_BUNDLED_SPDLOG "Use the bundled version of spdlog." ${USE_BUNDLED})
-option(USE_BUNDLED_OLM "Use the bundled version of libolm." ${USE_BUNDLED})
-option(USE_BUNDLED_GTEST "Use the bundled version of Google Test."
-       ${USE_BUNDLED})
-option(USE_BUNDLED_JSON "Use the bundled version of nlohmann json." ${USE_BUNDLED})
-
-option(USE_EXISTING_SRC_DIR
-       "Skip download of deps sources in case of existing source directory."
-       OFF)
-
-include(ExternalProject)
-
-if(USE_BUNDLED_BOOST)
-  # bundled boost is 1.70, which requires CMake 3.15 or greater.
-  cmake_minimum_required(VERSION 3.15)
-endif()
-
-set(BOOST_URL
-    https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.bz2)
-set(BOOST_SHA256
-    430ae8354789de4fd19ee52f3b1f739e1fba576f0aded0897c3c2bc00fb38778)
-
-set(GTEST_URL https://github.com/google/googletest/archive/release-1.8.0.tar.gz)
-set(GTEST_SHA1 e7e646a6204638fe8e87e165292b8dd9cd4c36ed)
-
-set(OLM_URL https://git.matrix.org/git/olm.git)
-set(OLM_TAG 4065c8e11a33ba41133a086ed3de4da94dcb6bae)
-
-set(SPDLOG_URL https://github.com/gabime/spdlog/archive/v1.1.0.tar.gz)
-set(SPDLOG_HASH
-    3dbcbfd8c07e25f5e0d662b194d3a7772ef214358c49ada23c044c4747ce8b19)
-
-set(JSON_URL
-    https://github.com/nlohmann/json.git)
-set(JSON_TAG
-    v3.2.0)
-
-if(USE_BUNDLED_JSON)
-  include(Json)
-endif()
-
-if(USE_BUNDLED_BOOST)
-  include(Boost)
-endif()
-
-if(USE_BUNDLED_SPDLOG)
-  include(SpdLog)
-endif()
-
-if(USE_BUNDLED_OLM)
-  include(Olm)
-endif()
-
-if(USE_BUNDLED_GTEST)
-  include(GoogleTest)
-endif()
-
-if(WIN32)
-  if("${TARGET_ARCH}" STREQUAL "X86_64")
-    set(TARGET_ARCH x64)
-  elseif(TARGET_ARCH STREQUAL "X86")
-    set(TARGET_ARCH ia32)
-  endif()
-endif()
-
-add_custom_target(third-party ALL
-                  COMMAND ${CMAKE_COMMAND} -E touch .third-party
-                  DEPENDS ${THIRD_PARTY_DEPS})
diff --git a/deps/cmake/Boost.cmake b/deps/cmake/Boost.cmake
deleted file mode 100644
index bfa3813dc3305a790be68971d53c9707353a0b2f..0000000000000000000000000000000000000000
--- a/deps/cmake/Boost.cmake
+++ /dev/null
@@ -1,23 +0,0 @@
-if(WIN32)
-  message(STATUS "Building Boost in Windows is not supported (skipping)")
-  return()
-endif()
-
-ExternalProject_Add(
-  Boost
-
-  URL ${BOOST_URL}
-  URL_HASH SHA256=${BOOST_SHA256}
-  DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/boost
-  DOWNLOAD_NO_PROGRESS 0
-
-  BUILD_IN_SOURCE 1
-  SOURCE_DIR ${DEPS_BUILD_DIR}/boost
-  CONFIGURE_COMMAND ${DEPS_BUILD_DIR}/boost/bootstrap.sh
-    --with-libraries=random,thread,system,iostreams,atomic,chrono,date_time,regex
-    --prefix=${DEPS_INSTALL_DIR}
-  BUILD_COMMAND ${DEPS_BUILD_DIR}/boost/b2 -d0 cxxstd=17 variant=release link=shared runtime-link=shared threading=multi --layout=system
-  INSTALL_COMMAND ${DEPS_BUILD_DIR}/boost/b2 -d0 install
-)
-
-list(APPEND THIRD_PARTY_DEPS Boost)
diff --git a/deps/cmake/GoogleTest.cmake b/deps/cmake/GoogleTest.cmake
deleted file mode 100644
index 631d5939341bffa0a10abc3e9cdfc70a3a0c740f..0000000000000000000000000000000000000000
--- a/deps/cmake/GoogleTest.cmake
+++ /dev/null
@@ -1,24 +0,0 @@
-if(WIN32)
-  message(STATUS "Building gtest in Windows is not supported (skipping)")
-  return()
-endif()
-
-ExternalProject_Add(
-  GTest
-
-  URL ${GTEST_URL}
-  URL_HASH SHA1=${GTEST_SHA1}
-  DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/gtest
-  DOWNLOAD_NO_PROGRESS 0
-
-  BUILD_IN_SOURCE 1
-  SOURCE_DIR ${DEPS_BUILD_DIR}/gtest
-  CONFIGURE_COMMAND ${CMAKE_COMMAND}
-        -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
-        -DCMAKE_BUILD_TYPE=Release
-        ${DEPS_BUILD_DIR}/gtest
-  BUILD_COMMAND ${CMAKE_COMMAND}
-        --build ${DEPS_BUILD_DIR}/gtest
-        --config Release)
-
-list(APPEND THIRD_PARTY_DEPS GTest)
diff --git a/deps/cmake/Json.cmake b/deps/cmake/Json.cmake
deleted file mode 100644
index c5e66cea2bbf47d4f0fb157bac0ec75d4d26fa8d..0000000000000000000000000000000000000000
--- a/deps/cmake/Json.cmake
+++ /dev/null
@@ -1,19 +0,0 @@
-ExternalProject_Add(
-  Json
-
-  GIT_REPOSITORY ${JSON_URL}
-  GIT_TAG ${JSON_TAG}
-
-  BUILD_IN_SOURCE 1
-  SOURCE_DIR ${DEPS_BUILD_DIR}/json
-
-  CONFIGURE_COMMAND ${CMAKE_COMMAND}
-        -DJSON_BuildTests=OFF
-        -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
-        -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
-
-  BUILD_COMMAND ${CMAKE_COMMAND} --build ${DEPS_BUILD_DIR}/json 
-  INSTALL_COMMAND ${CMAKE_COMMAND} --build ${DEPS_BUILD_DIR}/json --target install
-)
-
-list(APPEND THIRD_PARTY_DEPS Json)
diff --git a/deps/cmake/Olm.cmake b/deps/cmake/Olm.cmake
deleted file mode 100644
index a5b8be76e34380ec066c866f82e1d1bc58da20b5..0000000000000000000000000000000000000000
--- a/deps/cmake/Olm.cmake
+++ /dev/null
@@ -1,34 +0,0 @@
-set(WINDOWS_FLAGS "")
-
-if(MSVC)
-    set(WINDOWS_FLAGS "-DCMAKE_GENERATOR_PLATFORM=x64")
-endif()
-
-ExternalProject_Add(
-  Olm
-
-  GIT_REPOSITORY ${OLM_URL}
-  GIT_TAG ${OLM_TAG}
-
-  BUILD_IN_SOURCE 1
-  SOURCE_DIR ${DEPS_BUILD_DIR}/olm
-  CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
-      ${CMAKE_CURRENT_SOURCE_DIR}/cmake/OlmCMakeLists.txt
-      ${DEPS_BUILD_DIR}/olm/CMakeLists.txt
-    COMMAND ${CMAKE_COMMAND} -E copy
-      ${CMAKE_CURRENT_SOURCE_DIR}/cmake/OlmConfig.cmake.in
-      ${DEPS_BUILD_DIR}/olm/cmake/OlmConfig.cmake.in
-    COMMAND ${CMAKE_COMMAND}
-      -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
-      -DCMAKE_BUILD_TYPE=Release
-      ${DEPS_BUILD_DIR}/olm
-      ${WINDOWS_FLAGS}
-  BUILD_COMMAND ${CMAKE_COMMAND}
-    --build ${DEPS_BUILD_DIR}/olm
-    --config Release
-  INSTALL_COMMAND ${CMAKE_COMMAND}
-    --build ${DEPS_BUILD_DIR}/olm
-    --config Release
-    --target install)
-
-list(APPEND THIRD_PARTY_DEPS Olm)
diff --git a/deps/cmake/OlmCMakeLists.txt b/deps/cmake/OlmCMakeLists.txt
deleted file mode 100644
index 4e96e1b2f5ee48f2e7931009d7819bf9fa2f0230..0000000000000000000000000000000000000000
--- a/deps/cmake/OlmCMakeLists.txt
+++ /dev/null
@@ -1,106 +0,0 @@
-cmake_minimum_required(VERSION 3.1)
-
-project(olm VERSION 2.2.2 LANGUAGES CXX C)
-
-add_definitions(-DOLMLIB_VERSION_MAJOR=${PROJECT_VERSION_MAJOR})
-add_definitions(-DOLMLIB_VERSION_MINOR=${PROJECT_VERSION_MINOR})
-add_definitions(-DOLMLIB_VERSION_PATCH=${PROJECT_VERSION_PATCH})
-
-set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
-set(CMAKE_CXX_STANDARD 11)
-set(CMAKE_CXX_STANDARD_REQUIRED ON)
-set(CMAKE_C_STANDARD 99)
-set(CMAKE_C_STANDARD_REQUIRED ON)
-set(CMAKE_POSITION_INDEPENDENT_CODE ON)
-
-if(NOT CMAKE_BUILD_TYPE)
-    set(CMAKE_BUILD_TYPE Release)
-endif()
-
-add_library(olm
-    src/account.cpp
-    src/base64.cpp
-    src/cipher.cpp
-    src/crypto.cpp
-    src/memory.cpp
-    src/message.cpp
-    src/pickle.cpp
-    src/ratchet.cpp
-    src/session.cpp
-    src/utility.cpp
-
-    src/ed25519.c
-    src/error.c
-    src/inbound_group_session.c
-    src/megolm.c
-    src/olm.cpp
-    src/outbound_group_session.c
-    src/pickle_encoding.c
-
-    lib/crypto-algorithms/aes.c
-    lib/crypto-algorithms/sha256.c
-    lib/curve25519-donna/curve25519-donna.c)
-add_library(Olm::Olm ALIAS olm)
-
-target_include_directories(olm
-    PUBLIC
-        $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
-        $<INSTALL_INTERFACE:include>
-    PRIVATE
-        ${CMAKE_CURRENT_SOURCE_DIR}/lib)
-
-set_target_properties(olm PROPERTIES
-   SOVERSION ${PROJECT_VERSION_MAJOR}
-   VERSION ${PROJECT_VERSION})
-
-set_target_properties(olm PROPERTIES
-    ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}
-    LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}
-    RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
-
-#
-# Installation
-#
-include(GNUInstallDirs)
-set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/Olm)
-install(TARGETS olm
-    EXPORT olm-targets
-    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
-    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
-
-# The exported target will be named Olm.
-set_target_properties(olm PROPERTIES EXPORT_NAME Olm)
-install(FILES
-    ${CMAKE_SOURCE_DIR}/include/olm/olm.h
-    ${CMAKE_SOURCE_DIR}/include/olm/outbound_group_session.h
-    ${CMAKE_SOURCE_DIR}/include/olm/inbound_group_session.h
-    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/olm)
-
-# Export the targets to a script.
-install(EXPORT olm-targets
-  FILE OlmTargets.cmake
-  NAMESPACE Olm::
-  DESTINATION ${INSTALL_CONFIGDIR})
-
-# Create a ConfigVersion.cmake file.
-include(CMakePackageConfigHelpers)
-configure_package_config_file(
-    ${CMAKE_CURRENT_LIST_DIR}/cmake/OlmConfig.cmake.in
-    ${CMAKE_CURRENT_BINARY_DIR}/OlmConfig.cmake
-    INSTALL_DESTINATION ${INSTALL_CONFIGDIR})
-write_basic_package_version_file(
-    ${CMAKE_CURRENT_BINARY_DIR}/OlmConfigVersion.cmake
-    VERSION ${PROJECT_VERSION}
-    COMPATIBILITY SameMajorVersion)
-
-#Install the config & configversion.
-install(FILES
-    ${CMAKE_CURRENT_BINARY_DIR}/OlmConfig.cmake
-    ${CMAKE_CURRENT_BINARY_DIR}/OlmConfigVersion.cmake
-    DESTINATION ${INSTALL_CONFIGDIR})
-
-# Register package in user's package registry
-export(EXPORT olm-targets
-    FILE ${CMAKE_CURRENT_BINARY_DIR}/OlmTargets.cmake
-    NAMESPACE Olm::)
-export(PACKAGE Olm)
diff --git a/deps/cmake/OlmConfig.cmake.in b/deps/cmake/OlmConfig.cmake.in
deleted file mode 100644
index b670fe85104dbaf360f4b42e37536b2e747c24d2..0000000000000000000000000000000000000000
--- a/deps/cmake/OlmConfig.cmake.in
+++ /dev/null
@@ -1,11 +0,0 @@
-get_filename_component(Olm_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
-include(CMakeFindDependencyMacro)
-
-list(APPEND CMAKE_MODULE_PATH ${Olm_CMAKE_DIR})
-list(REMOVE_AT CMAKE_MODULE_PATH -1)
-
-if(NOT TARGET Olm::Olm)
-  include("${Olm_CMAKE_DIR}/OlmTargets.cmake")
-endif()
-
-set(Olm_LIBRARIES Olm::Olm)
diff --git a/deps/cmake/SpdLog.cmake b/deps/cmake/SpdLog.cmake
deleted file mode 100644
index 7726d88c7fc0284c2f94d9e0df3a34b9e8d83d18..0000000000000000000000000000000000000000
--- a/deps/cmake/SpdLog.cmake
+++ /dev/null
@@ -1,17 +0,0 @@
-ExternalProject_Add(
-  SpdLog
-
-  URL ${SPDLOG_URL}
-  URL_HASH SHA256=${SPDLOG_HASH}
-
-  BUILD_IN_SOURCE 1
-  SOURCE_DIR ${DEPS_BUILD_DIR}/spdlog
-  CONFIGURE_COMMAND ${CMAKE_COMMAND}
-        -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
-        -DCMAKE_BUILD_TYPE=Release
-        -DSPDLOG_BUILD_EXAMPLES=0
-        -DSPDLOG_BUILD_TESTING=0
-        ${DEPS_BUILD_DIR}/spdlog
-)
-
-list(APPEND THIRD_PARTY_DEPS SpdLog)
diff --git a/toolchain.cmake b/toolchain.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..85571957a9f28e1d4aac456d6ce94074edf67187
--- /dev/null
+++ b/toolchain.cmake
@@ -0,0 +1,3 @@
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_POSITION_INDEPENDENT_CODE ON)