diff --git a/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthComponent.swift b/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthComponent.swift
new file mode 100644
index 0000000000000000000000000000000000000000..629c150dc271792e1b1b88bc9733a364955a8985
--- /dev/null
+++ b/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthComponent.swift
@@ -0,0 +1,71 @@
+import ComposableArchitecture
+import Foundation
+import XCTestDynamicOverlay
+import XXClient
+import XXMessengerClient
+
+public struct ResetAuthComponent: ReducerProtocol {
+  public struct State: Equatable {
+    public init(
+      partner: Contact,
+      isResetting: Bool = false,
+      failure: String? = nil,
+      didReset: Bool = false
+    ) {
+      self.partner = partner
+      self.isResetting = isResetting
+      self.failure = failure
+      self.didReset = didReset
+    }
+
+    public var partner: Contact
+    public var isResetting: Bool
+    public var failure: String?
+    public var didReset: Bool
+  }
+
+  public enum Action: Equatable {
+    case resetTapped
+    case didReset
+    case didFail(String)
+  }
+
+  public init() {}
+
+  @Dependency(\.app.messenger) var messenger: Messenger
+  @Dependency(\.app.mainQueue) var mainQueue: AnySchedulerOf<DispatchQueue>
+  @Dependency(\.app.bgQueue) var bgQueue: AnySchedulerOf<DispatchQueue>
+
+  public func reduce(into state: inout State, action: Action) -> EffectTask<Action> {
+    switch action {
+    case .resetTapped:
+      state.isResetting = true
+      state.didReset = false
+      state.failure = nil
+      return Effect.result { [state] in
+        do {
+          let e2e = try messenger.e2e.tryGet()
+          _ = try e2e.resetAuthenticatedChannel(partner: state.partner)
+          return .success(.didReset)
+        } catch {
+          return .success(.didFail(error.localizedDescription))
+        }
+      }
+      .subscribe(on: bgQueue)
+      .receive(on: mainQueue)
+      .eraseToEffect()
+
+    case .didReset:
+      state.isResetting = false
+      state.didReset = true
+      state.failure = nil
+      return .none
+
+    case .didFail(let failure):
+      state.isResetting = false
+      state.didReset = false
+      state.failure = failure
+      return .none
+    }
+  }
+}
diff --git a/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthFeature.swift b/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthFeature.swift
deleted file mode 100644
index d4acb74002902f9b9a82da2981f78cd3312deb9e..0000000000000000000000000000000000000000
--- a/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthFeature.swift
+++ /dev/null
@@ -1,90 +0,0 @@
-import ComposableArchitecture
-import Foundation
-import XCTestDynamicOverlay
-import XXClient
-import XXMessengerClient
-
-public struct ResetAuthState: Equatable {
-  public init(
-    partner: Contact,
-    isResetting: Bool = false,
-    failure: String? = nil,
-    didReset: Bool = false
-  ) {
-    self.partner = partner
-    self.isResetting = isResetting
-    self.failure = failure
-    self.didReset = didReset
-  }
-
-  public var partner: Contact
-  public var isResetting: Bool
-  public var failure: String?
-  public var didReset: Bool
-}
-
-public enum ResetAuthAction: Equatable {
-  case resetTapped
-  case didReset
-  case didFail(String)
-}
-
-public struct ResetAuthEnvironment {
-  public init(
-    messenger: Messenger,
-    mainQueue: AnySchedulerOf<DispatchQueue>,
-    bgQueue: AnySchedulerOf<DispatchQueue>
-  ) {
-    self.messenger = messenger
-    self.mainQueue = mainQueue
-    self.bgQueue = bgQueue
-  }
-
-  public var messenger: Messenger
-  public var mainQueue: AnySchedulerOf<DispatchQueue>
-  public var bgQueue: AnySchedulerOf<DispatchQueue>
-}
-
-#if DEBUG
-extension ResetAuthEnvironment {
-  public static let unimplemented = ResetAuthEnvironment(
-    messenger: .unimplemented,
-    mainQueue: .unimplemented,
-    bgQueue: .unimplemented
-  )
-}
-#endif
-
-public let resetAuthReducer = Reducer<ResetAuthState, ResetAuthAction, ResetAuthEnvironment>
-{ state, action, env in
-  switch action {
-  case .resetTapped:
-    state.isResetting = true
-    state.didReset = false
-    state.failure = nil
-    return Effect.result { [state] in
-      do {
-        let e2e = try env.messenger.e2e.tryGet()
-        _ = try e2e.resetAuthenticatedChannel(partner: state.partner)
-        return .success(.didReset)
-      } catch {
-        return .success(.didFail(error.localizedDescription))
-      }
-    }
-    .subscribe(on: env.bgQueue)
-    .receive(on: env.mainQueue)
-    .eraseToEffect()
-
-  case .didReset:
-    state.isResetting = false
-    state.didReset = true
-    state.failure = nil
-    return .none
-
-  case .didFail(let failure):
-    state.isResetting = false
-    state.didReset = false
-    state.failure = failure
-    return .none
-  }
-}
diff --git a/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthView.swift b/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthView.swift
index 7b384efb74d841b4edf04a61cf55aa02a7c0d725..cc15b34a75c475c41c5cedacf0bd11181877791d 100644
--- a/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthView.swift
+++ b/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthView.swift
@@ -3,14 +3,14 @@ import ComposableArchitecture
 import SwiftUI
 
 public struct ResetAuthView: View {
-  public init(store: Store<ResetAuthState, ResetAuthAction>) {
+  public init(store: StoreOf<ResetAuthComponent>) {
     self.store = store
   }
 
-  let store: Store<ResetAuthState, ResetAuthAction>
+  let store: StoreOf<ResetAuthComponent>
 
   struct ViewState: Equatable {
-    init(state: ResetAuthState) {
+    init(state: ResetAuthComponent.State) {
       contactID = try? state.partner.getId()
       isResetting = state.isResetting
       failure = state.failure
@@ -68,11 +68,10 @@ public struct ResetAuthView_Previews: PreviewProvider {
   public static var previews: some View {
     NavigationView {
       ResetAuthView(store: Store(
-        initialState: ResetAuthState(
+        initialState: ResetAuthComponent.State(
           partner: .unimplemented(Data())
         ),
-        reducer: .empty,
-        environment: ()
+        reducer: EmptyReducer()
       ))
     }
   }
diff --git a/Examples/xx-messenger/Tests/ResetAuthFeatureTests/ResetAuthFeatureTests.swift b/Examples/xx-messenger/Tests/ResetAuthFeatureTests/ResetAuthComponentTests.swift
similarity index 71%
rename from Examples/xx-messenger/Tests/ResetAuthFeatureTests/ResetAuthFeatureTests.swift
rename to Examples/xx-messenger/Tests/ResetAuthFeatureTests/ResetAuthComponentTests.swift
index 46b5dc9e402d5c2cb71a796790b205732876a658..03ec62686846d64a50ede08c39bc25255cc64558 100644
--- a/Examples/xx-messenger/Tests/ResetAuthFeatureTests/ResetAuthFeatureTests.swift
+++ b/Examples/xx-messenger/Tests/ResetAuthFeatureTests/ResetAuthComponentTests.swift
@@ -4,7 +4,7 @@ import XCTest
 import XXClient
 @testable import ResetAuthFeature
 
-final class ResetAuthFeatureTests: XCTestCase {
+final class ResetAuthComponentTests: XCTestCase {
   func testReset() {
     let partnerData = "contact-data".data(using: .utf8)!
     let partner = Contact.unimplemented(partnerData)
@@ -12,15 +12,14 @@ final class ResetAuthFeatureTests: XCTestCase {
     var didResetAuthChannel: [Contact] = []
 
     let store = TestStore(
-      initialState: ResetAuthState(
+      initialState: ResetAuthComponent.State(
         partner: partner
       ),
-      reducer: resetAuthReducer,
-      environment: .unimplemented
+      reducer: ResetAuthComponent()
     )
-    store.environment.mainQueue = .immediate
-    store.environment.bgQueue = .immediate
-    store.environment.messenger.e2e.get = {
+    store.dependencies.app.mainQueue = .immediate
+    store.dependencies.app.bgQueue = .immediate
+    store.dependencies.app.messenger.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.resetAuthenticatedChannel.run = { contact in
         didResetAuthChannel.append(contact)
@@ -46,15 +45,14 @@ final class ResetAuthFeatureTests: XCTestCase {
     let failure = Failure()
 
     let store = TestStore(
-      initialState: ResetAuthState(
+      initialState: ResetAuthComponent.State(
         partner: .unimplemented(Data())
       ),
-      reducer: resetAuthReducer,
-      environment: .unimplemented
+      reducer: ResetAuthComponent()
     )
-    store.environment.mainQueue = .immediate
-    store.environment.bgQueue = .immediate
-    store.environment.messenger.e2e.get = {
+    store.dependencies.app.mainQueue = .immediate
+    store.dependencies.app.bgQueue = .immediate
+    store.dependencies.app.messenger.e2e.get = {
       var e2e: E2E = .unimplemented
       e2e.resetAuthenticatedChannel.run = { _ in throw failure }
       return e2e