diff --git a/meson.build b/meson.build
index e9dc6de38fbe3d066c899b29bd8be96a24294813..a57c18995c765c76a60266ecb962f293d917ba3b 100644
--- a/meson.build
+++ b/meson.build
@@ -1,24 +1,24 @@
 project(
   'mtxclient',
   'cpp',
-version : '0.3.1',
-meson_version : '>=0.55.0',
+version : '0.5.1',
+meson_version : '>=0.57.0',
 license : 'MIT',
 default_options : 'cpp_std=c++17'
 )
 
 cmake = import('cmake')
 
-boost_dep = dependency('boost', version: '>=1.70', modules : ['iostreams', 'system', 'thread'])
-thread_dep = dependency('threads')
-openssl_dep = dependency('OpenSSL', version: '>=1.1')
+coeurl_dep = dependency('coeurl', required: true)
+thread_dep = dependency('threads', required: true)
+openssl_dep = dependency('openssl', version: '>=1.1', required: true)
 
-olm_dep = dependency('Olm', method: 'cmake', fallback: ['olm-wrap', 'olm_dep'])
+olm_dep = dependency('Olm', method: 'cmake', fallback: ['olm-wrap', 'olm_dep'], required: true)
 
-json_dep = dependency('nlohmann_json', version: '>=3.2.0')
+json_dep = dependency('nlohmann_json', version: '>=3.2.0', required: true)
 
 deps = [
-  boost_dep,
+  coeurl_dep,
   thread_dep,
   olm_dep,
   openssl_dep,
@@ -27,70 +27,76 @@ deps = [
 
 inc = include_directories('include')
 src = [
-  'lib/http/client.cpp',
-  'lib/http/session.cpp',
-  'lib/crypto/client.cpp',
-  'lib/crypto/encoding.cpp',
-  'lib/crypto/types.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/identifiers.cpp',
-  'lib/structs/pushrules.cpp',
-  'lib/structs/requests.cpp',
-  'lib/structs/secret_storage.cpp',
-  'lib/structs/user_interactive.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/presence.cpp',
-  'lib/structs/events/reaction.cpp',
-  'lib/structs/events/redaction.cpp',
-  'lib/structs/events/tag.cpp',
-  'lib/structs/events/tombstone.cpp',
-  'lib/structs/events/topic.cpp',
-  'lib/structs/events/voip.cpp',
-  'lib/structs/events/nheko_extensions/hidden_events.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/groups.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/turn_server.cpp',
-  'lib/structs/responses/version.cpp',
-  'lib/structs/responses/well-known.cpp'
+	'lib/crypto/client.cpp',
+	'lib/crypto/encoding.cpp',
+	'lib/crypto/types.cpp',
+	'lib/crypto/utils.cpp',
+	'lib/http/client.cpp',
+	'lib/log.cpp',
+	'lib/structs/common.cpp',
+	'lib/structs/errors.cpp',
+	'lib/structs/events.cpp',
+	'lib/structs/events/account_data/fully_read.cpp',
+	'lib/structs/events/aliases.cpp',
+	'lib/structs/events/avatar.cpp',
+	'lib/structs/events/canonical_alias.cpp',
+	'lib/structs/events/collections.cpp',
+	'lib/structs/events/common.cpp',
+	'lib/structs/events/create.cpp',
+	'lib/structs/events/encrypted.cpp',
+	'lib/structs/events/encryption.cpp',
+	'lib/structs/events/ephemeral/receipt.cpp',
+	'lib/structs/events/ephemeral/typing.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/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/events/mscs/image_packs.cpp',
+	'lib/structs/events/name.cpp',
+	'lib/structs/events/nheko_extensions/hidden_events.cpp',
+	'lib/structs/events/pinned_events.cpp',
+	'lib/structs/events/power_levels.cpp',
+	'lib/structs/events/presence.cpp',
+	'lib/structs/events/reaction.cpp',
+	'lib/structs/events/redaction.cpp',
+	'lib/structs/events/spaces.cpp',
+	'lib/structs/events/tag.cpp',
+	'lib/structs/events/tombstone.cpp',
+	'lib/structs/events/topic.cpp',
+	'lib/structs/events/unknown.cpp',
+	'lib/structs/events/voip.cpp',
+	'lib/structs/identifiers.cpp',
+	'lib/structs/pushrules.cpp',
+	'lib/structs/requests.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/groups.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/public_rooms.cpp',
+	'lib/structs/responses/register.cpp',
+	'lib/structs/responses/sync.cpp',
+	'lib/structs/responses/turn_server.cpp',
+	'lib/structs/responses/version.cpp',
+	'lib/structs/responses/well-known.cpp',
+	'lib/structs/secret_storage.cpp',
+	'lib/structs/user_interactive.cpp',
+	'lib/utils.cpp',
 ]
 
-matrix_client = shared_library('matrix_client',
+matrix_client = library('matrix_client',
     src,
     dependencies: deps,
     include_directories : inc,
@@ -101,6 +107,14 @@ matrix_client_dep = declare_dependency(
   dependencies: deps,
   include_directories: inc)
 
+pkg = import('pkgconfig')
+pkg.generate(matrix_client,
+  libraries : [matrix_client],
+  version : meson.project_version(),
+  filebase : meson.project_name(),
+  description : 'Client API library for Matrix.',
+  url : 'https://github.com/Nheko-Reborn/mtxclient)')
+
 conf = configuration_data()
 
 cmake.write_basic_package_version_file(
diff --git a/subprojects/coeurl.wrap b/subprojects/coeurl.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..9213d30938078c894cb5d2a1fcb053c48d0c6165
--- /dev/null
+++ b/subprojects/coeurl.wrap
@@ -0,0 +1,3 @@
+[wrap-git]
+url = https://nheko.im/nheko-reborn/coeurl.git
+revision = head
diff --git a/subprojects/curl.wrap b/subprojects/curl.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..a53ff8219f8e43bae6c55e1f781d07d220c548ab
--- /dev/null
+++ b/subprojects/curl.wrap
@@ -0,0 +1,2 @@
+[wrap-redirect]
+filename = coeurl/subprojects/curl.wrap
diff --git a/subprojects/libevent.wrap b/subprojects/libevent.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..9800153c4f55e97574aa2a063e3897f479d80599
--- /dev/null
+++ b/subprojects/libevent.wrap
@@ -0,0 +1,2 @@
+[wrap-redirect]
+filename = coeurl/subprojects/libevent.wrap
diff --git a/subprojects/openssl.wrap b/subprojects/openssl.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..3bf176e980647994c5d6d912ca40b9257a702ad1
--- /dev/null
+++ b/subprojects/openssl.wrap
@@ -0,0 +1,9 @@
+[wrap-file]
+directory = openssl-1.1.1k
+
+source_url = https://www.openssl.org/source/openssl-1.1.1k.tar.gz
+source_filename = openssl-1.1.1k.tar.gz
+source_hash = 892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5
+
+patch_directory = openssl-meson
+
diff --git a/subprojects/packagefiles/openssl-meson/meson.build b/subprojects/packagefiles/openssl-meson/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..a1db8cdcadbefee9591d8ba147966eeaf92e54c4
--- /dev/null
+++ b/subprojects/packagefiles/openssl-meson/meson.build
@@ -0,0 +1,21 @@
+project('Openssl meson wrapper', 'c',
+  meson_version : '>=0.55.0',
+  version: '1.1.1k',
+)
+
+mod = import('unstable_external_project')
+
+openssl = mod.add_project('Configure',
+  configure_options : [
+    '--prefix=@PREFIX@',
+    '--libdir=@LIBDIR@',
+    '-Dincludedir_ignore=@PREFIX@/@INCLUDEDIR@',
+    target_machine.system() + '-' + target_machine.cpu_family(),
+                      ],
+  verbose: true,
+)
+
+ssl_dep = openssl.dependency('ssl')
+crypto_dep = openssl.dependency('crypto')
+openssl_dep = declare_dependency(dependencies: [ssl_dep, crypto_dep])
+meson.override_dependency('openssl', ssl_dep)
diff --git a/subprojects/spdlog.wrap b/subprojects/spdlog.wrap
index 51e0ddbcff15d77391be4352c5af40e31270db2e..27cb98547ed211e96d14796fd059b7c79415aab5 100644
--- a/subprojects/spdlog.wrap
+++ b/subprojects/spdlog.wrap
@@ -1,9 +1,12 @@
 [wrap-file]
-directory = spdlog-1.8.0
-source_url = https://github.com/gabime/spdlog/archive/v1.8.0.tar.gz
-source_filename = v1.8.0.tar.gz
-source_hash = 1e68e9b40cf63bb022a4b18cdc1c9d88eb5d97e4fd64fa981950a9cacf57a4bf
-patch_url = https://wrapdb.mesonbuild.com/v1/projects/spdlog/1.8.0/1/get_zip
-patch_filename = spdlog-1.8.0-1-wrap.zip
-patch_hash = f783da51f6bebc99624504ca16fc1265b92add514956db9aa669a287d85b5049
+directory = spdlog-1.8.5
+source_url = https://github.com/gabime/spdlog/archive/v1.8.5.tar.gz
+source_filename = v1.8.5.tar.gz
+source_hash = 944d0bd7c763ac721398dca2bb0f3b5ed16f67cef36810ede5061f35a543b4b8
+patch_url = https://wrapdb.mesonbuild.com/v1/projects/spdlog/1.8.5/1/get_zip
+patch_filename = spdlog-1.8.5-1-wrap.zip
+patch_hash = 3c38f275d5792b1286391102594329e98b17737924b344f98312ab09929b74be
+
+[provide]
+spdlog = spdlog_dep