diff --git a/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift b/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift
index 818807c8229fed9d17ccd90c94711046dc651d37..c08ed6b75635f299af58763af63e5c5627635b0e 100644
--- a/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift
+++ b/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift
@@ -18,12 +18,14 @@ public struct MyContactState: Equatable {
     focusedField: Field? = nil,
     email: String = "",
     phone: String = "",
+    isLoadingFacts: Bool = false,
     alert: AlertState<MyContactAction>? = nil
   ) {
     self.contact = contact
     self.focusedField = focusedField
     self.email = email
     self.phone = phone
+    self.isLoadingFacts = isLoadingFacts
     self.alert = alert
   }
 
@@ -31,6 +33,7 @@ public struct MyContactState: Equatable {
   @BindableState public var focusedField: Field?
   @BindableState public var email: String
   @BindableState public var phone: String
+  @BindableState public var isLoadingFacts: Bool
   public var alert: AlertState<MyContactAction>?
 }
 
@@ -112,6 +115,7 @@ public let myContactReducer = Reducer<MyContactState, MyContactAction, MyContact
     return .none
 
   case .loadFactsTapped:
+    state.isLoadingFacts = true
     return Effect.run { subscriber in
       do {
         let contactId = try env.messenger.e2e.tryGet().getContact().getId()
@@ -124,6 +128,7 @@ public let myContactReducer = Reducer<MyContactState, MyContactAction, MyContact
       } catch {
         subscriber.send(.didFail(error.localizedDescription))
       }
+      subscriber.send(.set(\.$isLoadingFacts, false))
       subscriber.send(completion: .finished)
       return AnyCancellable {}
     }
diff --git a/Examples/xx-messenger/Sources/MyContactFeature/MyContactView.swift b/Examples/xx-messenger/Sources/MyContactFeature/MyContactView.swift
index 6e2cbc8fc9f3d9ed5edca7ab057c633a19e1fa48..7eb8e7aaddbc5716dcb064eb33b62cbfe1ddb7bf 100644
--- a/Examples/xx-messenger/Sources/MyContactFeature/MyContactView.swift
+++ b/Examples/xx-messenger/Sources/MyContactFeature/MyContactView.swift
@@ -16,12 +16,14 @@ public struct MyContactView: View {
       focusedField = state.focusedField
       email = state.email
       phone = state.phone
+      isLoadingFacts = state.isLoadingFacts
     }
 
     var contact: XXModels.Contact?
     var focusedField: MyContactState.Field?
     var email: String
     var phone: String
+    var isLoadingFacts: Bool
   }
 
   public var body: some View {
@@ -105,8 +107,15 @@ public struct MyContactView: View {
           Button {
             viewStore.send(.loadFactsTapped)
           } label: {
-            Text("Load facts from client")
+            HStack {
+              Text("Reload facts")
+              Spacer()
+              if viewStore.isLoadingFacts {
+                ProgressView()
+              }
+            }
           }
+          .disabled(viewStore.isLoadingFacts)
         } header: {
           Text("Actions")
         }
diff --git a/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift b/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift
index 62e7fcd9959e5583e55bce9c5a2a6cb413999c32..4193e935c8724d101629c5c72c1fb3088225f332 100644
--- a/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift
+++ b/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift
@@ -159,13 +159,19 @@ final class MyContactFeatureTests: XCTestCase {
       return db
     }
 
-    store.send(.loadFactsTapped)
+    store.send(.loadFactsTapped) {
+      $0.isLoadingFacts = true
+    }
 
     XCTAssertNoDifference(didFetchContacts, [.init(id: [contactId])])
     var expectedSavedContact = dbContact
     expectedSavedContact.email = email
     expectedSavedContact.phone = phone
     XCTAssertNoDifference(didSaveContact, [expectedSavedContact])
+
+    store.receive(.set(\.$isLoadingFacts, false)) {
+      $0.isLoadingFacts = false
+    }
   }
 
   func testErrorAlert() {