diff --git a/Examples/xx-messenger/Sources/NewGroupFeature/NewGroupComponent.swift b/Examples/xx-messenger/Sources/NewGroupFeature/NewGroupComponent.swift
index db9193d0aec29f430910f853c54b1535c867bd77..9bac4d04a12ee801603e584fb92edb2b57bdab08 100644
--- a/Examples/xx-messenger/Sources/NewGroupFeature/NewGroupComponent.swift
+++ b/Examples/xx-messenger/Sources/NewGroupFeature/NewGroupComponent.swift
@@ -1,20 +1,45 @@
+import AppCore
 import ComposableArchitecture
+import Foundation
+import XXModels
 
 public struct NewGroupComponent: ReducerProtocol {
   public struct State: Equatable {
-    public init() {}
+    public init(
+      contacts: IdentifiedArrayOf<XXModels.Contact> = []
+    ) {
+      self.contacts = contacts
+    }
+
+    public var contacts: IdentifiedArrayOf<XXModels.Contact>
   }
 
   public enum Action: Equatable {
     case start
+    case didFetchContacts([XXModels.Contact])
     case didFinish
   }
 
   public init() {}
 
+  @Dependency(\.app.dbManager.getDB) var db: DBManagerGetDB
+  @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 .start:
+      return Effect
+        .catching { try db() }
+        .flatMap { $0.fetchContactsPublisher(.init()) }
+        .assertNoFailure()
+        .map(Action.didFetchContacts)
+        .subscribe(on: bgQueue)
+        .receive(on: mainQueue)
+        .eraseToEffect()
+
+    case .didFetchContacts(let contacts):
+      state.contacts = IdentifiedArray(uniqueElements: contacts)
       return .none
 
     case .didFinish:
diff --git a/Examples/xx-messenger/Tests/NewGroupFeatureTests/NewGroupComponentTests.swift b/Examples/xx-messenger/Tests/NewGroupFeatureTests/NewGroupComponentTests.swift
index 2db124d74bc4a2de867a21974f8f0ee034f519da..04af1dca6d56f0f92c9f017399aacb81684052ff 100644
--- a/Examples/xx-messenger/Tests/NewGroupFeatureTests/NewGroupComponentTests.swift
+++ b/Examples/xx-messenger/Tests/NewGroupFeatureTests/NewGroupComponentTests.swift
@@ -1,16 +1,62 @@
+import Combine
 import ComposableArchitecture
+import CustomDump
 import XCTest
+import XXModels
 @testable import NewGroupFeature
 
 final class NewGroupComponentTests: XCTestCase {
+  enum Action: Equatable {
+    case didFetchContacts(XXModels.Contact.Query)
+  }
+
+  var actions: [Action]!
+
+  override func setUp() {
+    actions = []
+  }
+
+  override func tearDown() {
+    actions = nil
+  }
+
   func testStart() {
+    let contactsSubject = PassthroughSubject<[XXModels.Contact], Error>()
+
     let store = TestStore(
       initialState: NewGroupComponent.State(),
       reducer: NewGroupComponent()
     )
 
+    store.dependencies.app.mainQueue = .immediate
+    store.dependencies.app.bgQueue = .immediate
+    store.dependencies.app.dbManager.getDB.run = {
+      var db: Database = .unimplemented
+      db.fetchContactsPublisher.run = { query in
+        self.actions.append(.didFetchContacts(query))
+        return contactsSubject.eraseToAnyPublisher()
+      }
+      return db
+    }
+
     store.send(.start)
-    store.send(.didFinish)
+
+    XCTAssertNoDifference(actions, [
+      .didFetchContacts(.init())
+    ])
+
+    let contacts: [XXModels.Contact] = [
+      .init(id: "contact-1-id".data(using: .utf8)!),
+      .init(id: "contact-2-id".data(using: .utf8)!),
+      .init(id: "contact-3-id".data(using: .utf8)!),
+    ]
+    contactsSubject.send(contacts)
+
+    store.receive(.didFetchContacts(contacts)) {
+      $0.contacts = IdentifiedArray(uniqueElements: contacts)
+    }
+
+    contactsSubject.send(completion: .finished)
   }
 
   func testFinish() {