diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterBackupCallback.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterBackupCallback.swift
new file mode 100644
index 0000000000000000000000000000000000000000..f7c9a251072b04f28f7c12f527e42be7174dce15
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerRegisterBackupCallback.swift
@@ -0,0 +1,24 @@
+import XCTestDynamicOverlay
+import XXClient
+
+public struct MessengerRegisterBackupCallback {
+  public var run: (UpdateBackupFunc) -> Cancellable
+
+  public func callAsFunction(_ callback: UpdateBackupFunc) -> Cancellable {
+    run(callback)
+  }
+}
+
+extension MessengerRegisterBackupCallback {
+  public static func live(_ env: MessengerEnvironment) -> MessengerRegisterBackupCallback {
+    MessengerRegisterBackupCallback { callback in
+      env.backupCallbacks.register(callback)
+    }
+  }
+}
+
+extension MessengerRegisterBackupCallback {
+  public static let unimplemented = MessengerRegisterBackupCallback(
+    run: XCTUnimplemented("\(Self.self)", placeholder: Cancellable {})
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index ea85852c6752e30af60987264851d57af910e811..030aefb5c6df1b60686148bd2ba451c6f4edb017 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -29,6 +29,7 @@ public struct Messenger {
   public var registerForNotifications: MessengerRegisterForNotifications
   public var verifyContact: MessengerVerifyContact
   public var sendMessage: MessengerSendMessage
+  public var registerBackupCallback: MessengerRegisterBackupCallback
 }
 
 extension Messenger {
@@ -61,7 +62,8 @@ extension Messenger {
       lookupContacts: .live(env),
       registerForNotifications: .live(env),
       verifyContact: .live(env),
-      sendMessage: .live(env)
+      sendMessage: .live(env),
+      registerBackupCallback: .live(env)
     )
   }
 }
@@ -95,6 +97,7 @@ extension Messenger {
     lookupContacts: .unimplemented,
     registerForNotifications: .unimplemented,
     verifyContact: .unimplemented,
-    sendMessage: .unimplemented
+    sendMessage: .unimplemented,
+    registerBackupCallback: .unimplemented
   )
 }
diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
index 641a8062d3f9ae136192af38b2814fe14cafccb9..f6f9a8263cf735031f3e6eaa42a3adf7d4413c0c 100644
--- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
+++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
@@ -4,6 +4,7 @@ import XCTestDynamicOverlay
 
 public struct MessengerEnvironment {
   public var authCallbacks: AuthCallbacksRegistry
+  public var backupCallbacks: BackupCallbacksRegistry
   public var cMix: Stored<CMix?>
   public var downloadNDF: DownloadAndVerifySignedNdf
   public var e2e: Stored<E2E?>
@@ -45,6 +46,7 @@ extension MessengerEnvironment {
   public static func live() -> MessengerEnvironment {
     MessengerEnvironment(
       authCallbacks: .live(),
+      backupCallbacks: .live(),
       cMix: .inMemory(),
       downloadNDF: .live,
       e2e: .inMemory(),
@@ -81,6 +83,7 @@ extension MessengerEnvironment {
 extension MessengerEnvironment {
   public static let unimplemented = MessengerEnvironment(
     authCallbacks: .unimplemented,
+    backupCallbacks: .unimplemented,
     cMix: .unimplemented(),
     downloadNDF: .unimplemented,
     e2e: .unimplemented(),
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterBackupCallbackTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterBackupCallbackTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..44e7e21c2bbac9badafd94370a595fea209da2f9
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRegisterBackupCallbackTests.swift
@@ -0,0 +1,34 @@
+import CustomDump
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerRegisterBackupCallbackTests: XCTestCase {
+  func testRegisterBackupCallback() {
+    var registeredCallbacks: [UpdateBackupFunc] = []
+    var didHandleData: [Data] = []
+    var didCancelRegisteredCallback = 0
+
+    var env: MessengerEnvironment = .unimplemented
+    env.backupCallbacks.register = { callback in
+      registeredCallbacks.append(callback)
+      return Cancellable { didCancelRegisteredCallback += 1 }
+    }
+    let registerBackupCallback: MessengerRegisterBackupCallback = .live(env)
+    let cancellable = registerBackupCallback(UpdateBackupFunc { data in
+      didHandleData.append(data)
+    })
+
+    XCTAssertEqual(registeredCallbacks.count, 1)
+
+    registeredCallbacks.forEach { callback in
+      callback.handle("test".data(using: .utf8)!)
+    }
+
+    XCTAssertNoDifference(didHandleData, ["test".data(using: .utf8)!])
+
+    cancellable.cancel()
+
+    XCTAssertEqual(didCancelRegisteredCallback, 1)
+  }
+}