diff --git a/src/api/client_server/push.rs b/src/api/client_server/push.rs
index affd8e851adcc2cee559eb630209623754b29704..b04413842dc46ee2b4c6b0854c5aab83447fb731 100644
--- a/src/api/client_server/push.rs
+++ b/src/api/client_server/push.rs
@@ -9,7 +9,7 @@
         },
     },
     events::{push_rules::PushRulesEvent, GlobalAccountDataEventType},
-    push::{ConditionalPushRuleInit, PatternedPushRuleInit, SimplePushRuleInit},
+    push::{ConditionalPushRuleInit, NewPushRule, PatternedPushRuleInit, SimplePushRuleInit},
 };
 
 /// # `GET /_matrix/client/r0/pushrules`
@@ -132,66 +132,65 @@ pub async fn set_pushrule_route(
         .map_err(|_| Error::bad_database("Invalid account data event in db."))?;
 
     let global = &mut account_data.content.global;
-    match body.kind {
-        RuleKind::Override => {
+    match body.rule {
+        NewPushRule::Override(rule) => {
             global.override_.replace(
                 ConditionalPushRuleInit {
-                    actions: body.actions,
+                    actions: rule.actions,
                     default: false,
                     enabled: true,
-                    rule_id: body.rule_id,
-                    conditions: body.conditions,
+                    rule_id: rule.rule_id,
+                    conditions: rule.conditions,
                 }
                 .into(),
             );
         }
-        RuleKind::Underride => {
+        NewPushRule::Underride(rule) => {
             global.underride.replace(
                 ConditionalPushRuleInit {
-                    actions: body.actions,
+                    actions: rule.actions,
                     default: false,
                     enabled: true,
-                    rule_id: body.rule_id,
-                    conditions: body.conditions,
+                    rule_id: rule.rule_id,
+                    conditions: rule.conditions,
                 }
                 .into(),
             );
         }
-        RuleKind::Sender => {
+        NewPushRule::Sender(rule) => {
             global.sender.replace(
                 SimplePushRuleInit {
-                    actions: body.actions,
+                    actions: rule.actions,
                     default: false,
                     enabled: true,
-                    rule_id: body.rule_id,
+                    rule_id: rule.rule_id,
                 }
                 .into(),
             );
         }
-        RuleKind::Room => {
+        NewPushRule::Room(rule) => {
             global.room.replace(
                 SimplePushRuleInit {
-                    actions: body.actions,
+                    actions: rule.actions,
                     default: false,
                     enabled: true,
-                    rule_id: body.rule_id,
+                    rule_id: rule.rule_id,
                 }
                 .into(),
             );
         }
-        RuleKind::Content => {
+        NewPushRule::Content(rule) => {
             global.content.replace(
                 PatternedPushRuleInit {
-                    actions: body.actions,
+                    actions: rule.actions,
                     default: false,
                     enabled: true,
-                    rule_id: body.rule_id,
-                    pattern: body.pattern.unwrap_or_default(),
+                    rule_id: rule.rule_id,
+                    pattern: rule.pattern,
                 }
                 .into(),
             );
         }
-        _ => {}
     }
 
     services().account_data.update(
@@ -212,7 +211,7 @@ pub async fn get_pushrule_actions_route(
 ) -> Result<get_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.",
diff --git a/src/main.rs b/src/main.rs
index e754b84f8502f9b1e910ce7e84a75236a6817eb0..013c4de51e28533c6341253ad8940dcc679ae37c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -29,7 +29,7 @@
 use opentelemetry::trace::{FutureExt, Tracer};
 use ruma::api::{
     client::{
-        error::{Error as RumaError, ErrorKind},
+        error::{Error as RumaError, ErrorBody, ErrorKind},
         uiaa::UiaaResponse,
     },
     IncomingRequest,
@@ -223,8 +223,10 @@ async fn unrecognized_method<B>(
     if inner.status() == axum::http::StatusCode::METHOD_NOT_ALLOWED {
         warn!("Method not allowed: {method} {uri}");
         return Ok(RumaResponse(UiaaResponse::MatrixError(RumaError {
-            kind: ErrorKind::Unrecognized,
-            message: "M_UNRECOGNIZED: Unrecognized request".to_owned(),
+            body: ErrorBody::Standard {
+                kind: ErrorKind::Unrecognized,
+                message: "M_UNRECOGNIZED: Unrecognized request".to_owned(),
+            },
             status_code: StatusCode::METHOD_NOT_ALLOWED,
         }))
         .into_response());
diff --git a/src/service/pusher/mod.rs b/src/service/pusher/mod.rs
index d3d157c753f43f4ac0610f75b5842a9c131ccb3f..ba096a2da67fe0319bdd81ea67d8779d77441536 100644
--- a/src/service/pusher/mod.rs
+++ b/src/service/pusher/mod.rs
@@ -239,12 +239,12 @@ async fn send_notice(
                     device.tweaks = tweaks.clone();
                 }
 
-                let d = &[device];
+                let d = vec![device];
                 let mut notifi = Notification::new(d);
 
                 notifi.prio = NotificationPriority::Low;
-                notifi.event_id = Some(&event.event_id);
-                notifi.room_id = Some(&event.room_id);
+                notifi.event_id = Some((*event.event_id).to_owned());
+                notifi.room_id = Some((*event.room_id).to_owned());
                 // TODO: missed calls
                 notifi.counts = NotificationCounts::new(unread, uint!(0));
 
@@ -260,18 +260,16 @@ async fn send_notice(
                     self.send_request(&http.url, send_event_notification::v1::Request::new(notifi))
                         .await?;
                 } else {
-                    notifi.sender = Some(&event.sender);
-                    notifi.event_type = Some(&event.kind);
-                    let content = serde_json::value::to_raw_value(&event.content).ok();
-                    notifi.content = content.as_deref();
+                    notifi.sender = Some(event.sender.clone());
+                    notifi.event_type = Some(event.kind.clone());
+                    notifi.content = serde_json::value::to_raw_value(&event.content).ok();
 
                     if event.kind == RoomEventType::RoomMember {
                         notifi.user_is_target =
                             event.state_key.as_deref() == Some(event.sender.as_str());
                     }
 
-                    let user_name = services().users.displayname(&event.sender)?;
-                    notifi.sender_display_name = user_name.as_deref();
+                    notifi.sender_display_name = services().users.displayname(&event.sender)?;
 
                     let room_name = if let Some(room_name_pdu) = services()
                         .rooms
@@ -287,7 +285,7 @@ async fn send_notice(
                         None
                     };
 
-                    notifi.room_name = room_name.as_deref();
+                    notifi.room_name = room_name;
 
                     self.send_request(&http.url, send_event_notification::v1::Request::new(notifi))
                         .await?;
diff --git a/src/service/rooms/event_handler/mod.rs b/src/service/rooms/event_handler/mod.rs
index 85d21bf9a6f5107db6d3916974f8878c0c88e8c1..3c49349f6a82ee976b64e77210378bc17c71985e 100644
--- a/src/service/rooms/event_handler/mod.rs
+++ b/src/service/rooms/event_handler/mod.rs
@@ -1113,7 +1113,7 @@ pub(crate) fn fetch_and_handle_outliers<'a>(
                         .send_federation_request(
                             origin,
                             get_event::v1::Request {
-                                event_id: next_id.into(),
+                                event_id: (*next_id).to_owned(),
                             },
                         )
                         .await
diff --git a/src/service/rooms/state_cache/mod.rs b/src/service/rooms/state_cache/mod.rs
index 6c9bed3542da0775101d934b03a3324e51b9b0fa..32afdd4eeee4f58eb7d03ede97e614f0b1bce553 100644
--- a/src/service/rooms/state_cache/mod.rs
+++ b/src/service/rooms/state_cache/mod.rs
@@ -164,7 +164,7 @@ pub fn update_membership(
                             .content
                             .ignored_users
                             .iter()
-                            .any(|user| user == sender)
+                            .any(|(user, _details)| user == sender)
                     });
 
                 if is_ignored {
diff --git a/src/utils/error.rs b/src/utils/error.rs
index 0ef13ce6fc2d171ef31614f6bcf5f6d6cd0846ee..3e0d8ca3cc62b40d352b139a6212223f36115612 100644
--- a/src/utils/error.rs
+++ b/src/utils/error.rs
@@ -102,7 +102,10 @@ pub fn to_response(&self) -> RumaResponse<UiaaResponse> {
 
         if let Self::FederationError(origin, error) = self {
             let mut error = error.clone();
-            error.message = format!("Answer from {}: {}", origin, error.message);
+            error.body = ErrorBody::Standard {
+                kind: Unknown,
+                message: format!("Answer from {}: {}", origin, error),
+            };
             return RumaResponse(UiaaResponse::MatrixError(error));
         }