diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerConnect.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerConnect.swift
index efca553a512e4ab3745eb292fd54e59232fe03f4..d4bc0fa90b6e4bfe72e1cd292ca3990875a35d0d 100644
--- a/Sources/XXMessengerClient/Messenger/Functions/MessengerConnect.swift
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerConnect.swift
@@ -25,6 +25,7 @@ extension MessengerConnect {
         identity: try cMix.makeReceptionIdentity(legacy: true),
         e2eParamsJSON: env.getE2EParams()
       ))
+      env.isListeningForMessages.set(false)
     }
   }
 }
diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift
index 65a718dffa7c33c246de7a8b371c749433f2898b..7d6932badafbae5128694b414df70a32c405fd02 100644
--- a/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift
@@ -22,6 +22,7 @@ extension MessengerDestroy {
       env.ud.set(nil)
       env.e2e.set(nil)
       env.cMix.set(nil)
+      env.isListeningForMessages.set(false)
       try env.fileManager.removeDirectory(env.storageDir)
       try env.passwordStorage.remove()
     }
diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerIsListeningForMessages.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerIsListeningForMessages.swift
new file mode 100644
index 0000000000000000000000000000000000000000..a5cbd390456dc8063345655e007daca8bb4693fc
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerIsListeningForMessages.swift
@@ -0,0 +1,21 @@
+import XCTestDynamicOverlay
+
+public struct MessengerIsListeningForMessages {
+  public var run: () -> Bool
+
+  public func callAsFunction() -> Bool {
+    run()
+  }
+}
+
+extension MessengerIsListeningForMessages {
+  public static func live(_ env: MessengerEnvironment) -> MessengerIsListeningForMessages {
+    MessengerIsListeningForMessages(run: env.isListeningForMessages.get)
+  }
+}
+
+extension MessengerIsListeningForMessages {
+  public static let unimplemented = MessengerIsListeningForMessages(
+    run: XCTUnimplemented("\(Self.self)", placeholder: false)
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerListenForMessages.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerListenForMessages.swift
index 90fa02dab3cf84d85e50e3d696fe0a5a226d4884..62b9a600a58eb7c279a518aff0b23d7110aaaaf5 100644
--- a/Sources/XXMessengerClient/Messenger/Functions/MessengerListenForMessages.swift
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerListenForMessages.swift
@@ -16,14 +16,20 @@ public struct MessengerListenForMessages {
 extension MessengerListenForMessages {
   public static func live(_ env: MessengerEnvironment) -> MessengerListenForMessages {
     MessengerListenForMessages {
-      guard let e2e = env.e2e() else {
-        throw Error.notConnected
+      do {
+        guard let e2e = env.e2e() else {
+          throw Error.notConnected
+        }
+        try e2e.registerListener(
+          senderId: nil,
+          messageType: 2,
+          callback: env.messageListeners.registered()
+        )
+        env.isListeningForMessages.set(true)
+      } catch {
+        env.isListeningForMessages.set(false)
+        throw error
       }
-      try e2e.registerListener(
-        senderId: nil,
-        messageType: 2,
-        callback: env.messageListeners.registered()
-      )
     }
   }
 }
diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerRestoreBackup.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerRestoreBackup.swift
index 8b05e7d44dba67916bc2d0f5e0d99d005dc41e5b..9f0d591b44e0820c6f2f6af6611055c72f74be06 100644
--- a/Sources/XXMessengerClient/Messenger/Functions/MessengerRestoreBackup.swift
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerRestoreBackup.swift
@@ -73,6 +73,7 @@ extension MessengerRestoreBackup {
         env.cMix.set(cMix)
         env.e2e.set(e2e)
         env.ud.set(ud)
+        env.isListeningForMessages.set(false)
         return Result(
           restoredParams: params,
           restoredContacts: report.restoredContacts
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index ad3fff797d257b6d7014b67792f90b87a74f51c8..ea85852c6752e30af60987264851d57af910e811 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -14,6 +14,7 @@ public struct Messenger {
   public var start: MessengerStart
   public var isConnected: MessengerIsConnected
   public var connect: MessengerConnect
+  public var isListeningForMessages: MessengerIsListeningForMessages
   public var listenForMessages: MessengerListenForMessages
   public var isRegistered: MessengerIsRegistered
   public var register: MessengerRegister
@@ -46,6 +47,7 @@ extension Messenger {
       start: .live(env),
       isConnected: .live(env),
       connect: .live(env),
+      isListeningForMessages: .live(env),
       listenForMessages: .live(env),
       isRegistered: .live(env),
       register: .live(env),
@@ -79,6 +81,7 @@ extension Messenger {
     start: .unimplemented,
     isConnected: .unimplemented,
     connect: .unimplemented,
+    isListeningForMessages: .unimplemented,
     listenForMessages: .unimplemented,
     isRegistered: .unimplemented,
     register: .unimplemented,
diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
index 00ab6338b1731987b1f27b8c2c17da3bef8ed695..641a8062d3f9ae136192af38b2814fe14cafccb9 100644
--- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
+++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
@@ -12,6 +12,7 @@ public struct MessengerEnvironment {
   public var getCMixParams: GetCMixParams
   public var getE2EParams: GetE2EParams
   public var getSingleUseParams: GetSingleUseParams
+  public var isListeningForMessages: Stored<Bool>
   public var isRegisteredWithUD: IsRegisteredWithUD
   public var loadCMix: LoadCMix
   public var login: Login
@@ -52,6 +53,7 @@ extension MessengerEnvironment {
       getCMixParams: .liveDefault,
       getE2EParams: .liveDefault,
       getSingleUseParams: .liveDefault,
+      isListeningForMessages: .inMemory(false),
       isRegisteredWithUD: .live,
       loadCMix: .live,
       login: .live,
@@ -87,6 +89,7 @@ extension MessengerEnvironment {
     getCMixParams: .unimplemented,
     getE2EParams: .unimplemented,
     getSingleUseParams: .unimplemented,
+    isListeningForMessages: .unimplemented(placeholder: false),
     isRegisteredWithUD: .unimplemented,
     loadCMix: .unimplemented,
     login: .unimplemented,
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerConnectTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerConnectTests.swift
index 1f69797f10465a6c4d4ddd027d368cdc7dc69c7a..e17d6028ed3fd2eb59577f2b94df31338a60b1af 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerConnectTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerConnectTests.swift
@@ -17,12 +17,14 @@ final class MessengerConnectTests: XCTestCase {
     var didLogInWithAuthCallbacks: [AuthCallbacks?] = []
     var didSetE2E: [E2E?] = []
     var didHandleAuthCallbacks: [AuthCallbacks.Callback] = []
+    var didSetIsListeningForMessages: [Bool] = []
 
     let cMixId = 1234
     let receptionId = ReceptionIdentity.stub
     let e2eParams = "e2e-params".data(using: .utf8)!
 
     var env: MessengerEnvironment = .unimplemented
+    env.isListeningForMessages.set = { didSetIsListeningForMessages.append($0) }
     env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.getId.run = { cMixId }
@@ -62,6 +64,7 @@ final class MessengerConnectTests: XCTestCase {
         e2eParamsJSON: e2eParams
       )
     ])
+    XCTAssertNoDifference(didSetIsListeningForMessages, [false])
     XCTAssertEqual(didLogInWithAuthCallbacks.compactMap { $0 }.count, 1)
     XCTAssertEqual(didSetE2E.compactMap { $0 }.count, 1)
 
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift
index 36745d028934142b59912d341649e1519b435e1e..ccf999e77e6771724d17e27b6b43ce6a811fb8ae 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift
@@ -14,6 +14,7 @@ final class MessengerDestroyTests: XCTestCase {
     var didSetE2E: [E2E?] = []
     var didSetCMix: [CMix?] = []
     var didRemovePassword = 0
+    var didSetIsListeningForMessages: [Bool] = []
 
     var env: MessengerEnvironment = .unimplemented
     env.cMix.get = {
@@ -28,6 +29,7 @@ final class MessengerDestroyTests: XCTestCase {
     env.ud.set = { didSetUD.append($0) }
     env.e2e.set = { didSetE2E.append($0) }
     env.cMix.set = { didSetCMix.append($0) }
+    env.isListeningForMessages.set = { didSetIsListeningForMessages.append($0) }
     env.fileManager.removeDirectory = { didRemoveDirectory.append($0) }
     env.passwordStorage.remove = { didRemovePassword += 1 }
     let destroy: MessengerDestroy = .live(env)
@@ -39,6 +41,7 @@ final class MessengerDestroyTests: XCTestCase {
     XCTAssertNoDifference(didSetUD.map { $0 == nil }, [true])
     XCTAssertNoDifference(didSetE2E.map { $0 == nil }, [true])
     XCTAssertNoDifference(didSetCMix.map { $0 == nil }, [true])
+    XCTAssertNoDifference(didSetIsListeningForMessages, [false])
     XCTAssertNoDifference(didRemoveDirectory, [storageDir])
     XCTAssertNoDifference(didRemovePassword, 1)
   }
@@ -67,12 +70,14 @@ final class MessengerDestroyTests: XCTestCase {
     var didSetUD: [UserDiscovery?] = []
     var didSetE2E: [E2E?] = []
     var didSetCMix: [CMix?] = []
+    var didSetIsListeningForMessages: [Bool] = []
 
     var env: MessengerEnvironment = .unimplemented
     env.cMix.get = { nil }
     env.ud.set = { didSetUD.append($0) }
     env.e2e.set = { didSetE2E.append($0) }
     env.cMix.set = { didSetCMix.append($0) }
+    env.isListeningForMessages.set = { didSetIsListeningForMessages.append($0) }
     env.fileManager.removeDirectory = { _ in throw error }
     let destroy: MessengerDestroy = .live(env)
 
@@ -82,6 +87,7 @@ final class MessengerDestroyTests: XCTestCase {
     XCTAssertNoDifference(didSetUD.map { $0 == nil }, [true])
     XCTAssertNoDifference(didSetE2E.map { $0 == nil }, [true])
     XCTAssertNoDifference(didSetCMix.map { $0 == nil }, [true])
+    XCTAssertNoDifference(didSetIsListeningForMessages, [false])
   }
 
   func testRemovePasswordFailure() {
@@ -92,12 +98,14 @@ final class MessengerDestroyTests: XCTestCase {
     var didSetUD: [UserDiscovery?] = []
     var didSetE2E: [E2E?] = []
     var didSetCMix: [CMix?] = []
+    var didSetIsListeningForMessages: [Bool] = []
 
     var env: MessengerEnvironment = .unimplemented
     env.cMix.get = { nil }
     env.ud.set = { didSetUD.append($0) }
     env.e2e.set = { didSetE2E.append($0) }
     env.cMix.set = { didSetCMix.append($0) }
+    env.isListeningForMessages.set = { didSetIsListeningForMessages.append($0) }
     env.storageDir = storageDir
     env.fileManager.removeDirectory = { didRemoveDirectory.append($0) }
     env.passwordStorage.remove = { throw error }
@@ -109,6 +117,7 @@ final class MessengerDestroyTests: XCTestCase {
     XCTAssertNoDifference(didSetUD.map { $0 == nil }, [true])
     XCTAssertNoDifference(didSetE2E.map { $0 == nil }, [true])
     XCTAssertNoDifference(didSetCMix.map { $0 == nil }, [true])
+    XCTAssertNoDifference(didSetIsListeningForMessages, [false])
     XCTAssertNoDifference(didRemoveDirectory, [storageDir])
   }
 }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerIsListeningForMessagesTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerIsListeningForMessagesTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..bda5200bd315d498f9af8085aeb0571bfedfb290
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerIsListeningForMessagesTests.swift
@@ -0,0 +1,20 @@
+import XCTest
+@testable import XXMessengerClient
+
+final class MessengerIsListeningForMessagesTests: XCTestCase {
+  func testListening() {
+    var env: MessengerEnvironment = .unimplemented
+    env.isListeningForMessages.get = { true }
+    let isListening: MessengerIsListeningForMessages = .live(env)
+
+    XCTAssertTrue(isListening())
+  }
+
+  func testNotListening() {
+    var env: MessengerEnvironment = .unimplemented
+    env.isListeningForMessages.get = { false }
+    let isListening: MessengerIsListeningForMessages = .live(env)
+
+    XCTAssertFalse(isListening())
+  }
+}
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerListenForMessagesTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerListenForMessagesTests.swift
index 948ee33e3d668fdb0eff4a4cfad72f82b908c395..1f78a60a959ffb64d1bfbff41e59cb624ab36eb3 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerListenForMessagesTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerListenForMessagesTests.swift
@@ -12,6 +12,7 @@ final class MessengerListenForMessagesTests: XCTestCase {
     var didRegisterListenerWithParams: [RegisterListenerParams] = []
     var didRegisterListenerWithCallback: [Listener] = []
     var didHandleMessage: [Message] = []
+    var didSetIsListeningForMessages: [Bool] = []
 
     var env: MessengerEnvironment = .unimplemented
     env.e2e.get = {
@@ -25,6 +26,9 @@ final class MessengerListenForMessagesTests: XCTestCase {
     env.messageListeners.registered = {
       Listener { message in didHandleMessage.append(message) }
     }
+    env.isListeningForMessages.set = {
+      didSetIsListeningForMessages.append($0)
+    }
     let listen: MessengerListenForMessages = .live(env)
 
     try listen()
@@ -32,6 +36,7 @@ final class MessengerListenForMessagesTests: XCTestCase {
     XCTAssertNoDifference(didRegisterListenerWithParams, [
       .init(senderId: nil, messageType: 2)
     ])
+    XCTAssertNoDifference(didSetIsListeningForMessages, [true])
 
     let message = Message.stub(123)
     didRegisterListenerWithCallback.first?.handle(message)
@@ -40,19 +45,26 @@ final class MessengerListenForMessagesTests: XCTestCase {
   }
 
   func testListenWhenNotLoggedIn() {
+    var didSetIsListeningForMessages: [Bool] = []
+
     var env: MessengerEnvironment = .unimplemented
     env.e2e.get = { nil }
+    env.isListeningForMessages.set = { didSetIsListeningForMessages.append($0) }
     let listen: MessengerListenForMessages = .live(env)
 
     XCTAssertThrowsError(try listen()) { error in
       XCTAssertNoDifference(error as? MessengerListenForMessages.Error, .notConnected)
     }
+
+    XCTAssertNoDifference(didSetIsListeningForMessages, [false])
   }
 
   func testListenFailure() {
     struct Failure: Error, Equatable {}
     let error = Failure()
 
+    var didSetIsListeningForMessages: [Bool] = []
+
     var env: MessengerEnvironment = .unimplemented
     env.e2e.get = {
       var e2e: E2E = .unimplemented
@@ -60,10 +72,13 @@ final class MessengerListenForMessagesTests: XCTestCase {
       return e2e
     }
     env.messageListeners.registered = { Listener.unimplemented }
+    env.isListeningForMessages.set = { didSetIsListeningForMessages.append($0) }
     let listen: MessengerListenForMessages = .live(env)
 
     XCTAssertThrowsError(try listen()) { err in
       XCTAssertNoDifference(err as? Failure, error)
     }
+
+    XCTAssertNoDifference(didSetIsListeningForMessages, [false])
   }
 }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift
index 21194303b1ee245150ff1764bfc8968f38569855..fb8fe7da315df608763b572a273ec67ef2c8366c 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerRestoreBackupTests.swift
@@ -100,6 +100,9 @@ final class MessengerRestoreBackupTests: XCTestCase {
     env.cMix.set = { _ in caughtActions.append(.didSetCMix) }
     env.e2e.set = { _ in caughtActions.append(.didSetE2E) }
     env.ud.set = { _ in caughtActions.append(.didSetUD) }
+    env.isListeningForMessages.set = {
+      caughtActions.append(.didSetIsListeningForMessages(isListening: $0))
+    }
 
     let restore: MessengerRestoreBackup = .live(env)
 
@@ -157,6 +160,9 @@ final class MessengerRestoreBackupTests: XCTestCase {
       .didSetCMix,
       .didSetE2E,
       .didSetUD,
+      .didSetIsListeningForMessages(
+        isListening: false
+      ),
     ])
 
     XCTAssertNoDifference(result, MessengerRestoreBackup.Result(
@@ -228,4 +234,7 @@ private enum CaughtAction: Equatable {
   case didSetCMix
   case didSetE2E
   case didSetUD
+  case didSetIsListeningForMessages(
+    isListening: Bool
+  )
 }