diff --git a/Cargo.lock b/Cargo.lock
index b0212c8b4820c56bde7fdb0532a9b04e095a3399..60301bb89d5b55aa4f295ee9f49346d7af1b51fb 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1634,7 +1634,7 @@ dependencies = [
 [[package]]
 name = "ruma"
 version = "0.0.3"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "assign",
  "js_int",
@@ -1654,7 +1654,7 @@ dependencies = [
 [[package]]
 name = "ruma-api"
 version = "0.17.0-alpha.4"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "bytes",
  "http",
@@ -1670,7 +1670,7 @@ dependencies = [
 [[package]]
 name = "ruma-api-macros"
 version = "0.17.0-alpha.4"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2",
@@ -1681,7 +1681,7 @@ dependencies = [
 [[package]]
 name = "ruma-appservice-api"
 version = "0.2.0-alpha.3"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "ruma-api",
  "ruma-common",
@@ -1695,7 +1695,7 @@ dependencies = [
 [[package]]
 name = "ruma-client-api"
 version = "0.10.0-alpha.3"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "assign",
  "bytes",
@@ -1715,7 +1715,7 @@ dependencies = [
 [[package]]
 name = "ruma-common"
 version = "0.5.0"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "indexmap",
  "js_int",
@@ -1731,7 +1731,7 @@ dependencies = [
 [[package]]
 name = "ruma-events"
 version = "0.22.0-alpha.3"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "js_int",
  "ruma-common",
@@ -1745,7 +1745,7 @@ dependencies = [
 [[package]]
 name = "ruma-events-macros"
 version = "0.22.0-alpha.3"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2",
@@ -1756,7 +1756,7 @@ dependencies = [
 [[package]]
 name = "ruma-federation-api"
 version = "0.1.0-alpha.2"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "js_int",
  "ruma-api",
@@ -1771,7 +1771,7 @@ dependencies = [
 [[package]]
 name = "ruma-identifiers"
 version = "0.19.0"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "paste",
  "rand",
@@ -1785,7 +1785,7 @@ dependencies = [
 [[package]]
 name = "ruma-identifiers-macros"
 version = "0.19.0"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1796,13 +1796,14 @@ dependencies = [
 [[package]]
 name = "ruma-identifiers-validation"
 version = "0.3.0"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 
 [[package]]
 name = "ruma-identity-service-api"
 version = "0.1.0-alpha.1"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
+ "js_int",
  "ruma-api",
  "ruma-common",
  "ruma-identifiers",
@@ -1814,7 +1815,7 @@ dependencies = [
 [[package]]
 name = "ruma-push-gateway-api"
 version = "0.1.0-alpha.1"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "js_int",
  "ruma-api",
@@ -1829,7 +1830,7 @@ dependencies = [
 [[package]]
 name = "ruma-serde"
 version = "0.3.1"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "bytes",
  "form_urlencoded",
@@ -1843,7 +1844,7 @@ dependencies = [
 [[package]]
 name = "ruma-serde-macros"
 version = "0.3.1"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2",
@@ -1854,7 +1855,7 @@ dependencies = [
 [[package]]
 name = "ruma-signatures"
 version = "0.7.0"
-source = "git+https://github.com/ruma/ruma?rev=d27584ae3bdc035529e7389f1c392d4c96f9f8eb#d27584ae3bdc035529e7389f1c392d4c96f9f8eb"
+source = "git+https://github.com/ruma/ruma?rev=8c286e78d41770fe431e7304cc2fe23e383793df#8c286e78d41770fe431e7304cc2fe23e383793df"
 dependencies = [
  "base64 0.13.0",
  "ring",
@@ -2167,7 +2168,7 @@ dependencies = [
 [[package]]
 name = "state-res"
 version = "0.1.0"
-source = "git+https://github.com/ruma/state-res?rev=ce665d213fffeaa47e146d01c6b87f9eb9feaa52#ce665d213fffeaa47e146d01c6b87f9eb9feaa52"
+source = "git+https://github.com/ruma/state-res?rev=c20893e536bea4d17a9fe6af28428fb17169b56f#c20893e536bea4d17a9fe6af28428fb17169b56f"
 dependencies = [
  "itertools 0.10.0",
  "log",
diff --git a/Cargo.toml b/Cargo.toml
index 8554fa21afd44f603935a8b230f39494c1938fcf..f12420e6aa833bbfd6fada5d1a1617e6aac4057b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -18,12 +18,12 @@ rocket = { git = "https://github.com/SergioBenitez/Rocket.git", rev = "801e04bd5
 #rocket = { git = "https://github.com/timokoesters/Rocket.git", branch = "empty_parameters", default-features = false, features = ["tls"] }
 
 # Used for matrix spec type definitions and helpers
-ruma = { git = "https://github.com/ruma/ruma", rev = "d27584ae3bdc035529e7389f1c392d4c96f9f8eb", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "unstable-pre-spec", "unstable-exhaustive-types"] }
+ruma = { git = "https://github.com/ruma/ruma", rev = "8c286e78d41770fe431e7304cc2fe23e383793df", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "unstable-pre-spec", "unstable-exhaustive-types"] }
 #ruma = { git = "https://github.com/timokoesters/ruma", rev = "220d5b4a76b3b781f7f8297fbe6b14473b04214b", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "unstable-pre-spec", "unstable-exhaustive-types"] }
 #ruma = { path = "../ruma/ruma", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "unstable-pre-spec", "unstable-exhaustive-types"] }
 
 # Used when doing state resolution
-state-res = { git = "https://github.com/ruma/state-res", rev = "ce665d213fffeaa47e146d01c6b87f9eb9feaa52", features = ["unstable-pre-spec"] }
+state-res = { git = "https://github.com/ruma/state-res", rev = "c20893e536bea4d17a9fe6af28428fb17169b56f", features = ["unstable-pre-spec"] }
 #state-res = { path = "../state-res", features = ["unstable-pre-spec"] }
 
 # Used for long polling and federation sender, should be the same as rocket::tokio
diff --git a/src/appservice_server.rs b/src/appservice_server.rs
index 8f64edf1eb6b50011ddebac3d8f58661ac7d5cf4..42918577c2a2ed04c5a8edb3073560abde49d45b 100644
--- a/src/appservice_server.rs
+++ b/src/appservice_server.rs
@@ -1,11 +1,11 @@
 use crate::{utils, Error, Result};
 use bytes::BytesMut;
-use http::header::{HeaderValue, CONTENT_TYPE};
 use log::warn;
 use ruma::api::{IncomingResponse, OutgoingRequest, SendAccessToken};
 use std::{
     convert::{TryFrom, TryInto},
     fmt::Debug,
+    mem,
     time::Duration,
 };
 
@@ -40,33 +40,27 @@ pub async fn send_request<T: OutgoingRequest>(
     );
     *http_request.uri_mut() = parts.try_into().expect("our manipulation is always valid");
 
-    http_request.headers_mut().insert(
-        CONTENT_TYPE,
-        HeaderValue::from_str("application/json").unwrap(),
-    );
-
     let mut reqwest_request = reqwest::Request::try_from(http_request)
         .expect("all http requests are valid reqwest requests");
 
     *reqwest_request.timeout_mut() = Some(Duration::from_secs(30));
 
     let url = reqwest_request.url().clone();
-    let mut reqwest_response = globals.reqwest_client().execute(reqwest_request).await?;
-
-    // Because reqwest::Response -> http::Response is complicated:
-    let status = reqwest_response.status();
-    let mut http_response = http::Response::builder().status(status);
-    let headers = http_response.headers_mut().unwrap();
+    let mut response = globals.reqwest_client().execute(reqwest_request).await?;
 
-    for (k, v) in reqwest_response.headers_mut().drain() {
-        if let Some(key) = k {
-            headers.insert(key, v);
-        }
-    }
-
-    let status = reqwest_response.status();
+    // reqwest::Response -> http::Response conversion
+    let status = response.status();
+    let mut http_response_builder = http::Response::builder()
+        .status(status)
+        .version(response.version());
+    mem::swap(
+        response.headers_mut(),
+        http_response_builder
+            .headers_mut()
+            .expect("http::response::Builder is usable"),
+    );
 
-    let body = reqwest_response.bytes().await.unwrap_or_else(|e| {
+    let body = response.bytes().await.unwrap_or_else(|e| {
         warn!("server error: {}", e);
         Vec::new().into()
     }); // TODO: handle timeout
@@ -82,7 +76,7 @@ pub async fn send_request<T: OutgoingRequest>(
     }
 
     let response = T::IncomingResponse::try_from_http_response(
-        http_response
+        http_response_builder
             .body(body)
             .expect("reqwest body is valid http body"),
     );
diff --git a/src/client_server/config.rs b/src/client_server/config.rs
index 68cd2e03f084f059ed15d4a8ab604fd273087160..07a9bc9617023d785926da19098b5f41a09d4130 100644
--- a/src/client_server/config.rs
+++ b/src/client_server/config.rs
@@ -8,9 +8,11 @@
             set_room_account_data,
         },
     },
-    events::{custom::CustomEventContent, BasicEvent},
+    events::{custom::CustomEventContent, AnyBasicEventContent, BasicEvent},
     serde::Raw,
 };
+use serde::Deserialize;
+use serde_json::value::RawValue as RawJsonValue;
 
 #[cfg(feature = "conduit_bin")]
 use rocket::{get, put};
@@ -91,14 +93,17 @@ pub async fn get_global_account_data_route(
 ) -> ConduitResult<get_global_account_data::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
-    let data = db
+    let event = db
         .account_data
-        .get::<Raw<ruma::events::AnyBasicEvent>>(None, sender_user, body.event_type.clone().into())?
+        .get::<Box<RawJsonValue>>(None, sender_user, body.event_type.clone().into())?
         .ok_or(Error::BadRequest(ErrorKind::NotFound, "Data not found."))?;
-
     db.flush().await?;
 
-    Ok(get_global_account_data::Response { account_data: data }.into())
+    let account_data = serde_json::from_str::<ExtractEventContent>(event.get())
+        .map_err(|_| Error::bad_database("Invalid account data event in db."))?
+        .content;
+
+    Ok(get_global_account_data::Response { account_data }.into())
 }
 
 #[cfg_attr(
@@ -115,16 +120,24 @@ pub async fn get_room_account_data_route(
 ) -> ConduitResult<get_room_account_data::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
-    let data = db
+    let event = db
         .account_data
-        .get::<Raw<ruma::events::AnyBasicEvent>>(
+        .get::<Box<RawJsonValue>>(
             Some(&body.room_id),
             sender_user,
             body.event_type.clone().into(),
         )?
         .ok_or(Error::BadRequest(ErrorKind::NotFound, "Data not found."))?;
-
     db.flush().await?;
 
-    Ok(get_room_account_data::Response { account_data: data }.into())
+    let account_data = serde_json::from_str::<ExtractEventContent>(event.get())
+        .map_err(|_| Error::bad_database("Invalid account data event in db."))?
+        .content;
+
+    Ok(get_room_account_data::Response { account_data }.into())
+}
+
+#[derive(Deserialize)]
+struct ExtractEventContent {
+    content: Raw<AnyBasicEventContent>,
 }
diff --git a/src/client_server/profile.rs b/src/client_server/profile.rs
index f2c141bdc8d88548141c70af375f00a9df1daa7a..882b02e7e4d9c0e2c51adf4a8c9754de7efdc695 100644
--- a/src/client_server/profile.rs
+++ b/src/client_server/profile.rs
@@ -49,11 +49,11 @@ pub async fn set_displayname_route(
                                 )?
                                 .ok_or_else(|| {
                                     Error::bad_database(
-                                "Tried to send displayname update for user not in the room.",
-                            )
+                                        "Tried to send displayname update for user not in the \
+                                         room.",
+                                    )
                                 })?
-                                .content
-                                .clone(),
+                                .content,
                         )
                         .expect("from_value::<Raw<..>> can never fail")
                         .deserialize()
@@ -150,11 +150,11 @@ pub async fn set_avatar_url_route(
                                 )?
                                 .ok_or_else(|| {
                                     Error::bad_database(
-                                "Tried to send displayname update for user not in the room.",
-                            )
+                                        "Tried to send displayname update for user not in the \
+                                         room.",
+                                    )
                                 })?
-                                .content
-                                .clone(),
+                                .content,
                         )
                         .expect("from_value::<Raw<..>> can never fail")
                         .deserialize()
diff --git a/src/database/pusher.rs b/src/database/pusher.rs
index 7c7abb3b4d181ad1c9077c6e026dcbd4b6d241d5..75c2efb6e01dfdea19c9ac14f47438f846043847 100644
--- a/src/database/pusher.rs
+++ b/src/database/pusher.rs
@@ -16,7 +16,7 @@
 };
 use sled::IVec;
 
-use std::{convert::TryFrom, fmt::Debug};
+use std::{convert::TryFrom, fmt::Debug, mem};
 
 #[derive(Debug, Clone)]
 pub struct PushData {
@@ -114,24 +114,23 @@ pub async fn send_request<T: OutgoingRequest>(
     //*reqwest_request.timeout_mut() = Some(Duration::from_secs(5));
 
     let url = reqwest_request.url().clone();
-    let reqwest_response = globals.reqwest_client().execute(reqwest_request).await;
-
-    // Because reqwest::Response -> http::Response is complicated:
-    match reqwest_response {
-        Ok(mut reqwest_response) => {
-            let status = reqwest_response.status();
-            let mut http_response = http::Response::builder().status(status);
-            let headers = http_response.headers_mut().unwrap();
-
-            for (k, v) in reqwest_response.headers_mut().drain() {
-                if let Some(key) = k {
-                    headers.insert(key, v);
-                }
-            }
-
-            let status = reqwest_response.status();
+    let response = globals.reqwest_client().execute(reqwest_request).await;
+
+    match response {
+        Ok(mut response) => {
+            // reqwest::Response -> http::Response conversion
+            let status = response.status();
+            let mut http_response_builder = http::Response::builder()
+                .status(status)
+                .version(response.version());
+            mem::swap(
+                response.headers_mut(),
+                http_response_builder
+                    .headers_mut()
+                    .expect("http::response::Builder is usable"),
+            );
 
-            let body = reqwest_response.bytes().await.unwrap_or_else(|e| {
+            let body = response.bytes().await.unwrap_or_else(|e| {
                 warn!("server error {}", e);
                 Vec::new().into()
             }); // TODO: handle timeout
@@ -147,7 +146,7 @@ pub async fn send_request<T: OutgoingRequest>(
             }
 
             let response = T::IncomingResponse::try_from_http_response(
-                http_response
+                http_response_builder
                     .body(body)
                     .expect("reqwest body is valid http body"),
             );
diff --git a/src/server_server.rs b/src/server_server.rs
index 1e58067e9f92adffb3da27c67a7cb88e3b449b85..908a54e647ac830b36f8a7db20738ed814d4bd29 100644
--- a/src/server_server.rs
+++ b/src/server_server.rs
@@ -43,6 +43,7 @@
     convert::{TryFrom, TryInto},
     fmt::Debug,
     future::Future,
+    mem,
     net::{IpAddr, SocketAddr},
     pin::Pin,
     result::Result as StdResult,
@@ -219,24 +220,23 @@ pub async fn send_request<T: OutgoingRequest>(
     *reqwest_request.timeout_mut() = Some(Duration::from_secs(30));
 
     let url = reqwest_request.url().clone();
-    let reqwest_response = globals.reqwest_client().execute(reqwest_request).await;
-
-    // Because reqwest::Response -> http::Response is complicated:
-    match reqwest_response {
-        Ok(mut reqwest_response) => {
-            let status = reqwest_response.status();
-            let mut http_response = http::Response::builder().status(status);
-            let headers = http_response.headers_mut().unwrap();
-
-            for (k, v) in reqwest_response.headers_mut().drain() {
-                if let Some(key) = k {
-                    headers.insert(key, v);
-                }
-            }
-
-            let status = reqwest_response.status();
+    let response = globals.reqwest_client().execute(reqwest_request).await;
+
+    match response {
+        Ok(mut response) => {
+            // reqwest::Response -> http::Response conversion
+            let status = response.status();
+            let mut http_response_builder = http::Response::builder()
+                .status(status)
+                .version(response.version());
+            mem::swap(
+                response.headers_mut(),
+                http_response_builder
+                    .headers_mut()
+                    .expect("http::response::Builder is usable"),
+            );
 
-            let body = reqwest_response.bytes().await.unwrap_or_else(|e| {
+            let body = response.bytes().await.unwrap_or_else(|e| {
                 warn!("server error {}", e);
                 Vec::new().into()
             }); // TODO: handle timeout
@@ -254,7 +254,7 @@ pub async fn send_request<T: OutgoingRequest>(
             }
 
             let response = T::IncomingResponse::try_from_http_response(
-                http_response
+                http_response_builder
                     .body(body)
                     .expect("reqwest body is valid http body"),
             );