diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterGroupRequestHandler.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterGroupRequestHandler.swift
new file mode 100644
index 0000000000000000000000000000000000000000..d298952da0e610cf321643139ef30e076ce6287a
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterGroupRequestHandler.swift
@@ -0,0 +1,24 @@
+import XCTestDynamicOverlay
+import XXClient
+
+public struct MessengerRegisterGroupRequestHandler {
+  public var run: (GroupRequest) -> Cancellable
+
+  public func callAsFunction(_ handler: GroupRequest) -> Cancellable {
+    run(handler)
+  }
+}
+
+extension MessengerRegisterGroupRequestHandler {
+  public static func live(_ env: MessengerEnvironment) -> MessengerRegisterGroupRequestHandler {
+    MessengerRegisterGroupRequestHandler { handler in
+      env.groupRequests.register(handler)
+    }
+  }
+}
+
+extension MessengerRegisterGroupRequestHandler {
+  public static let unimplemented = MessengerRegisterGroupRequestHandler(
+    run: XCTUnimplemented("\(Self.self)", placeholder: Cancellable {})
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 8a29ed6a103380b18bf9b140366cb18bdc9615aa..4e5585ac7881ee7768cc3a05d8441480dd31448a 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -49,6 +49,7 @@ public struct Messenger {
   public var receiveFile: MessengerReceiveFile
   public var trackServices: MessengerTrackServices
   public var getNotificationReports: MessengerGetNotificationReports
+  public var registerGroupRequestHandler: MessengerRegisterGroupRequestHandler
   public var startGroupChat: MessengerStartGroupChat
 }
 
@@ -103,6 +104,7 @@ extension Messenger {
       receiveFile: .live(env),
       trackServices: .live(env),
       getNotificationReports: .live(env),
+      registerGroupRequestHandler: .live(env),
       startGroupChat: .live(env)
     )
   }
@@ -158,6 +160,7 @@ extension Messenger {
     receiveFile: .unimplemented,
     trackServices: .unimplemented,
     getNotificationReports: .unimplemented,
+    registerGroupRequestHandler: .unimplemented,
     startGroupChat: .unimplemented
   )
 }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterGroupRequestHandlerTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterGroupRequestHandlerTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..0bca164c2de9af82b45a33e600e1f2261c892cc4
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterGroupRequestHandlerTests.swift
@@ -0,0 +1,34 @@
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerRegisterGroupRequestHandlerTests: XCTestCase {
+  func testRegister() {
+    var registered: [GroupRequest] = []
+    var didHandle: [Group] = []
+    var didCancel = 0
+
+    var env: MessengerEnvironment = .unimplemented
+    env.groupRequests.register = { handler in
+      registered.append(handler)
+      return Cancellable { didCancel += 1 }
+    }
+    let register: MessengerRegisterGroupRequestHandler = .live(env)
+    let cancellable = register(.init { group in
+      didHandle.append(group)
+    })
+
+    XCTAssertEqual(registered.count, 1)
+
+    let group = Group.stub(1)
+    registered.forEach { handler in
+      handler.handle(group)
+    }
+
+    XCTAssertEqual(didHandle.map { $0.getId() }, [group.getId()])
+
+    cancellable.cancel()
+
+    XCTAssertEqual(didCancel, 1)
+  }
+}