diff --git a/Cargo.lock b/Cargo.lock
index 6ae18361ef08d1fe9bc8feb5a9b3619f40e3575a..a659dec0fd785e2fa225fd124b9522a535ecfcfe 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2053,7 +2053,7 @@ dependencies = [
 [[package]]
 name = "ruma"
 version = "0.7.4"
-source = "git+https://github.com/ruma/ruma?rev=2bd5c131f49b2239750c39ed63b623cd5a01c965#2bd5c131f49b2239750c39ed63b623cd5a01c965"
+source = "git+https://github.com/ruma/ruma?rev=af28dc8339773e5cad460289fa3c4e22d9a058cd#af28dc8339773e5cad460289fa3c4e22d9a058cd"
 dependencies = [
  "assign",
  "js_int",
@@ -2071,7 +2071,7 @@ dependencies = [
 [[package]]
 name = "ruma-appservice-api"
 version = "0.7.0"
-source = "git+https://github.com/ruma/ruma?rev=2bd5c131f49b2239750c39ed63b623cd5a01c965#2bd5c131f49b2239750c39ed63b623cd5a01c965"
+source = "git+https://github.com/ruma/ruma?rev=af28dc8339773e5cad460289fa3c4e22d9a058cd#af28dc8339773e5cad460289fa3c4e22d9a058cd"
 dependencies = [
  "js_int",
  "ruma-common",
@@ -2082,7 +2082,7 @@ dependencies = [
 [[package]]
 name = "ruma-client-api"
 version = "0.15.3"
-source = "git+https://github.com/ruma/ruma?rev=2bd5c131f49b2239750c39ed63b623cd5a01c965#2bd5c131f49b2239750c39ed63b623cd5a01c965"
+source = "git+https://github.com/ruma/ruma?rev=af28dc8339773e5cad460289fa3c4e22d9a058cd#af28dc8339773e5cad460289fa3c4e22d9a058cd"
 dependencies = [
  "assign",
  "bytes",
@@ -2099,7 +2099,7 @@ dependencies = [
 [[package]]
 name = "ruma-common"
 version = "0.10.5"
-source = "git+https://github.com/ruma/ruma?rev=2bd5c131f49b2239750c39ed63b623cd5a01c965#2bd5c131f49b2239750c39ed63b623cd5a01c965"
+source = "git+https://github.com/ruma/ruma?rev=af28dc8339773e5cad460289fa3c4e22d9a058cd#af28dc8339773e5cad460289fa3c4e22d9a058cd"
 dependencies = [
  "base64",
  "bytes",
@@ -2127,7 +2127,7 @@ dependencies = [
 [[package]]
 name = "ruma-federation-api"
 version = "0.6.0"
-source = "git+https://github.com/ruma/ruma?rev=2bd5c131f49b2239750c39ed63b623cd5a01c965#2bd5c131f49b2239750c39ed63b623cd5a01c965"
+source = "git+https://github.com/ruma/ruma?rev=af28dc8339773e5cad460289fa3c4e22d9a058cd#af28dc8339773e5cad460289fa3c4e22d9a058cd"
 dependencies = [
  "js_int",
  "ruma-common",
@@ -2138,7 +2138,7 @@ dependencies = [
 [[package]]
 name = "ruma-identifiers-validation"
 version = "0.9.0"
-source = "git+https://github.com/ruma/ruma?rev=2bd5c131f49b2239750c39ed63b623cd5a01c965#2bd5c131f49b2239750c39ed63b623cd5a01c965"
+source = "git+https://github.com/ruma/ruma?rev=af28dc8339773e5cad460289fa3c4e22d9a058cd#af28dc8339773e5cad460289fa3c4e22d9a058cd"
 dependencies = [
  "js_int",
  "thiserror",
@@ -2147,7 +2147,7 @@ dependencies = [
 [[package]]
 name = "ruma-identity-service-api"
 version = "0.6.0"
-source = "git+https://github.com/ruma/ruma?rev=2bd5c131f49b2239750c39ed63b623cd5a01c965#2bd5c131f49b2239750c39ed63b623cd5a01c965"
+source = "git+https://github.com/ruma/ruma?rev=af28dc8339773e5cad460289fa3c4e22d9a058cd#af28dc8339773e5cad460289fa3c4e22d9a058cd"
 dependencies = [
  "js_int",
  "ruma-common",
@@ -2157,7 +2157,7 @@ dependencies = [
 [[package]]
 name = "ruma-macros"
 version = "0.10.5"
-source = "git+https://github.com/ruma/ruma?rev=2bd5c131f49b2239750c39ed63b623cd5a01c965#2bd5c131f49b2239750c39ed63b623cd5a01c965"
+source = "git+https://github.com/ruma/ruma?rev=af28dc8339773e5cad460289fa3c4e22d9a058cd#af28dc8339773e5cad460289fa3c4e22d9a058cd"
 dependencies = [
  "once_cell",
  "proc-macro-crate",
@@ -2172,7 +2172,7 @@ dependencies = [
 [[package]]
 name = "ruma-push-gateway-api"
 version = "0.6.0"
-source = "git+https://github.com/ruma/ruma?rev=2bd5c131f49b2239750c39ed63b623cd5a01c965#2bd5c131f49b2239750c39ed63b623cd5a01c965"
+source = "git+https://github.com/ruma/ruma?rev=af28dc8339773e5cad460289fa3c4e22d9a058cd#af28dc8339773e5cad460289fa3c4e22d9a058cd"
 dependencies = [
  "js_int",
  "ruma-common",
@@ -2183,7 +2183,7 @@ dependencies = [
 [[package]]
 name = "ruma-signatures"
 version = "0.12.0"
-source = "git+https://github.com/ruma/ruma?rev=2bd5c131f49b2239750c39ed63b623cd5a01c965#2bd5c131f49b2239750c39ed63b623cd5a01c965"
+source = "git+https://github.com/ruma/ruma?rev=af28dc8339773e5cad460289fa3c4e22d9a058cd#af28dc8339773e5cad460289fa3c4e22d9a058cd"
 dependencies = [
  "base64",
  "ed25519-dalek",
@@ -2199,7 +2199,7 @@ dependencies = [
 [[package]]
 name = "ruma-state-res"
 version = "0.8.0"
-source = "git+https://github.com/ruma/ruma?rev=2bd5c131f49b2239750c39ed63b623cd5a01c965#2bd5c131f49b2239750c39ed63b623cd5a01c965"
+source = "git+https://github.com/ruma/ruma?rev=af28dc8339773e5cad460289fa3c4e22d9a058cd#af28dc8339773e5cad460289fa3c4e22d9a058cd"
 dependencies = [
  "itertools",
  "js_int",
diff --git a/Cargo.toml b/Cargo.toml
index 801d3635de957306c7eb26cee249e10bc348ce4d..87102c0c3a64d3da2037e28f946ffa6e8c863852 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -21,7 +21,7 @@ tower-http = { version = "0.3.4", features = ["add-extension", "cors", "compress
 
 # Used for matrix spec type definitions and helpers
 #ruma = { version = "0.4.0", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
-ruma = { git = "https://github.com/ruma/ruma", rev = "2bd5c131f49b2239750c39ed63b623cd5a01c965", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-msc2448", "unstable-exhaustive-types", "ring-compat", "unstable-unspecified" ] }
+ruma = { git = "https://github.com/ruma/ruma", rev = "af28dc8339773e5cad460289fa3c4e22d9a058cd", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-msc2448", "unstable-exhaustive-types", "ring-compat", "unstable-unspecified" ] }
 #ruma = { git = "https://github.com/timokoesters/ruma", rev = "50c1db7e0a3a21fc794b0cce3b64285a4c750c71", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
 #ruma = { path = "../ruma/crates/ruma", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
 
diff --git a/src/api/client_server/account.rs b/src/api/client_server/account.rs
index 309a3618a2de4c4c1ca1f181082778a010c8ff3a..50a6a1875f0a11d73d5e7bcbc0fbcb87c9fe4b64 100644
--- a/src/api/client_server/account.rs
+++ b/src/api/client_server/account.rs
@@ -30,7 +30,7 @@
 ///
 /// Note: This will not reserve the username, so the username might become invalid when trying to register
 pub async fn get_register_available_route(
-    body: Ruma<get_username_availability::v3::IncomingRequest>,
+    body: Ruma<get_username_availability::v3::Request>,
 ) -> Result<get_username_availability::v3::Response> {
     // Validate user id
     let user_id = UserId::parse_with_server_name(
@@ -73,9 +73,7 @@ pub async fn get_register_available_route(
 /// - If type is not guest and no username is given: Always fails after UIAA check
 /// - Creates a new account and populates it with default account data
 /// - If `inhibit_login` is false: Creates a device and returns device id and access_token
-pub async fn register_route(
-    body: Ruma<register::v3::IncomingRequest>,
-) -> Result<register::v3::Response> {
+pub async fn register_route(body: Ruma<register::v3::Request>) -> Result<register::v3::Response> {
     if !services().globals.allow_registration() && !body.from_appservice {
         return Err(Error::BadRequest(
             ErrorKind::Forbidden,
@@ -266,7 +264,7 @@ pub async fn register_route(
 /// - Forgets to-device events
 /// - Triggers device list updates
 pub async fn change_password_route(
-    body: Ruma<change_password::v3::IncomingRequest>,
+    body: Ruma<change_password::v3::Request>,
 ) -> Result<change_password::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     let sender_device = body.sender_device.as_ref().expect("user is authenticated");
@@ -354,7 +352,7 @@ pub async fn whoami_route(body: Ruma<whoami::v3::Request>) -> Result<whoami::v3:
 /// - Triggers device list updates
 /// - Removes ability to log in again
 pub async fn deactivate_route(
-    body: Ruma<deactivate::v3::IncomingRequest>,
+    body: Ruma<deactivate::v3::Request>,
 ) -> Result<deactivate::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     let sender_device = body.sender_device.as_ref().expect("user is authenticated");
@@ -426,7 +424,7 @@ pub async fn third_party_route(
 ///
 /// - 403 signals that The homeserver does not allow the third party identifier as a contact option.
 pub async fn request_3pid_management_token_via_email_route(
-    _body: Ruma<request_3pid_management_token_via_email::v3::IncomingRequest>,
+    _body: Ruma<request_3pid_management_token_via_email::v3::Request>,
 ) -> Result<request_3pid_management_token_via_email::v3::Response> {
     Err(Error::BadRequest(
         ErrorKind::ThreepidDenied,
@@ -440,7 +438,7 @@ pub async fn request_3pid_management_token_via_email_route(
 ///
 /// - 403 signals that The homeserver does not allow the third party identifier as a contact option.
 pub async fn request_3pid_management_token_via_msisdn_route(
-    _body: Ruma<request_3pid_management_token_via_msisdn::v3::IncomingRequest>,
+    _body: Ruma<request_3pid_management_token_via_msisdn::v3::Request>,
 ) -> Result<request_3pid_management_token_via_msisdn::v3::Response> {
     Err(Error::BadRequest(
         ErrorKind::ThreepidDenied,
diff --git a/src/api/client_server/alias.rs b/src/api/client_server/alias.rs
index b28606c14e27633343a59f6892a57307b13efa7f..ab51b5065b7996a0b2ce9a44982b75bfaf70b9de 100644
--- a/src/api/client_server/alias.rs
+++ b/src/api/client_server/alias.rs
@@ -9,14 +9,14 @@
         },
         federation,
     },
-    RoomAliasId,
+    OwnedRoomAliasId,
 };
 
 /// # `PUT /_matrix/client/r0/directory/room/{roomAlias}`
 ///
 /// Creates a new room alias on this server.
 pub async fn create_alias_route(
-    body: Ruma<create_alias::v3::IncomingRequest>,
+    body: Ruma<create_alias::v3::Request>,
 ) -> Result<create_alias::v3::Response> {
     if body.room_alias.server_name() != services().globals.server_name() {
         return Err(Error::BadRequest(
@@ -49,7 +49,7 @@ pub async fn create_alias_route(
 /// - TODO: additional access control checks
 /// - TODO: Update canonical alias event
 pub async fn delete_alias_route(
-    body: Ruma<delete_alias::v3::IncomingRequest>,
+    body: Ruma<delete_alias::v3::Request>,
 ) -> Result<delete_alias::v3::Response> {
     if body.room_alias.server_name() != services().globals.server_name() {
         return Err(Error::BadRequest(
@@ -71,18 +71,22 @@ pub async fn delete_alias_route(
 ///
 /// - TODO: Suggest more servers to join via
 pub async fn get_alias_route(
-    body: Ruma<get_alias::v3::IncomingRequest>,
+    body: Ruma<get_alias::v3::Request>,
 ) -> Result<get_alias::v3::Response> {
-    get_alias_helper(&body.room_alias).await
+    get_alias_helper(body.body.room_alias).await
 }
 
-pub(crate) async fn get_alias_helper(room_alias: &RoomAliasId) -> Result<get_alias::v3::Response> {
+pub(crate) async fn get_alias_helper(
+    room_alias: OwnedRoomAliasId,
+) -> Result<get_alias::v3::Response> {
     if room_alias.server_name() != services().globals.server_name() {
         let response = services()
             .sending
             .send_federation_request(
                 room_alias.server_name(),
-                federation::query::get_room_information::v1::Request { room_alias },
+                federation::query::get_room_information::v1::Request {
+                    room_alias: room_alias.to_owned(),
+                },
             )
             .await?;
 
@@ -93,7 +97,7 @@ pub(crate) async fn get_alias_helper(room_alias: &RoomAliasId) -> Result<get_ali
     }
 
     let mut room_id = None;
-    match services().rooms.alias.resolve_local_alias(room_alias)? {
+    match services().rooms.alias.resolve_local_alias(&room_alias)? {
         Some(r) => room_id = Some(r),
         None => {
             for (_id, registration) in services().appservice.all()? {
@@ -115,7 +119,9 @@ pub(crate) async fn get_alias_helper(room_alias: &RoomAliasId) -> Result<get_ali
                         .sending
                         .send_appservice_request(
                             registration,
-                            appservice::query::query_room_alias::v1::Request { room_alias },
+                            appservice::query::query_room_alias::v1::Request {
+                                room_alias: room_alias.clone(),
+                            },
                         )
                         .await
                         .is_ok()
@@ -124,7 +130,7 @@ pub(crate) async fn get_alias_helper(room_alias: &RoomAliasId) -> Result<get_ali
                         services()
                             .rooms
                             .alias
-                            .resolve_local_alias(room_alias)?
+                            .resolve_local_alias(&room_alias)?
                             .ok_or_else(|| {
                                 Error::bad_config("Appservice lied to us. Room does not exist.")
                             })?,
diff --git a/src/api/client_server/backup.rs b/src/api/client_server/backup.rs
index f3d5ddc5024b382017ddc705629822dd86f294ea..115cba7cb3c56a6e077aad414d0c347d047ac585 100644
--- a/src/api/client_server/backup.rs
+++ b/src/api/client_server/backup.rs
@@ -28,7 +28,7 @@ pub async fn create_backup_version_route(
 ///
 /// Update information about an existing backup. Only `auth_data` can be modified.
 pub async fn update_backup_version_route(
-    body: Ruma<update_backup_version::v3::IncomingRequest>,
+    body: Ruma<update_backup_version::v3::Request>,
 ) -> Result<update_backup_version::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     services()
@@ -66,7 +66,7 @@ pub async fn get_latest_backup_info_route(
 ///
 /// Get information about an existing backup.
 pub async fn get_backup_info_route(
-    body: Ruma<get_backup_info::v3::IncomingRequest>,
+    body: Ruma<get_backup_info::v3::Request>,
 ) -> Result<get_backup_info::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     let algorithm = services()
@@ -96,7 +96,7 @@ pub async fn get_backup_info_route(
 ///
 /// - Deletes both information about the backup, as well as all key data related to the backup
 pub async fn delete_backup_version_route(
-    body: Ruma<delete_backup_version::v3::IncomingRequest>,
+    body: Ruma<delete_backup_version::v3::Request>,
 ) -> Result<delete_backup_version::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -115,7 +115,7 @@ pub async fn delete_backup_version_route(
 /// - Adds the keys to the backup
 /// - Returns the new number of keys in this backup and the etag
 pub async fn add_backup_keys_route(
-    body: Ruma<add_backup_keys::v3::IncomingRequest>,
+    body: Ruma<add_backup_keys::v3::Request>,
 ) -> Result<add_backup_keys::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -162,7 +162,7 @@ pub async fn add_backup_keys_route(
 /// - Adds the keys to the backup
 /// - Returns the new number of keys in this backup and the etag
 pub async fn add_backup_keys_for_room_route(
-    body: Ruma<add_backup_keys_for_room::v3::IncomingRequest>,
+    body: Ruma<add_backup_keys_for_room::v3::Request>,
 ) -> Result<add_backup_keys_for_room::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -207,7 +207,7 @@ pub async fn add_backup_keys_for_room_route(
 /// - Adds the keys to the backup
 /// - Returns the new number of keys in this backup and the etag
 pub async fn add_backup_keys_for_session_route(
-    body: Ruma<add_backup_keys_for_session::v3::IncomingRequest>,
+    body: Ruma<add_backup_keys_for_session::v3::Request>,
 ) -> Result<add_backup_keys_for_session::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -246,7 +246,7 @@ pub async fn add_backup_keys_for_session_route(
 ///
 /// Retrieves all keys from the backup.
 pub async fn get_backup_keys_route(
-    body: Ruma<get_backup_keys::v3::IncomingRequest>,
+    body: Ruma<get_backup_keys::v3::Request>,
 ) -> Result<get_backup_keys::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -259,7 +259,7 @@ pub async fn get_backup_keys_route(
 ///
 /// Retrieves all keys from the backup for a given room.
 pub async fn get_backup_keys_for_room_route(
-    body: Ruma<get_backup_keys_for_room::v3::IncomingRequest>,
+    body: Ruma<get_backup_keys_for_room::v3::Request>,
 ) -> Result<get_backup_keys_for_room::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -274,7 +274,7 @@ pub async fn get_backup_keys_for_room_route(
 ///
 /// Retrieves a key from the backup.
 pub async fn get_backup_keys_for_session_route(
-    body: Ruma<get_backup_keys_for_session::v3::IncomingRequest>,
+    body: Ruma<get_backup_keys_for_session::v3::Request>,
 ) -> Result<get_backup_keys_for_session::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -293,7 +293,7 @@ pub async fn get_backup_keys_for_session_route(
 ///
 /// Delete the keys from the backup.
 pub async fn delete_backup_keys_route(
-    body: Ruma<delete_backup_keys::v3::IncomingRequest>,
+    body: Ruma<delete_backup_keys::v3::Request>,
 ) -> Result<delete_backup_keys::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -316,7 +316,7 @@ pub async fn delete_backup_keys_route(
 ///
 /// Delete the keys from the backup for a given room.
 pub async fn delete_backup_keys_for_room_route(
-    body: Ruma<delete_backup_keys_for_room::v3::IncomingRequest>,
+    body: Ruma<delete_backup_keys_for_room::v3::Request>,
 ) -> Result<delete_backup_keys_for_room::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -339,7 +339,7 @@ pub async fn delete_backup_keys_for_room_route(
 ///
 /// Delete a key from the backup.
 pub async fn delete_backup_keys_for_session_route(
-    body: Ruma<delete_backup_keys_for_session::v3::IncomingRequest>,
+    body: Ruma<delete_backup_keys_for_session::v3::Request>,
 ) -> Result<delete_backup_keys_for_session::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
diff --git a/src/api/client_server/capabilities.rs b/src/api/client_server/capabilities.rs
index 31d42d2f4e9655a1be6c993a53ca50b360e1de7c..233e3c9c01dcbd814513f9f132c1566b278c8fab 100644
--- a/src/api/client_server/capabilities.rs
+++ b/src/api/client_server/capabilities.rs
@@ -8,7 +8,7 @@
 ///
 /// Get information on the supported feature set and other relevent capabilities of this server.
 pub async fn get_capabilities_route(
-    _body: Ruma<get_capabilities::v3::IncomingRequest>,
+    _body: Ruma<get_capabilities::v3::Request>,
 ) -> Result<get_capabilities::v3::Response> {
     let mut available = BTreeMap::new();
     for room_version in &services().globals.unstable_room_versions {
diff --git a/src/api/client_server/config.rs b/src/api/client_server/config.rs
index dbd2b2ccc3a2c2e9ce113b65ed6970fef50be87c..12f9aeaaacbf0f153968708169c10b2a6ca5140d 100644
--- a/src/api/client_server/config.rs
+++ b/src/api/client_server/config.rs
@@ -17,7 +17,7 @@
 ///
 /// Sets some account data for the sender user.
 pub async fn set_global_account_data_route(
-    body: Ruma<set_global_account_data::v3::IncomingRequest>,
+    body: Ruma<set_global_account_data::v3::Request>,
 ) -> Result<set_global_account_data::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -43,7 +43,7 @@ pub async fn set_global_account_data_route(
 ///
 /// Sets some room account data for the sender user.
 pub async fn set_room_account_data_route(
-    body: Ruma<set_room_account_data::v3::IncomingRequest>,
+    body: Ruma<set_room_account_data::v3::Request>,
 ) -> Result<set_room_account_data::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -69,7 +69,7 @@ pub async fn set_room_account_data_route(
 ///
 /// Gets some account data for the sender user.
 pub async fn get_global_account_data_route(
-    body: Ruma<get_global_account_data::v3::IncomingRequest>,
+    body: Ruma<get_global_account_data::v3::Request>,
 ) -> Result<get_global_account_data::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -89,7 +89,7 @@ pub async fn get_global_account_data_route(
 ///
 /// Gets some room account data for the sender user.
 pub async fn get_room_account_data_route(
-    body: Ruma<get_room_account_data::v3::IncomingRequest>,
+    body: Ruma<get_room_account_data::v3::Request>,
 ) -> Result<get_room_account_data::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
diff --git a/src/api/client_server/context.rs b/src/api/client_server/context.rs
index 2e0f25768b9931351df9f9830d890602d865a843..1e62f910d3e956d79c38424f48ab34dd44b6e455 100644
--- a/src/api/client_server/context.rs
+++ b/src/api/client_server/context.rs
@@ -13,7 +13,7 @@
 /// - Only works if the user is joined (TODO: always allow, but only show events if the user was
 /// joined, depending on history_visibility)
 pub async fn get_context_route(
-    body: Ruma<get_context::v3::IncomingRequest>,
+    body: Ruma<get_context::v3::Request>,
 ) -> Result<get_context::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     let sender_device = body.sender_device.as_ref().expect("user is authenticated");
diff --git a/src/api/client_server/device.rs b/src/api/client_server/device.rs
index d4c417861d957a89e7e96517fad5765fea3cca91..aba061b20e6473fec62c5493f18548a3c5714a2c 100644
--- a/src/api/client_server/device.rs
+++ b/src/api/client_server/device.rs
@@ -28,7 +28,7 @@ pub async fn get_devices_route(
 ///
 /// Get metadata on a single device of the sender user.
 pub async fn get_device_route(
-    body: Ruma<get_device::v3::IncomingRequest>,
+    body: Ruma<get_device::v3::Request>,
 ) -> Result<get_device::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -44,7 +44,7 @@ pub async fn get_device_route(
 ///
 /// Updates the metadata on a given device of the sender user.
 pub async fn update_device_route(
-    body: Ruma<update_device::v3::IncomingRequest>,
+    body: Ruma<update_device::v3::Request>,
 ) -> Result<update_device::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -72,7 +72,7 @@ pub async fn update_device_route(
 /// - Forgets to-device events
 /// - Triggers device list updates
 pub async fn delete_device_route(
-    body: Ruma<delete_device::v3::IncomingRequest>,
+    body: Ruma<delete_device::v3::Request>,
 ) -> Result<delete_device::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     let sender_device = body.sender_device.as_ref().expect("user is authenticated");
@@ -126,7 +126,7 @@ pub async fn delete_device_route(
 /// - Forgets to-device events
 /// - Triggers device list updates
 pub async fn delete_devices_route(
-    body: Ruma<delete_devices::v3::IncomingRequest>,
+    body: Ruma<delete_devices::v3::Request>,
 ) -> Result<delete_devices::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     let sender_device = body.sender_device.as_ref().expect("user is authenticated");
diff --git a/src/api/client_server/directory.rs b/src/api/client_server/directory.rs
index f07a225423c3ead2e9c9503f6e11c2b8fabda763..645710f158e904d1aabc077d59835cc5334c0217 100644
--- a/src/api/client_server/directory.rs
+++ b/src/api/client_server/directory.rs
@@ -11,10 +11,7 @@
         },
         federation,
     },
-    directory::{
-        Filter, IncomingFilter, IncomingRoomNetwork, PublicRoomJoinRule, PublicRoomsChunk,
-        RoomNetwork,
-    },
+    directory::{Filter, PublicRoomJoinRule, PublicRoomsChunk, RoomNetwork},
     events::{
         room::{
             avatar::RoomAvatarEventContent,
@@ -38,7 +35,7 @@
 ///
 /// - Rooms are ordered by the number of joined members
 pub async fn get_public_rooms_filtered_route(
-    body: Ruma<get_public_rooms_filtered::v3::IncomingRequest>,
+    body: Ruma<get_public_rooms_filtered::v3::Request>,
 ) -> Result<get_public_rooms_filtered::v3::Response> {
     get_public_rooms_filtered_helper(
         body.server.as_deref(),
@@ -56,14 +53,14 @@ pub async fn get_public_rooms_filtered_route(
 ///
 /// - Rooms are ordered by the number of joined members
 pub async fn get_public_rooms_route(
-    body: Ruma<get_public_rooms::v3::IncomingRequest>,
+    body: Ruma<get_public_rooms::v3::Request>,
 ) -> Result<get_public_rooms::v3::Response> {
     let response = get_public_rooms_filtered_helper(
         body.server.as_deref(),
         body.limit,
         body.since.as_deref(),
-        &IncomingFilter::default(),
-        &IncomingRoomNetwork::Matrix,
+        &Filter::default(),
+        &RoomNetwork::Matrix,
     )
     .await?;
 
@@ -81,7 +78,7 @@ pub async fn get_public_rooms_route(
 ///
 /// - TODO: Access control checks
 pub async fn set_room_visibility_route(
-    body: Ruma<set_room_visibility::v3::IncomingRequest>,
+    body: Ruma<set_room_visibility::v3::Request>,
 ) -> Result<set_room_visibility::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -111,7 +108,7 @@ pub async fn set_room_visibility_route(
 ///
 /// Gets the visibility of a given room in the room directory.
 pub async fn get_room_visibility_route(
-    body: Ruma<get_room_visibility::v3::IncomingRequest>,
+    body: Ruma<get_room_visibility::v3::Request>,
 ) -> Result<get_room_visibility::v3::Response> {
     if !services().rooms.metadata.exists(&body.room_id)? {
         // Return 404 if the room doesn't exist
@@ -131,8 +128,8 @@ pub(crate) async fn get_public_rooms_filtered_helper(
     server: Option<&ServerName>,
     limit: Option<UInt>,
     since: Option<&str>,
-    filter: &IncomingFilter,
-    _network: &IncomingRoomNetwork,
+    filter: &Filter,
+    _network: &RoomNetwork,
 ) -> Result<get_public_rooms_filtered::v3::Response> {
     if let Some(other_server) =
         server.filter(|server| *server != services().globals.server_name().as_str())
@@ -143,9 +140,9 @@ pub(crate) async fn get_public_rooms_filtered_helper(
                 other_server,
                 federation::directory::get_public_rooms_filtered::v1::Request {
                     limit,
-                    since,
+                    since: since.map(ToOwned::to_owned),
                     filter: Filter {
-                        generic_search_term: filter.generic_search_term.as_deref(),
+                        generic_search_term: filter.generic_search_term.clone(),
                         room_types: filter.room_types.clone(),
                     },
                     room_network: RoomNetwork::Matrix,
diff --git a/src/api/client_server/filter.rs b/src/api/client_server/filter.rs
index a0d5a192b03c73b5bea53dbe6c5482ef1143e0f2..e9a359d6584f5e234a0fee5d341048c2d15f6414 100644
--- a/src/api/client_server/filter.rs
+++ b/src/api/client_server/filter.rs
@@ -10,7 +10,7 @@
 ///
 /// - A user can only access their own filters
 pub async fn get_filter_route(
-    body: Ruma<get_filter::v3::IncomingRequest>,
+    body: Ruma<get_filter::v3::Request>,
 ) -> Result<get_filter::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     let filter = match services().users.get_filter(sender_user, &body.filter_id)? {
@@ -25,7 +25,7 @@ pub async fn get_filter_route(
 ///
 /// Creates a new filter to be used by other endpoints.
 pub async fn create_filter_route(
-    body: Ruma<create_filter::v3::IncomingRequest>,
+    body: Ruma<create_filter::v3::Request>,
 ) -> Result<create_filter::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     Ok(create_filter::v3::Response::new(
diff --git a/src/api/client_server/keys.rs b/src/api/client_server/keys.rs
index b649166abe952112e2fb39d0e9e86b1a31b6576f..ba89ece056645415cb3a2b19df0786eef70724ce 100644
--- a/src/api/client_server/keys.rs
+++ b/src/api/client_server/keys.rs
@@ -65,9 +65,7 @@ pub async fn upload_keys_route(
 /// - Always fetches users from other servers over federation
 /// - Gets master keys, self-signing keys, user signing keys and device keys.
 /// - The master and self-signing keys contain signatures that the user is allowed to see
-pub async fn get_keys_route(
-    body: Ruma<get_keys::v3::IncomingRequest>,
-) -> Result<get_keys::v3::Response> {
+pub async fn get_keys_route(body: Ruma<get_keys::v3::Request>) -> Result<get_keys::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
     let response =
@@ -93,7 +91,7 @@ pub async fn claim_keys_route(
 ///
 /// - Requires UIAA to verify password
 pub async fn upload_signing_keys_route(
-    body: Ruma<upload_signing_keys::v3::IncomingRequest>,
+    body: Ruma<upload_signing_keys::v3::Request>,
 ) -> Result<upload_signing_keys::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     let sender_device = body.sender_device.as_ref().expect("user is authenticated");
@@ -214,7 +212,7 @@ pub async fn upload_signatures_route(
 ///
 /// - TODO: left users
 pub async fn get_key_changes_route(
-    body: Ruma<get_key_changes::v3::IncomingRequest>,
+    body: Ruma<get_key_changes::v3::Request>,
 ) -> Result<get_key_changes::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
diff --git a/src/api/client_server/media.rs b/src/api/client_server/media.rs
index fa6def0bf30b4b86a47c1df23b5423245cf4b3e5..3410cc010b35737a2c02d7db44afb0f21fcee843 100644
--- a/src/api/client_server/media.rs
+++ b/src/api/client_server/media.rs
@@ -27,7 +27,7 @@ pub async fn get_media_config_route(
 /// - Some metadata will be saved in the database
 /// - Media will be saved in the media/ directory
 pub async fn create_content_route(
-    body: Ruma<create_content::v3::IncomingRequest>,
+    body: Ruma<create_content::v3::Request>,
 ) -> Result<create_content::v3::Response> {
     let mxc = format!(
         "mxc://{}/{}",
@@ -57,7 +57,7 @@ pub async fn create_content_route(
 pub async fn get_remote_content(
     mxc: &str,
     server_name: &ruma::ServerName,
-    media_id: &str,
+    media_id: String,
 ) -> Result<get_content::v3::Response, Error> {
     let content_response = services()
         .sending
@@ -65,7 +65,7 @@ pub async fn get_remote_content(
             server_name,
             get_content::v3::Request {
                 allow_remote: false,
-                server_name,
+                server_name: server_name.to_owned(),
                 media_id,
             },
         )
@@ -90,7 +90,7 @@ pub async fn get_remote_content(
 ///
 /// - Only allows federation if `allow_remote` is true
 pub async fn get_content_route(
-    body: Ruma<get_content::v3::IncomingRequest>,
+    body: Ruma<get_content::v3::Request>,
 ) -> Result<get_content::v3::Response> {
     let mxc = format!("mxc://{}/{}", body.server_name, body.media_id);
 
@@ -108,7 +108,7 @@ pub async fn get_content_route(
         })
     } else if &*body.server_name != services().globals.server_name() && body.allow_remote {
         let remote_content_response =
-            get_remote_content(&mxc, &body.server_name, &body.media_id).await?;
+            get_remote_content(&mxc, &body.server_name, body.media_id.clone()).await?;
         Ok(remote_content_response)
     } else {
         Err(Error::BadRequest(ErrorKind::NotFound, "Media not found."))
@@ -121,7 +121,7 @@ pub async fn get_content_route(
 ///
 /// - Only allows federation if `allow_remote` is true
 pub async fn get_content_as_filename_route(
-    body: Ruma<get_content_as_filename::v3::IncomingRequest>,
+    body: Ruma<get_content_as_filename::v3::Request>,
 ) -> Result<get_content_as_filename::v3::Response> {
     let mxc = format!("mxc://{}/{}", body.server_name, body.media_id);
 
@@ -139,7 +139,7 @@ pub async fn get_content_as_filename_route(
         })
     } else if &*body.server_name != services().globals.server_name() && body.allow_remote {
         let remote_content_response =
-            get_remote_content(&mxc, &body.server_name, &body.media_id).await?;
+            get_remote_content(&mxc, &body.server_name, body.media_id.clone()).await?;
 
         Ok(get_content_as_filename::v3::Response {
             content_disposition: Some(format!("inline: filename={}", body.filename)),
@@ -158,7 +158,7 @@ pub async fn get_content_as_filename_route(
 ///
 /// - Only allows federation if `allow_remote` is true
 pub async fn get_content_thumbnail_route(
-    body: Ruma<get_content_thumbnail::v3::IncomingRequest>,
+    body: Ruma<get_content_thumbnail::v3::Request>,
 ) -> Result<get_content_thumbnail::v3::Response> {
     let mxc = format!("mxc://{}/{}", body.server_name, body.media_id);
 
@@ -192,8 +192,8 @@ pub async fn get_content_thumbnail_route(
                     height: body.height,
                     width: body.width,
                     method: body.method.clone(),
-                    server_name: &body.server_name,
-                    media_id: &body.media_id,
+                    server_name: body.server_name.clone(),
+                    media_id: body.media_id.clone(),
                 },
             )
             .await?;
diff --git a/src/api/client_server/membership.rs b/src/api/client_server/membership.rs
index f6e94e67d08ac86d4dea1a9f4701c28d716186a8..8674a60532a7d5b52068b94d5f93e1550ed91d5b 100644
--- a/src/api/client_server/membership.rs
+++ b/src/api/client_server/membership.rs
@@ -5,7 +5,7 @@
             membership::{
                 ban_user, forget_room, get_member_events, invite_user, join_room_by_id,
                 join_room_by_id_or_alias, joined_members, joined_rooms, kick_user, leave_room,
-                unban_user, IncomingThirdPartySigned,
+                unban_user, ThirdPartySigned,
             },
         },
         federation::{self, membership::create_invite},
@@ -44,7 +44,7 @@
 /// - If the server knowns about this room: creates the join event and does auth rules locally
 /// - If the server does not know about the room: asks other servers over federation
 pub async fn join_room_by_id_route(
-    body: Ruma<join_room_by_id::v3::IncomingRequest>,
+    body: Ruma<join_room_by_id::v3::Request>,
 ) -> Result<join_room_by_id::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -81,7 +81,7 @@ pub async fn join_room_by_id_route(
 /// - If the server knowns about this room: creates the join event and does auth rules locally
 /// - If the server does not know about the room: asks other servers over federation
 pub async fn join_room_by_id_or_alias_route(
-    body: Ruma<join_room_by_id_or_alias::v3::IncomingRequest>,
+    body: Ruma<join_room_by_id_or_alias::v3::Request>,
 ) -> Result<join_room_by_id_or_alias::v3::Response> {
     let sender_user = body.sender_user.as_deref().expect("user is authenticated");
     let body = body.body;
@@ -107,7 +107,7 @@ pub async fn join_room_by_id_or_alias_route(
             (servers, room_id)
         }
         Err(room_alias) => {
-            let response = get_alias_helper(&room_alias).await?;
+            let response = get_alias_helper(room_alias).await?;
 
             (response.servers.into_iter().collect(), response.room_id)
         }
@@ -132,7 +132,7 @@ pub async fn join_room_by_id_or_alias_route(
 ///
 /// - This should always work if the user is currently joined.
 pub async fn leave_room_route(
-    body: Ruma<leave_room::v3::IncomingRequest>,
+    body: Ruma<leave_room::v3::Request>,
 ) -> Result<leave_room::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -145,11 +145,11 @@ pub async fn leave_room_route(
 ///
 /// Tries to send an invite event into the room.
 pub async fn invite_user_route(
-    body: Ruma<invite_user::v3::IncomingRequest>,
+    body: Ruma<invite_user::v3::Request>,
 ) -> Result<invite_user::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
-    if let invite_user::v3::IncomingInvitationRecipient::UserId { user_id } = &body.recipient {
+    if let invite_user::v3::InvitationRecipient::UserId { user_id } = &body.recipient {
         invite_helper(sender_user, user_id, &body.room_id, false).await?;
         Ok(invite_user::v3::Response {})
     } else {
@@ -161,7 +161,7 @@ pub async fn invite_user_route(
 ///
 /// Tries to send a kick event into the room.
 pub async fn kick_user_route(
-    body: Ruma<kick_user::v3::IncomingRequest>,
+    body: Ruma<kick_user::v3::Request>,
 ) -> Result<kick_user::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -218,9 +218,7 @@ pub async fn kick_user_route(
 /// # `POST /_matrix/client/r0/rooms/{roomId}/ban`
 ///
 /// Tries to send a ban event into the room.
-pub async fn ban_user_route(
-    body: Ruma<ban_user::v3::IncomingRequest>,
-) -> Result<ban_user::v3::Response> {
+pub async fn ban_user_route(body: Ruma<ban_user::v3::Request>) -> Result<ban_user::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
     // TODO: reason
@@ -287,7 +285,7 @@ pub async fn ban_user_route(
 ///
 /// Tries to send an unban event into the room.
 pub async fn unban_user_route(
-    body: Ruma<unban_user::v3::IncomingRequest>,
+    body: Ruma<unban_user::v3::Request>,
 ) -> Result<unban_user::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -349,7 +347,7 @@ pub async fn unban_user_route(
 /// Note: Other devices of the user have no way of knowing the room was forgotten, so this has to
 /// be called from every device
 pub async fn forget_room_route(
-    body: Ruma<forget_room::v3::IncomingRequest>,
+    body: Ruma<forget_room::v3::Request>,
 ) -> Result<forget_room::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -385,7 +383,7 @@ pub async fn joined_rooms_route(
 ///
 /// - Only works if the user is currently joined
 pub async fn get_member_events_route(
-    body: Ruma<get_member_events::v3::IncomingRequest>,
+    body: Ruma<get_member_events::v3::Request>,
 ) -> Result<get_member_events::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -421,7 +419,7 @@ pub async fn get_member_events_route(
 /// - The sender user must be in the room
 /// - TODO: An appservice just needs a puppet joined
 pub async fn joined_members_route(
-    body: Ruma<joined_members::v3::IncomingRequest>,
+    body: Ruma<joined_members::v3::Request>,
 ) -> Result<joined_members::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -462,7 +460,7 @@ async fn join_room_by_id_helper(
     sender_user: Option<&UserId>,
     room_id: &RoomId,
     servers: &[OwnedServerName],
-    _third_party_signed: Option<&IncomingThirdPartySigned>,
+    _third_party_signed: Option<&ThirdPartySigned>,
 ) -> Result<join_room_by_id::v3::Response> {
     let sender_user = sender_user.expect("user is authenticated");
 
@@ -575,9 +573,9 @@ async fn join_room_by_id_helper(
             .send_federation_request(
                 &remote_server,
                 federation::membership::create_join_event::v2::Request {
-                    room_id,
-                    event_id,
-                    pdu: &PduEvent::convert_to_outgoing_federation_event(join_event.clone()),
+                    room_id: room_id.to_owned(),
+                    event_id: event_id.to_owned(),
+                    pdu: PduEvent::convert_to_outgoing_federation_event(join_event.clone()),
                 },
             )
             .await?;
@@ -896,9 +894,9 @@ async fn join_room_by_id_helper(
                 .send_federation_request(
                     &remote_server,
                     federation::membership::create_join_event::v2::Request {
-                        room_id,
-                        event_id,
-                        pdu: &PduEvent::convert_to_outgoing_federation_event(join_event.clone()),
+                        room_id: room_id.to_owned(),
+                        event_id: event_id.to_owned(),
+                        pdu: PduEvent::convert_to_outgoing_federation_event(join_event.clone()),
                     },
                 )
                 .await?;
@@ -969,9 +967,9 @@ async fn make_join_request(
             .send_federation_request(
                 remote_server,
                 federation::membership::prepare_join_event::v1::Request {
-                    room_id,
-                    user_id: sender_user,
-                    ver: &services().globals.supported_room_versions(),
+                    room_id: room_id.to_owned(),
+                    user_id: sender_user.to_owned(),
+                    ver: services().globals.supported_room_versions(),
                 },
             )
             .await;
@@ -1105,18 +1103,18 @@ pub(crate) async fn invite_helper<'a>(
             (pdu, pdu_json, invite_room_state)
         };
 
-        let room_version_id = &services().rooms.state.get_room_version(room_id)?;
+        let room_version_id = services().rooms.state.get_room_version(room_id)?;
 
         let response = services()
             .sending
             .send_federation_request(
                 user_id.server_name(),
                 create_invite::v2::Request {
-                    room_id,
-                    event_id: &pdu.event_id,
-                    room_version: &room_version_id,
-                    event: &PduEvent::convert_to_outgoing_federation_event(pdu_json.clone()),
-                    invite_room_state: &invite_room_state,
+                    room_id: room_id.to_owned(),
+                    event_id: (&*pdu.event_id).to_owned(),
+                    room_version: room_version_id.clone(),
+                    event: PduEvent::convert_to_outgoing_federation_event(pdu_json.clone()),
+                    invite_room_state,
                 },
             )
             .await?;
@@ -1124,7 +1122,7 @@ pub(crate) async fn invite_helper<'a>(
         let pub_key_map = RwLock::new(BTreeMap::new());
 
         // We do not add the event_id field to the pdu here because of signature and hashes checks
-        let (event_id, value) = match gen_event_id_canonical_json(&response.event, room_version_id)
+        let (event_id, value) = match gen_event_id_canonical_json(&response.event, &room_version_id)
         {
             Ok(t) => t,
             Err(_) => {
@@ -1136,7 +1134,7 @@ pub(crate) async fn invite_helper<'a>(
             }
         };
 
-        if pdu.event_id != event_id {
+        if *pdu.event_id != *event_id {
             warn!("Server {} changed invite event, that's not allowed in the spec: ours: {:?}, theirs: {:?}", user_id.server_name(), pdu_json, value);
         }
 
@@ -1363,7 +1361,10 @@ async fn remote_leave_room(user_id: &UserId, room_id: &RoomId) -> Result<()> {
             .sending
             .send_federation_request(
                 &remote_server,
-                federation::membership::prepare_leave_event::v1::Request { room_id, user_id },
+                federation::membership::prepare_leave_event::v1::Request {
+                    room_id: room_id.to_owned(),
+                    user_id: user_id.to_owned(),
+                },
             )
             .await;
 
@@ -1440,9 +1441,9 @@ async fn remote_leave_room(user_id: &UserId, room_id: &RoomId) -> Result<()> {
         .send_federation_request(
             &remote_server,
             federation::membership::create_leave_event::v2::Request {
-                room_id,
-                event_id: &event_id,
-                pdu: &PduEvent::convert_to_outgoing_federation_event(leave_event.clone()),
+                room_id: room_id.to_owned(),
+                event_id,
+                pdu: PduEvent::convert_to_outgoing_federation_event(leave_event.clone()),
             },
         )
         .await?;
diff --git a/src/api/client_server/message.rs b/src/api/client_server/message.rs
index b04c26268c8f4309a5d8d71bf606c271ab56abde..6ad075174321ab7196d976bcaa5ed6592e6e5720 100644
--- a/src/api/client_server/message.rs
+++ b/src/api/client_server/message.rs
@@ -19,7 +19,7 @@
 /// - The only requirement for the content is that it has to be valid json
 /// - Tries to send the event into the room, auth rules will determine if it is allowed
 pub async fn send_message_event_route(
-    body: Ruma<send_message_event::v3::IncomingRequest>,
+    body: Ruma<send_message_event::v3::Request>,
 ) -> Result<send_message_event::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     let sender_device = body.sender_device.as_deref();
@@ -105,7 +105,7 @@ pub async fn send_message_event_route(
 /// - Only works if the user is joined (TODO: always allow, but only show events where the user was
 /// joined, depending on history_visibility)
 pub async fn get_message_events_route(
-    body: Ruma<get_message_events::v3::IncomingRequest>,
+    body: Ruma<get_message_events::v3::Request>,
 ) -> Result<get_message_events::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     let sender_device = body.sender_device.as_ref().expect("user is authenticated");
diff --git a/src/api/client_server/presence.rs b/src/api/client_server/presence.rs
index dfac3dbd9871bbcd4b56e699213cbf460df32f52..ef88d1a0f8120f3b034bc025aa792f45910d0405 100644
--- a/src/api/client_server/presence.rs
+++ b/src/api/client_server/presence.rs
@@ -6,7 +6,7 @@
 ///
 /// Sets the presence state of the sender user.
 pub async fn set_presence_route(
-    body: Ruma<set_presence::v3::IncomingRequest>,
+    body: Ruma<set_presence::v3::Request>,
 ) -> Result<set_presence::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -43,7 +43,7 @@ pub async fn set_presence_route(
 ///
 /// - Only works if you share a room with the user
 pub async fn get_presence_route(
-    body: Ruma<get_presence::v3::IncomingRequest>,
+    body: Ruma<get_presence::v3::Request>,
 ) -> Result<get_presence::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
diff --git a/src/api/client_server/profile.rs b/src/api/client_server/profile.rs
index 5ace17775a14d684439405b5f01aa8f586b33393..6400e891a2b0a0edb31a26a9547593fa0b81750a 100644
--- a/src/api/client_server/profile.rs
+++ b/src/api/client_server/profile.rs
@@ -20,7 +20,7 @@
 ///
 /// - Also makes sure other users receive the update using presence EDUs
 pub async fn set_displayname_route(
-    body: Ruma<set_display_name::v3::IncomingRequest>,
+    body: Ruma<set_display_name::v3::Request>,
 ) -> Result<set_display_name::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -121,7 +121,7 @@ pub async fn set_displayname_route(
 ///
 /// - If user is on another server: Fetches displayname over federation
 pub async fn get_displayname_route(
-    body: Ruma<get_display_name::v3::IncomingRequest>,
+    body: Ruma<get_display_name::v3::Request>,
 ) -> Result<get_display_name::v3::Response> {
     if body.user_id.server_name() != services().globals.server_name() {
         let response = services()
@@ -129,8 +129,8 @@ pub async fn get_displayname_route(
             .send_federation_request(
                 body.user_id.server_name(),
                 federation::query::get_profile_information::v1::Request {
-                    user_id: &body.user_id,
-                    field: Some(&ProfileField::DisplayName),
+                    user_id: body.user_id.clone(),
+                    field: Some(ProfileField::DisplayName),
                 },
             )
             .await?;
@@ -151,7 +151,7 @@ pub async fn get_displayname_route(
 ///
 /// - Also makes sure other users receive the update using presence EDUs
 pub async fn set_avatar_url_route(
-    body: Ruma<set_avatar_url::v3::IncomingRequest>,
+    body: Ruma<set_avatar_url::v3::Request>,
 ) -> Result<set_avatar_url::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -256,7 +256,7 @@ pub async fn set_avatar_url_route(
 ///
 /// - If user is on another server: Fetches avatar_url and blurhash over federation
 pub async fn get_avatar_url_route(
-    body: Ruma<get_avatar_url::v3::IncomingRequest>,
+    body: Ruma<get_avatar_url::v3::Request>,
 ) -> Result<get_avatar_url::v3::Response> {
     if body.user_id.server_name() != services().globals.server_name() {
         let response = services()
@@ -264,8 +264,8 @@ pub async fn get_avatar_url_route(
             .send_federation_request(
                 body.user_id.server_name(),
                 federation::query::get_profile_information::v1::Request {
-                    user_id: &body.user_id,
-                    field: Some(&ProfileField::AvatarUrl),
+                    user_id: body.user_id.clone(),
+                    field: Some(ProfileField::AvatarUrl),
                 },
             )
             .await?;
@@ -288,7 +288,7 @@ pub async fn get_avatar_url_route(
 ///
 /// - If user is on another server: Fetches profile over federation
 pub async fn get_profile_route(
-    body: Ruma<get_profile::v3::IncomingRequest>,
+    body: Ruma<get_profile::v3::Request>,
 ) -> Result<get_profile::v3::Response> {
     if body.user_id.server_name() != services().globals.server_name() {
         let response = services()
@@ -296,7 +296,7 @@ pub async fn get_profile_route(
             .send_federation_request(
                 body.user_id.server_name(),
                 federation::query::get_profile_information::v1::Request {
-                    user_id: &body.user_id,
+                    user_id: body.user_id.clone(),
                     field: None,
                 },
             )
diff --git a/src/api/client_server/push.rs b/src/api/client_server/push.rs
index dc936a6ca5f1ace0b3e2ee4bacbe07071775a55d..affd8e851adcc2cee559eb630209623754b29704 100644
--- a/src/api/client_server/push.rs
+++ b/src/api/client_server/push.rs
@@ -5,7 +5,7 @@
         push::{
             delete_pushrule, get_pushers, get_pushrule, get_pushrule_actions, get_pushrule_enabled,
             get_pushrules_all, set_pusher, set_pushrule, set_pushrule_actions,
-            set_pushrule_enabled, RuleKind,
+            set_pushrule_enabled, RuleKind, RuleScope,
         },
     },
     events::{push_rules::PushRulesEvent, GlobalAccountDataEventType},
@@ -45,7 +45,7 @@ pub async fn get_pushrules_all_route(
 ///
 /// Retrieves a single specified push rule for this user.
 pub async fn get_pushrule_route(
-    body: Ruma<get_pushrule::v3::IncomingRequest>,
+    body: Ruma<get_pushrule::v3::Request>,
 ) -> Result<get_pushrule::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -104,12 +104,12 @@ pub async fn get_pushrule_route(
 ///
 /// Creates a single specified push rule for this user.
 pub async fn set_pushrule_route(
-    body: Ruma<set_pushrule::v3::IncomingRequest>,
+    body: Ruma<set_pushrule::v3::Request>,
 ) -> Result<set_pushrule::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     let body = body.body;
 
-    if body.scope != "global" {
+    if body.scope != RuleScope::Global {
         return Err(Error::BadRequest(
             ErrorKind::InvalidParam,
             "Scopes other than 'global' are not supported.",
@@ -208,7 +208,7 @@ pub async fn set_pushrule_route(
 ///
 /// Gets the actions of a single specified push rule for this user.
 pub async fn get_pushrule_actions_route(
-    body: Ruma<get_pushrule_actions::v3::IncomingRequest>,
+    body: Ruma<get_pushrule_actions::v3::Request>,
 ) -> Result<get_pushrule_actions::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -269,11 +269,11 @@ pub async fn get_pushrule_actions_route(
 ///
 /// Sets the actions of a single specified push rule for this user.
 pub async fn set_pushrule_actions_route(
-    body: Ruma<set_pushrule_actions::v3::IncomingRequest>,
+    body: Ruma<set_pushrule_actions::v3::Request>,
 ) -> Result<set_pushrule_actions::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
-    if body.scope != "global" {
+    if body.scope != RuleScope::Global {
         return Err(Error::BadRequest(
             ErrorKind::InvalidParam,
             "Scopes other than 'global' are not supported.",
@@ -344,11 +344,11 @@ pub async fn set_pushrule_actions_route(
 ///
 /// Gets the enabled status of a single specified push rule for this user.
 pub async fn get_pushrule_enabled_route(
-    body: Ruma<get_pushrule_enabled::v3::IncomingRequest>,
+    body: Ruma<get_pushrule_enabled::v3::Request>,
 ) -> Result<get_pushrule_enabled::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
-    if body.scope != "global" {
+    if body.scope != RuleScope::Global {
         return Err(Error::BadRequest(
             ErrorKind::InvalidParam,
             "Scopes other than 'global' are not supported.",
@@ -407,11 +407,11 @@ pub async fn get_pushrule_enabled_route(
 ///
 /// Sets the enabled status of a single specified push rule for this user.
 pub async fn set_pushrule_enabled_route(
-    body: Ruma<set_pushrule_enabled::v3::IncomingRequest>,
+    body: Ruma<set_pushrule_enabled::v3::Request>,
 ) -> Result<set_pushrule_enabled::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
-    if body.scope != "global" {
+    if body.scope != RuleScope::Global {
         return Err(Error::BadRequest(
             ErrorKind::InvalidParam,
             "Scopes other than 'global' are not supported.",
@@ -487,11 +487,11 @@ pub async fn set_pushrule_enabled_route(
 ///
 /// Deletes a single specified push rule for this user.
 pub async fn delete_pushrule_route(
-    body: Ruma<delete_pushrule::v3::IncomingRequest>,
+    body: Ruma<delete_pushrule::v3::Request>,
 ) -> Result<delete_pushrule::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
-    if body.scope != "global" {
+    if body.scope != RuleScope::Global {
         return Err(Error::BadRequest(
             ErrorKind::InvalidParam,
             "Scopes other than 'global' are not supported.",
diff --git a/src/api/client_server/read_marker.rs b/src/api/client_server/read_marker.rs
index d529c6a84c79a5286b11dc42e16ba0a2a657d4a1..b12468a787affa4accc21f1ce28f1291c86c875c 100644
--- a/src/api/client_server/read_marker.rs
+++ b/src/api/client_server/read_marker.rs
@@ -16,7 +16,7 @@
 /// - Updates fully-read account data event to `fully_read`
 /// - If `read_receipt` is set: Update private marker and public read receipt EDU
 pub async fn set_read_marker_route(
-    body: Ruma<set_read_marker::v3::IncomingRequest>,
+    body: Ruma<set_read_marker::v3::Request>,
 ) -> Result<set_read_marker::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -89,7 +89,7 @@ pub async fn set_read_marker_route(
 ///
 /// Sets private read marker and public read receipt EDU.
 pub async fn create_receipt_route(
-    body: Ruma<create_receipt::v3::IncomingRequest>,
+    body: Ruma<create_receipt::v3::Request>,
 ) -> Result<create_receipt::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
diff --git a/src/api/client_server/redact.rs b/src/api/client_server/redact.rs
index ab586c01d70bbfe87f2198f17031adbe1e0d5ac1..a29a56105062db3b94f2efc4f1b38c250e156fa4 100644
--- a/src/api/client_server/redact.rs
+++ b/src/api/client_server/redact.rs
@@ -14,7 +14,7 @@
 ///
 /// - TODO: Handle txn id
 pub async fn redact_event_route(
-    body: Ruma<redact_event::v3::IncomingRequest>,
+    body: Ruma<redact_event::v3::Request>,
 ) -> Result<redact_event::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     let body = body.body;
diff --git a/src/api/client_server/report.rs b/src/api/client_server/report.rs
index e45820e82c63c5edadffb7eb416e4e504b7c89a7..ab5027cd8e2c2615aa6c2647a4573b9fa1bdb9e5 100644
--- a/src/api/client_server/report.rs
+++ b/src/api/client_server/report.rs
@@ -10,7 +10,7 @@
 /// Reports an inappropriate event to homeserver admins
 ///
 pub async fn report_event_route(
-    body: Ruma<report_content::v3::IncomingRequest>,
+    body: Ruma<report_content::v3::Request>,
 ) -> Result<report_content::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
diff --git a/src/api/client_server/room.rs b/src/api/client_server/room.rs
index 097f0e14255656f1331b968fc778d98222177511..c77cfa9b5205bdb84e76a9ae2d413224360798f9 100644
--- a/src/api/client_server/room.rs
+++ b/src/api/client_server/room.rs
@@ -46,7 +46,7 @@
 /// - Send events implied by `name` and `topic`
 /// - Send invite events
 pub async fn create_room_route(
-    body: Ruma<create_room::v3::IncomingRequest>,
+    body: Ruma<create_room::v3::Request>,
 ) -> Result<create_room::v3::Response> {
     use create_room::v3::RoomPreset;
 
@@ -421,7 +421,7 @@ pub async fn create_room_route(
 ///
 /// - You have to currently be joined to the room (TODO: Respect history visibility)
 pub async fn get_room_event_route(
-    body: Ruma<get_room_event::v3::IncomingRequest>,
+    body: Ruma<get_room_event::v3::Request>,
 ) -> Result<get_room_event::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -452,7 +452,7 @@ pub async fn get_room_event_route(
 ///
 /// - Only users joined to the room are allowed to call this TODO: Allow any user to call it if history_visibility is world readable
 pub async fn get_room_aliases_route(
-    body: Ruma<aliases::v3::IncomingRequest>,
+    body: Ruma<aliases::v3::Request>,
 ) -> Result<aliases::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -488,7 +488,7 @@ pub async fn get_room_aliases_route(
 /// - Moves local aliases
 /// - Modifies old room power levels to prevent users from speaking
 pub async fn upgrade_room_route(
-    body: Ruma<upgrade_room::v3::IncomingRequest>,
+    body: Ruma<upgrade_room::v3::Request>,
 ) -> Result<upgrade_room::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
diff --git a/src/api/client_server/search.rs b/src/api/client_server/search.rs
index 5b634a443b28e1b31ce61ff2e74a9f48f3f302da..51255d5a121001f86d7bc2f410367f3cdf777a16 100644
--- a/src/api/client_server/search.rs
+++ b/src/api/client_server/search.rs
@@ -15,7 +15,7 @@
 ///
 /// - Only works if the user is currently joined to the room (TODO: Respect history visibility)
 pub async fn search_events_route(
-    body: Ruma<search_events::v3::IncomingRequest>,
+    body: Ruma<search_events::v3::Request>,
 ) -> Result<search_events::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
diff --git a/src/api/client_server/session.rs b/src/api/client_server/session.rs
index 7c8c12889328d154dc4c787d6849acbd7f988225..64c00720733c4b3418de4c0daa581b3e93255489 100644
--- a/src/api/client_server/session.rs
+++ b/src/api/client_server/session.rs
@@ -4,7 +4,7 @@
     api::client::{
         error::ErrorKind,
         session::{get_login_types, login, logout, logout_all},
-        uiaa::IncomingUserIdentifier,
+        uiaa::UserIdentifier,
     },
     UserId,
 };
@@ -22,7 +22,7 @@ struct Claims {
 /// Get the supported login types of this server. One of these should be used as the `type` field
 /// when logging in.
 pub async fn get_login_types_route(
-    _body: Ruma<get_login_types::v3::IncomingRequest>,
+    _body: Ruma<get_login_types::v3::Request>,
 ) -> Result<get_login_types::v3::Response> {
     Ok(get_login_types::v3::Response::new(vec![
         get_login_types::v3::LoginType::Password(Default::default()),
@@ -40,15 +40,15 @@ pub async fn get_login_types_route(
 ///
 /// Note: You can use [`GET /_matrix/client/r0/login`](fn.get_supported_versions_route.html) to see
 /// supported login types.
-pub async fn login_route(body: Ruma<login::v3::IncomingRequest>) -> Result<login::v3::Response> {
+pub async fn login_route(body: Ruma<login::v3::Request>) -> Result<login::v3::Response> {
     // Validate login method
     // TODO: Other login methods
     let user_id = match &body.login_info {
-        login::v3::IncomingLoginInfo::Password(login::v3::IncomingPassword {
+        login::v3::LoginInfo::Password(login::v3::Password {
             identifier,
             password,
         }) => {
-            let username = if let IncomingUserIdentifier::UserIdOrLocalpart(user_id) = identifier {
+            let username = if let UserIdentifier::UserIdOrLocalpart(user_id) = identifier {
                 user_id.to_lowercase()
             } else {
                 return Err(Error::BadRequest(ErrorKind::Forbidden, "Bad login type."));
@@ -84,7 +84,7 @@ pub async fn login_route(body: Ruma<login::v3::IncomingRequest>) -> Result<login
 
             user_id
         }
-        login::v3::IncomingLoginInfo::Token(login::v3::IncomingToken { token }) => {
+        login::v3::LoginInfo::Token(login::v3::Token { token }) => {
             if let Some(jwt_decoding_key) = services().globals.jwt_decoding_key() {
                 let token = jsonwebtoken::decode::<Claims>(
                     token,
diff --git a/src/api/client_server/state.rs b/src/api/client_server/state.rs
index 36466b8fdcb073fc46a86361fdf4771d9ea7f57a..d9c146488095908145ed48b8c63eea9d0b65c87f 100644
--- a/src/api/client_server/state.rs
+++ b/src/api/client_server/state.rs
@@ -25,7 +25,7 @@
 /// - Tries to send the event into the room, auth rules will determine if it is allowed
 /// - If event is new canonical_alias: Rejects if alias is incorrect
 pub async fn send_state_event_for_key_route(
-    body: Ruma<send_state_event::v3::IncomingRequest>,
+    body: Ruma<send_state_event::v3::Request>,
 ) -> Result<send_state_event::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -50,7 +50,7 @@ pub async fn send_state_event_for_key_route(
 /// - Tries to send the event into the room, auth rules will determine if it is allowed
 /// - If event is new canonical_alias: Rejects if alias is incorrect
 pub async fn send_state_event_for_empty_key_route(
-    body: Ruma<send_state_event::v3::IncomingRequest>,
+    body: Ruma<send_state_event::v3::Request>,
 ) -> Result<RumaResponse<send_state_event::v3::Response>> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -81,7 +81,7 @@ pub async fn send_state_event_for_empty_key_route(
 ///
 /// - If not joined: Only works if current room history visibility is world readable
 pub async fn get_state_events_route(
-    body: Ruma<get_state_events::v3::IncomingRequest>,
+    body: Ruma<get_state_events::v3::Request>,
 ) -> Result<get_state_events::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -133,7 +133,7 @@ pub async fn get_state_events_route(
 ///
 /// - If not joined: Only works if current room history visibility is world readable
 pub async fn get_state_events_for_key_route(
-    body: Ruma<get_state_events_for_key::v3::IncomingRequest>,
+    body: Ruma<get_state_events_for_key::v3::Request>,
 ) -> Result<get_state_events_for_key::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -188,7 +188,7 @@ pub async fn get_state_events_for_key_route(
 ///
 /// - If not joined: Only works if current room history visibility is world readable
 pub async fn get_state_events_for_empty_key_route(
-    body: Ruma<get_state_events_for_key::v3::IncomingRequest>,
+    body: Ruma<get_state_events_for_key::v3::Request>,
 ) -> Result<RumaResponse<get_state_events_for_key::v3::Response>> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
diff --git a/src/api/client_server/sync.rs b/src/api/client_server/sync.rs
index 94e4f5bbda36f15f048e27ba48e5510c86319466..43ca238a7c9da719f9082d27a44d6197f8bf73f7 100644
--- a/src/api/client_server/sync.rs
+++ b/src/api/client_server/sync.rs
@@ -1,7 +1,7 @@
 use crate::{services, Error, Result, Ruma, RumaResponse};
 use ruma::{
     api::client::{
-        filter::{IncomingFilterDefinition, LazyLoadOptions},
+        filter::{FilterDefinition, LazyLoadOptions},
         sync::sync_events::{self, DeviceLists, UnreadNotificationsCount},
         uiaa::UiaaResponse,
     },
@@ -55,7 +55,7 @@
 /// - Sync is handled in an async task, multiple requests from the same device with the same
 /// `since` will be cached
 pub async fn sync_events_route(
-    body: Ruma<sync_events::v3::IncomingRequest>,
+    body: Ruma<sync_events::v3::Request>,
 ) -> Result<sync_events::v3::Response, RumaResponse<UiaaResponse>> {
     let sender_user = body.sender_user.expect("user is authenticated");
     let sender_device = body.sender_device.expect("user is authenticated");
@@ -124,7 +124,7 @@ pub async fn sync_events_route(
 async fn sync_helper_wrapper(
     sender_user: OwnedUserId,
     sender_device: OwnedDeviceId,
-    body: sync_events::v3::IncomingRequest,
+    body: sync_events::v3::Request,
     tx: Sender<Option<Result<sync_events::v3::Response>>>,
 ) {
     let since = body.since.clone();
@@ -157,12 +157,12 @@ async fn sync_helper_wrapper(
 async fn sync_helper(
     sender_user: OwnedUserId,
     sender_device: OwnedDeviceId,
-    body: sync_events::v3::IncomingRequest,
+    body: sync_events::v3::Request,
     // bool = caching allowed
 ) -> Result<(sync_events::v3::Response, bool), Error> {
     use sync_events::v3::{
-        Ephemeral, GlobalAccountData, IncomingFilter, InviteState, InvitedRoom, JoinedRoom,
-        LeftRoom, Presence, RoomAccountData, RoomSummary, Rooms, State, Timeline, ToDevice,
+        Ephemeral, Filter, GlobalAccountData, InviteState, InvitedRoom, JoinedRoom, LeftRoom,
+        Presence, RoomAccountData, RoomSummary, Rooms, State, Timeline, ToDevice,
     };
 
     // TODO: match body.set_presence {
@@ -176,9 +176,9 @@ async fn sync_helper(
 
     // Load filter
     let filter = match body.filter {
-        None => IncomingFilterDefinition::default(),
-        Some(IncomingFilter::FilterDefinition(filter)) => filter,
-        Some(IncomingFilter::FilterId(filter_id)) => services()
+        None => FilterDefinition::default(),
+        Some(Filter::FilterDefinition(filter)) => filter,
+        Some(Filter::FilterId(filter_id)) => services()
             .users
             .get_filter(&sender_user, &filter_id)?
             .unwrap_or_default(),
diff --git a/src/api/client_server/tag.rs b/src/api/client_server/tag.rs
index c87e2335cc8aedb4ab68417c0a95740c966d3dfc..16f1600f7b2647860746159c2ce42a77952c50b5 100644
--- a/src/api/client_server/tag.rs
+++ b/src/api/client_server/tag.rs
@@ -14,7 +14,7 @@
 ///
 /// - Inserts the tag into the tag event of the room account data.
 pub async fn update_tag_route(
-    body: Ruma<create_tag::v3::IncomingRequest>,
+    body: Ruma<create_tag::v3::Request>,
 ) -> Result<create_tag::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -58,7 +58,7 @@ pub async fn update_tag_route(
 ///
 /// - Removes the tag from the tag event of the room account data.
 pub async fn delete_tag_route(
-    body: Ruma<delete_tag::v3::IncomingRequest>,
+    body: Ruma<delete_tag::v3::Request>,
 ) -> Result<delete_tag::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
@@ -98,9 +98,7 @@ pub async fn delete_tag_route(
 /// Returns tags on the room.
 ///
 /// - Gets the tag event of the room account data.
-pub async fn get_tags_route(
-    body: Ruma<get_tags::v3::IncomingRequest>,
-) -> Result<get_tags::v3::Response> {
+pub async fn get_tags_route(body: Ruma<get_tags::v3::Request>) -> Result<get_tags::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
     let event = services().account_data.get(
diff --git a/src/api/client_server/thirdparty.rs b/src/api/client_server/thirdparty.rs
index 5665ad6cf19adc86804f66059cb3caef54fa18dc..c2c1adfdf8e1b71d4480abb98c2f03a19f31837b 100644
--- a/src/api/client_server/thirdparty.rs
+++ b/src/api/client_server/thirdparty.rs
@@ -7,7 +7,7 @@
 ///
 /// TODO: Fetches all metadata about protocols supported by the homeserver.
 pub async fn get_protocols_route(
-    _body: Ruma<get_protocols::v3::IncomingRequest>,
+    _body: Ruma<get_protocols::v3::Request>,
 ) -> Result<get_protocols::v3::Response> {
     // TODO
     Ok(get_protocols::v3::Response {
diff --git a/src/api/client_server/to_device.rs b/src/api/client_server/to_device.rs
index 139b845dbafd403f2fe8ae4b57b753142609cf73..26db4e4d87cb7374d19093028352aeaa0ecab272 100644
--- a/src/api/client_server/to_device.rs
+++ b/src/api/client_server/to_device.rs
@@ -14,7 +14,7 @@
 ///
 /// Send a to-device event to a set of client devices.
 pub async fn send_event_to_device_route(
-    body: Ruma<send_event_to_device::v3::IncomingRequest>,
+    body: Ruma<send_event_to_device::v3::Request>,
 ) -> Result<send_event_to_device::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     let sender_device = body.sender_device.as_deref();
diff --git a/src/api/client_server/typing.rs b/src/api/client_server/typing.rs
index ecc926f4ffe24929f9abddcf53f28c4456551b8a..43217e1aec47a0c42f0ca6b27614765362ed8d79 100644
--- a/src/api/client_server/typing.rs
+++ b/src/api/client_server/typing.rs
@@ -5,7 +5,7 @@
 ///
 /// Sets the typing state of the sender user.
 pub async fn create_typing_event_route(
-    body: Ruma<create_typing_event::v3::IncomingRequest>,
+    body: Ruma<create_typing_event::v3::Request>,
 ) -> Result<create_typing_event::v3::Response> {
     use create_typing_event::v3::Typing;
 
diff --git a/src/api/client_server/unversioned.rs b/src/api/client_server/unversioned.rs
index 8a5c3d254cbc04194c31f4032dad41c24c8009d8..526598b9a7115f57e1a1419094b86a6065a01575 100644
--- a/src/api/client_server/unversioned.rs
+++ b/src/api/client_server/unversioned.rs
@@ -15,7 +15,7 @@
 /// Note: Unstable features are used while developing new features. Clients should avoid using
 /// unstable features in their stable releases
 pub async fn get_supported_versions_route(
-    _body: Ruma<get_supported_versions::IncomingRequest>,
+    _body: Ruma<get_supported_versions::Request>,
 ) -> Result<get_supported_versions::Response> {
     let resp = get_supported_versions::Response {
         versions: vec![
diff --git a/src/api/client_server/user_directory.rs b/src/api/client_server/user_directory.rs
index 518daa5e38c9e5f0e29019aeb67c7e4702a6d484..c30bac5162d9a4efc4db4eef22fd2350b9d4128e 100644
--- a/src/api/client_server/user_directory.rs
+++ b/src/api/client_server/user_directory.rs
@@ -14,7 +14,7 @@
 /// - Hides any local users that aren't in any public rooms (i.e. those that have the join rule set to public)
 /// and don't share a room with the sender
 pub async fn search_users_route(
-    body: Ruma<search_users::v3::IncomingRequest>,
+    body: Ruma<search_users::v3::Request>,
 ) -> Result<search_users::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
     let limit = u64::from(body.limit) as usize;
diff --git a/src/api/client_server/voip.rs b/src/api/client_server/voip.rs
index 6b1ee400dfa1de4db47a5d832a9a5ed801b295e2..4990c17c4c31b647b83952337403299358bc1391 100644
--- a/src/api/client_server/voip.rs
+++ b/src/api/client_server/voip.rs
@@ -10,7 +10,7 @@
 ///
 /// TODO: Returns information about the recommended turn server.
 pub async fn turn_server_route(
-    body: Ruma<get_turn_server_info::v3::IncomingRequest>,
+    body: Ruma<get_turn_server_info::v3::Request>,
 ) -> Result<get_turn_server_info::v3::Response> {
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
diff --git a/src/api/server_server.rs b/src/api/server_server.rs
index 12b255ba99ef2574211f273f1391a6184b6114ae..2b854a68f4141ed6504d654bd6eab181518e3a15 100644
--- a/src/api/server_server.rs
+++ b/src/api/server_server.rs
@@ -31,7 +31,7 @@
         EndpointError, IncomingResponse, MatrixVersion, OutgoingRequest, OutgoingResponse,
         SendAccessToken,
     },
-    directory::{IncomingFilter, IncomingRoomNetwork},
+    directory::{Filter, RoomNetwork},
     events::{
         receipt::{ReceiptEvent, ReceiptEventContent, ReceiptType},
         room::{
@@ -294,13 +294,7 @@ pub(crate) async fn send_request<T: OutgoingRequest>(
             } else {
                 Err(Error::FederationError(
                     destination.to_owned(),
-                    RumaError::try_from_http_response(http_response).map_err(|e| {
-                        warn!(
-                            "Invalid {} response from {} on: {} {}",
-                            status, &destination, url, e
-                        );
-                        Error::BadServerResponse("Server returned bad error response.")
-                    })?,
+                    RumaError::from_http_response(http_response),
                 ))
             }
         }
@@ -586,7 +580,7 @@ pub async fn get_server_keys_deprecated_route() -> impl IntoResponse {
 ///
 /// Lists the public rooms on this server.
 pub async fn get_public_rooms_filtered_route(
-    body: Ruma<get_public_rooms_filtered::v1::IncomingRequest>,
+    body: Ruma<get_public_rooms_filtered::v1::Request>,
 ) -> Result<get_public_rooms_filtered::v1::Response> {
     if !services().globals.allow_federation() {
         return Err(Error::bad_config("Federation is disabled."));
@@ -613,7 +607,7 @@ pub async fn get_public_rooms_filtered_route(
 ///
 /// Lists the public rooms on this server.
 pub async fn get_public_rooms_route(
-    body: Ruma<get_public_rooms::v1::IncomingRequest>,
+    body: Ruma<get_public_rooms::v1::Request>,
 ) -> Result<get_public_rooms::v1::Response> {
     if !services().globals.allow_federation() {
         return Err(Error::bad_config("Federation is disabled."));
@@ -623,8 +617,8 @@ pub async fn get_public_rooms_route(
         None,
         body.limit,
         body.since.as_deref(),
-        &IncomingFilter::default(),
-        &IncomingRoomNetwork::Matrix,
+        &Filter::default(),
+        &RoomNetwork::Matrix,
     )
     .await?;
 
@@ -640,7 +634,7 @@ pub async fn get_public_rooms_route(
 ///
 /// Push EDUs and PDUs to this server.
 pub async fn send_transaction_message_route(
-    body: Ruma<send_transaction_message::v1::IncomingRequest>,
+    body: Ruma<send_transaction_message::v1::Request>,
 ) -> Result<send_transaction_message::v1::Response> {
     if !services().globals.allow_federation() {
         return Err(Error::bad_config("Federation is disabled."));
@@ -916,7 +910,7 @@ pub async fn send_transaction_message_route(
 ///
 /// - Only works if a user of this server is currently invited or joined the room
 pub async fn get_event_route(
-    body: Ruma<get_event::v1::IncomingRequest>,
+    body: Ruma<get_event::v1::Request>,
 ) -> Result<get_event::v1::Response> {
     if !services().globals.allow_federation() {
         return Err(Error::bad_config("Federation is disabled."));
@@ -963,7 +957,7 @@ pub async fn get_event_route(
 ///
 /// Retrieves events that the sender is missing.
 pub async fn get_missing_events_route(
-    body: Ruma<get_missing_events::v1::IncomingRequest>,
+    body: Ruma<get_missing_events::v1::Request>,
 ) -> Result<get_missing_events::v1::Response> {
     if !services().globals.allow_federation() {
         return Err(Error::bad_config("Federation is disabled."));
@@ -1042,7 +1036,7 @@ pub async fn get_missing_events_route(
 ///
 /// - This does not include the event itself
 pub async fn get_event_authorization_route(
-    body: Ruma<get_event_authorization::v1::IncomingRequest>,
+    body: Ruma<get_event_authorization::v1::Request>,
 ) -> Result<get_event_authorization::v1::Response> {
     if !services().globals.allow_federation() {
         return Err(Error::bad_config("Federation is disabled."));
@@ -1101,7 +1095,7 @@ pub async fn get_event_authorization_route(
 ///
 /// Retrieves the current state of the room.
 pub async fn get_room_state_route(
-    body: Ruma<get_room_state::v1::IncomingRequest>,
+    body: Ruma<get_room_state::v1::Request>,
 ) -> Result<get_room_state::v1::Response> {
     if !services().globals.allow_federation() {
         return Err(Error::bad_config("Federation is disabled."));
@@ -1181,7 +1175,7 @@ pub async fn get_room_state_route(
 ///
 /// Retrieves the current state of the room.
 pub async fn get_room_state_ids_route(
-    body: Ruma<get_room_state_ids::v1::IncomingRequest>,
+    body: Ruma<get_room_state_ids::v1::Request>,
 ) -> Result<get_room_state_ids::v1::Response> {
     if !services().globals.allow_federation() {
         return Err(Error::bad_config("Federation is disabled."));
@@ -1242,7 +1236,7 @@ pub async fn get_room_state_ids_route(
 ///
 /// Creates a join template.
 pub async fn create_join_event_template_route(
-    body: Ruma<prepare_join_event::v1::IncomingRequest>,
+    body: Ruma<prepare_join_event::v1::Request>,
 ) -> Result<prepare_join_event::v1::Response> {
     if !services().globals.allow_federation() {
         return Err(Error::bad_config("Federation is disabled."));
@@ -1494,7 +1488,7 @@ async fn create_join_event(
 ///
 /// Submits a signed join event.
 pub async fn create_join_event_v1_route(
-    body: Ruma<create_join_event::v1::IncomingRequest>,
+    body: Ruma<create_join_event::v1::Request>,
 ) -> Result<create_join_event::v1::Response> {
     let sender_servername = body
         .sender_servername
@@ -1510,7 +1504,7 @@ pub async fn create_join_event_v1_route(
 ///
 /// Submits a signed join event.
 pub async fn create_join_event_v2_route(
-    body: Ruma<create_join_event::v2::IncomingRequest>,
+    body: Ruma<create_join_event::v2::Request>,
 ) -> Result<create_join_event::v2::Response> {
     let sender_servername = body
         .sender_servername
@@ -1526,7 +1520,7 @@ pub async fn create_join_event_v2_route(
 ///
 /// Invites a remote user to a room.
 pub async fn create_invite_route(
-    body: Ruma<create_invite::v2::IncomingRequest>,
+    body: Ruma<create_invite::v2::Request>,
 ) -> Result<create_invite::v2::Response> {
     if !services().globals.allow_federation() {
         return Err(Error::bad_config("Federation is disabled."));
@@ -1643,7 +1637,7 @@ pub async fn create_invite_route(
 ///
 /// Gets information on all devices of the user.
 pub async fn get_devices_route(
-    body: Ruma<get_devices::v1::IncomingRequest>,
+    body: Ruma<get_devices::v1::Request>,
 ) -> Result<get_devices::v1::Response> {
     if !services().globals.allow_federation() {
         return Err(Error::bad_config("Federation is disabled."));
@@ -1690,7 +1684,7 @@ pub async fn get_devices_route(
 ///
 /// Resolve a room alias to a room id.
 pub async fn get_room_information_route(
-    body: Ruma<get_room_information::v1::IncomingRequest>,
+    body: Ruma<get_room_information::v1::Request>,
 ) -> Result<get_room_information::v1::Response> {
     if !services().globals.allow_federation() {
         return Err(Error::bad_config("Federation is disabled."));
@@ -1715,7 +1709,7 @@ pub async fn get_room_information_route(
 ///
 /// Gets information on a profile.
 pub async fn get_profile_information_route(
-    body: Ruma<get_profile_information::v1::IncomingRequest>,
+    body: Ruma<get_profile_information::v1::Request>,
 ) -> Result<get_profile_information::v1::Response> {
     if !services().globals.allow_federation() {
         return Err(Error::bad_config("Federation is disabled."));
diff --git a/src/database/key_value/users.rs b/src/database/key_value/users.rs
index cd5a535265ed15bc77fbc7bd0c743c598866b209..1cabab0e2998c292dc2f4bae37b5b596c796227b 100644
--- a/src/database/key_value/users.rs
+++ b/src/database/key_value/users.rs
@@ -1,7 +1,7 @@
 use std::{collections::BTreeMap, mem::size_of};
 
 use ruma::{
-    api::client::{device::Device, error::ErrorKind, filter::IncomingFilterDefinition},
+    api::client::{device::Device, error::ErrorKind, filter::FilterDefinition},
     encryption::{CrossSigningKey, DeviceKeys, OneTimeKey},
     events::{AnyToDeviceEvent, StateEventType},
     serde::Raw,
@@ -899,7 +899,7 @@ fn all_devices_metadata<'a>(
     }
 
     /// Creates a new sync filter. Returns the filter id.
-    fn create_filter(&self, user_id: &UserId, filter: &IncomingFilterDefinition) -> Result<String> {
+    fn create_filter(&self, user_id: &UserId, filter: &FilterDefinition) -> Result<String> {
         let filter_id = utils::random_string(4);
 
         let mut key = user_id.as_bytes().to_vec();
@@ -914,11 +914,7 @@ fn create_filter(&self, user_id: &UserId, filter: &IncomingFilterDefinition) ->
         Ok(filter_id)
     }
 
-    fn get_filter(
-        &self,
-        user_id: &UserId,
-        filter_id: &str,
-    ) -> Result<Option<IncomingFilterDefinition>> {
+    fn get_filter(&self, user_id: &UserId, filter_id: &str) -> Result<Option<FilterDefinition>> {
         let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(filter_id.as_bytes());
diff --git a/src/service/rooms/event_handler/mod.rs b/src/service/rooms/event_handler/mod.rs
index b35264748926ed13e95b7ef29409331820c61b68..85d21bf9a6f5107db6d3916974f8878c0c88e8c1 100644
--- a/src/service/rooms/event_handler/mod.rs
+++ b/src/service/rooms/event_handler/mod.rs
@@ -638,8 +638,8 @@ pub async fn upgrade_outlier_to_timeline_pdu(
                 .send_federation_request(
                     origin,
                     get_room_state_ids::v1::Request {
-                        room_id,
-                        event_id: &incoming_pdu.event_id,
+                        room_id: room_id.to_owned(),
+                        event_id: (&*incoming_pdu.event_id).to_owned(),
                     },
                 )
                 .await
@@ -1112,7 +1112,9 @@ pub(crate) fn fetch_and_handle_outliers<'a>(
                         .sending
                         .send_federation_request(
                             origin,
-                            get_event::v1::Request { event_id: &next_id },
+                            get_event::v1::Request {
+                                event_id: next_id.into(),
+                            },
                         )
                         .await
                     {
@@ -1689,7 +1691,7 @@ pub async fn fetch_signing_keys(
                 .send_federation_request(
                     server,
                     get_remote_server_keys::v2::Request::new(
-                        origin,
+                        origin.to_owned(),
                         MilliSecondsSinceUnixEpoch::from_system_time(
                             SystemTime::now()
                                 .checked_add(Duration::from_secs(3600))
diff --git a/src/service/sending/mod.rs b/src/service/sending/mod.rs
index afa12fc71908dc9ca8e92025bf2c40ecb1ffeccc..1861feb44da1b4948e03d1a188426c5aa57d1277 100644
--- a/src/service/sending/mod.rs
+++ b/src/service/sending/mod.rs
@@ -496,7 +496,7 @@ async fn handle_events(
                             )
                         })?,
                     appservice::event::push_events::v1::Request {
-                        events: &pdu_jsons,
+                        events: pdu_jsons,
                         txn_id: (&*base64::encode_config(
                             calculate_hash(
                                 &events
@@ -638,9 +638,9 @@ async fn handle_events(
                 let response = server_server::send_request(
                     server,
                     send_transaction_message::v1::Request {
-                        origin: services().globals.server_name(),
-                        pdus: &pdu_jsons,
-                        edus: &edu_jsons,
+                        origin: services().globals.server_name().to_owned(),
+                        pdus: pdu_jsons,
+                        edus: edu_jsons,
                         origin_server_ts: MilliSecondsSinceUnixEpoch::now(),
                         transaction_id: (&*base64::encode_config(
                             calculate_hash(
diff --git a/src/service/uiaa/mod.rs b/src/service/uiaa/mod.rs
index 672290c304fd6fa836529683b94743c061762119..147ce4d1fe473c9d9914c86321ec53a407c04a40 100644
--- a/src/service/uiaa/mod.rs
+++ b/src/service/uiaa/mod.rs
@@ -5,7 +5,7 @@
 use ruma::{
     api::client::{
         error::ErrorKind,
-        uiaa::{AuthType, IncomingAuthData, IncomingPassword, IncomingUserIdentifier, UiaaInfo},
+        uiaa::{AuthData, AuthType, Password, UiaaInfo, UserIdentifier},
     },
     CanonicalJsonValue, DeviceId, UserId,
 };
@@ -44,7 +44,7 @@ pub fn try_auth(
         &self,
         user_id: &UserId,
         device_id: &DeviceId,
-        auth: &IncomingAuthData,
+        auth: &AuthData,
         uiaainfo: &UiaaInfo,
     ) -> Result<(bool, UiaaInfo)> {
         let mut uiaainfo = auth
@@ -58,13 +58,13 @@ pub fn try_auth(
 
         match auth {
             // Find out what the user completed
-            IncomingAuthData::Password(IncomingPassword {
+            AuthData::Password(Password {
                 identifier,
                 password,
                 ..
             }) => {
                 let username = match identifier {
-                    IncomingUserIdentifier::UserIdOrLocalpart(username) => username,
+                    UserIdentifier::UserIdOrLocalpart(username) => username,
                     _ => {
                         return Err(Error::BadRequest(
                             ErrorKind::Unrecognized,
@@ -85,7 +85,7 @@ pub fn try_auth(
                         argon2::verify_encoded(&hash, password.as_bytes()).unwrap_or(false);
 
                     if !hash_matches {
-                        uiaainfo.auth_error = Some(ruma::api::client::error::ErrorBody {
+                        uiaainfo.auth_error = Some(ruma::api::client::error::StandardErrorBody {
                             kind: ErrorKind::Forbidden,
                             message: "Invalid username or password.".to_owned(),
                         });
@@ -96,7 +96,7 @@ pub fn try_auth(
                 // Password was correct! Let's add it to `completed`
                 uiaainfo.completed.push(AuthType::Password);
             }
-            IncomingAuthData::Dummy(_) => {
+            AuthData::Dummy(_) => {
                 uiaainfo.completed.push(AuthType::Dummy);
             }
             k => error!("type not supported: {:?}", k),
diff --git a/src/service/users/data.rs b/src/service/users/data.rs
index bc1db33ff4ff8a7b9c7d4c94bcf2a2fd9c1527bf..85532109d4b6b2d4c863d7fc502993174431d90a 100644
--- a/src/service/users/data.rs
+++ b/src/service/users/data.rs
@@ -1,6 +1,6 @@
 use crate::Result;
 use ruma::{
-    api::client::{device::Device, filter::IncomingFilterDefinition},
+    api::client::{device::Device, filter::FilterDefinition},
     encryption::{CrossSigningKey, DeviceKeys, OneTimeKey},
     events::AnyToDeviceEvent,
     serde::Raw,
@@ -191,11 +191,7 @@ fn all_devices_metadata<'a>(
     ) -> Box<dyn Iterator<Item = Result<Device>> + 'a>;
 
     /// Creates a new sync filter. Returns the filter id.
-    fn create_filter(&self, user_id: &UserId, filter: &IncomingFilterDefinition) -> Result<String>;
+    fn create_filter(&self, user_id: &UserId, filter: &FilterDefinition) -> Result<String>;
 
-    fn get_filter(
-        &self,
-        user_id: &UserId,
-        filter_id: &str,
-    ) -> Result<Option<IncomingFilterDefinition>>;
+    fn get_filter(&self, user_id: &UserId, filter_id: &str) -> Result<Option<FilterDefinition>>;
 }
diff --git a/src/service/users/mod.rs b/src/service/users/mod.rs
index 9dcfa8be2079023eb902d695c89995b14afb9b0e..6be5c89535a1861491aedff3d032fb6dabb3c938 100644
--- a/src/service/users/mod.rs
+++ b/src/service/users/mod.rs
@@ -3,7 +3,7 @@
 
 pub use data::Data;
 use ruma::{
-    api::client::{device::Device, error::ErrorKind, filter::IncomingFilterDefinition},
+    api::client::{device::Device, error::ErrorKind, filter::FilterDefinition},
     encryption::{CrossSigningKey, DeviceKeys, OneTimeKey},
     events::AnyToDeviceEvent,
     serde::Raw,
@@ -326,11 +326,7 @@ pub fn deactivate_account(&self, user_id: &UserId) -> Result<()> {
     }
 
     /// Creates a new sync filter. Returns the filter id.
-    pub fn create_filter(
-        &self,
-        user_id: &UserId,
-        filter: &IncomingFilterDefinition,
-    ) -> Result<String> {
+    pub fn create_filter(&self, user_id: &UserId, filter: &FilterDefinition) -> Result<String> {
         self.db.create_filter(user_id, filter)
     }
 
@@ -338,7 +334,7 @@ pub fn get_filter(
         &self,
         user_id: &UserId,
         filter_id: &str,
-    ) -> Result<Option<IncomingFilterDefinition>> {
+    ) -> Result<Option<FilterDefinition>> {
         self.db.get_filter(user_id, filter_id)
     }
 }
diff --git a/src/utils/error.rs b/src/utils/error.rs
index 9c8617f928b22ea8e3db546ebeb7971345228cff..0ef13ce6fc2d171ef31614f6bcf5f6d6cd0846ee 100644
--- a/src/utils/error.rs
+++ b/src/utils/error.rs
@@ -3,7 +3,7 @@
 use http::StatusCode;
 use ruma::{
     api::client::{
-        error::{Error as RumaError, ErrorKind},
+        error::{Error as RumaError, ErrorBody, ErrorKind},
         uiaa::{UiaaInfo, UiaaResponse},
     },
     OwnedServerName,
@@ -131,8 +131,7 @@ pub fn to_response(&self) -> RumaResponse<UiaaResponse> {
         warn!("{}: {}", status_code, message);
 
         RumaResponse(UiaaResponse::MatrixError(RumaError {
-            kind,
-            message,
+            body: ErrorBody::Standard { kind, message },
             status_code,
         }))
     }