diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt
new file mode 100644
index 00000000..06b1f7e1
--- /dev/null
+++ b/deps/CMakeLists.txt
@@ -0,0 +1,82 @@
+cmake_minimum_required(VERSION 3.1)
+project(NHEKO_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_MATRIX_STRUCTS "Use the bundled version of matrix-structs."
+ ${USE_BUNDLED})
+option(USE_BUNDLED_MATRIX_CLIENT "Use the bundled version of mtxclient."
+ ${USE_BUNDLED})
+
+include(ExternalProject)
+
+set(BOOST_URL
+ https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.tar.bz2)
+set(BOOST_SHA256
+ 5721818253e6a0989583192f96782c4a98eb6204965316df9f5ad75819225ca9)
+
+set(MATRIX_STRUCTS_URL https://github.com/mujx/matrix-structs)
+set(MATRIX_STRUCTS_TAG eeb7373729a1618e2b3838407863342b88b8a0de)
+
+set(MTXCLIENT_URL https://github.com/mujx/mtxclient)
+set(MTXCLIENT_TAG 68188721e042ff5b47ea9a87aa97d3a9efbca989)
+
+set(OLM_URL https://git.matrix.org/git/olm.git)
+set(OLM_TAG 4065c8e11a33ba41133a086ed3de4da94dcb6bae)
+
+set(SPDLOG_URL https://github.com/gabime/spdlog)
+set(SPDLOG_TAG 560df2878ad308b27873b3cc5e810635d69cfad6)
+
+if(USE_BUNDLED_BOOST)
+ include(Boost)
+endif()
+
+if(USE_BUNDLED_SPDLOG)
+ include(SpdLog)
+endif()
+
+if(USE_BUNDLED_OLM)
+ include(Olm)
+endif()
+
+if(USE_BUNDLED_MATRIX_STRUCTS)
+ include(MatrixStructs)
+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})
+
+if(USE_BUNDLED_MATRIX_CLIENT)
+ include(MatrixClient)
+ add_dependencies(MatrixClient third-party)
+endif()
diff --git a/deps/cmake/Boost.cmake b/deps/cmake/Boost.cmake
new file mode 100644
index 00000000..572d1d07
--- /dev/null
+++ b/deps/cmake/Boost.cmake
@@ -0,0 +1,23 @@
+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 variant=release link=static threading=multi --layout=system
+ INSTALL_COMMAND ${DEPS_BUILD_DIR}/boost/b2 -d0 install
+)
+
+list(APPEND THIRD_PARTY_DEPS Boost)
diff --git a/deps/cmake/MatrixClient.cmake b/deps/cmake/MatrixClient.cmake
new file mode 100644
index 00000000..d8dd48c7
--- /dev/null
+++ b/deps/cmake/MatrixClient.cmake
@@ -0,0 +1,31 @@
+set(PLATFORM_FLAGS "")
+
+if(MSVC)
+ set(PLATFORM_FLAGS "-DCMAKE_GENERATOR_PLATFORM=x64")
+endif()
+
+if(APPLE)
+ set(PLATFORM_FLAGS "-DOPENSSL_ROOT_DIR=/usr/local/opt/openssl")
+endif()
+
+ExternalProject_Add(
+ MatrixClient
+
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/mtxclient
+ GIT_REPOSITORY ${MTXCLIENT_URL}
+ GIT_TAG ${MTXCLIENT_TAG}
+
+ BUILD_IN_SOURCE 1
+ SOURCE_DIR ${DEPS_BUILD_DIR}/mtxclient
+ CONFIGURE_COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ -DCMAKE_BUILD_TYPE=Release
+ -DBUILD_LIB_TESTS=OFF
+ -DBUILD_LIB_EXAMPLES=OFF
+ -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
+ ${PLATFORM_FLAGS}
+ ${DEPS_BUILD_DIR}/mtxclient
+ BUILD_COMMAND
+ ${CMAKE_COMMAND} --build ${DEPS_BUILD_DIR}/mtxclient --config Release)
+
+list(APPEND THIRD_PARTY_DEPS MatrixClient)
diff --git a/deps/cmake/MatrixStructs.cmake b/deps/cmake/MatrixStructs.cmake
new file mode 100644
index 00000000..fd12ad39
--- /dev/null
+++ b/deps/cmake/MatrixStructs.cmake
@@ -0,0 +1,25 @@
+set(WINDOWS_FLAGS "")
+
+if(MSVC)
+ set(WINDOWS_FLAGS "-DCMAKE_GENERATOR_PLATFORM=x64")
+endif()
+
+ExternalProject_Add(
+ MatrixStructs
+
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/matrix_structs
+ GIT_REPOSITORY ${MATRIX_STRUCTS_URL}
+ GIT_TAG ${MATRIX_STRUCTS_TAG}
+
+ BUILD_IN_SOURCE 1
+ SOURCE_DIR ${DEPS_BUILD_DIR}/matrix_structs
+ CONFIGURE_COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ -DCMAKE_BUILD_TYPE=Release
+ ${DEPS_BUILD_DIR}/matrix_structs
+ ${WINDOWS_FLAGS}
+ BUILD_COMMAND ${CMAKE_COMMAND}
+ --build ${DEPS_BUILD_DIR}/matrix_structs
+ --config Release)
+
+list(APPEND THIRD_PARTY_DEPS MatrixStructs)
diff --git a/deps/cmake/Olm.cmake b/deps/cmake/Olm.cmake
new file mode 100644
index 00000000..a5b8be76
--- /dev/null
+++ b/deps/cmake/Olm.cmake
@@ -0,0 +1,34 @@
+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
new file mode 100644
index 00000000..529cbb92
--- /dev/null
+++ b/deps/cmake/OlmCMakeLists.txt
@@ -0,0 +1,107 @@
+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)
+write_basic_package_version_file(
+ ${CMAKE_CURRENT_BINARY_DIR}/OlmConfigVersion.cmake
+ VERSION ${PROJECT_VERSION}
+ COMPATIBILITY SameMajorVersion)
+
+configure_package_config_file(
+ ${CMAKE_CURRENT_LIST_DIR}/cmake/OlmConfig.cmake.in
+ ${CMAKE_CURRENT_BINARY_DIR}/OlmConfig.cmake
+ INSTALL_DESTINATION ${INSTALL_CONFIGDIR})
+
+#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
new file mode 100644
index 00000000..b670fe85
--- /dev/null
+++ b/deps/cmake/OlmConfig.cmake.in
@@ -0,0 +1,11 @@
+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
new file mode 100644
index 00000000..5a5f318c
--- /dev/null
+++ b/deps/cmake/SpdLog.cmake
@@ -0,0 +1,22 @@
+set(WINDOWS_FLAGS "")
+
+if(MSVC)
+ set(WINDOWS_FLAGS "-DCMAKE_GENERATOR_PLATFORM=x64")
+endif()
+
+ExternalProject_Add(
+ SpdLog
+
+ GIT_REPOSITORY ${SPDLOG_URL}
+ GIT_TAG ${SPDLOG_TAG}
+
+ BUILD_IN_SOURCE 1
+ SOURCE_DIR ${DEPS_BUILD_DIR}/spdlog
+ CONFIGURE_COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ -DSPDLOG_BUILD_EXAMPLES=0
+ -DSPDLOG_BUILD_TESTING=0
+ ${DEPS_BUILD_DIR}/spdlog
+ ${WINDOWS_FLAGS})
+
+list(APPEND THIRD_PARTY_DEPS SpdLog)
|