diff --git a/src/service/pdu.rs b/src/service/pdu.rs
index 554f3be710307adfc9045d9669142baaccb4c9db..5b5cbd032c01d4478daefffe8ad30f60714909d4 100644
--- a/src/service/pdu.rs
+++ b/src/service/pdu.rs
@@ -111,9 +111,11 @@ pub fn to_sync_room_event(&self) -> Raw<AnySyncTimelineEvent> {
             "event_id": self.event_id,
             "sender": self.sender,
             "origin_server_ts": self.origin_server_ts,
-            "unsigned": self.unsigned,
         });
 
+        if let Some(unsigned) = &self.unsigned {
+            json["unsigned"] = json!(unsigned);
+        }
         if let Some(state_key) = &self.state_key {
             json["state_key"] = json!(state_key);
         }
@@ -133,10 +135,12 @@ pub fn to_any_event(&self) -> Raw<AnyEphemeralRoomEvent> {
             "event_id": self.event_id,
             "sender": self.sender,
             "origin_server_ts": self.origin_server_ts,
-            "unsigned": self.unsigned,
             "room_id": self.room_id,
         });
 
+        if let Some(unsigned) = &self.unsigned {
+            json["unsigned"] = json!(unsigned);
+        }
         if let Some(state_key) = &self.state_key {
             json["state_key"] = json!(state_key);
         }
@@ -155,10 +159,12 @@ pub fn to_room_event(&self) -> Raw<AnyTimelineEvent> {
             "event_id": self.event_id,
             "sender": self.sender,
             "origin_server_ts": self.origin_server_ts,
-            "unsigned": self.unsigned,
             "room_id": self.room_id,
         });
 
+        if let Some(unsigned) = &self.unsigned {
+            json["unsigned"] = json!(unsigned);
+        }
         if let Some(state_key) = &self.state_key {
             json["state_key"] = json!(state_key);
         }
@@ -171,32 +177,38 @@ pub fn to_room_event(&self) -> Raw<AnyTimelineEvent> {
 
     #[tracing::instrument(skip(self))]
     pub fn to_state_event(&self) -> Raw<AnyStateEvent> {
-        let json = json!({
+        let mut json = json!({
             "content": self.content,
             "type": self.kind,
             "event_id": self.event_id,
             "sender": self.sender,
             "origin_server_ts": self.origin_server_ts,
-            "unsigned": self.unsigned,
             "room_id": self.room_id,
             "state_key": self.state_key,
         });
 
+        if let Some(unsigned) = &self.unsigned {
+            json["unsigned"] = json!(unsigned);
+        }
+
         serde_json::from_value(json).expect("Raw::from_value always works")
     }
 
     #[tracing::instrument(skip(self))]
     pub fn to_sync_state_event(&self) -> Raw<AnySyncStateEvent> {
-        let json = json!({
+        let mut json = json!({
             "content": self.content,
             "type": self.kind,
             "event_id": self.event_id,
             "sender": self.sender,
             "origin_server_ts": self.origin_server_ts,
-            "unsigned": self.unsigned,
             "state_key": self.state_key,
         });
 
+        if let Some(unsigned) = &self.unsigned {
+            json["unsigned"] = json!(unsigned);
+        }
+
         serde_json::from_value(json).expect("Raw::from_value always works")
     }
 
@@ -214,18 +226,21 @@ pub fn to_stripped_state_event(&self) -> Raw<AnyStrippedStateEvent> {
 
     #[tracing::instrument(skip(self))]
     pub fn to_member_event(&self) -> Raw<StateEvent<RoomMemberEventContent>> {
-        let json = json!({
+        let mut json = json!({
             "content": self.content,
             "type": self.kind,
             "event_id": self.event_id,
             "sender": self.sender,
             "origin_server_ts": self.origin_server_ts,
             "redacts": self.redacts,
-            "unsigned": self.unsigned,
             "room_id": self.room_id,
             "state_key": self.state_key,
         });
 
+        if let Some(unsigned) = &self.unsigned {
+            json["unsigned"] = json!(unsigned);
+        }
+
         serde_json::from_value(json).expect("Raw::from_value always works")
     }