[fractal] Integrate matrix-rust-sdk and making it log in



commit 9757df278614e353604baa4b823a3031f3a241de
Author: Alejandro Domínguez <adomu net-c com>
Date:   Fri Jul 24 12:38:10 2020 +0200

    Integrate matrix-rust-sdk and making it log in

 Cargo.lock                                         | 998 ++++++++++++++++++++-
 fractal-gtk/Cargo.toml                             |   2 +
 fractal-gtk/src/actions/account_settings.rs        |   2 +-
 fractal-gtk/src/app/connect/language.rs            |   2 +-
 fractal-gtk/src/appop/account.rs                   |  28 +-
 fractal-gtk/src/appop/directory.rs                 |   7 +-
 fractal-gtk/src/appop/invite.rs                    |  11 +-
 fractal-gtk/src/appop/login.rs                     |  31 +-
 fractal-gtk/src/appop/media_viewer.rs              |   4 +-
 fractal-gtk/src/appop/member.rs                    |   6 +-
 fractal-gtk/src/appop/message.rs                   |  31 +-
 fractal-gtk/src/appop/mod.rs                       |  21 +-
 fractal-gtk/src/appop/notify.rs                    |   5 +-
 fractal-gtk/src/appop/room.rs                      |  44 +-
 fractal-gtk/src/appop/room_settings.rs             |   2 +-
 fractal-gtk/src/appop/start_chat.rs                |   2 +-
 fractal-gtk/src/appop/sync.rs                      |   2 +-
 fractal-gtk/src/appop/user.rs                      |  12 +-
 fractal-gtk/src/backend/mod.rs                     |  16 +-
 fractal-gtk/src/backend/register.rs                |   2 +-
 fractal-gtk/src/backend/sync.rs                    |   2 +-
 fractal-gtk/src/client.rs                          | 111 ++-
 fractal-gtk/src/widgets/address.rs                 |   2 +-
 fractal-gtk/src/widgets/member.rs                  |   4 +-
 fractal-gtk/src/widgets/room.rs                    |   2 +-
 fractal-gtk/src/widgets/room_history.rs            |   2 +-
 fractal-matrix-api/Cargo.toml                      |   6 +-
 fractal-matrix-api/src/lib.rs                      |   4 +-
 fractal-matrix-api/src/meson.build                 |   1 -
 fractal-matrix-api/src/r0/account/login.rs         |   6 +-
 fractal-matrix-api/src/r0/account/register.rs      |   4 +-
 .../src/r0/config/get_global_account_data.rs       |   2 +-
 .../src/r0/config/set_global_account_data.rs       |   2 +-
 .../src/r0/config/set_room_account_data.rs         |   2 +-
 fractal-matrix-api/src/r0/context/get_context.rs   |   2 +-
 .../src/r0/directory/post_public_rooms.rs          |   4 +-
 .../src/r0/membership/invite_user.rs               |   2 +-
 .../src/r0/membership/join_room_by_id_or_alias.rs  |   2 +-
 fractal-matrix-api/src/r0/membership/leave_room.rs |   2 +-
 .../src/r0/message/create_message_event.rs         |   2 +-
 .../src/r0/message/get_message_events.rs           |   2 +-
 .../src/r0/profile/get_display_name.rs             |   2 +-
 fractal-matrix-api/src/r0/profile/get_profile.rs   |   2 +-
 .../src/r0/profile/set_avatar_url.rs               |   2 +-
 .../src/r0/profile/set_display_name.rs             |   2 +-
 .../src/r0/pushrules/delete_room_rules.rs          |   2 +-
 .../src/r0/pushrules/get_room_rules.rs             |   2 +-
 .../src/r0/pushrules/set_room_rules.rs             |   2 +-
 .../src/r0/read_marker/set_read_marker.rs          |   2 +-
 fractal-matrix-api/src/r0/redact/redact_event.rs   |   2 +-
 fractal-matrix-api/src/r0/room/create_room.rs      |   2 +-
 fractal-matrix-api/src/r0/search/user.rs           |   2 +-
 .../src/r0/state/create_state_events_for_key.rs    |   2 +-
 .../src/r0/state/get_state_events_for_key.rs       |   2 +-
 .../src/r0/sync/get_joined_members.rs              |   2 +-
 fractal-matrix-api/src/r0/sync/sync_events.rs      |   2 +-
 fractal-matrix-api/src/r0/tag/create_tag.rs        |   2 +-
 fractal-matrix-api/src/r0/tag/delete_tag.rs        |   2 +-
 fractal-matrix-api/src/r0/typing.rs                |   2 +-
 fractal-matrix-api/src/util.rs                     |   4 -
 60 files changed, 1254 insertions(+), 180 deletions(-)
---
diff --git a/Cargo.lock b/Cargo.lock
index ba3110f6..11c452e4 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -12,11 +12,23 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "f7001367fde4c768a19d1029f0a8be5abd9308e1119846d5bd9ad26297b8faf5"
 dependencies = [
- "aes-soft",
- "aesni",
+ "aes-soft 0.4.0",
+ "aesni 0.7.0",
  "block-cipher",
 ]
 
+[[package]]
+name = "aes-ctr"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "7729c3cde54d67063be556aeac75a81330d802f0259500ca40cb52967f975763"
+dependencies = [
+ "aes-soft 0.6.4",
+ "aesni 0.10.0",
+ "cipher",
+ "ctr",
+]
+
 [[package]]
 name = "aes-soft"
 version = "0.4.0"
@@ -28,6 +40,16 @@ dependencies = [
  "opaque-debug 0.2.3",
 ]
 
+[[package]]
+name = "aes-soft"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072"
+dependencies = [
+ "cipher",
+ "opaque-debug 0.3.0",
+]
+
 [[package]]
 name = "aesni"
 version = "0.7.0"
@@ -38,6 +60,25 @@ dependencies = [
  "opaque-debug 0.2.3",
 ]
 
+[[package]]
+name = "aesni"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce"
+dependencies = [
+ "cipher",
+ "opaque-debug 0.3.0",
+]
+
+[[package]]
+name = "ahash"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217"
+dependencies = [
+ "const-random",
+]
+
 [[package]]
 name = "aho-corasick"
 version = "0.7.15"
@@ -98,6 +139,12 @@ version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
 
+[[package]]
+name = "assign"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "4af5687fe33aec5e70ef14caac5e0d363e335e5e5d6385fb75978d0c241b1d67"
+
 [[package]]
 name = "async-compression"
 version = "0.3.6"
@@ -111,6 +158,50 @@ dependencies = [
  "pin-project-lite 0.1.11",
 ]
 
+[[package]]
+name = "async-native-tls"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "9e9e7a929bd34c68a82d58a4de7f86fffdaf97fb2af850162a7bb19dd7269b33"
+dependencies = [
+ "native-tls",
+ "thiserror",
+ "tokio",
+ "url",
+]
+
+[[package]]
+name = "async-stream"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "22068c0c19514942eefcfd4daf8976ef1aad84e61539f95cd200c35202f80af5"
+dependencies = [
+ "async-stream-impl",
+ "futures-core",
+]
+
+[[package]]
+name = "async-stream-impl"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "25f9db3b38af870bf7e5cc649167533b493928e50744e2c30ae350230b414670"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "async-trait"
+version = "0.1.42"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "8d3a45e77e34375a7923b1e8febb049bb011f064714a8e17a1a616fef01da13d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
 [[package]]
 name = "atk"
 version = "0.9.0"
@@ -137,6 +228,15 @@ dependencies = [
  "system-deps",
 ]
 
+[[package]]
+name = "atomic"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "c3410529e8288c463bedb5930f82833bc0c90e5d2fe639a56582a4d09220b281"
+dependencies = [
+ "autocfg 1.0.1",
+]
+
 [[package]]
 name = "atty"
 version = "0.2.14"
@@ -160,6 +260,12 @@ version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
 
+[[package]]
+name = "base-x"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b"
+
 [[package]]
 name = "base64"
 version = "0.13.0"
@@ -182,6 +288,18 @@ version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
 
+[[package]]
+name = "bitvec"
+version = "0.19.4"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "a7ba35e9565969edb811639dbebfe34edc0368e472c5018474c8eb2543397f81"
+dependencies = [
+ "funty",
+ "radium",
+ "tap",
+ "wyz",
+]
+
 [[package]]
 name = "blake2b_simd"
 version = "0.5.11"
@@ -330,10 +448,19 @@ dependencies = [
  "num-integer",
  "num-traits",
  "serde",
- "time",
+ "time 0.1.44",
  "winapi 0.3.9",
 ]
 
+[[package]]
+name = "cipher"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801"
+dependencies = [
+ "generic-array 0.14.4",
+]
+
 [[package]]
 name = "clap"
 version = "2.33.3"
@@ -358,6 +485,15 @@ dependencies = [
  "bitflags",
 ]
 
+[[package]]
+name = "cmake"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "eb6210b637171dfba4cda12e579ac6dc73f5165ad56133e5d72ef3131f320855"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "comrak"
 version = "0.7.0"
@@ -385,6 +521,34 @@ dependencies = [
  "wasm-bindgen",
 ]
 
+[[package]]
+name = "const-random"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "486d435a7351580347279f374cb8a3c16937485441db80181357b7c4d70f17ed"
+dependencies = [
+ "const-random-macro",
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "const-random-macro"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "49a84d8ff70e3ec52311109b019c27672b4c1929e4cf7c18bcf0cd9fb5e230be"
+dependencies = [
+ "getrandom 0.2.0",
+ "lazy_static",
+ "proc-macro-hack",
+ "tiny-keccak",
+]
+
+[[package]]
+name = "const_fn"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "c478836e029dcef17fb47c89023448c64f781a046e0300e257ad8225ae59afab"
+
 [[package]]
 name = "constant_time_eq"
 version = "0.1.5"
@@ -422,6 +586,28 @@ dependencies = [
  "cfg-if 1.0.0",
 ]
 
+[[package]]
+name = "crossbeam-queue"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570"
+dependencies = [
+ "cfg-if 0.1.10",
+ "crossbeam-utils 0.7.2",
+ "maybe-uninit",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
+dependencies = [
+ "autocfg 1.0.1",
+ "cfg-if 0.1.10",
+ "lazy_static",
+]
+
 [[package]]
 name = "crossbeam-utils"
 version = "0.8.1"
@@ -433,6 +619,12 @@ dependencies = [
  "lazy_static",
 ]
 
+[[package]]
+name = "crunchy"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
+
 [[package]]
 name = "crypto-mac"
 version = "0.8.0"
@@ -443,6 +635,36 @@ dependencies = [
  "subtle",
 ]
 
+[[package]]
+name = "crypto-mac"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6"
+dependencies = [
+ "generic-array 0.14.4",
+ "subtle",
+]
+
+[[package]]
+name = "ctr"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "dashmap"
+version = "3.11.10"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "0f260e2fc850179ef410018660006951c1b55b79e8087e87111a2c388994b9b5"
+dependencies = [
+ "ahash",
+ "cfg-if 0.1.10",
+ "num_cpus",
+]
+
 [[package]]
 name = "dbus"
 version = "0.2.3"
@@ -501,6 +723,18 @@ dependencies = [
  "winapi 0.3.9",
 ]
 
+[[package]]
+name = "discard"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0"
+
+[[package]]
+name = "dotenv"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
+
 [[package]]
 name = "either"
 version = "1.5.99"
@@ -584,6 +818,7 @@ name = "fractal-gtk"
 version = "4.4.0"
 dependencies = [
  "anyhow",
+ "async-trait",
  "cairo-rs",
  "chrono",
  "clap",
@@ -605,6 +840,7 @@ dependencies = [
  "gtk",
  "gtk-sys",
  "html2pango",
+ "http",
  "itertools 0.8.2",
  "lazy_static",
  "libhandy",
@@ -627,8 +863,8 @@ name = "fractal-matrix-api"
 version = "4.4.0"
 dependencies = [
  "gio",
+ "matrix-sdk",
  "reqwest",
- "ruma-identifiers",
  "serde",
  "serde_json",
  "url",
@@ -662,6 +898,12 @@ version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
 
+[[package]]
+name = "funty"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "0ba62103ce691c2fd80fbae2213dfdda9ce60804973ac6b6e97de818ea7f52c8"
+
 [[package]]
 name = "futf"
 version = "0.1.4"
@@ -720,6 +962,15 @@ version = "0.3.8"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "611834ce18aaa1bd13c4b374f5d653e1027cf99b6b502584ff8c9a64413b30bb"
 
+[[package]]
+name = "futures-locks"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "50c4e684ddb2d8a4db5ca8a02b35156da129674ba4412b6f528698d58c594954"
+dependencies = [
+ "futures",
+]
+
 [[package]]
 name = "futures-macro"
 version = "0.3.8"
@@ -747,6 +998,16 @@ dependencies = [
  "once_cell",
 ]
 
+[[package]]
+name = "futures-timer"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
+dependencies = [
+ "gloo-timers",
+ "send_wrapper",
+]
+
 [[package]]
 name = "futures-util"
 version = "0.3.8"
@@ -856,6 +1117,18 @@ name = "getrandom"
 version = "0.1.15"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "ee8025cf36f917e6a52cce185b7c7177689b838b7ec138364e50cc2277a56cf4"
 dependencies = [
  "cfg-if 0.1.10",
  "libc",
@@ -958,6 +1231,19 @@ dependencies = [
  "system-deps",
 ]
 
+[[package]]
+name = "gloo-timers"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "47204a46aaff920a1ea58b11d03dec6f704287d27561724a4631e450654a891f"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
 [[package]]
 name = "gobject-sys"
 version = "0.10.0"
@@ -1272,6 +1558,12 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "hex"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35"
+
 [[package]]
 name = "hkdf"
 version = "0.9.0"
@@ -1279,7 +1571,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "fe1149865383e4526a43aee8495f9a325f0b806c63ce6427d06336a590abbbc9"
 dependencies = [
  "digest 0.9.0",
- "hmac",
+ "hmac 0.8.1",
 ]
 
 [[package]]
@@ -1288,7 +1580,17 @@ version = "0.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840"
 dependencies = [
- "crypto-mac",
+ "crypto-mac 0.8.0",
+ "digest 0.9.0",
+]
+
+[[package]]
+name = "hmac"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15"
+dependencies = [
+ "crypto-mac 0.10.0",
  "digest 0.9.0",
 ]
 
@@ -1413,6 +1715,19 @@ dependencies = [
  "hashbrown",
 ]
 
+[[package]]
+name = "instant"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec"
+dependencies = [
+ "cfg-if 1.0.0",
+ "js-sys",
+ "time 0.2.23",
+ "wasm-bindgen",
+ "web-sys",
+]
+
 [[package]]
 name = "iovec"
 version = "0.1.4"
@@ -1461,6 +1776,15 @@ dependencies = [
  "wasm-bindgen",
 ]
 
+[[package]]
+name = "js_int"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "b96797f53235a1d6dc985f244a69de54b04c45b7e0e357a35c85a45a847d92f2"
+dependencies = [
+ "serde",
+]
+
 [[package]]
 name = "kernel32-sys"
 version = "0.2.2"
@@ -1477,6 +1801,19 @@ version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 
+[[package]]
+name = "lexical-core"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "db65c6da02e61f55dae90a0ae427b2a5f6b3e8db09f58d10efab23af92592616"
+dependencies = [
+ "arrayvec",
+ "bitflags",
+ "cfg-if 0.1.10",
+ "ryu",
+ "static_assertions",
+]
+
 [[package]]
 name = "libc"
 version = "0.2.80"
@@ -1527,6 +1864,17 @@ dependencies = [
  "system-deps",
 ]
 
+[[package]]
+name = "libsqlite3-sys"
+version = "0.17.3"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "56d90181c2904c287e5390186be820e5ef311a3c62edebb7d6ca3d6a48ce041d"
+dependencies = [
+ "cc",
+ "pkg-config",
+ "vcpkg",
+]
+
 [[package]]
 name = "linkify"
 version = "0.4.0"
@@ -1637,20 +1985,116 @@ source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
 
 [[package]]
-name = "md5"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
-
-[[package]]
-name = "mdl"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9408becfeee133226be6df86aee4018565e6e26f746510467d0f5a0f38bc5bd5"
+name = "matrix-sdk"
+version = "0.1.0"
+source = 
"git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=0422bae92485b033d4f9b56f2331909653655609#0422bae92485b033d4f9b56f2331909653655609";
 dependencies = [
- "anyhow",
- "bincode",
- "lmdb",
+ "async-trait",
+ "dashmap",
+ "futures-timer",
+ "http",
+ "matrix-sdk-base",
+ "matrix-sdk-common",
+ "matrix-sdk-common-macros",
+ "mime",
+ "reqwest",
+ "serde_json",
+ "thiserror",
+ "tokio",
+ "tracing",
+ "tracing-futures",
+ "url",
+ "zeroize",
+]
+
+[[package]]
+name = "matrix-sdk-base"
+version = "0.1.0"
+source = 
"git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=0422bae92485b033d4f9b56f2331909653655609#0422bae92485b033d4f9b56f2331909653655609";
+dependencies = [
+ "async-trait",
+ "matrix-sdk-common",
+ "matrix-sdk-common-macros",
+ "matrix-sdk-crypto",
+ "serde",
+ "serde_json",
+ "thiserror",
+ "tokio",
+ "tracing",
+ "zeroize",
+]
+
+[[package]]
+name = "matrix-sdk-common"
+version = "0.1.0"
+source = 
"git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=0422bae92485b033d4f9b56f2331909653655609#0422bae92485b033d4f9b56f2331909653655609";
+dependencies = [
+ "assign",
+ "futures-locks",
+ "instant",
+ "js_int",
+ "ruma",
+ "tokio",
+ "uuid",
+]
+
+[[package]]
+name = "matrix-sdk-common-macros"
+version = "0.1.0"
+source = 
"git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=0422bae92485b033d4f9b56f2331909653655609#0422bae92485b033d4f9b56f2331909653655609";
+dependencies = [
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "matrix-sdk-crypto"
+version = "0.1.0"
+source = 
"git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=0422bae92485b033d4f9b56f2331909653655609#0422bae92485b033d4f9b56f2331909653655609";
+dependencies = [
+ "aes-ctr",
+ "async-trait",
+ "atomic",
+ "base64",
+ "byteorder",
+ "dashmap",
+ "getrandom 0.2.0",
+ "hmac 0.10.1",
+ "matrix-sdk-common",
+ "matrix-sdk-common-macros",
+ "olm-rs",
+ "pbkdf2",
+ "serde",
+ "serde_json",
+ "sha2",
+ "sqlx",
+ "thiserror",
+ "tracing",
+ "url",
+ "zeroize",
+]
+
+[[package]]
+name = "maybe-uninit"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
+
+[[package]]
+name = "md5"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
+
+[[package]]
+name = "mdl"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "9408becfeee133226be6df86aee4018565e6e26f746510467d0f5a0f38bc5bd5"
+dependencies = [
+ "anyhow",
+ "bincode",
+ "lmdb",
  "serde",
 ]
 
@@ -1758,6 +2202,18 @@ version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
 
+[[package]]
+name = "nom"
+version = "6.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "88034cfd6b4a0d54dd14f4a507eceee36c0b70e5a02236c4e4df571102be17f0"
+dependencies = [
+ "bitvec",
+ "lexical-core",
+ "memchr",
+ "version_check",
+]
+
 [[package]]
 name = "num"
 version = "0.3.1"
@@ -1844,6 +2300,28 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "olm-rs"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "daab4abdd728e5e77ec15888fc12688c0b821c81fca621f1bb28dbe489cbc404"
+dependencies = [
+ "getrandom 0.2.0",
+ "olm-sys",
+ "serde",
+ "serde_json",
+ "zeroize",
+]
+
+[[package]]
+name = "olm-sys"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "87fa74f77d7ce49231025de2a26df4e71228a9ea5bd5b0a3edc8d6bb05e3d420"
+dependencies = [
+ "cmake",
+]
+
 [[package]]
 name = "once_cell"
 version = "1.5.2"
@@ -1928,6 +2406,15 @@ version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "7151b083b0664ed58ed669fcdd92f01c3d2fdbf10af4931a301474950b52bfa9"
 
+[[package]]
+name = "pbkdf2"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "b3b8c0d71734018084da0c0354193a5edfb81b20d2d57a92c5b154aefc554a4a"
+dependencies = [
+ "crypto-mac 0.10.0",
+]
+
 [[package]]
 name = "percent-encoding"
 version = "2.1.0"
@@ -2160,6 +2647,12 @@ dependencies = [
  "proc-macro2",
 ]
 
+[[package]]
+name = "radium"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "941ba9d78d8e2f7ce474c015eea4d9c6d25b6a3327f9832ee29a4de27f91bbb8"
+
 [[package]]
 name = "rand"
 version = "0.6.5"
@@ -2185,7 +2678,7 @@ version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
 dependencies = [
- "getrandom",
+ "getrandom 0.1.15",
  "libc",
  "rand_chacha 0.2.2",
  "rand_core 0.5.1",
@@ -2234,7 +2727,7 @@ version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
 dependencies = [
- "getrandom",
+ "getrandom 0.1.15",
 ]
 
 [[package]]
@@ -2338,7 +2831,7 @@ version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d"
 dependencies = [
- "getrandom",
+ "getrandom 0.1.15",
  "redox_syscall",
  "rust-argon2",
 ]
@@ -2409,23 +2902,148 @@ dependencies = [
  "winreg",
 ]
 
+[[package]]
+name = "ruma"
+version = "0.0.1"
+source = 
"git+https://github.com/ruma/ruma?rev=48d1c9747561686e1c5627405780f6de01ee17b1#48d1c9747561686e1c5627405780f6de01ee17b1";
+dependencies = [
+ "assign",
+ "js_int",
+ "ruma-api",
+ "ruma-client-api",
+ "ruma-common",
+ "ruma-events",
+ "ruma-federation-api",
+ "ruma-identifiers",
+ "ruma-serde",
+]
+
+[[package]]
+name = "ruma-api"
+version = "0.17.0-alpha.1"
+source = 
"git+https://github.com/ruma/ruma?rev=48d1c9747561686e1c5627405780f6de01ee17b1#48d1c9747561686e1c5627405780f6de01ee17b1";
+dependencies = [
+ "http",
+ "percent-encoding",
+ "ruma-api-macros",
+ "ruma-common",
+ "ruma-identifiers",
+ "ruma-serde",
+ "serde",
+ "serde_json",
+ "thiserror",
+]
+
+[[package]]
+name = "ruma-api-macros"
+version = "0.17.0-alpha.1"
+source = 
"git+https://github.com/ruma/ruma?rev=48d1c9747561686e1c5627405780f6de01ee17b1#48d1c9747561686e1c5627405780f6de01ee17b1";
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "ruma-client-api"
+version = "0.10.0-alpha.1"
+source = 
"git+https://github.com/ruma/ruma?rev=48d1c9747561686e1c5627405780f6de01ee17b1#48d1c9747561686e1c5627405780f6de01ee17b1";
+dependencies = [
+ "assign",
+ "http",
+ "js_int",
+ "maplit",
+ "percent-encoding",
+ "ruma-api",
+ "ruma-common",
+ "ruma-events",
+ "ruma-identifiers",
+ "ruma-serde",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "ruma-common"
+version = "0.2.0"
+source = 
"git+https://github.com/ruma/ruma?rev=48d1c9747561686e1c5627405780f6de01ee17b1#48d1c9747561686e1c5627405780f6de01ee17b1";
+dependencies = [
+ "js_int",
+ "ruma-common-macros",
+ "ruma-identifiers",
+ "ruma-serde",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "ruma-common-macros"
+version = "0.2.0"
+source = 
"git+https://github.com/ruma/ruma?rev=48d1c9747561686e1c5627405780f6de01ee17b1#48d1c9747561686e1c5627405780f6de01ee17b1";
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "ruma-events"
+version = "0.22.0-alpha.1"
+source = 
"git+https://github.com/ruma/ruma?rev=48d1c9747561686e1c5627405780f6de01ee17b1#48d1c9747561686e1c5627405780f6de01ee17b1";
+dependencies = [
+ "js_int",
+ "ruma-common",
+ "ruma-events-macros",
+ "ruma-identifiers",
+ "ruma-serde",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "ruma-events-macros"
+version = "0.22.0-alpha.1"
+source = 
"git+https://github.com/ruma/ruma?rev=48d1c9747561686e1c5627405780f6de01ee17b1#48d1c9747561686e1c5627405780f6de01ee17b1";
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "ruma-federation-api"
+version = "0.0.3"
+source = 
"git+https://github.com/ruma/ruma?rev=48d1c9747561686e1c5627405780f6de01ee17b1#48d1c9747561686e1c5627405780f6de01ee17b1";
+dependencies = [
+ "js_int",
+ "ruma-api",
+ "ruma-common",
+ "ruma-events",
+ "ruma-identifiers",
+ "ruma-serde",
+ "serde",
+ "serde_json",
+]
+
 [[package]]
 name = "ruma-identifiers"
 version = "0.17.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5917092ecf88dec0a9a1f39ed5755096f39dc23003dcc278a58805ee8be65dee"
+source = 
"git+https://github.com/ruma/ruma?rev=48d1c9747561686e1c5627405780f6de01ee17b1#48d1c9747561686e1c5627405780f6de01ee17b1";
 dependencies = [
+ "ruma-common-macros",
  "ruma-identifiers-macros",
  "ruma-identifiers-validation",
+ "ruma-serde",
  "serde",
- "strum",
 ]
 
 [[package]]
 name = "ruma-identifiers-macros"
 version = "0.17.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "986f7ea65aac70e22fdbdadf582d51ceb4c896c0844ccf7a944a1128c2c5e30e"
+source = 
"git+https://github.com/ruma/ruma?rev=48d1c9747561686e1c5627405780f6de01ee17b1#48d1c9747561686e1c5627405780f6de01ee17b1";
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2436,11 +3054,22 @@ dependencies = [
 [[package]]
 name = "ruma-identifiers-validation"
 version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c112fd1d537d0c9eec9ec93e098576f8c68b2eabbc64b7275b1ed28235fe605b"
+source = 
"git+https://github.com/ruma/ruma?rev=48d1c9747561686e1c5627405780f6de01ee17b1#48d1c9747561686e1c5627405780f6de01ee17b1";
+dependencies = [
+ "serde",
+ "strum 0.19.5",
+]
+
+[[package]]
+name = "ruma-serde"
+version = "0.2.3"
+source = 
"git+https://github.com/ruma/ruma?rev=48d1c9747561686e1c5627405780f6de01ee17b1#48d1c9747561686e1c5627405780f6de01ee17b1";
 dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "js_int",
  "serde",
- "strum",
+ "serde_json",
 ]
 
 [[package]]
@@ -2452,7 +3081,16 @@ dependencies = [
  "base64",
  "blake2b_simd",
  "constant_time_eq",
- "crossbeam-utils",
+ "crossbeam-utils 0.8.1",
+]
+
+[[package]]
+name = "rustc_version"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+dependencies = [
+ "semver",
 ]
 
 [[package]]
@@ -2516,6 +3154,27 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "semver"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+dependencies = [
+ "semver-parser",
+]
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+
+[[package]]
+name = "send_wrapper"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0"
+
 [[package]]
 name = "serde"
 version = "1.0.117"
@@ -2571,6 +3230,12 @@ dependencies = [
  "opaque-debug 0.2.3",
 ]
 
+[[package]]
+name = "sha1"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d"
+
 [[package]]
 name = "sha2"
 version = "0.9.2"
@@ -2649,6 +3314,137 @@ dependencies = [
  "system-deps",
 ]
 
+[[package]]
+name = "sqlformat"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "74c70f0235b9925cbb106c52af1a28b5ea4885a8b851e328b8562e257a389c2d"
+dependencies = [
+ "lazy_static",
+ "maplit",
+ "nom",
+ "regex",
+ "unicode_categories",
+]
+
+[[package]]
+name = "sqlx"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "8974cacd80085fbe49e778708d660dec6fb351604dc34c3905b26efb2803b038"
+dependencies = [
+ "sqlx-core",
+ "sqlx-macros",
+]
+
+[[package]]
+name = "sqlx-core"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "88ac5a436f941c42eac509471a730df5c3c58e1450e68cd39afedbd948206273"
+dependencies = [
+ "async-native-tls",
+ "async-stream",
+ "bitflags",
+ "byteorder",
+ "crossbeam-queue",
+ "crossbeam-utils 0.7.2",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "hex",
+ "libc",
+ "libsqlite3-sys",
+ "log",
+ "memchr",
+ "percent-encoding",
+ "sqlformat",
+ "tokio",
+ "url",
+]
+
+[[package]]
+name = "sqlx-macros"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "de2ae78b783af5922d811b14665a5a3755e531c3087bb805cf24cf71f15e6780"
+dependencies = [
+ "dotenv",
+ "futures",
+ "heck",
+ "lazy_static",
+ "proc-macro2",
+ "quote",
+ "sqlx-core",
+ "syn",
+ "tokio",
+ "url",
+]
+
+[[package]]
+name = "standback"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "cf906c8b8fc3f6ecd1046e01da1d8ddec83e48c8b08b84dcc02b585a6bedf5a8"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "stdweb"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5"
+dependencies = [
+ "discard",
+ "rustc_version",
+ "stdweb-derive",
+ "stdweb-internal-macros",
+ "stdweb-internal-runtime",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "stdweb-derive"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_derive",
+ "syn",
+]
+
+[[package]]
+name = "stdweb-internal-macros"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11"
+dependencies = [
+ "base-x",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "sha1",
+ "syn",
+]
+
+[[package]]
+name = "stdweb-internal-runtime"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0"
+
 [[package]]
 name = "string_cache"
 version = "0.8.1"
@@ -2685,8 +3481,14 @@ name = "strum"
 version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b"
+
+[[package]]
+name = "strum"
+version = "0.19.5"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "b89a286a7e3b5720b9a477b23253bc50debac207c8d21505f8e70b36792f11b5"
 dependencies = [
- "strum_macros",
+ "strum_macros 0.19.4",
 ]
 
 [[package]]
@@ -2701,6 +3503,18 @@ dependencies = [
  "syn",
 ]
 
+[[package]]
+name = "strum_macros"
+version = "0.19.4"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "e61bb0be289045cb80bfce000512e32d09f8337e54c186725da381377ad1f8d5"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
 [[package]]
 name = "subtle"
 version = "2.3.0"
@@ -2718,6 +3532,18 @@ dependencies = [
  "unicode-xid",
 ]
 
+[[package]]
+name = "synstructure"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "unicode-xid",
+]
+
 [[package]]
 name = "system-deps"
 version = "1.3.2"
@@ -2726,13 +3552,19 @@ checksum = "0f3ecc17269a19353b3558b313bba738b25d82993e30d62a18406a24aba4649b"
 dependencies = [
  "heck",
  "pkg-config",
- "strum",
- "strum_macros",
+ "strum 0.18.0",
+ "strum_macros 0.18.0",
  "thiserror",
  "toml",
  "version-compare",
 ]
 
+[[package]]
+name = "tap"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "36474e732d1affd3a6ed582781b3683df3d0563714c59c39591e8ff707cf078e"
+
 [[package]]
 name = "tempfile"
 version = "3.1.0"
@@ -2807,6 +3639,53 @@ dependencies = [
  "winapi 0.3.9",
 ]
 
+[[package]]
+name = "time"
+version = "0.2.23"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "bcdaeea317915d59b2b4cd3b5efcd156c309108664277793f5351700c02ce98b"
+dependencies = [
+ "const_fn",
+ "libc",
+ "standback",
+ "stdweb",
+ "time-macros",
+ "version_check",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "time-macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1"
+dependencies = [
+ "proc-macro-hack",
+ "time-macros-impl",
+]
+
+[[package]]
+name = "time-macros-impl"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "e5c3be1edfad6027c69f5491cf4cb310d1a71ecd6af742788c6ff8bced86b8fa"
+dependencies = [
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "standback",
+ "syn",
+]
+
+[[package]]
+name = "tiny-keccak"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
+dependencies = [
+ "crunchy",
+]
+
 [[package]]
 name = "tinyvec"
 version = "1.1.0"
@@ -2901,9 +3780,21 @@ dependencies = [
  "cfg-if 1.0.0",
  "log",
  "pin-project-lite 0.2.0",
+ "tracing-attributes",
  "tracing-core",
 ]
 
+[[package]]
+name = "tracing-attributes"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "80e0ccfc3378da0cce270c946b676a376943f5cd16aeba64568e7939806f4ada"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
 [[package]]
 name = "tracing-core"
 version = "0.1.17"
@@ -3033,6 +3924,16 @@ version = "0.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7"
 
+[[package]]
+name = "uuid"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11"
+dependencies = [
+ "rand 0.7.3",
+ "serde",
+]
+
 [[package]]
 name = "vcpkg"
 version = "0.2.10"
@@ -3234,6 +4135,12 @@ dependencies = [
  "winapi-build",
 ]
 
+[[package]]
+name = "wyz"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214"
+
 [[package]]
 name = "xml5ever"
 version = "0.16.1"
@@ -3243,5 +4150,26 @@ dependencies = [
  "log",
  "mac",
  "markup5ever",
- "time",
+ "time 0.1.44",
+]
+
+[[package]]
+name = "zeroize"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "05f33972566adbd2d3588b0491eb94b98b43695c4ef897903470ede4f3f5a28a"
+dependencies = [
+ "zeroize_derive",
+]
+
+[[package]]
+name = "zeroize_derive"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "c3f369ddb18862aba61aa49bf31e74d29f0f162dec753063200e1dc084345d16"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "synstructure",
 ]
diff --git a/fractal-gtk/Cargo.toml b/fractal-gtk/Cargo.toml
index abc77656..713ae9be 100644
--- a/fractal-gtk/Cargo.toml
+++ b/fractal-gtk/Cargo.toml
@@ -7,6 +7,7 @@ edition = "2018"
 
 [dependencies]
 anyhow = "1.0.32"
+async-trait = "0.1.40"
 clap = "2.33.0"
 comrak = "0.7.0"
 directories = "2.0.2"
@@ -17,6 +18,7 @@ gdk-pixbuf = "0.9.0"
 gstreamer-pbutils = "0.16.0"
 glib = "0.10.1"
 html2pango = "0.3.2"
+http = "0.2.1"
 itertools = "0.8.2"
 lazy_static = "1.4.0"
 log = "0.4.8"
diff --git a/fractal-gtk/src/actions/account_settings.rs b/fractal-gtk/src/actions/account_settings.rs
index bb8a26c0..76362c32 100644
--- a/fractal-gtk/src/actions/account_settings.rs
+++ b/fractal-gtk/src/actions/account_settings.rs
@@ -25,7 +25,7 @@ pub fn new(window: &gtk::Window, op: Arc<Mutex<AppOp>>) -> gio::SimpleActionGrou
 
     change_avatar.connect_activate(clone!(@weak window => move |a, _| {
         let login_data = unwrap_or_unit_return!(op.lock().unwrap().login_data.clone());
-        let server_url = login_data.server_url;
+        let server_url = login_data.session_client.homeserver().clone();
         let access_token = login_data.access_token;
         let uid = login_data.uid;
 
diff --git a/fractal-gtk/src/app/connect/language.rs b/fractal-gtk/src/app/connect/language.rs
index 0b402b71..d2f91412 100644
--- a/fractal-gtk/src/app/connect/language.rs
+++ b/fractal-gtk/src/app/connect/language.rs
@@ -27,7 +27,7 @@ impl App {
                     If the checker is modified by gtk due to the user switching the language, the op mutex 
is unlocked. */
                     if let Ok(op) = op.try_lock() {
                         if let (Some(active_room), Some(login_data)) = (op.active_room.as_ref(), 
op.login_data.as_ref()) {
-                            let server = login_data.server_url.clone();
+                            let server = login_data.session_client.homeserver().clone();
                             let access_token = login_data.access_token.clone();
                             let uid = login_data.uid.clone();
                             let room_id = active_room.clone();
diff --git a/fractal-gtk/src/appop/account.rs b/fractal-gtk/src/appop/account.rs
index 0c2aa268..5fd378fd 100644
--- a/fractal-gtk/src/appop/account.rs
+++ b/fractal-gtk/src/appop/account.rs
@@ -27,7 +27,10 @@ impl AppOp {
     pub fn get_three_pid(&self) {
         let login_data = unwrap_or_unit_return!(self.login_data.clone());
         thread::spawn(move || {
-            match user::get_threepid(login_data.server_url, login_data.access_token) {
+            match user::get_threepid(
+                login_data.session_client.homeserver().clone(),
+                login_data.access_token,
+            ) {
                 Ok(list) => {
                     let l = Some(list);
                     APPOP!(set_three_pid, (l));
@@ -49,7 +52,7 @@ impl AppOp {
             if let Some(secret) = secret {
                 thread::spawn(move || {
                     match user::add_threepid(
-                        login_data.server_url,
+                        login_data.session_client.homeserver().clone(),
                         login_data.access_token,
                         login_data.identity_url,
                         secret,
@@ -115,7 +118,7 @@ impl AppOp {
             if let gtk::ResponseType::Ok = r {
                 let token = value.get_text().to_string();
 
-                let server_url = login_data.server_url.clone();
+                let server_url = login_data.session_client.homeserver().clone();
                 let secret = secret.clone();
                 let sid = sid.clone();
                 thread::spawn(move || {
@@ -162,7 +165,7 @@ impl AppOp {
                 let sid = sid.clone();
                 thread::spawn(move || {
                     match user::add_threepid(
-                        login_data.server_url,
+                        login_data.session_client.homeserver().clone(),
                         login_data.access_token,
                         login_data.identity_url,
                         secret,
@@ -317,13 +320,8 @@ impl AppOp {
         stack.set_visible_child_name("loading");
         self.get_three_pid();
         uid.set_text(&login_data.uid.to_string());
-        device_id.set_text(
-            self.device_id
-                .as_ref()
-                .map(|id| id.as_str())
-                .unwrap_or_default(),
-        );
-        homeserver.set_text(login_data.server_url.as_str());
+        device_id.set_text(login_data.device_id.as_str());
+        homeserver.set_text(login_data.session_client.homeserver().as_str());
         name.set_text(&login_data.username.unwrap_or_default());
         name.grab_focus_without_selecting();
         name.set_position(-1);
@@ -547,7 +545,7 @@ impl AppOp {
         download_to_cache(
             self.thread_pool.clone(),
             self.user_info_cache.clone(),
-            login_data.server_url,
+            login_data.session_client.homeserver().clone(),
             login_data.access_token,
             login_data.uid,
             data,
@@ -611,7 +609,7 @@ impl AppOp {
             name.set_editable(false);
             thread::spawn(move || {
                 match user::set_username(
-                    login_data.server_url,
+                    login_data.session_client.homeserver().clone(),
                     login_data.access_token,
                     login_data.uid,
                     username,
@@ -682,7 +680,7 @@ impl AppOp {
             password_btn_stack.set_visible_child_name("spinner");
             thread::spawn(move || {
                 match user::change_password(
-                    login_data.server_url,
+                    login_data.session_client.homeserver().clone(),
                     login_data.access_token,
                     login_data.uid.localpart().into(),
                     old.to_string(),
@@ -797,7 +795,7 @@ impl AppOp {
                 let login_data = login_data.clone();
                 thread::spawn(move || {
                     match user::account_destruction(
-                        login_data.server_url.clone(),
+                        login_data.session_client.homeserver().clone(),
                         login_data.access_token.clone(),
                         login_data.uid.localpart().into(),
                         password,
diff --git a/fractal-gtk/src/appop/directory.rs b/fractal-gtk/src/appop/directory.rs
index e1f8abc4..cc9e8a49 100644
--- a/fractal-gtk/src/appop/directory.rs
+++ b/fractal-gtk/src/appop/directory.rs
@@ -16,7 +16,10 @@ impl AppOp {
     pub fn init_protocols(&self) {
         let login_data = unwrap_or_unit_return!(self.login_data.clone());
         thread::spawn(move || {
-            match directory::protocols(login_data.server_url, login_data.access_token) {
+            match directory::protocols(
+                login_data.session_client.homeserver().clone(),
+                login_data.access_token,
+            ) {
                 Ok(protocols) => {
                     APPOP!(set_protocols, (protocols));
                 }
@@ -136,7 +139,7 @@ impl AppOp {
         let rooms_since = self.directory_pagination.clone().into();
         thread::spawn(move || {
             let query = directory::room_search(
-                login_data.server_url,
+                login_data.session_client.homeserver().clone(),
                 login_data.access_token,
                 homeserver,
                 search_term,
diff --git a/fractal-gtk/src/appop/invite.rs b/fractal-gtk/src/appop/invite.rs
index 775105e2..cd5054c0 100644
--- a/fractal-gtk/src/appop/invite.rs
+++ b/fractal-gtk/src/appop/invite.rs
@@ -165,7 +165,7 @@ impl AppOp {
         let login_data = unwrap_or_unit_return!(self.login_data.clone());
         if let Some(ref r) = self.active_room {
             for user in &self.invite_list {
-                let server = login_data.server_url.clone();
+                let server = login_data.session_client.homeserver().clone();
                 let access_token = login_data.access_token.clone();
                 let room_id = r.clone();
                 let user_id = user.0.uid.clone();
@@ -229,7 +229,7 @@ impl AppOp {
             if accept {
                 thread::spawn(move || {
                     match room::join_room(
-                        login_data.server_url,
+                        login_data.session_client.homeserver().clone(),
                         login_data.access_token,
                         room_id.into(),
                     ) {
@@ -245,8 +245,11 @@ impl AppOp {
                 });
             } else {
                 thread::spawn(move || {
-                    let query =
-                        room::leave_room(login_data.server_url, login_data.access_token, room_id);
+                    let query = room::leave_room(
+                        login_data.session_client.homeserver().clone(),
+                        login_data.access_token,
+                        room_id,
+                    );
                     if let Err(err) = query {
                         err.handle_error();
                     }
diff --git a/fractal-gtk/src/appop/login.rs b/fractal-gtk/src/appop/login.rs
index 018e978b..48edd267 100644
--- a/fractal-gtk/src/appop/login.rs
+++ b/fractal-gtk/src/appop/login.rs
@@ -1,16 +1,18 @@
 use log::error;
 
+use crate::app::RUNTIME;
 use crate::backend::register;
 use fractal_api::identifiers::{DeviceId, UserId};
 use fractal_api::r0::AccessToken;
-
 use fractal_api::url::Url;
+use fractal_api::Session;
 
 use crate::app::App;
 use crate::appop::AppOp;
 
 use crate::backend::HandleError;
 use crate::cache;
+use crate::client::get_matrix_client;
 
 use std::thread;
 
@@ -25,7 +27,7 @@ impl AppOp {
         &mut self,
         uid: UserId,
         access_token: AccessToken,
-        device: Option<Box<DeviceId>>,
+        device_id: Box<DeviceId>,
         server_url: Url,
         identity_url: Url,
     ) {
@@ -33,17 +35,28 @@ impl AppOp {
             error!("Can't store the token using libsecret");
         }
 
+        let matrix_client =
+            get_matrix_client(server_url).expect("Failed to login with the Matrix client");
+
         self.set_login_data(LoginData {
-            access_token,
-            uid,
+            session_client: matrix_client.clone(),
+            uid: uid.clone(),
+            access_token: access_token.clone(),
+            device_id: device_id.clone(),
             username: None,
             avatar: None,
-            server_url,
             identity_url,
         });
 
+        let _ = RUNTIME
+            .handle()
+            .block_on(matrix_client.restore_login(Session {
+                access_token: access_token.to_string(),
+                user_id: uid,
+                device_id,
+            }));
+
         self.set_state(AppState::NoRoom);
-        self.device_id = self.device_id.clone().or(device);
         self.since = None;
         self.get_username();
 
@@ -63,7 +76,6 @@ impl AppOp {
 
         self.set_state(AppState::Login);
         self.login_data = None;
-        self.device_id = None;
     }
 
     pub fn connect(&mut self, username: String, password: String, server: Url, identity: Url) {
@@ -97,7 +109,10 @@ impl AppOp {
         let login_data = unwrap_or_unit_return!(self.login_data.clone());
         let _ = self.delete_pass("fractal");
         thread::spawn(move || {
-            match register::logout(login_data.server_url, login_data.access_token) {
+            match register::logout(
+                login_data.session_client.homeserver().clone(),
+                login_data.access_token,
+            ) {
                 Ok(_) => {
                     APPOP!(bk_logout);
                 }
diff --git a/fractal-gtk/src/appop/media_viewer.rs b/fractal-gtk/src/appop/media_viewer.rs
index 1e0fd76b..1cd9ad8d 100644
--- a/fractal-gtk/src/appop/media_viewer.rs
+++ b/fractal-gtk/src/appop/media_viewer.rs
@@ -34,7 +34,7 @@ impl AppOp {
                 main_window,
                 room,
                 &msg,
-                login_data.server_url,
+                login_data.session_client.homeserver().clone(),
                 login_data.access_token,
                 login_data.uid,
             );
@@ -46,7 +46,7 @@ impl AppOp {
                 let back_history = self.room_back_history.clone();
                 let actions = actions::Message::new(
                     self.thread_pool.clone(),
-                    login_data.server_url,
+                    login_data.session_client.homeserver().clone(),
                     login_data.access_token,
                     self.ui.clone(),
                     back_history,
diff --git a/fractal-gtk/src/appop/member.rs b/fractal-gtk/src/appop/member.rs
index 14439891..2ffad084 100644
--- a/fractal-gtk/src/appop/member.rs
+++ b/fractal-gtk/src/appop/member.rs
@@ -193,7 +193,11 @@ impl AppOp {
     pub fn search_invite_user(&self, term: String) {
         let login_data = unwrap_or_unit_return!(self.login_data.clone());
         thread::spawn(move || {
-            match user::search(login_data.server_url, login_data.access_token, term) {
+            match user::search(
+                login_data.session_client.homeserver().clone(),
+                login_data.access_token,
+                term,
+            ) {
                 Ok(users) => {
                     APPOP!(user_search_finished, (users));
                 }
diff --git a/fractal-gtk/src/appop/message.rs b/fractal-gtk/src/appop/message.rs
index 1bc42d9a..f99ea05c 100644
--- a/fractal-gtk/src/appop/message.rs
+++ b/fractal-gtk/src/appop/message.rs
@@ -76,12 +76,15 @@ impl AppOp {
         let login_data = self.login_data.clone()?;
         let messages = self.history.as_ref()?.get_listbox();
         if let Some(ui_msg) = self.create_new_room_message(&msg) {
-            let mb = widgets::MessageBox::new(login_data.server_url, login_data.access_token)
-                .tmpwidget(
-                    self.thread_pool.clone(),
-                    self.user_info_cache.clone(),
-                    &ui_msg,
-                );
+            let mb = widgets::MessageBox::new(
+                login_data.session_client.homeserver().clone(),
+                login_data.access_token,
+            )
+            .tmpwidget(
+                self.thread_pool.clone(),
+                self.user_info_cache.clone(),
+                &ui_msg,
+            );
             let m = mb.get_listbox_row();
             messages.add(m);
 
@@ -118,7 +121,7 @@ impl AppOp {
         for t in self.msg_queue.iter().rev().filter(|m| m.msg.room == r.id) {
             if let Some(ui_msg) = self.create_new_room_message(&t.msg) {
                 let mb = widgets::MessageBox::new(
-                    login_data.server_url.clone(),
+                    login_data.session_client.homeserver().clone(),
                     login_data.access_token.clone(),
                 )
                 .tmpwidget(
@@ -165,7 +168,7 @@ impl AppOp {
             let event_id = last_message.id.clone()?;
             thread::spawn(move || {
                 match room::mark_as_read(
-                    login_data.server_url,
+                    login_data.session_client.homeserver().clone(),
                     login_data.access_token,
                     room_id,
                     event_id,
@@ -221,12 +224,20 @@ impl AppOp {
             match &next.msg.mtype[..] {
                 "m.image" | "m.file" | "m.audio" | "m.video" => {
                     thread::spawn(move || {
-                        attach_file(login_data.server_url, login_data.access_token, msg)
+                        attach_file(
+                            login_data.session_client.homeserver().clone(),
+                            login_data.access_token,
+                            msg,
+                        )
                     });
                 }
                 _ => {
                     thread::spawn(move || {
-                        match room::send_msg(login_data.server_url, login_data.access_token, msg) {
+                        match room::send_msg(
+                            login_data.session_client.homeserver().clone(),
+                            login_data.access_token,
+                            msg,
+                        ) {
                             Ok((txid, evid)) => {
                                 APPOP!(msg_sent, (txid, evid));
                                 let initial = false;
diff --git a/fractal-gtk/src/appop/mod.rs b/fractal-gtk/src/appop/mod.rs
index a1e4ca00..dc7547eb 100644
--- a/fractal-gtk/src/appop/mod.rs
+++ b/fractal-gtk/src/appop/mod.rs
@@ -8,6 +8,7 @@ use std::time::Duration;
 use fractal_api::identifiers::{DeviceId, RoomId, UserId};
 use fractal_api::r0::AccessToken;
 
+use fractal_api::Client as MatrixClient;
 use gtk::prelude::*;
 
 use crate::backend::ThreadPool;
@@ -74,11 +75,12 @@ impl RoomSearchPagination {
 
 #[derive(Clone, Debug)]
 pub struct LoginData {
-    pub access_token: AccessToken,
+    pub session_client: MatrixClient,
     pub uid: UserId,
+    pub access_token: AccessToken,
+    pub device_id: Box<DeviceId>,
     pub username: Option<String>,
     pub avatar: Option<PathBuf>,
-    pub server_url: Url,
     pub identity_url: Url,
 }
 
@@ -90,7 +92,6 @@ pub struct AppOp {
     pub sending_message: bool,
 
     pub login_data: Option<LoginData>,
-    pub device_id: Option<Box<DeviceId>>, // TODO: Shouldn't be optional
 
     pub active_room: Option<RoomId>,
     pub join_to_room: Option<RoomId>,
@@ -143,7 +144,6 @@ impl AppOp {
             room_settings: None,
             history: None,
             login_data: None,
-            device_id: None,
             syncing: false,
             msg_queue: vec![],
             sending_message: false,
@@ -177,19 +177,20 @@ impl AppOp {
         self.set_state(AppState::Loading);
 
         // FIXME: Username and uid should not be duplicated in cache.
-        if let Ok(data) = cache::load() {
+        let device_id = if let Ok(data) = cache::load() {
             let r: Vec<Room> = data.rooms.values().cloned().collect();
             self.set_rooms(r, true);
-            /* Make sure that since is never an empty string */
             self.since = data.since.filter(|s| !s.is_empty());
-            self.device_id = Some(data.device_id);
-        }
+            Some(data.device_id)
+        } else {
+            None
+        };
 
         // FIXME: Storing and getting the password is insecure.
         //        Only the access token should be used.
         if let Ok((username, password, server, id_url)) = self.get_pass() {
-            if let Ok((Some(access_token), uid)) = self.get_token() {
-                self.bk_login(uid, access_token, self.device_id.clone(), server, id_url);
+            if let (Ok((Some(access_token), uid)), Some(dev_id)) = (self.get_token(), device_id) {
+                self.bk_login(uid, access_token, dev_id, server, id_url);
             } else {
                 self.connect(username, password, server, id_url);
             }
diff --git a/fractal-gtk/src/appop/notify.rs b/fractal-gtk/src/appop/notify.rs
index 5055e80a..e5ce591f 100644
--- a/fractal-gtk/src/appop/notify.rs
+++ b/fractal-gtk/src/appop/notify.rs
@@ -44,8 +44,9 @@ impl AppOp {
     }
 
     pub fn notify(&self, app: gtk::Application, room_id: &RoomId, id: &EventId) -> Option<()> {
-        let server_url = self.login_data.clone()?.server_url;
-        let access_token = self.login_data.clone()?.access_token;
+        let login_data = self.login_data.as_ref()?;
+        let access_token = login_data.access_token.clone();
+        let server_url = login_data.session_client.homeserver().clone();
         let msg = self.get_message_by_id(room_id, id)?;
         let r = self.rooms.get(room_id)?;
         let short_body = match &msg.mtype[..] {
diff --git a/fractal-gtk/src/appop/room.rs b/fractal-gtk/src/appop/room.rs
index 3c5b34e3..3f889310 100644
--- a/fractal-gtk/src/appop/room.rs
+++ b/fractal-gtk/src/appop/room.rs
@@ -1,6 +1,6 @@
 use crate::backend::room;
 use crate::util::i18n::{i18n, i18n_k, ni18n_f};
-use fractal_api::identifiers::{DeviceId, RoomId};
+use fractal_api::identifiers::RoomId;
 use fractal_api::url::Url;
 use log::{error, warn};
 use std::convert::TryInto;
@@ -79,7 +79,7 @@ impl AppOp {
                 self.update_typing_notification();
             } else {
                 // Request all joined members for each new room
-                let server = login_data.server_url.clone();
+                let server = login_data.session_client.homeserver().clone();
                 let access_token = login_data.access_token.clone();
                 let room_id = room.id.clone();
                 thread::spawn(move || {
@@ -94,7 +94,7 @@ impl AppOp {
                 });
                 // Download the room avatar
                 // TODO: Use the avatar url returned by sync
-                let server = login_data.server_url.clone();
+                let server = login_data.session_client.homeserver().clone();
                 let access_token = login_data.access_token.clone();
                 let room_id = room.id.clone();
                 thread::spawn(
@@ -142,12 +142,13 @@ impl AppOp {
                 }
             }
 
-            self.roomlist = widgets::RoomList::new(adj, Some(login_data.server_url.clone()));
+            self.roomlist =
+                widgets::RoomList::new(adj, Some(login_data.session_client.homeserver().clone()));
             self.roomlist.add_rooms(roomlist);
             container.add(self.roomlist.widget());
 
             self.roomlist.connect_fav(move |room, tofav| {
-                let server = login_data.server_url.clone();
+                let server = login_data.session_client.homeserver().clone();
                 let access_token = login_data.access_token.clone();
                 let uid = login_data.uid.clone();
                 thread::spawn(move || {
@@ -245,7 +246,7 @@ impl AppOp {
         self.roomlist.select(&active_room);
 
         // getting room details
-        let server_url = login_data.server_url.clone();
+        let server_url = login_data.session_client.homeserver().clone();
         let access_token = login_data.access_token.clone();
         let a_room = active_room.clone();
         thread::spawn(
@@ -259,7 +260,7 @@ impl AppOp {
             },
         );
 
-        let server_url = login_data.server_url.clone();
+        let server_url = login_data.session_client.homeserver().clone();
         let access_token = login_data.access_token.clone();
         let a_room = active_room.clone();
         thread::spawn(move || {
@@ -302,7 +303,7 @@ impl AppOp {
         let back_history = self.room_back_history.clone();
         let actions = actions::Message::new(
             self.thread_pool.clone(),
-            login_data.server_url,
+            login_data.session_client.homeserver().clone(),
             login_data.access_token,
             self.ui.clone(),
             back_history,
@@ -333,7 +334,11 @@ impl AppOp {
         let r = unwrap_or_unit_return!(self.active_room.clone());
         let room_id = r.clone();
         thread::spawn(move || {
-            let query = room::leave_room(login_data.server_url, login_data.access_token, room_id);
+            let query = room::leave_room(
+                login_data.session_client.homeserver().clone(),
+                login_data.access_token,
+                room_id,
+            );
             if let Err(err) = query {
                 err.handle_error();
             }
@@ -399,7 +404,7 @@ impl AppOp {
         let name = n;
         thread::spawn(move || {
             match room::new_room(
-                login_data.server_url,
+                login_data.session_client.homeserver().clone(),
                 login_data.access_token,
                 name,
                 privacy,
@@ -421,10 +426,7 @@ impl AppOp {
         let since = self.since.clone();
         let username = login_data.username.unwrap_or_default();
         let uid = login_data.uid;
-        let device_id = self
-            .device_id
-            .clone()
-            .unwrap_or_else(|| Box::<DeviceId>::from(""));
+        let device_id = login_data.device_id;
 
         if cache::store(&rooms, since, username, uid, device_id).is_err() {
             error!("Error caching rooms");
@@ -558,7 +560,11 @@ impl AppOp {
                 }
             };
 
-            match room::join_room(login_data.server_url, login_data.access_token, room_id) {
+            match room::join_room(
+                login_data.session_client.homeserver().clone(),
+                login_data.access_token,
+                room_id,
+            ) {
                 Ok(jtr) => {
                     let jtr = Some(jtr);
                     APPOP!(set_join_to_room, (jtr));
@@ -700,7 +706,11 @@ impl AppOp {
         }
 
         thread::spawn(move || {
-            match room::get_room_avatar(login_data.server_url, login_data.access_token, room_id) {
+            match room::get_room_avatar(
+                login_data.session_client.homeserver().clone(),
+                login_data.access_token,
+                room_id,
+            ) {
                 Ok((room, avatar)) => {
                     APPOP!(set_room_avatar, (room, avatar));
                 }
@@ -753,7 +763,7 @@ impl AppOp {
         self.typing.insert(active_room.clone(), now);
         thread::spawn(move || {
             let query = room::send_typing(
-                login_data.server_url,
+                login_data.session_client.homeserver().clone(),
                 login_data.access_token,
                 login_data.uid,
                 active_room,
diff --git a/fractal-gtk/src/appop/room_settings.rs b/fractal-gtk/src/appop/room_settings.rs
index f961df67..d644f154 100644
--- a/fractal-gtk/src/appop/room_settings.rs
+++ b/fractal-gtk/src/appop/room_settings.rs
@@ -25,7 +25,7 @@ impl AppOp {
                 &window,
                 login_data.uid,
                 room.clone(),
-                login_data.server_url,
+                login_data.session_client.homeserver().clone(),
                 login_data.access_token,
             );
             let page = panel.create()?;
diff --git a/fractal-gtk/src/appop/start_chat.rs b/fractal-gtk/src/appop/start_chat.rs
index c0c89e53..1c902b26 100644
--- a/fractal-gtk/src/appop/start_chat.rs
+++ b/fractal-gtk/src/appop/start_chat.rs
@@ -19,7 +19,7 @@ impl AppOp {
         let member = user.0;
         thread::spawn(move || {
             match room::direct_chat(
-                login_data.server_url,
+                login_data.session_client.homeserver().clone(),
                 login_data.access_token,
                 login_data.uid,
                 member,
diff --git a/fractal-gtk/src/appop/sync.rs b/fractal-gtk/src/appop/sync.rs
index 52f82353..b399bc1a 100644
--- a/fractal-gtk/src/appop/sync.rs
+++ b/fractal-gtk/src/appop/sync.rs
@@ -30,7 +30,7 @@ impl AppOp {
             let since = self.since.clone().filter(|_| !initial);
             thread::spawn(move || {
                 match sync::sync(
-                    login_data.server_url,
+                    login_data.session_client.homeserver().clone(),
                     login_data.access_token,
                     login_data.uid,
                     join_to_room,
diff --git a/fractal-gtk/src/appop/user.rs b/fractal-gtk/src/appop/user.rs
index 3789ed3b..e756c1d9 100644
--- a/fractal-gtk/src/appop/user.rs
+++ b/fractal-gtk/src/appop/user.rs
@@ -21,7 +21,7 @@ impl AppOp {
         let login_data = unwrap_or_unit_return!(self.login_data.clone());
 
         thread::spawn(clone!(@strong login_data => move || {
-            match user::get_username(login_data.server_url, login_data.access_token, login_data.uid) {
+            match user::get_username(login_data.session_client.homeserver().clone(), 
login_data.access_token, login_data.uid) {
                 Ok(username) => {
                     APPOP!(set_username, (username));
                 }
@@ -32,7 +32,11 @@ impl AppOp {
         }));
 
         thread::spawn(clone!(@strong login_data => move || {
-            match user::get_user_avatar(login_data.server_url, login_data.access_token, &login_data.uid) {
+            match user::get_user_avatar(
+                login_data.session_client.homeserver().clone(),
+                login_data.access_token,
+                &login_data.uid,
+            ) {
                 Ok((_, path)) => {
                     APPOP!(set_avatar, (path));
                 }
@@ -90,7 +94,7 @@ impl AppOp {
             download_to_cache(
                 self.thread_pool.clone(),
                 self.user_info_cache.clone(),
-                login_data.server_url.clone(),
+                login_data.session_client.homeserver().clone(),
                 login_data.access_token.clone(),
                 login_data.uid.clone(),
                 data,
@@ -116,7 +120,7 @@ impl AppOp {
                 download_to_cache(
                     self.thread_pool.clone(),
                     self.user_info_cache.clone(),
-                    login_data.server_url.clone(),
+                    login_data.session_client.homeserver().clone(),
                     login_data.access_token.clone(),
                     login_data.uid,
                     data,
diff --git a/fractal-gtk/src/backend/mod.rs b/fractal-gtk/src/backend/mod.rs
index 5043e909..d10b68e0 100644
--- a/fractal-gtk/src/backend/mod.rs
+++ b/fractal-gtk/src/backend/mod.rs
@@ -11,7 +11,7 @@ use std::path::PathBuf;
 use std::sync::{Arc, Condvar, Mutex};
 use std::thread;
 
-use crate::client::Client;
+use crate::client::ClientBlocking;
 use crate::util::cache_dir_path;
 use fractal_api::r0::context::get_context::request as get_context;
 use fractal_api::r0::context::get_context::Parameters as GetContextParameters;
@@ -31,7 +31,7 @@ pub mod sync;
 pub mod user;
 
 lazy_static! {
-    pub static ref HTTP_CLIENT: Client = Client::new();
+    pub static ref HTTP_CLIENT: ClientBlocking = ClientBlocking::new();
 }
 
 #[derive(Clone, Debug)]
@@ -187,13 +187,11 @@ pub fn dw_media(
     if fname.is_file() && (dest.is_none() || is_fname_recent) {
         Ok(fname)
     } else {
-        HTTP_CLIENT
-            .get_client()
-            .execute(request)?
-            .bytes()
-            .map_err(Into::into)
-            .and_then(|media| write(&fname, media).map_err(Into::into))
-            .and(Ok(fname))
+        let media = HTTP_CLIENT.get_client().execute(request)?.bytes()?;
+
+        write(&fname, media)?;
+
+        Ok(fname)
     }
 }
 
diff --git a/fractal-gtk/src/backend/register.rs b/fractal-gtk/src/backend/register.rs
index 89b1377b..037fe546 100644
--- a/fractal-gtk/src/backend/register.rs
+++ b/fractal-gtk/src/backend/register.rs
@@ -46,7 +46,7 @@ pub fn login(
     user: String,
     password: String,
     server: Url,
-) -> Result<(UserId, AccessToken, Option<Box<DeviceId>>), LoginError> {
+) -> Result<(UserId, AccessToken, Box<DeviceId>), LoginError> {
     let body = if globals::EMAIL_RE.is_match(&user) {
         LoginBody {
             auth: Auth::Password { password },
diff --git a/fractal-gtk/src/backend/sync.rs b/fractal-gtk/src/backend/sync.rs
index 622aae4a..e7b0d444 100644
--- a/fractal-gtk/src/backend/sync.rs
+++ b/fractal-gtk/src/backend/sync.rs
@@ -179,7 +179,7 @@ pub fn sync(
 
     let query = ProxySettings::current().and_then(|proxy_settings| {
         let client = proxy_settings
-            .apply_to_client_builder(client_builder_timeout)
+            .apply_to_blocking_client_builder(client_builder_timeout)
             .build()?;
         let request = sync_events(base.clone(), &params)?;
         let response = client.execute(request)?;
diff --git a/fractal-gtk/src/client.rs b/fractal-gtk/src/client.rs
index 67462068..30aa5913 100644
--- a/fractal-gtk/src/client.rs
+++ b/fractal-gtk/src/client.rs
@@ -1,10 +1,17 @@
 use crate::error::Error;
 use crate::globals;
+use async_trait::async_trait;
 
 use fractal_api::reqwest;
+use fractal_api::url::Url;
+use fractal_api::HttpSend;
+use fractal_api::{
+    Client as MatrixClient, ClientConfig as MatrixClientConfig, Error as MatrixSdkError,
+};
 use gio::prelude::*;
 
-use std::sync::Mutex;
+use std::convert::TryInto;
+use std::sync::{Arc, Mutex};
 
 // Special URI used by gio to indicate no proxy
 const PROXY_DIRECT_URI: &str = "direct://";
@@ -42,7 +49,7 @@ impl ProxySettings {
         ))
     }
 
-    pub fn apply_to_client_builder(
+    pub fn apply_to_blocking_client_builder(
         &self,
         mut builder: fractal_api::reqwest::blocking::ClientBuilder,
     ) -> fractal_api::reqwest::blocking::ClientBuilder {
@@ -58,8 +65,33 @@ impl ProxySettings {
         if let Some(https_proxy) = self
             .https_proxy
             .get(0)
+            .map(reqwest::Proxy::https)
+            .and_then(Result::ok)
+        {
+            builder = builder.proxy(https_proxy);
+        }
+
+        builder
+    }
+
+    pub fn apply_to_client_builder(
+        &self,
+        mut builder: fractal_api::reqwest::ClientBuilder,
+    ) -> fractal_api::reqwest::ClientBuilder {
+        // Reqwest only supports one proxy for each type
+        if let Some(http_proxy) = self
+            .http_proxy
+            .get(0)
             .map(reqwest::Proxy::http)
             .and_then(Result::ok)
+        {
+            builder = builder.proxy(http_proxy);
+        }
+        if let Some(https_proxy) = self
+            .https_proxy
+            .get(0)
+            .map(reqwest::Proxy::https)
+            .and_then(Result::ok)
         {
             builder = builder.proxy(https_proxy);
         }
@@ -76,7 +108,7 @@ thread_local! {
 
 #[derive(Debug)]
 struct ClientInner {
-    client: fractal_api::reqwest::blocking::Client,
+    client: fractal_api::reqwest::Client,
     proxy_settings: ProxySettings,
 }
 
@@ -86,9 +118,76 @@ pub struct Client {
 }
 
 impl Client {
-    pub fn new() -> Client {
-        Client {
+    pub fn new() -> Self {
+        Self {
             inner: Mutex::new(ClientInner {
+                client: Self::build(fractal_api::reqwest::Client::builder()),
+                proxy_settings: Default::default(),
+            }),
+        }
+    }
+
+    pub fn get_client(&self) -> fractal_api::reqwest::Client {
+        // Lock first so we don't overwrite proxy settings with outdated information
+        let mut inner = self.inner.lock().unwrap();
+
+        let new_proxy_settings = ProxySettings::current().unwrap_or_default();
+
+        if inner.proxy_settings != new_proxy_settings {
+            let mut builder = fractal_api::reqwest::Client::builder();
+            builder = new_proxy_settings.apply_to_client_builder(builder);
+            let client = Self::build(builder);
+
+            inner.client = client;
+            inner.proxy_settings = new_proxy_settings;
+        }
+
+        inner.client.clone()
+    }
+
+    fn build(builder: fractal_api::reqwest::ClientBuilder) -> fractal_api::reqwest::Client {
+        builder
+            .gzip(true)
+            .timeout(globals::TIMEOUT)
+            .build()
+            .expect("Couldn't create a http client")
+    }
+}
+
+#[async_trait]
+impl HttpSend for Client {
+    async fn send_request(
+        &self,
+        req: http::Request<Vec<u8>>,
+    ) -> fractal_api::Result<http::Response<Vec<u8>>> {
+        self.get_client().send_request(req).await
+    }
+}
+
+pub fn get_matrix_client<U>(homeserver_url: U) -> Result<MatrixClient, MatrixSdkError>
+where
+    U: TryInto<Url>,
+{
+    let client = Arc::from(Client::new());
+    let config = MatrixClientConfig::new().client(client);
+    MatrixClient::new_with_config(homeserver_url, config)
+}
+
+#[derive(Debug)]
+struct ClientInnerBlocking {
+    client: fractal_api::reqwest::blocking::Client,
+    proxy_settings: ProxySettings,
+}
+
+#[derive(Debug)]
+pub struct ClientBlocking {
+    inner: Mutex<ClientInnerBlocking>,
+}
+
+impl ClientBlocking {
+    pub fn new() -> Self {
+        Self {
+            inner: Mutex::new(ClientInnerBlocking {
                 client: Self::build(fractal_api::reqwest::blocking::Client::builder()),
                 proxy_settings: Default::default(),
             }),
@@ -103,7 +202,7 @@ impl Client {
 
         if inner.proxy_settings != new_proxy_settings {
             let mut builder = fractal_api::reqwest::blocking::Client::builder();
-            builder = new_proxy_settings.apply_to_client_builder(builder);
+            builder = new_proxy_settings.apply_to_blocking_client_builder(builder);
             let client = Self::build(builder);
 
             inner.client = client;
diff --git a/fractal-gtk/src/widgets/address.rs b/fractal-gtk/src/widgets/address.rs
index 04817d50..89735333 100644
--- a/fractal-gtk/src/widgets/address.rs
+++ b/fractal-gtk/src/widgets/address.rs
@@ -161,7 +161,7 @@ impl<'a> Address<'a> {
         let entry = self.entry.clone();
         let address = self.address.clone();
         let access_token = login_data.access_token;
-        let server_url = login_data.server_url;
+        let server_url = login_data.session_client.homeserver().clone();
         let id_server = login_data.identity_url;
         self.signal_id = Some(self.button.clone().connect_clicked(move |w| {
             if !w.get_sensitive() || !w.is_visible() {
diff --git a/fractal-gtk/src/widgets/member.rs b/fractal-gtk/src/widgets/member.rs
index 1832c6af..24efad61 100644
--- a/fractal-gtk/src/widgets/member.rs
+++ b/fractal-gtk/src/widgets/member.rs
@@ -60,7 +60,7 @@ impl<'a> MemberBox<'a> {
             download_to_cache(
                 self.op.thread_pool.clone(),
                 self.op.user_info_cache.clone(),
-                login_data.server_url,
+                login_data.session_client.homeserver().clone(),
                 login_data.access_token,
                 self.member.uid.clone(),
                 data,
@@ -105,7 +105,7 @@ impl<'a> MemberBox<'a> {
             download_to_cache(
                 self.op.thread_pool.clone(),
                 self.op.user_info_cache.clone(),
-                login_data.server_url,
+                login_data.session_client.homeserver().clone(),
                 login_data.access_token,
                 self.member.uid.clone(),
                 data,
diff --git a/fractal-gtk/src/widgets/room.rs b/fractal-gtk/src/widgets/room.rs
index d23ed319..5845f9c2 100644
--- a/fractal-gtk/src/widgets/room.rs
+++ b/fractal-gtk/src/widgets/room.rs
@@ -120,7 +120,7 @@ impl<'a> RoomBox<'a> {
             let join_button = gtk::Button::with_label(i18n("Join").as_str());
             let room_id = room.id.clone();
             join_button.connect_clicked(move |_| {
-                let server_url = login_data.server_url.clone();
+                let server_url = login_data.session_client.homeserver().clone();
                 let access_token = login_data.access_token.clone();
                 let room_id = room_id.clone();
                 thread::spawn(move || {
diff --git a/fractal-gtk/src/widgets/room_history.rs b/fractal-gtk/src/widgets/room_history.rs
index 91a59b92..29b0f0e3 100644
--- a/fractal-gtk/src/widgets/room_history.rs
+++ b/fractal-gtk/src/widgets/room_history.rs
@@ -301,7 +301,7 @@ impl RoomHistory {
         let mut rh = RoomHistory {
             rows: Rc::new(RefCell::new(List::new(scroll))),
             access_token: login_data.access_token,
-            server_url: login_data.server_url,
+            server_url: login_data.session_client.homeserver().clone(),
             source_id: Rc::new(RefCell::new(None)),
             queue: Rc::new(RefCell::new(VecDeque::new())),
             edit_buffer: Rc::new(RefCell::new(VecDeque::new())),
diff --git a/fractal-matrix-api/Cargo.toml b/fractal-matrix-api/Cargo.toml
index c4353a97..53d837f0 100644
--- a/fractal-matrix-api/Cargo.toml
+++ b/fractal-matrix-api/Cargo.toml
@@ -17,7 +17,6 @@ documentation = "https://gnome.pages.gitlab.gnome.org/fractal/fractal_matrix_api
 
 [dependencies]
 gio = "0.9.0"
-ruma-identifiers = "0.17.1"
 serde_json = "1.0.48"
 
 [dependencies.serde]
@@ -31,3 +30,8 @@ features = ["blocking", "json", "gzip", "socks"]
 [dependencies.url]
 version = "2.1.1"
 features = ["serde"]
+
+[dependencies.matrix-sdk]
+git = "https://github.com/matrix-org/matrix-rust-sdk.git";
+rev = "0422bae92485b033d4f9b56f2331909653655609"
+features = ["unstable-synapse-quirks", "socks"]
diff --git a/fractal-matrix-api/src/lib.rs b/fractal-matrix-api/src/lib.rs
index ad87e5e8..5e894f98 100644
--- a/fractal-matrix-api/src/lib.rs
+++ b/fractal-matrix-api/src/lib.rs
@@ -1,9 +1,7 @@
-#[macro_use]
 pub mod identity;
 pub mod r0;
 
-pub use reqwest;
-pub use ruma_identifiers as identifiers;
+pub use matrix_sdk::*;
 pub use url;
 
 #[cfg(test)]
diff --git a/fractal-matrix-api/src/meson.build b/fractal-matrix-api/src/meson.build
index 5bdbe0e2..1853e32a 100644
--- a/fractal-matrix-api/src/meson.build
+++ b/fractal-matrix-api/src/meson.build
@@ -65,5 +65,4 @@ api_sources = files(
   'identity.rs',
   'lib.rs',
   'r0.rs',
-  'util.rs'
 )
diff --git a/fractal-matrix-api/src/r0/account/login.rs b/fractal-matrix-api/src/r0/account/login.rs
index 84d66021..4634b0e2 100644
--- a/fractal-matrix-api/src/r0/account/login.rs
+++ b/fractal-matrix-api/src/r0/account/login.rs
@@ -1,10 +1,10 @@
 use super::Identifier;
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::DeviceId;
+use matrix_sdk::identifiers::UserId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::DeviceId;
-use ruma_identifiers::UserId;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
@@ -33,7 +33,7 @@ pub enum Auth {
 pub struct Response {
     pub access_token: Option<AccessToken>,
     pub user_id: Option<UserId>,
-    pub device_id: Option<Box<DeviceId>>,
+    pub device_id: Box<DeviceId>,
 }
 
 pub fn request(base: Url, body: &Body) -> Result<Request, Error> {
diff --git a/fractal-matrix-api/src/r0/account/register.rs b/fractal-matrix-api/src/r0/account/register.rs
index eba81978..3a8522a1 100644
--- a/fractal-matrix-api/src/r0/account/register.rs
+++ b/fractal-matrix-api/src/r0/account/register.rs
@@ -1,10 +1,10 @@
 use super::AuthenticationData;
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::DeviceId;
+use matrix_sdk::identifiers::UserId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::DeviceId;
-use ruma_identifiers::UserId;
 use serde::{Deserialize, Serialize};
 use std::ops::Not;
 use url::Url;
diff --git a/fractal-matrix-api/src/r0/config/get_global_account_data.rs 
b/fractal-matrix-api/src/r0/config/get_global_account_data.rs
index 9630575b..fb515807 100644
--- a/fractal-matrix-api/src/r0/config/get_global_account_data.rs
+++ b/fractal-matrix-api/src/r0/config/get_global_account_data.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::UserId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::UserId;
 use serde::Serialize;
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/config/set_global_account_data.rs 
b/fractal-matrix-api/src/r0/config/set_global_account_data.rs
index 5e95a77c..00a91f44 100644
--- a/fractal-matrix-api/src/r0/config/set_global_account_data.rs
+++ b/fractal-matrix-api/src/r0/config/set_global_account_data.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::UserId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::UserId;
 use serde::Serialize;
 use serde_json::Value as JsonValue;
 use url::Url;
diff --git a/fractal-matrix-api/src/r0/config/set_room_account_data.rs 
b/fractal-matrix-api/src/r0/config/set_room_account_data.rs
index 12bc31c2..a23c0892 100644
--- a/fractal-matrix-api/src/r0/config/set_room_account_data.rs
+++ b/fractal-matrix-api/src/r0/config/set_room_account_data.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::{RoomId, UserId};
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::{RoomId, UserId};
 use serde::Serialize;
 use serde_json::Value as JsonValue;
 use url::Url;
diff --git a/fractal-matrix-api/src/r0/context/get_context.rs 
b/fractal-matrix-api/src/r0/context/get_context.rs
index 2d574032..f5b39f93 100644
--- a/fractal-matrix-api/src/r0/context/get_context.rs
+++ b/fractal-matrix-api/src/r0/context/get_context.rs
@@ -2,10 +2,10 @@ use crate::r0::filter::serialize_room_event_filter_as_str;
 use crate::r0::filter::RoomEventFilter;
 use crate::r0::u64_is_10;
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::{EventId, RoomId};
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::{EventId, RoomId};
 use serde::{Deserialize, Serialize};
 use serde_json::Value as JsonValue;
 use url::Url;
diff --git a/fractal-matrix-api/src/r0/directory/post_public_rooms.rs 
b/fractal-matrix-api/src/r0/directory/post_public_rooms.rs
index 9d9ac079..1b7c70a8 100644
--- a/fractal-matrix-api/src/r0/directory/post_public_rooms.rs
+++ b/fractal-matrix-api/src/r0/directory/post_public_rooms.rs
@@ -1,9 +1,9 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::RoomAliasId;
+use matrix_sdk::identifiers::RoomId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::RoomAliasId;
-use ruma_identifiers::RoomId;
 use serde::ser::SerializeMap;
 use serde::{Deserialize, Serialize, Serializer};
 use url::Url;
diff --git a/fractal-matrix-api/src/r0/membership/invite_user.rs 
b/fractal-matrix-api/src/r0/membership/invite_user.rs
index c36f74b4..9dbc997d 100644
--- a/fractal-matrix-api/src/r0/membership/invite_user.rs
+++ b/fractal-matrix-api/src/r0/membership/invite_user.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::{RoomId, UserId};
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::{RoomId, UserId};
 use serde::Serialize;
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/membership/join_room_by_id_or_alias.rs 
b/fractal-matrix-api/src/r0/membership/join_room_by_id_or_alias.rs
index d0df557b..a60ec3c8 100644
--- a/fractal-matrix-api/src/r0/membership/join_room_by_id_or_alias.rs
+++ b/fractal-matrix-api/src/r0/membership/join_room_by_id_or_alias.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::{RoomId, RoomIdOrAliasId};
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::{RoomId, RoomIdOrAliasId};
 use serde::{Deserialize, Serialize};
 use url::Host;
 use url::Url;
diff --git a/fractal-matrix-api/src/r0/membership/leave_room.rs 
b/fractal-matrix-api/src/r0/membership/leave_room.rs
index b5256218..5981b7cc 100644
--- a/fractal-matrix-api/src/r0/membership/leave_room.rs
+++ b/fractal-matrix-api/src/r0/membership/leave_room.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::RoomId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::RoomId;
 use serde::Serialize;
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/message/create_message_event.rs 
b/fractal-matrix-api/src/r0/message/create_message_event.rs
index 4e3c6b92..c878a9d2 100644
--- a/fractal-matrix-api/src/r0/message/create_message_event.rs
+++ b/fractal-matrix-api/src/r0/message/create_message_event.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::{EventId, RoomId};
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::{EventId, RoomId};
 use serde::{Deserialize, Serialize};
 use serde_json::Value as JsonValue;
 use url::Url;
diff --git a/fractal-matrix-api/src/r0/message/get_message_events.rs 
b/fractal-matrix-api/src/r0/message/get_message_events.rs
index a89acc6a..0b1d877f 100644
--- a/fractal-matrix-api/src/r0/message/get_message_events.rs
+++ b/fractal-matrix-api/src/r0/message/get_message_events.rs
@@ -2,10 +2,10 @@ use crate::r0::filter::serialize_room_event_filter_as_str;
 use crate::r0::filter::RoomEventFilter;
 use crate::r0::u64_is_10;
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::RoomId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::RoomId;
 use serde::{Deserialize, Serialize};
 use serde_json::Value as JsonValue;
 use url::Url;
diff --git a/fractal-matrix-api/src/r0/profile/get_display_name.rs 
b/fractal-matrix-api/src/r0/profile/get_display_name.rs
index 1e7171af..a735642f 100644
--- a/fractal-matrix-api/src/r0/profile/get_display_name.rs
+++ b/fractal-matrix-api/src/r0/profile/get_display_name.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::UserId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::UserId;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/profile/get_profile.rs 
b/fractal-matrix-api/src/r0/profile/get_profile.rs
index a59d99ee..c542a96e 100644
--- a/fractal-matrix-api/src/r0/profile/get_profile.rs
+++ b/fractal-matrix-api/src/r0/profile/get_profile.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::UserId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::UserId;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/profile/set_avatar_url.rs 
b/fractal-matrix-api/src/r0/profile/set_avatar_url.rs
index 771e2b8e..407a4c07 100644
--- a/fractal-matrix-api/src/r0/profile/set_avatar_url.rs
+++ b/fractal-matrix-api/src/r0/profile/set_avatar_url.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::UserId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::UserId;
 use serde::Serialize;
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/profile/set_display_name.rs 
b/fractal-matrix-api/src/r0/profile/set_display_name.rs
index dbc4f0a6..1ddd6d4e 100644
--- a/fractal-matrix-api/src/r0/profile/set_display_name.rs
+++ b/fractal-matrix-api/src/r0/profile/set_display_name.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::UserId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::UserId;
 use serde::Serialize;
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/pushrules/delete_room_rules.rs 
b/fractal-matrix-api/src/r0/pushrules/delete_room_rules.rs
index 753bc457..d2df1701 100644
--- a/fractal-matrix-api/src/r0/pushrules/delete_room_rules.rs
+++ b/fractal-matrix-api/src/r0/pushrules/delete_room_rules.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::RoomId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::RoomId;
 use serde::Serialize;
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/pushrules/get_room_rules.rs 
b/fractal-matrix-api/src/r0/pushrules/get_room_rules.rs
index ea3c4491..57733f59 100644
--- a/fractal-matrix-api/src/r0/pushrules/get_room_rules.rs
+++ b/fractal-matrix-api/src/r0/pushrules/get_room_rules.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::RoomId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::RoomId;
 use serde::Serialize;
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/pushrules/set_room_rules.rs 
b/fractal-matrix-api/src/r0/pushrules/set_room_rules.rs
index cc1cac1b..677371f3 100644
--- a/fractal-matrix-api/src/r0/pushrules/set_room_rules.rs
+++ b/fractal-matrix-api/src/r0/pushrules/set_room_rules.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::RoomId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::RoomId;
 use serde::Serialize;
 use serde_json::Value as JsonValue;
 use url::Url;
diff --git a/fractal-matrix-api/src/r0/read_marker/set_read_marker.rs 
b/fractal-matrix-api/src/r0/read_marker/set_read_marker.rs
index 1cb4e217..e48b1583 100644
--- a/fractal-matrix-api/src/r0/read_marker/set_read_marker.rs
+++ b/fractal-matrix-api/src/r0/read_marker/set_read_marker.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::{EventId, RoomId};
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::{EventId, RoomId};
 use serde::Serialize;
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/redact/redact_event.rs 
b/fractal-matrix-api/src/r0/redact/redact_event.rs
index 1d4c784d..c10f1ed5 100644
--- a/fractal-matrix-api/src/r0/redact/redact_event.rs
+++ b/fractal-matrix-api/src/r0/redact/redact_event.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::{EventId, RoomId};
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::{EventId, RoomId};
 use serde::{Deserialize, Serialize};
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/room/create_room.rs b/fractal-matrix-api/src/r0/room/create_room.rs
index 400652a2..3035265e 100644
--- a/fractal-matrix-api/src/r0/room/create_room.rs
+++ b/fractal-matrix-api/src/r0/room/create_room.rs
@@ -1,9 +1,9 @@
 use super::Visibility;
 use crate::r0::{AccessToken, HostAndPort, Medium};
+use matrix_sdk::identifiers::{RoomId, UserId};
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::{RoomId, UserId};
 use serde::{Deserialize, Serialize};
 use serde_json::Value as JsonValue;
 use std::ops::Not;
diff --git a/fractal-matrix-api/src/r0/search/user.rs b/fractal-matrix-api/src/r0/search/user.rs
index 8020103b..b86660cc 100644
--- a/fractal-matrix-api/src/r0/search/user.rs
+++ b/fractal-matrix-api/src/r0/search/user.rs
@@ -1,9 +1,9 @@
 use crate::r0::u64_is_10;
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::UserId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::UserId;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/state/create_state_events_for_key.rs 
b/fractal-matrix-api/src/r0/state/create_state_events_for_key.rs
index 48d9f19c..f96a218d 100644
--- a/fractal-matrix-api/src/r0/state/create_state_events_for_key.rs
+++ b/fractal-matrix-api/src/r0/state/create_state_events_for_key.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::RoomId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::RoomId;
 use serde::Serialize;
 use serde_json::Value as JsonValue;
 use url::Url;
diff --git a/fractal-matrix-api/src/r0/state/get_state_events_for_key.rs 
b/fractal-matrix-api/src/r0/state/get_state_events_for_key.rs
index 7adeb12c..e64a5af6 100644
--- a/fractal-matrix-api/src/r0/state/get_state_events_for_key.rs
+++ b/fractal-matrix-api/src/r0/state/get_state_events_for_key.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::RoomId;
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::RoomId;
 use serde::Serialize;
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/sync/get_joined_members.rs 
b/fractal-matrix-api/src/r0/sync/get_joined_members.rs
index d77e2d76..0046f9fd 100644
--- a/fractal-matrix-api/src/r0/sync/get_joined_members.rs
+++ b/fractal-matrix-api/src/r0/sync/get_joined_members.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::{RoomId, UserId};
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::{RoomId, UserId};
 use serde::{Deserialize, Serialize};
 use std::collections::HashMap;
 use url::Url;
diff --git a/fractal-matrix-api/src/r0/sync/sync_events.rs b/fractal-matrix-api/src/r0/sync/sync_events.rs
index f03cfce6..05a1ae68 100644
--- a/fractal-matrix-api/src/r0/sync/sync_events.rs
+++ b/fractal-matrix-api/src/r0/sync/sync_events.rs
@@ -1,9 +1,9 @@
 use crate::r0::filter::{serialize_filter_as_str, Filter};
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::{RoomId, UserId};
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::{RoomId, UserId};
 use serde::ser::SerializeMap;
 use serde::{Deserialize, Serialize, Serializer};
 use serde_json::Value as JsonValue;
diff --git a/fractal-matrix-api/src/r0/tag/create_tag.rs b/fractal-matrix-api/src/r0/tag/create_tag.rs
index f71870dd..3effbf09 100644
--- a/fractal-matrix-api/src/r0/tag/create_tag.rs
+++ b/fractal-matrix-api/src/r0/tag/create_tag.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::{RoomId, UserId};
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::{RoomId, UserId};
 use serde::Serialize;
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/tag/delete_tag.rs b/fractal-matrix-api/src/r0/tag/delete_tag.rs
index dd3210e4..bb7f2da3 100644
--- a/fractal-matrix-api/src/r0/tag/delete_tag.rs
+++ b/fractal-matrix-api/src/r0/tag/delete_tag.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::{RoomId, UserId};
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::{RoomId, UserId};
 use serde::Serialize;
 use url::Url;
 
diff --git a/fractal-matrix-api/src/r0/typing.rs b/fractal-matrix-api/src/r0/typing.rs
index 43046523..cdf784af 100644
--- a/fractal-matrix-api/src/r0/typing.rs
+++ b/fractal-matrix-api/src/r0/typing.rs
@@ -1,8 +1,8 @@
 use crate::r0::AccessToken;
+use matrix_sdk::identifiers::{RoomId, UserId};
 use reqwest::blocking::Client;
 use reqwest::blocking::Request;
 use reqwest::Error;
-use ruma_identifiers::{RoomId, UserId};
 use serde::ser::SerializeMap;
 use serde::Serialize;
 use serde::Serializer;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]