diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs
index 07c2ecacf956b977ec2a2f76cb5b599a348b47a8..7d107ffe965057b47f08c4ae4e01c5a346039fe7 100644
--- a/src/database/entities/message.rs
+++ b/src/database/entities/message.rs
@@ -43,6 +43,19 @@ pub enum Content {
     SystemMessage(SystemMessage),
 }
 
+impl Content {
+    pub async fn send_as_system(self, target: &Channel) -> Result<()> {
+        Message::create(
+            "00000000000000000000000000".to_string(),
+            target.id().to_string(),
+            self,
+            None
+        )
+        .publish(&target)
+        .await
+    }
+}
+
 #[derive(Serialize, Deserialize, Debug, Clone)]
 pub struct Message {
     #[serde(rename = "_id")]
diff --git a/src/routes/channels/delete_channel.rs b/src/routes/channels/delete_channel.rs
index 7b3dfed09b59f496a4bfdefed1ee435bad666ea3..2869d177ad5f790b330566f6ceb73db63c92d5aa 100644
--- a/src/routes/channels/delete_channel.rs
+++ b/src/routes/channels/delete_channel.rs
@@ -98,15 +98,9 @@ pub async fn req(user: User, target: Ref) -> Result<()> {
             }
             .publish(id.clone());
 
-            Message::create(
-                "00000000000000000000000000".to_string(),
-                id.clone(),
-                Content::SystemMessage(SystemMessage::UserLeft { id: user.id }),
-                None
-            )
-            .publish(&target)
-            .await
-            .ok();
+            Content::SystemMessage(SystemMessage::UserLeft { id: user.id })
+            .send_as_system(&target)
+            .await.ok();
 
             Ok(())
         }
diff --git a/src/routes/channels/edit_channel.rs b/src/routes/channels/edit_channel.rs
index 8d33a14cabc502a00b0d3290179d6b1dc511e088..668dfe095d5f348d648a37d5c7fdebadd3d539f5 100644
--- a/src/routes/channels/edit_channel.rs
+++ b/src/routes/channels/edit_channel.rs
@@ -112,44 +112,26 @@ pub async fn req(user: User, target: Ref, data: Json<Data>) -> Result<()> {
 
             if let Channel::Group { .. } = &target {
                 if let Some(name) = data.name {
-                    Message::create(
-                        "00000000000000000000000000".to_string(),
-                        id.clone(),
-                        Content::SystemMessage(SystemMessage::ChannelRenamed {
-                            name,
-                            by: user.id.clone(),
-                        }),
-                        None
-                    )
-                    .publish(&target)
-                    .await
-                    .ok();
+                    Content::SystemMessage(SystemMessage::ChannelRenamed {
+                        name,
+                        by: user.id.clone(),
+                    })
+                    .send_as_system(&target)
+                    .await.ok();
                 }
 
                 if let Some(_) = data.description {
-                    Message::create(
-                        "00000000000000000000000000".to_string(),
-                        id.clone(),
-                        Content::SystemMessage(SystemMessage::ChannelDescriptionChanged {
-                            by: user.id.clone(),
-                        }),
-                        None
-                    )
-                    .publish(&target)
-                    .await
-                    .ok();
+                    Content::SystemMessage(SystemMessage::ChannelDescriptionChanged {
+                        by: user.id.clone(),
+                    })
+                    .send_as_system(&target)
+                    .await.ok();
                 }
 
                 if let Some(_) = data.icon {
-                    Message::create(
-                        "00000000000000000000000000".to_string(),
-                        id.clone(),
-                        Content::SystemMessage(SystemMessage::ChannelIconChanged { by: user.id }),
-                        None
-                    )
-                    .publish(&target)
-                    .await
-                    .ok();
+                    Content::SystemMessage(SystemMessage::ChannelIconChanged { by: user.id })
+                    .send_as_system(&target)
+                    .await.ok();
                 }
             }
 
diff --git a/src/routes/channels/group_add_member.rs b/src/routes/channels/group_add_member.rs
index bb6aa70f40654291a6f4c815b3ae789af63e2f75..e00c8afc71fb135482e93837a3ebdcf6207efbf1 100644
--- a/src/routes/channels/group_add_member.rs
+++ b/src/routes/channels/group_add_member.rs
@@ -55,18 +55,12 @@ pub async fn req(user: User, target: Ref, member: Ref) -> Result<()> {
         }
         .publish(id.clone());
 
-        Message::create(
-            "00000000000000000000000000".to_string(),
-            id.clone(),
-            Content::SystemMessage(SystemMessage::UserAdded {
-                id: member.id,
-                by: user.id,
-            }),
-            None
-        )
-        .publish(&channel)
-        .await
-        .ok();
+        Content::SystemMessage(SystemMessage::UserAdded {
+            id: member.id,
+            by: user.id,
+        })
+        .send_as_system(&channel)
+        .await.ok();
 
         Ok(())
     } else {
diff --git a/src/routes/channels/group_remove_member.rs b/src/routes/channels/group_remove_member.rs
index 9f7ea61731a5dc65cdf5ffdea5bc5af94cbaf2d4..640bb8efa483cdc7c3b3a69d94e9994f555d7b02 100644
--- a/src/routes/channels/group_remove_member.rs
+++ b/src/routes/channels/group_remove_member.rs
@@ -51,18 +51,12 @@ pub async fn req(user: User, target: Ref, member: Ref) -> Result<()> {
         }
         .publish(id.clone());
 
-        Message::create(
-            "00000000000000000000000000".to_string(),
-            id.clone(),
-            Content::SystemMessage(SystemMessage::UserRemove {
-                id: member.id,
-                by: user.id,
-            }),
-            None
-        )
-        .publish(&channel)
-        .await
-        .ok();
+        Content::SystemMessage(SystemMessage::UserRemove {
+            id: member.id,
+            by: user.id,
+        })
+        .send_as_system(&channel)
+        .await.ok();
 
         Ok(())
     } else {