diff --git a/Examples/xx-messenger/Sources/AppCore/SendMessage/SendGroupMessage.swift b/Examples/xx-messenger/Sources/AppCore/SendMessage/SendGroupMessage.swift
new file mode 100644
index 0000000000000000000000000000000000000000..65bceac997e7dbb7190d08376a1890ed54f7c4a8
--- /dev/null
+++ b/Examples/xx-messenger/Sources/AppCore/SendMessage/SendGroupMessage.swift
@@ -0,0 +1,44 @@
+import Foundation
+import XCTestDynamicOverlay
+import XXClient
+import XXMessengerClient
+import XXModels
+
+public struct SendGroupMessage {
+  public typealias OnError = (Error) -> Void
+  public typealias Completion = () -> Void
+
+  public var run: (String, Data, @escaping OnError, @escaping Completion) -> Void
+
+  public func callAsFunction(
+    text: String,
+    to groupId: Data,
+    onError: @escaping OnError,
+    completion: @escaping Completion
+  ) {
+    run(text, groupId, onError, completion)
+  }
+}
+
+extension SendGroupMessage {
+  public static func live(
+    messenger: Messenger,
+    db: DBManagerGetDB,
+    now: @escaping () -> Date
+  ) -> SendGroupMessage {
+    SendGroupMessage { text, groupId, onError, completion in
+      // TODO: implement sending group message
+      struct Unimplemented: Error, LocalizedError {
+        var errorDescription: String? { "SendGroupMessage is not implemented!" }
+      }
+      onError(Unimplemented())
+      completion()
+    }
+  }
+}
+
+extension SendGroupMessage {
+  public static let unimplemented = SendGroupMessage(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Examples/xx-messenger/Tests/AppCoreTests/SendMessage/SendGroupMessageTests.swift b/Examples/xx-messenger/Tests/AppCoreTests/SendMessage/SendGroupMessageTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..a53e5e35e49a1fda9f12a0a11b751951da4a2df5
--- /dev/null
+++ b/Examples/xx-messenger/Tests/AppCoreTests/SendMessage/SendGroupMessageTests.swift
@@ -0,0 +1,55 @@
+import CustomDump
+import XCTest
+import XCTestDynamicOverlay
+import XXClient
+import XXMessengerClient
+import XXModels
+@testable import AppCore
+
+final class SendGroupMessageTests: XCTestCase {
+  enum Action: Equatable {
+    case didReceiveError(String)
+    case didComplete
+  }
+
+  var actions: [Action]!
+
+  override func setUp() {
+    actions = []
+  }
+
+  override func tearDown() {
+    actions = nil
+  }
+
+  func testSend() {
+    let text = "Hello!"
+    let groupId = "group-id".data(using: .utf8)!
+
+    var messenger: Messenger = .unimplemented
+    var db: DBManagerGetDB = .unimplemented
+    let now = Date()
+    let send: SendGroupMessage = .live(
+      messenger: messenger,
+      db: db,
+      now: { now }
+    )
+
+    send(
+      text: text,
+      to: groupId,
+      onError: { error in
+        self.actions.append(.didReceiveError(error.localizedDescription))
+      },
+      completion: {
+        self.actions.append(.didComplete)
+      }
+    )
+
+    XCTAssertNoDifference(actions, [
+      .didReceiveError("SendGroupMessage is not implemented!"),
+      .didComplete
+    ])
+  }
+}
+