diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerCMix.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerCMix.swift
index 5543c048fde2b7a12ce261f7cf796adb2ddbc31f..d3e062d283f3a604bdfc83e735558e90c01787dc 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerCMix.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerCMix.swift
@@ -2,21 +2,28 @@ import XXClient
 import XCTestDynamicOverlay
 
 public struct MessengerCMix {
-  public var run: () -> CMix?
+  public var get: () -> CMix?
+  public var set: (CMix?) -> Void
 
   public func callAsFunction() -> CMix? {
-    run()
+    get()
   }
 }
 
 extension MessengerCMix {
-  public static func live(_ env: MessengerEnvironment) -> MessengerCMix {
-    MessengerCMix(run: env.ctx.getCMix)
+  public static func live() -> MessengerCMix {
+    class Storage { var value: CMix? }
+    let storage = Storage()
+    return MessengerCMix(
+      get: { storage.value },
+      set: { storage.value = $0 }
+    )
   }
 }
 
 extension MessengerCMix {
   public static let unimplemented = MessengerCMix(
-    run: XCTUnimplemented("\(Self.self)", placeholder: nil)
+    get: XCTUnimplemented("\(Self.self).get", placeholder: nil),
+    set: XCTUnimplemented("\(Self.self).set")
   )
 }
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerConnect.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerConnect.swift
index 97e399ab0f78485a4d99fc3d206e26d37275954b..8cebb73a648773e63137a86a4481142fe2f5b173 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerConnect.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerConnect.swift
@@ -16,10 +16,10 @@ public struct MessengerConnect {
 extension MessengerConnect {
   public static func live(_ env: MessengerEnvironment) -> MessengerConnect {
     MessengerConnect {
-      guard let cMix = env.ctx.getCMix() else {
+      guard let cMix = env.cMix() else {
         throw Error.notLoaded
       }
-      env.ctx.setE2E(try env.login(
+      env.e2e.set(try env.login(
         cMixId: cMix.getId(),
         identity: try cMix.makeLegacyReceptionIdentity(),
         e2eParamsJSON: env.getE2EParams()
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerE2E.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerE2E.swift
index cc1f8def702e95afdd0a26bc6259c15e934b3799..070a6b70ca9dab0c65e0752a1779f4b9370d4c46 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerE2E.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerE2E.swift
@@ -2,21 +2,28 @@ import XXClient
 import XCTestDynamicOverlay
 
 public struct MessengerE2E {
-  public var run: () -> E2E?
+  public var get: () -> E2E?
+  public var set: (E2E?) -> Void
 
   public func callAsFunction() -> E2E? {
-    run()
+    get()
   }
 }
 
 extension MessengerE2E {
-  public static func live(_ env: MessengerEnvironment) -> MessengerE2E {
-    MessengerE2E(run: env.ctx.getE2E)
+  public static func live() -> MessengerE2E {
+    class Storage { var value: E2E? }
+    let storage = Storage()
+    return MessengerE2E(
+      get: { storage.value },
+      set: { storage.value = $0 }
+    )
   }
 }
 
 extension MessengerE2E {
   public static let unimplemented = MessengerE2E(
-    run: XCTUnimplemented("\(Self.self)", placeholder: nil)
+    get: XCTUnimplemented("\(Self.self).get", placeholder: nil),
+    set: XCTUnimplemented("\(Self.self).set")
   )
 }
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsConnected.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsConnected.swift
index 81017429b98dad5dc05f7361f693cca6d8d99aa6..c30437faeb6b4cbc8b0a66df811bc55bd5618e28 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsConnected.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsConnected.swift
@@ -12,7 +12,7 @@ public struct MessengerIsConnected {
 extension MessengerIsConnected {
   public static func live(_ env: MessengerEnvironment) -> MessengerIsConnected {
     MessengerIsConnected {
-      env.ctx.getE2E() != nil
+      env.e2e() != nil
     }
   }
 }
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoaded.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoaded.swift
index 8931d2b491ce518b805955771d3c94ea81ce50af..dc0b42165efe5b39071674a5019a7e11860d53f5 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoaded.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoaded.swift
@@ -12,7 +12,7 @@ public struct MessengerIsLoaded {
 extension MessengerIsLoaded {
   public static func live(_ env: MessengerEnvironment) -> MessengerIsLoaded {
     MessengerIsLoaded {
-      env.ctx.getCMix() != nil
+      env.cMix() != nil
     }
   }
 }
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoggedIn.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoggedIn.swift
index 04aaa338d7f4e936dd7f5c75b0bf5e6ffd17249c..7c54c5785fc472c4815f3a91f626575881cf2dcd 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoggedIn.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsLoggedIn.swift
@@ -12,7 +12,7 @@ public struct MessengerIsLoggedIn {
 extension MessengerIsLoggedIn {
   public static func live(_ env: MessengerEnvironment) -> MessengerIsLoggedIn {
     MessengerIsLoggedIn {
-      env.ctx.getUD() != nil
+      env.ud() != nil
     }
   }
 }
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsRegistered.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsRegistered.swift
index cbf02c8a7cdd2f51a4fe6f9dea6249914225d988..bf3cafa541fa67847f749325419c683e9edd34c6 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerIsRegistered.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerIsRegistered.swift
@@ -16,7 +16,7 @@ public struct MessengerIsRegistered {
 extension MessengerIsRegistered {
   public static func live(_ env: MessengerEnvironment) -> MessengerIsRegistered {
     MessengerIsRegistered {
-      guard let e2e = env.ctx.getE2E() else {
+      guard let e2e = env.e2e() else {
         throw Error.notConnected
       }
       return try env.isRegisteredWithUD(e2eId: e2e.getId())
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerLoad.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerLoad.swift
index c57d7a5a05b84c74e8889c5199b9574fab9ff206..29f281688d0cb6e4611cbf50a5ee2f7844df07f1 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerLoad.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerLoad.swift
@@ -12,7 +12,7 @@ public struct MessengerLoad {
 extension MessengerLoad {
   public static func live(_ env: MessengerEnvironment) -> MessengerLoad {
     MessengerLoad {
-      env.ctx.setCMix(try env.loadCMix(
+      env.cMix.set(try env.loadCMix(
         storageDir: env.storageDir,
         password: try env.passwordStorage.load(),
         cMixParamsJSON: env.getCMixParams()
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerLogIn.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerLogIn.swift
index 51e970d5db4798ae46d7b98e6e0b8cbbebeea0cf..d0f86d8bcfa8ea7f7c0251d573a5dc591b59ddc0 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerLogIn.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerLogIn.swift
@@ -17,13 +17,13 @@ public struct MessengerLogIn {
 extension MessengerLogIn {
   public static func live(_ env: MessengerEnvironment) -> MessengerLogIn {
     MessengerLogIn {
-      guard let cMix = env.ctx.getCMix() else {
+      guard let cMix = env.cMix() else {
         throw Error.notLoaded
       }
-      guard let e2e = env.ctx.getE2E() else {
+      guard let e2e = env.e2e() else {
         throw Error.notConnected
       }
-      env.ctx.setUD(try env.newOrLoadUd(
+      env.ud.set(try env.newOrLoadUd(
         params: .init(
           e2eId: e2e.getId(),
           username: nil,
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerRegister.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerRegister.swift
index 35450762aaecb623755182f770dbbc6953714931..6f4296318c4eccf771ccb505cb584db458b74f8b 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerRegister.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerRegister.swift
@@ -19,13 +19,13 @@ public struct MessengerRegister {
 extension MessengerRegister {
   public static func live(_ env: MessengerEnvironment) -> MessengerRegister {
     MessengerRegister { username in
-      guard let cMix = env.ctx.getCMix() else {
+      guard let cMix = env.cMix() else {
         throw Error.notLoaded
       }
-      guard let e2e = env.ctx.getE2E() else {
+      guard let e2e = env.e2e() else {
         throw Error.notConnected
       }
-      env.ctx.setUD(try env.newOrLoadUd(
+      env.ud.set(try env.newOrLoadUd(
         params: .init(
           e2eId: e2e.getId(),
           username: username,
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerStart.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerStart.swift
index 224702b7a146047af046569ed8a98e5aab99ff6c..cc3363ec543ee2c3ed6c2414ac79d1ceaa0ccc33 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerStart.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerStart.swift
@@ -18,7 +18,7 @@ public struct MessengerStart {
 extension MessengerStart {
   public static func live(_ env: MessengerEnvironment) -> MessengerStart {
     MessengerStart { timeoutMS in
-      guard let cMix = env.ctx.getCMix() else {
+      guard let cMix = env.cMix() else {
         throw Error.notLoaded
       }
       guard cMix.networkFollowerStatus() != .running else {
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerUD.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerUD.swift
index c64ee6cf55db2ebcdc10959b00096e45953b48a6..c871f6e0be6d9c2f95a8eab1f29c01b76529de58 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerUD.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerUD.swift
@@ -2,21 +2,28 @@ import XXClient
 import XCTestDynamicOverlay
 
 public struct MessengerUD {
-  public var run: () -> UserDiscovery?
+  public var get: () -> UserDiscovery?
+  public var set: (UserDiscovery?) -> Void
 
   public func callAsFunction() -> UserDiscovery? {
-    run()
+    get()
   }
 }
 
 extension MessengerUD {
-  public static func live(_ env: MessengerEnvironment) -> MessengerUD {
-    MessengerUD(run: env.ctx.getUD)
+  public static func live() -> MessengerUD {
+    class Storage { var value: UserDiscovery? }
+    let storage = Storage()
+    return MessengerUD(
+      get: { storage.value },
+      set: { storage.value = $0 }
+    )
   }
 }
 
 extension MessengerUD {
   public static let unimplemented = MessengerUD(
-    run: XCTUnimplemented("\(Self.self)", placeholder: nil)
+    get: XCTUnimplemented("\(Self.self).get", placeholder: nil),
+    set: XCTUnimplemented("\(Self.self).set")
   )
 }
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNetwork.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNetwork.swift
index df8fea1885d56a9c8df0757d1886064d607447e9..8fe8cf3e4750f1d3bff8a7191574a143639466c7 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNetwork.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNetwork.swift
@@ -19,7 +19,7 @@ public struct MessengerWaitForNetwork {
 extension MessengerWaitForNetwork {
   public static func live(_ env: MessengerEnvironment) -> MessengerWaitForNetwork {
     MessengerWaitForNetwork { timeoutMS in
-      guard let cMix = env.ctx.getCMix() else {
+      guard let cMix = env.cMix() else {
         throw Error.notLoaded
       }
       guard cMix.waitForNetwork(timeoutMS: timeoutMS) else {
diff --git a/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNodes.swift b/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNodes.swift
index 8fc118994ea6edf296c888c5c3dc6d98139eda28..b87acc2f13caf51d2998d3a864a6484f897dc528 100644
--- a/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNodes.swift
+++ b/Sources/XXMessengerClient/Messenger/Functors/MessengerWaitForNodes.swift
@@ -24,7 +24,7 @@ public struct MessengerWaitForNodes {
 extension MessengerWaitForNodes {
   public static func live(_ env: MessengerEnvironment) -> MessengerWaitForNodes {
     MessengerWaitForNodes { targetRatio, sleepMS, retries, onProgress in
-      guard let cMix = env.ctx.getCMix() else {
+      guard let cMix = env.cMix() else {
         throw Error.notLoaded
       }
 
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 5a442ac9aa17220dcaa1f2b166c74a51be641c2b..397c8e849efec706ae0308f5528b5a1fbd582c2b 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -22,9 +22,9 @@ public struct Messenger {
 extension Messenger {
   public static func live(_ env: MessengerEnvironment) -> Messenger {
     Messenger(
-      cMix: .live(env),
-      e2e: .live(env),
-      ud: .live(env),
+      cMix: env.cMix,
+      e2e: env.e2e,
+      ud: env.ud,
       isCreated: .live(env),
       create: .live(env),
       isLoaded: .live(env),
diff --git a/Sources/XXMessengerClient/Messenger/MessengerContext.swift b/Sources/XXMessengerClient/Messenger/MessengerContext.swift
deleted file mode 100644
index c98523f2ef99ecd2844b5636c5ff8549bc3c5e9f..0000000000000000000000000000000000000000
--- a/Sources/XXMessengerClient/Messenger/MessengerContext.swift
+++ /dev/null
@@ -1,42 +0,0 @@
-import XXClient
-import XCTestDynamicOverlay
-
-public struct MessengerContext {
-  public var getCMix: () -> CMix?
-  public var setCMix: (CMix?) -> Void
-  public var getE2E: () -> E2E?
-  public var setE2E: (E2E?) -> Void
-  public var getUD: () -> UserDiscovery?
-  public var setUD: (UserDiscovery?) -> Void
-}
-
-extension MessengerContext {
-  public static func live() -> MessengerContext {
-    class Container {
-      var cMix: CMix?
-      var e2e: E2E?
-      var ud: UserDiscovery?
-    }
-    let container = Container()
-
-    return MessengerContext(
-      getCMix: { container.cMix },
-      setCMix: { container.cMix = $0 },
-      getE2E: { container.e2e },
-      setE2E: { container.e2e = $0 },
-      getUD: { container.ud },
-      setUD: { container.ud = $0 }
-    )
-  }
-}
-
-extension MessengerContext {
-  public static let unimplemented = MessengerContext(
-    getCMix: XCTUnimplemented("\(Self.self).getCMix"),
-    setCMix: XCTUnimplemented("\(Self.self).setCMix"),
-    getE2E: XCTUnimplemented("\(Self.self).getE2E"),
-    setE2E: XCTUnimplemented("\(Self.self).setE2E"),
-    getUD: XCTUnimplemented("\(Self.self).getUD"),
-    setUD: XCTUnimplemented("\(Self.self).setUD")
-  )
-}
diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
index eb7646f3ecc8f9c0996ddc19fda93ef87fc8efe8..a84a1e874e29d357eed5669cba1c5cfd548ab4ea 100644
--- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
+++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
@@ -3,8 +3,9 @@ import XXClient
 import XCTestDynamicOverlay
 
 public struct MessengerEnvironment {
-  public var ctx: MessengerContext
+  public var cMix: MessengerCMix
   public var downloadNDF: DownloadAndVerifySignedNdf
+  public var e2e: MessengerE2E
   public var fileManager: MessengerFileManager
   public var generateSecret: GenerateSecret
   public var getCMixParams: GetCMixParams
@@ -18,6 +19,7 @@ public struct MessengerEnvironment {
   public var passwordStorage: PasswordStorage
   public var sleep: (Int) -> Void
   public var storageDir: String
+  public var ud: MessengerUD
   public var udAddress: String?
   public var udCert: Data?
   public var udContact: Data?
@@ -32,8 +34,9 @@ extension MessengerEnvironment {
 
   public static func live() -> MessengerEnvironment {
     MessengerEnvironment(
-      ctx: .live(),
+      cMix: .live(),
       downloadNDF: .live,
+      e2e: .live(),
       fileManager: .live(),
       generateSecret: .live,
       getCMixParams: .liveDefault,
@@ -47,6 +50,7 @@ extension MessengerEnvironment {
       passwordStorage: .keychain,
       sleep: { Foundation.sleep(UInt32($0)) },
       storageDir: MessengerEnvironment.defaultStorageDir,
+      ud: .live(),
       udAddress: nil,
       udCert: nil,
       udContact: nil
@@ -56,8 +60,9 @@ extension MessengerEnvironment {
 
 extension MessengerEnvironment {
   public static let unimplemented = MessengerEnvironment(
-    ctx: .unimplemented,
+    cMix: .unimplemented,
     downloadNDF: .unimplemented,
+    e2e: .unimplemented,
     fileManager: .unimplemented,
     generateSecret: .unimplemented,
     getCMixParams: .unimplemented,
@@ -71,6 +76,7 @@ extension MessengerEnvironment {
     passwordStorage: .unimplemented,
     sleep: XCTUnimplemented("\(Self.self).sleep"),
     storageDir: "unimplemented",
+    ud: .unimplemented,
     udAddress: nil,
     udCert: nil,
     udContact: nil
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerCMixTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerCMixTests.swift
index f4327a08177ab4ec3c2b6eca9341859813fa83ae..668983f5ab365263405fca13bac7c3fadf3e7f39 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerCMixTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerCMixTests.swift
@@ -4,17 +4,15 @@ import XXClient
 
 final class MessengerCMixTests: XCTestCase {
   func testCMix() throws {
-    var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { .unimplemented }
-    let cMix: MessengerCMix = .live(env)
+    let cMix: MessengerCMix = .live()
+
+    XCTAssertNil(cMix())
+
+    cMix.set(.unimplemented)
 
     XCTAssertNotNil(cMix())
-  }
 
-  func testCMixWhenNotSet() throws {
-    var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
-    let cMix: MessengerCMix = .live(env)
+    cMix.set(nil)
 
     XCTAssertNil(cMix())
   }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerConnectTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerConnectTests.swift
index c93e403e816535677dfb86ef5ad7dac81ceaffdb..fb780353631b32f3f4bcf686bf60f3c3e38703c3 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerConnectTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerConnectTests.swift
@@ -21,13 +21,13 @@ final class MessengerConnectTests: XCTestCase {
     let e2eParams = "e2e-params".data(using: .utf8)!
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.getId.run = { cMixId }
       cMix.makeLegacyReceptionIdentity.run = { receptionId }
       return cMix
     }
-    env.ctx.setE2E = { didSetE2E.append($0) }
+    env.e2e.set = { didSetE2E.append($0) }
     env.getE2EParams.run = { e2eParams }
     env.login.run = { ephemeral, cMixId, authCallbacks, identity, e2eParamsJSON in
       didLogIn.append(.init(
@@ -57,7 +57,7 @@ final class MessengerConnectTests: XCTestCase {
 
   func testConnectWithoutCMix() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
+    env.cMix.get = { nil }
     let connect: MessengerConnect = .live(env)
 
     XCTAssertThrowsError(try connect()) { error in
@@ -73,7 +73,7 @@ final class MessengerConnectTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.getId.run = { 1234 }
       cMix.makeLegacyReceptionIdentity.run = { throw error }
@@ -91,7 +91,7 @@ final class MessengerConnectTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.getId.run = { 1234 }
       cMix.makeLegacyReceptionIdentity.run = { .stub }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerE2ETests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerE2ETests.swift
index bb54fb78ded08e309cd53f4278fe6e0e0ec6378d..63b9f58500173d7db488613cc37e502865c44c78 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerE2ETests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerE2ETests.swift
@@ -4,17 +4,15 @@ import XXClient
 
 final class MessengerE2ETests: XCTestCase {
   func testE2E() throws {
-    var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = { .unimplemented }
-    let e2e: MessengerE2E = .live(env)
+    let e2e: MessengerE2E = .live()
+
+    XCTAssertNil(e2e())
+
+    e2e.set(.unimplemented)
 
     XCTAssertNotNil(e2e())
-  }
 
-  func testE2EWhenNotSet() throws {
-    var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = { nil }
-    let e2e: MessengerE2E = .live(env)
+    e2e.set(nil)
 
     XCTAssertNil(e2e())
   }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsConnectedTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsConnectedTests.swift
index b361170cd70891cfeceefb47548c71d6be03ee91..c7c5de8bc78a79257ce08725a32524a5ce78da50 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsConnectedTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsConnectedTests.swift
@@ -4,7 +4,7 @@ import XCTest
 final class MessengerIsConnectedTests: XCTestCase {
   func testWithE2E() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = { .unimplemented }
+    env.e2e.get = { .unimplemented }
     let isConnected: MessengerIsConnected = .live(env)
 
     XCTAssertTrue(isConnected())
@@ -12,7 +12,7 @@ final class MessengerIsConnectedTests: XCTestCase {
 
   func testWithoutE2E() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = { nil }
+    env.e2e.get = { nil }
     let isConnected: MessengerIsConnected = .live(env)
 
     XCTAssertFalse(isConnected())
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoadedTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoadedTests.swift
index a88a1148a19130251d3cc203d6ff9c87ef51c6df..6f0591e264cbac1a12cf707b462b0be12d65aa74 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoadedTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoadedTests.swift
@@ -4,7 +4,7 @@ import XCTest
 final class MessengerIsLoadedTests: XCTestCase {
   func testWithCMix() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { .unimplemented }
+    env.cMix.get = { .unimplemented }
     let isLoaded: MessengerIsLoaded = .live(env)
 
     XCTAssertTrue(isLoaded())
@@ -12,7 +12,7 @@ final class MessengerIsLoadedTests: XCTestCase {
 
   func testWithoutCMix() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
+    env.cMix.get = { nil }
     let isLoaded: MessengerIsLoaded = .live(env)
 
     XCTAssertFalse(isLoaded())
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoggedInTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoggedInTests.swift
index 0bbd88671d00e8039c59c106369bb6f45adb01ab..c6ea87e64f2c300f9ab7090b8b56fc7e730ee765 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoggedInTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsLoggedInTests.swift
@@ -4,7 +4,7 @@ import XCTest
 final class MessengerIsLoggedInTests: XCTestCase {
   func testWithUD() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getUD = { .unimplemented }
+    env.ud.get = { .unimplemented }
     let isLoggedIn: MessengerIsLoggedIn = .live(env)
 
     XCTAssertTrue(isLoggedIn())
@@ -12,7 +12,7 @@ final class MessengerIsLoggedInTests: XCTestCase {
 
   func testWithoutUD() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getUD = { nil }
+    env.ud.get = { nil }
     let isLoggedIn: MessengerIsLoggedIn = .live(env)
 
     XCTAssertFalse(isLoggedIn())
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsRegisteredTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsRegisteredTests.swift
index b11bfbc65eb96fa8490eee6c290b723fe9717e58..b6dca3e9e4a09b5cc78b84b3d9a56ea12b032e3a 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsRegisteredTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerIsRegisteredTests.swift
@@ -7,7 +7,7 @@ final class MessengerIsRegisteredTests: XCTestCase {
     var didIsRegisteredWithUD: [Int] = []
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { 1234 }
       return e2e
@@ -24,7 +24,7 @@ final class MessengerIsRegisteredTests: XCTestCase {
 
   func testNotRegistered() throws {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { 1234 }
       return e2e
@@ -37,7 +37,7 @@ final class MessengerIsRegisteredTests: XCTestCase {
 
   func testWithoutE2E() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = { nil }
+    env.e2e.get = { nil }
     let isRegistered: MessengerIsRegistered = .live(env)
 
     XCTAssertThrowsError(try isRegistered()) { err in
@@ -53,7 +53,7 @@ final class MessengerIsRegisteredTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { 1234 }
       return e2e
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLoadTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLoadTests.swift
index eecdca1297c65ff338d81af7b40a3c481af13b5b..5eb90e3ae5379959c4891a5c0b36032827b8eae7 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLoadTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLoadTests.swift
@@ -18,7 +18,7 @@ final class MessengerLoadTests: XCTestCase {
     let cMixParams = "cmix-params".data(using: .utf8)!
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.setCMix = { didSetCMix.append($0) }
+    env.cMix.set = { didSetCMix.append($0) }
     env.storageDir = storageDir
     env.passwordStorage.load = { password }
     env.getCMixParams.run = { cMixParams }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLogInTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLogInTests.swift
index 3186d0acb3fa6ac5cd2820480c2a2dc49814428c..83dd2cd02fc79fcb5d460d244c025d05590a2233 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLogInTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerLogInTests.swift
@@ -16,12 +16,12 @@ final class MessengerLogInTests: XCTestCase {
     let udAddressFromNDF = "ndf-ud-address"
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { networkFollowerStatus }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { e2eId }
       e2e.getUdCertFromNdf.run = { udCertFromNDF }
@@ -29,7 +29,7 @@ final class MessengerLogInTests: XCTestCase {
       e2e.getUdAddressFromNdf.run = { udAddressFromNDF }
       return e2e
     }
-    env.ctx.setUD = { didSetUD.append($0) }
+    env.ud.set = { didSetUD.append($0) }
     env.udCert = nil
     env.udContact = nil
     env.udAddress = nil
@@ -67,17 +67,17 @@ final class MessengerLogInTests: XCTestCase {
     let altUdAddress = "alt-ud-address"
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .running }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { e2eId }
       return e2e
     }
-    env.ctx.setUD = { didSetUD.append($0) }
+    env.ud.set = { didSetUD.append($0) }
     env.udCert = altUdCert
     env.udContact = altUdContact
     env.udAddress = altUdAddress
@@ -101,7 +101,7 @@ final class MessengerLogInTests: XCTestCase {
 
   func testLoginWithoutCMix() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
+    env.cMix.get = { nil }
     let logIn: MessengerLogIn = .live(env)
 
     XCTAssertThrowsError(try logIn()) { error in
@@ -114,8 +114,8 @@ final class MessengerLogInTests: XCTestCase {
 
   func testLoginWithoutE2E() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { .unimplemented }
-    env.ctx.getE2E = { nil }
+    env.cMix.get = { .unimplemented }
+    env.e2e.get = { nil }
     let logIn: MessengerLogIn = .live(env)
 
     XCTAssertThrowsError(try logIn()) { error in
@@ -131,12 +131,12 @@ final class MessengerLogInTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .running }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { 1234 }
       e2e.getUdCertFromNdf.run = { "ndf-ud-cert".data(using: .utf8)! }
@@ -157,12 +157,12 @@ final class MessengerLogInTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .running }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { 1234 }
       return e2e
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerRegisterTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerRegisterTests.swift
index 82f2527bb2e4779910cb15726bc9b86dc4abe606..ef96b25197a388e7b258a341638e053cb63ff3ad 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerRegisterTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerRegisterTests.swift
@@ -18,7 +18,7 @@ final class MessengerRegisterTests: XCTestCase {
     let username = "new-user-name"
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { networkFollowerStatus }
       cMix.getReceptionRegistrationValidationSignature.run = {
@@ -26,7 +26,7 @@ final class MessengerRegisterTests: XCTestCase {
       }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { e2eId }
       e2e.getUdCertFromNdf.run = { udCertFromNDF }
@@ -34,7 +34,7 @@ final class MessengerRegisterTests: XCTestCase {
       e2e.getUdAddressFromNdf.run = { udAddressFromNDF }
       return e2e
     }
-    env.ctx.setUD = { didSetUD.append($0) }
+    env.ud.set = { didSetUD.append($0) }
     env.udCert = nil
     env.udContact = nil
     env.udAddress = nil
@@ -74,7 +74,7 @@ final class MessengerRegisterTests: XCTestCase {
     let username = "new-user-name"
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .running }
       cMix.getReceptionRegistrationValidationSignature.run = {
@@ -82,12 +82,12 @@ final class MessengerRegisterTests: XCTestCase {
       }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { e2eId }
       return e2e
     }
-    env.ctx.setUD = { didSetUD.append($0) }
+    env.ud.set = { didSetUD.append($0) }
     env.udCert = altUdCert
     env.udContact = altUdContact
     env.udAddress = altUdAddress
@@ -111,7 +111,7 @@ final class MessengerRegisterTests: XCTestCase {
 
   func testRegisterWithoutCMix() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
+    env.cMix.get = { nil }
     let register: MessengerRegister = .live(env)
 
     XCTAssertThrowsError(try register(username: "new-user-name")) { error in
@@ -124,8 +124,8 @@ final class MessengerRegisterTests: XCTestCase {
 
   func testRegisterWithoutE2E() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { .unimplemented }
-    env.ctx.getE2E = { nil }
+    env.cMix.get = { .unimplemented }
+    env.e2e.get = { nil }
     let register: MessengerRegister = .live(env)
 
     XCTAssertThrowsError(try register(username: "new-user-name")) { error in
@@ -141,7 +141,7 @@ final class MessengerRegisterTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .running }
       cMix.getReceptionRegistrationValidationSignature.run = {
@@ -149,7 +149,7 @@ final class MessengerRegisterTests: XCTestCase {
       }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { 1234 }
       e2e.getUdCertFromNdf.run = { "ndf-ud-cert".data(using: .utf8)! }
@@ -170,7 +170,7 @@ final class MessengerRegisterTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .running }
       cMix.getReceptionRegistrationValidationSignature.run = {
@@ -178,7 +178,7 @@ final class MessengerRegisterTests: XCTestCase {
       }
       return cMix
     }
-    env.ctx.getE2E = {
+    env.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.getId.run = { 1234 }
       return e2e
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerStartTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerStartTests.swift
index 1b0f11b48e14695867577c1bd095cb0dd504883b..7b3e33af570bd8a522d26091ef551be5fec7b674 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerStartTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerStartTests.swift
@@ -8,7 +8,7 @@ final class MessengerStartTests: XCTestCase {
     var didStartNetworkFollower: [Int] = []
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .stopped }
       cMix.startNetworkFollower.run = { timeoutMS in
@@ -25,7 +25,7 @@ final class MessengerStartTests: XCTestCase {
 
   func testStartWhenNotLoaded() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
+    env.cMix.get = { nil }
     let start: MessengerStart = .live(env)
 
     XCTAssertThrowsError(try start()) { error in
@@ -38,7 +38,7 @@ final class MessengerStartTests: XCTestCase {
 
   func testStartWhenRunning() throws {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .running }
       return cMix
@@ -53,7 +53,7 @@ final class MessengerStartTests: XCTestCase {
     let error = Error()
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.networkFollowerStatus.run = { .stopped }
       cMix.startNetworkFollower.run = { _ in throw error }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerUDTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerUDTests.swift
index 0166a8bb2f5b01fccef13fe9b68a1e2f78376cef..73f2092cefa27477baf6d591d0e56531e11df076 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerUDTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerUDTests.swift
@@ -4,18 +4,16 @@ import XXClient
 
 final class MessengerUDTests: XCTestCase {
   func testUD() throws {
-    var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = { .unimplemented }
-    let e2e: MessengerE2E = .live(env)
+    let ud: MessengerUD = .live()
 
-    XCTAssertNotNil(e2e())
-  }
+    XCTAssertNil(ud())
+
+    ud.set(.unimplemented)
+
+    XCTAssertNotNil(ud())
 
-  func testE2EWhenNotSet() throws {
-    var env: MessengerEnvironment = .unimplemented
-    env.ctx.getE2E = { nil }
-    let e2e: MessengerE2E = .live(env)
+    ud.set(nil)
 
-    XCTAssertNil(e2e())
+    XCTAssertNil(ud())
   }
 }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNetworkTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNetworkTests.swift
index 9e4892269f0ca9cb7819723548c35222c13d1699..1dbae73528c82a00c4270bf99c759356c7488171 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNetworkTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNetworkTests.swift
@@ -8,7 +8,7 @@ final class MessengerWaitForNetworkTests: XCTestCase {
     var didWaitForNetwork: [Int] = []
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.waitForNetwork.run = { timeoutMS in
         didWaitForNetwork.append(timeoutMS)
@@ -25,7 +25,7 @@ final class MessengerWaitForNetworkTests: XCTestCase {
 
   func testWaitWhenNotLoaded() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
+    env.cMix.get = { nil }
     let waitForNetwork: MessengerWaitForNetwork = .live(env)
 
     XCTAssertThrowsError(try waitForNetwork()) { error in
@@ -38,7 +38,7 @@ final class MessengerWaitForNetworkTests: XCTestCase {
 
   func testWaitTimeout() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.waitForNetwork.run = { _ in false }
       return cMix
diff --git a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNodesTests.swift b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNodesTests.swift
index ba1fd941bfdfc23e7c3e01d062f9895a4fb3564f..bc23afb53c604fd0b737bba5db544edfebdffe68 100644
--- a/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNodesTests.swift
+++ b/Tests/XXMessengerClientTests/Messenger/Functors/MessengerWaitForNodesTests.swift
@@ -6,7 +6,7 @@ import XXClient
 final class MessengerWaitForNodesTests: XCTestCase {
   func testWaitWhenNotLoaded() {
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = { nil }
+    env.cMix.get = { nil }
     let waitForNodes: MessengerWaitForNodes = .live(env)
 
     XCTAssertThrowsError(try waitForNodes()) { error in
@@ -21,7 +21,7 @@ final class MessengerWaitForNodesTests: XCTestCase {
     var didProgress: [NodeRegistrationReport] = []
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.getNodeRegistrationStatus.run = {
         NodeRegistrationReport(registered: 8, total: 10)
@@ -53,7 +53,7 @@ final class MessengerWaitForNodesTests: XCTestCase {
     ]
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.getNodeRegistrationStatus.run = { reports.removeFirst() }
       return cMix
@@ -88,7 +88,7 @@ final class MessengerWaitForNodesTests: XCTestCase {
     ]
 
     var env: MessengerEnvironment = .unimplemented
-    env.ctx.getCMix = {
+    env.cMix.get = {
       var cMix: CMix = .unimplemented
       cMix.getNodeRegistrationStatus.run = { reports.removeFirst() }
       return cMix