diff --git a/Sources/ChatFeature/ViewModels/SingleChatViewModel.swift b/Sources/ChatFeature/ViewModels/SingleChatViewModel.swift
index 860e084b69158b33889c6b3f882ed585d1208797..cd78765910d84d7242ee96ff145c3cd612c2492d 100644
--- a/Sources/ChatFeature/ViewModels/SingleChatViewModel.swift
+++ b/Sources/ChatFeature/ViewModels/SingleChatViewModel.swift
@@ -204,10 +204,10 @@ final class SingleChatViewModel {
         }
 
         guard let contact = try? session.dbManager.fetchContacts(.init(id: [message.senderId])).first else {
-            return ("You", message.text)
+            fatalError()
         }
 
-        let contactTitle = (contact.nickname ?? contact.username) ?? "Fetching username..."
+        let contactTitle = (contact.nickname ?? contact.username) ?? "You"
         return (contactTitle, message.text)
     }
 
diff --git a/Sources/Integration/Session/Session+Chat.swift b/Sources/Integration/Session/Session+Chat.swift
index ec582ff87bdfecef983bf74aa725aa5244bcac14..a0835167e5debbaf34986bcfa80eea3af2c2d2ef 100644
--- a/Sources/Integration/Session/Session+Chat.swift
+++ b/Sources/Integration/Session/Session+Chat.swift
@@ -115,9 +115,17 @@ extension Session {
     private func send(message: Message) {
         var message = message
 
+        var reply: Reply?
+        if let replyId = message.replyMessageId,
+           let replyMessage = try? dbManager.fetchMessages(Message.Query(networkId: replyId)).first {
+            reply = Reply(messageId: replyId, senderId: replyMessage.senderId)
+        }
+
+        let payloadData = Payload(text: message.text, reply: reply).asData()
+
         DispatchQueue.global().async { [weak self] in
             guard let self = self else { return }
-            switch self.client.bindings.send(message.text.data(using: .utf8)!, to: message.recipientId!) {
+            switch self.client.bindings.send(payloadData, to: message.recipientId!) {
             case .success(let report):
                 message.roundURL = report.roundURL
 
diff --git a/Sources/Integration/Session/Session+Group.swift b/Sources/Integration/Session/Session+Group.swift
index 9a37e4b8a1c350ece156ca3a147f2fc2a463f4b1..0275c8545a201319e169953046aa1f662006b607 100644
--- a/Sources/Integration/Session/Session+Group.swift
+++ b/Sources/Integration/Session/Session+Group.swift
@@ -116,10 +116,18 @@ extension Session {
         guard let manager = client.groupManager else { fatalError("A group manager was not created") }
         var message = message
 
+        var reply: Reply?
+        if let replyId = message.replyMessageId,
+           let replyMessage = try? dbManager.fetchMessages(Message.Query(networkId: replyId)).first {
+            reply = Reply(messageId: replyId, senderId: replyMessage.senderId)
+        }
+
+        let payloadData = Payload(text: message.text, reply: reply).asData()
+
         DispatchQueue.global().async { [weak self] in
             guard let self = self else { return }
 
-            switch manager.send(message.text.data(using: .utf8)!, to: message.groupId!) {
+            switch manager.send(payloadData, to: message.groupId!) {
             case .success((let roundId, let uniqueId, let roundURL)):
                 message.roundURL = roundURL