diff --git a/Examples/Package.swift b/Examples/Package.swift
new file mode 100644
index 0000000000000000000000000000000000000000..d0a31fe81dd861a3d33bf4eaeb4f59fb7c9f4947
--- /dev/null
+++ b/Examples/Package.swift
@@ -0,0 +1,4 @@
+// swift-tools-version:5.6
+// This file makes Xcode doesn't display this directory inside swift package.
+import PackageDescription
+let package = Package(name: "", products: [], targets: [])
diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/AppCore.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/AppCore.xcscheme
new file mode 100644
index 0000000000000000000000000000000000000000..2bd4e0801d9c8785542e12f5dedb6e8e66fa27aa
--- /dev/null
+++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/AppCore.xcscheme
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1340"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AppCore"
+               BuildableName = "AppCore"
+               BlueprintName = "AppCore"
+               ReferencedContainer = "container:">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      codeCoverageEnabled = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AppCoreTests"
+               BuildableName = "AppCoreTests"
+               BlueprintName = "AppCoreTests"
+               ReferencedContainer = "container:">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "AppCore"
+            BuildableName = "AppCore"
+            BlueprintName = "AppCore"
+            ReferencedContainer = "container:">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/AppFeature.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/AppFeature.xcscheme
new file mode 100644
index 0000000000000000000000000000000000000000..076cfa82379a4f3c57008017aa6f356892754cc9
--- /dev/null
+++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/AppFeature.xcscheme
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1340"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AppFeature"
+               BuildableName = "AppFeature"
+               BlueprintName = "AppFeature"
+               ReferencedContainer = "container:">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      codeCoverageEnabled = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AppFeatureTests"
+               BuildableName = "AppFeatureTests"
+               BlueprintName = "AppFeatureTests"
+               ReferencedContainer = "container:">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "AppFeature"
+            BuildableName = "AppFeature"
+            BlueprintName = "AppFeature"
+            ReferencedContainer = "container:">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/HomeFeature.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/HomeFeature.xcscheme
new file mode 100644
index 0000000000000000000000000000000000000000..44bed4e71971f74ec4d316580602b1e965d0a3a4
--- /dev/null
+++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/HomeFeature.xcscheme
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1340"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "HomeFeature"
+               BuildableName = "HomeFeature"
+               BlueprintName = "HomeFeature"
+               ReferencedContainer = "container:">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      codeCoverageEnabled = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "HomeFeatureTests"
+               BuildableName = "HomeFeatureTests"
+               BlueprintName = "HomeFeatureTests"
+               ReferencedContainer = "container:">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "HomeFeature"
+            BuildableName = "HomeFeature"
+            BlueprintName = "HomeFeature"
+            ReferencedContainer = "container:">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/LaunchFeature.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/LaunchFeature.xcscheme
new file mode 100644
index 0000000000000000000000000000000000000000..0b5b716cb194f784d36c6cfe45d705107c4e6549
--- /dev/null
+++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/LaunchFeature.xcscheme
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1340"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "LaunchFeature"
+               BuildableName = "LaunchFeature"
+               BlueprintName = "LaunchFeature"
+               ReferencedContainer = "container:">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      codeCoverageEnabled = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "LaunchFeatureTests"
+               BuildableName = "LaunchFeatureTests"
+               BlueprintName = "LaunchFeatureTests"
+               ReferencedContainer = "container:">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "LaunchFeature"
+            BuildableName = "LaunchFeature"
+            BlueprintName = "LaunchFeature"
+            ReferencedContainer = "container:">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/RegisterFeature.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/RegisterFeature.xcscheme
new file mode 100644
index 0000000000000000000000000000000000000000..69611b8706471b3f246fe1747b7bb63953c22ab4
--- /dev/null
+++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/RegisterFeature.xcscheme
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1340"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "RegisterFeature"
+               BuildableName = "RegisterFeature"
+               BlueprintName = "RegisterFeature"
+               ReferencedContainer = "container:">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      codeCoverageEnabled = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "RegisterFeatureTests"
+               BuildableName = "RegisterFeatureTests"
+               BlueprintName = "RegisterFeatureTests"
+               ReferencedContainer = "container:">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "RegisterFeature"
+            BuildableName = "RegisterFeature"
+            BlueprintName = "RegisterFeature"
+            ReferencedContainer = "container:">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/RestoreFeature.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/RestoreFeature.xcscheme
new file mode 100644
index 0000000000000000000000000000000000000000..47afca01630455cc3749e2016b21a0b879e0b5e3
--- /dev/null
+++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/RestoreFeature.xcscheme
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1340"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "RestoreFeature"
+               BuildableName = "RestoreFeature"
+               BlueprintName = "RestoreFeature"
+               ReferencedContainer = "container:">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      codeCoverageEnabled = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "RestoreFeatureTests"
+               BuildableName = "RestoreFeatureTests"
+               BlueprintName = "RestoreFeatureTests"
+               ReferencedContainer = "container:">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "RestoreFeature"
+            BuildableName = "RestoreFeature"
+            BlueprintName = "RestoreFeature"
+            ReferencedContainer = "container:">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/WelcomeFeature.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/WelcomeFeature.xcscheme
new file mode 100644
index 0000000000000000000000000000000000000000..60bd803bf3175a785b693461f4154e8b89467a2a
--- /dev/null
+++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/WelcomeFeature.xcscheme
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1340"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "WelcomeFeature"
+               BuildableName = "WelcomeFeature"
+               BlueprintName = "WelcomeFeature"
+               ReferencedContainer = "container:">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      codeCoverageEnabled = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "WelcomeFeatureTests"
+               BuildableName = "WelcomeFeatureTests"
+               BlueprintName = "WelcomeFeatureTests"
+               ReferencedContainer = "container:">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "WelcomeFeature"
+            BuildableName = "WelcomeFeature"
+            BlueprintName = "WelcomeFeature"
+            ReferencedContainer = "container:">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/Examples/xx-messenger/LICENSE b/Examples/xx-messenger/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..8551215fa5b651bb93a247cde5ab89d4b8f5f7e6
--- /dev/null
+++ b/Examples/xx-messenger/LICENSE
@@ -0,0 +1,21 @@
+Copyright (c) 2022, xx network SEZC
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this 
+list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice, 
+this list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift
new file mode 100644
index 0000000000000000000000000000000000000000..5eb7bede849b86baf218f969361cf911bd4a5907
--- /dev/null
+++ b/Examples/xx-messenger/Package.swift
@@ -0,0 +1,171 @@
+// swift-tools-version: 5.6
+import PackageDescription
+
+let swiftSettings: [SwiftSetting] = [
+  .unsafeFlags(
+    [
+      // "-Xfrontend", "-warn-concurrency",
+      "-Xfrontend", "-debug-time-function-bodies",
+      "-Xfrontend", "-debug-time-expression-type-checking",
+    ],
+    .when(configuration: .debug)
+  ),
+]
+
+let package = Package(
+  name: "xx-messenger",
+  platforms: [
+    .iOS(.v15),
+  ],
+  products: [
+    .library(name: "AppCore", targets: ["AppCore"]),
+    .library(name: "AppFeature", targets: ["AppFeature"]),
+    .library(name: "HomeFeature", targets: ["HomeFeature"]),
+    .library(name: "LaunchFeature", targets: ["LaunchFeature"]),
+    .library(name: "RegisterFeature", targets: ["RegisterFeature"]),
+    .library(name: "RestoreFeature", targets: ["RestoreFeature"]),
+    .library(name: "WelcomeFeature", targets: ["WelcomeFeature"]),
+  ],
+  dependencies: [
+    .package(
+      path: "../../"
+    ),
+    .package(
+      url: "https://github.com/pointfreeco/swift-composable-architecture.git",
+      .upToNextMajor(from: "0.39.0")
+    ),
+    .package(
+      url: "https://git.xx.network/elixxir/client-ios-db.git",
+      .upToNextMajor(from: "1.1.0")
+    ),
+    .package(
+      url: "https://github.com/darrarski/swift-composable-presentation.git",
+      .upToNextMajor(from: "0.5.2")
+    ),
+    .package(
+      url: "https://github.com/pointfreeco/xctest-dynamic-overlay.git",
+      .upToNextMajor(from: "0.4.0")
+    ),
+  ],
+  targets: [
+    .target(
+      name: "AppCore",
+      dependencies: [
+        .product(name: "XCTestDynamicOverlay", package: "xctest-dynamic-overlay"),
+        .product(name: "XXDatabase", package: "client-ios-db"),
+        .product(name: "XXModels", package: "client-ios-db"),
+      ],
+      swiftSettings: swiftSettings
+    ),
+    .testTarget(
+      name: "AppCoreTests",
+      dependencies: [
+        .target(name: "AppCore")
+      ],
+      swiftSettings: swiftSettings
+    ),
+    .target(
+      name: "AppFeature",
+      dependencies: [
+        .target(name: "AppCore"),
+        .target(name: "HomeFeature"),
+        .target(name: "LaunchFeature"),
+        .target(name: "RegisterFeature"),
+        .target(name: "RestoreFeature"),
+        .target(name: "WelcomeFeature"),
+        .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
+        .product(name: "ComposablePresentation", package: "swift-composable-presentation"),
+        .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"),
+        .product(name: "XXModels", package: "client-ios-db"),
+      ],
+      swiftSettings: swiftSettings
+    ),
+    .testTarget(
+      name: "AppFeatureTests",
+      dependencies: [
+        .target(name: "AppFeature"),
+      ],
+      swiftSettings: swiftSettings
+    ),
+    .target(
+      name: "HomeFeature",
+      dependencies: [
+        .target(name: "AppCore"),
+        .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
+        .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"),
+      ],
+      swiftSettings: swiftSettings
+    ),
+    .testTarget(
+      name: "HomeFeatureTests",
+      dependencies: [
+        .target(name: "HomeFeature"),
+      ],
+      swiftSettings: swiftSettings
+    ),
+    .target(
+      name: "LaunchFeature",
+      dependencies: [
+        .target(name: "AppCore"),
+        .target(name: "RegisterFeature"),
+        .target(name: "RestoreFeature"),
+        .target(name: "WelcomeFeature"),
+        .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
+        .product(name: "ComposablePresentation", package: "swift-composable-presentation"),
+        .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"),
+      ],
+      swiftSettings: swiftSettings
+    ),
+    .testTarget(
+      name: "LaunchFeatureTests",
+      dependencies: [
+        .target(name: "LaunchFeature"),
+      ],
+      swiftSettings: swiftSettings
+    ),
+    .target(
+      name: "RegisterFeature",
+      dependencies: [
+        .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
+        .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"),
+      ],
+      swiftSettings: swiftSettings
+    ),
+    .testTarget(
+      name: "RegisterFeatureTests",
+      dependencies: [
+        .target(name: "RegisterFeature"),
+      ],
+      swiftSettings: swiftSettings
+    ),
+    .target(
+      name: "RestoreFeature",
+      dependencies: [
+        .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
+      ],
+      swiftSettings: swiftSettings
+    ),
+    .testTarget(
+      name: "RestoreFeatureTests",
+      dependencies: [
+        .target(name: "RestoreFeature"),
+      ],
+      swiftSettings: swiftSettings
+    ),
+    .target(
+      name: "WelcomeFeature",
+      dependencies: [
+        .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
+        .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"),
+      ],
+      swiftSettings: swiftSettings
+    ),
+    .testTarget(
+      name: "WelcomeFeatureTests",
+      dependencies: [
+        .target(name: "WelcomeFeature"),
+      ],
+      swiftSettings: swiftSettings
+    ),
+  ]
+)
diff --git a/Examples/xx-messenger/Project/Package.swift b/Examples/xx-messenger/Project/Package.swift
new file mode 100644
index 0000000000000000000000000000000000000000..d0a31fe81dd861a3d33bf4eaeb4f59fb7c9f4947
--- /dev/null
+++ b/Examples/xx-messenger/Project/Package.swift
@@ -0,0 +1,4 @@
+// swift-tools-version:5.6
+// This file makes Xcode doesn't display this directory inside swift package.
+import PackageDescription
+let package = Package(name: "", products: [], targets: [])
diff --git a/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.pbxproj b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000000000000000000000000000000000..48ab32e161ebe4a729ed9473c83f522eb376a019
--- /dev/null
+++ b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.pbxproj
@@ -0,0 +1,338 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 55;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		313CFFFA28B632E40050B10D /* AppFeature in Frameworks */ = {isa = PBXBuildFile; productRef = 313CFFF928B632E40050B10D /* AppFeature */; };
+		31964B9228A6D37200BBDC17 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 31964B9128A6D37200BBDC17 /* Assets.xcassets */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+		31964B8A28A6D37100BBDC17 /* XXMessenger.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XXMessenger.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		31964B9128A6D37200BBDC17 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		31964B8728A6D37100BBDC17 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				313CFFFA28B632E40050B10D /* AppFeature in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		31964B8128A6D37100BBDC17 = {
+			isa = PBXGroup;
+			children = (
+				31964B8C28A6D37100BBDC17 /* XXMessenger */,
+				31964B8B28A6D37100BBDC17 /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		31964B8B28A6D37100BBDC17 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				31964B8A28A6D37100BBDC17 /* XXMessenger.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		31964B8C28A6D37100BBDC17 /* XXMessenger */ = {
+			isa = PBXGroup;
+			children = (
+				31964B9128A6D37200BBDC17 /* Assets.xcassets */,
+			);
+			path = XXMessenger;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		31964B8928A6D37100BBDC17 /* XXMessenger */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 31964B9828A6D37200BBDC17 /* Build configuration list for PBXNativeTarget "XXMessenger" */;
+			buildPhases = (
+				31964B8628A6D37100BBDC17 /* Sources */,
+				31964B8728A6D37100BBDC17 /* Frameworks */,
+				31964B8828A6D37100BBDC17 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = XXMessenger;
+			packageProductDependencies = (
+				313CFFF928B632E40050B10D /* AppFeature */,
+			);
+			productName = XXMessenger;
+			productReference = 31964B8A28A6D37100BBDC17 /* XXMessenger.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		31964B8228A6D37100BBDC17 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				BuildIndependentTargetsInParallel = 1;
+				LastSwiftUpdateCheck = 1340;
+				LastUpgradeCheck = 1340;
+				TargetAttributes = {
+					31964B8928A6D37100BBDC17 = {
+						CreatedOnToolsVersion = 13.4.1;
+					};
+				};
+			};
+			buildConfigurationList = 31964B8528A6D37100BBDC17 /* Build configuration list for PBXProject "XXMessenger" */;
+			compatibilityVersion = "Xcode 13.0";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = 31964B8128A6D37100BBDC17;
+			productRefGroup = 31964B8B28A6D37100BBDC17 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				31964B8928A6D37100BBDC17 /* XXMessenger */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		31964B8828A6D37100BBDC17 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				31964B9228A6D37200BBDC17 /* Assets.xcassets in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		31964B8628A6D37100BBDC17 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+		31964B9628A6D37200BBDC17 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				CURRENT_PROJECT_VERSION = 0;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 15.5;
+				MARKETING_VERSION = 1.0.0;
+				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+				MTL_FAST_MATH = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+				VERSIONING_SYSTEM = "apple-generic";
+			};
+			name = Debug;
+		};
+		31964B9728A6D37200BBDC17 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				CURRENT_PROJECT_VERSION = 0;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 15.5;
+				MARKETING_VERSION = 1.0.0;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				MTL_FAST_MATH = YES;
+				SDKROOT = iphoneos;
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
+				VALIDATE_PRODUCT = YES;
+				VERSIONING_SYSTEM = "apple-generic";
+			};
+			name = Release;
+		};
+		31964B9928A6D37200BBDC17 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = P38XW29864;
+				ENABLE_PREVIEWS = YES;
+				GENERATE_INFOPLIST_FILE = YES;
+				INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
+				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+				INFOPLIST_KEY_UILaunchScreen_Generation = YES;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = pl.darrarski.XXMessenger;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_EMIT_LOC_STRINGS = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = 1;
+			};
+			name = Debug;
+		};
+		31964B9A28A6D37200BBDC17 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = P38XW29864;
+				ENABLE_PREVIEWS = YES;
+				GENERATE_INFOPLIST_FILE = YES;
+				INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
+				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+				INFOPLIST_KEY_UILaunchScreen_Generation = YES;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = pl.darrarski.XXMessenger;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_EMIT_LOC_STRINGS = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = 1;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		31964B8528A6D37100BBDC17 /* Build configuration list for PBXProject "XXMessenger" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				31964B9628A6D37200BBDC17 /* Debug */,
+				31964B9728A6D37200BBDC17 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		31964B9828A6D37200BBDC17 /* Build configuration list for PBXNativeTarget "XXMessenger" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				31964B9928A6D37200BBDC17 /* Debug */,
+				31964B9A28A6D37200BBDC17 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+
+/* Begin XCSwiftPackageProductDependency section */
+		313CFFF928B632E40050B10D /* AppFeature */ = {
+			isa = XCSwiftPackageProductDependency;
+			productName = AppFeature;
+		};
+/* End XCSwiftPackageProductDependency section */
+	};
+	rootObject = 31964B8228A6D37100BBDC17 /* Project object */;
+}
diff --git a/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000000000000000000000000000000000000..919434a6254f0e9651f402737811be6634a03e9c
--- /dev/null
+++ b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:">
+   </FileRef>
+</Workspace>
diff --git a/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000000000000000000000000000000000000..18d981003d68d0546c4804ac2ff47dd97c6e7921
--- /dev/null
+++ b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git a/Examples/xx-messenger/Project/XXMessenger.xcodeproj/xcshareddata/xcschemes/XXMessenger.xcscheme b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/xcshareddata/xcschemes/XXMessenger.xcscheme
new file mode 100644
index 0000000000000000000000000000000000000000..9e83a72f3d20c49c9a5fec35e35ca64500fe5ebe
--- /dev/null
+++ b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/xcshareddata/xcschemes/XXMessenger.xcscheme
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1340"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "31964B8928A6D37100BBDC17"
+               BuildableName = "XXMessenger.app"
+               BlueprintName = "XXMessenger"
+               ReferencedContainer = "container:XXMessenger.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      codeCoverageEnabled = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AppCoreTests"
+               BuildableName = "AppCoreTests"
+               BlueprintName = "AppCoreTests"
+               ReferencedContainer = "container:..">
+            </BuildableReference>
+         </TestableReference>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AppFeatureTests"
+               BuildableName = "AppFeatureTests"
+               BlueprintName = "AppFeatureTests"
+               ReferencedContainer = "container:..">
+            </BuildableReference>
+         </TestableReference>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "HomeFeatureTests"
+               BuildableName = "HomeFeatureTests"
+               BlueprintName = "HomeFeatureTests"
+               ReferencedContainer = "container:..">
+            </BuildableReference>
+         </TestableReference>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "LaunchFeatureTests"
+               BuildableName = "LaunchFeatureTests"
+               BlueprintName = "LaunchFeatureTests"
+               ReferencedContainer = "container:..">
+            </BuildableReference>
+         </TestableReference>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "RegisterFeatureTests"
+               BuildableName = "RegisterFeatureTests"
+               BlueprintName = "RegisterFeatureTests"
+               ReferencedContainer = "container:..">
+            </BuildableReference>
+         </TestableReference>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "RestoreFeatureTests"
+               BuildableName = "RestoreFeatureTests"
+               BlueprintName = "RestoreFeatureTests"
+               ReferencedContainer = "container:..">
+            </BuildableReference>
+         </TestableReference>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "WelcomeFeatureTests"
+               BuildableName = "WelcomeFeatureTests"
+               BlueprintName = "WelcomeFeatureTests"
+               ReferencedContainer = "container:..">
+            </BuildableReference>
+         </TestableReference>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "31964B8928A6D37100BBDC17"
+            BuildableName = "XXMessenger.app"
+            BlueprintName = "XXMessenger"
+            ReferencedContainer = "container:XXMessenger.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "31964B8928A6D37100BBDC17"
+            BuildableName = "XXMessenger.app"
+            BlueprintName = "XXMessenger"
+            ReferencedContainer = "container:XXMessenger.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AccentColor.colorset/Contents.json b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000000000000000000000000000000000000..eb8789700816459c1e1480e0b34781d9fb78a1ca
--- /dev/null
+++ b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+  "colors" : [
+    {
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000000000000000000000000000000000000..84c0167b1a1045edaaee154e355e3d9362bb03c2
--- /dev/null
+++ b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,116 @@
+{
+  "images" : [
+    {
+      "filename" : "iPhone Notification 20pt 2x.png",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "20x20"
+    },
+    {
+      "filename" : "iPhone Notification 20pt 3x.png",
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "20x20"
+    },
+    {
+      "filename" : "iPhone Settings 29pt 2x.png",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "iPhone Settings 29pt 3x.png",
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "iPhone Spotlight 40pt 2x.png",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "40x40"
+    },
+    {
+      "filename" : "iPhone Spotlight 40pt 3x.png",
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "40x40"
+    },
+    {
+      "filename" : "iPhone App 60pt 2x.png",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "60x60"
+    },
+    {
+      "filename" : "iPhone App 60pt 3x.png",
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "60x60"
+    },
+    {
+      "filename" : "iPad Notification 20pt 1x.png",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "20x20"
+    },
+    {
+      "filename" : "iPad Notification 20pt 2x.png",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "20x20"
+    },
+    {
+      "filename" : "iPad Settings 29pt 1x.png",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "iPad Settings 29pt 2x.png",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "iPad Spotlight 40pt 1x.png",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "40x40"
+    },
+    {
+      "filename" : "iPad Spotlight 40pt 2x.png",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "40x40"
+    },
+    {
+      "filename" : "iPad App 76pt 1x.png",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "76x76"
+    },
+    {
+      "filename" : "iPad App 76pt 2x.png",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "76x76"
+    },
+    {
+      "filename" : "iPad Pro (12.9-inch) App 83.5pt 2x.png",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "83.5x83.5"
+    },
+    {
+      "filename" : "iOS App Store 1024pt 1x.png",
+      "idiom" : "ios-marketing",
+      "scale" : "1x",
+      "size" : "1024x1024"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iOS App Store 1024pt 1x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iOS App Store 1024pt 1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..f74bafba9a74e2c0f9a075ef11c390612af07c69
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iOS App Store 1024pt 1x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad App 76pt 1x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad App 76pt 1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..33755231d84723c6cfc3f823bad05eb5c8961ba2
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad App 76pt 1x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad App 76pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad App 76pt 2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..2b5ae552b64790957d1a355d80eec642bf93d100
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad App 76pt 2x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Notification 20pt 1x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Notification 20pt 1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..ca9a346232d62f79579473062b9758afb7f8907f
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Notification 20pt 1x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Notification 20pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Notification 20pt 2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a5a33677bdedee2496d9f1bf25f34dc88b0a473
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Notification 20pt 2x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Pro (12.9-inch) App 83.5pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Pro (12.9-inch) App 83.5pt 2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..35bcfba03a28d1a7e50573e9e6438cce84e75363
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Pro (12.9-inch) App 83.5pt 2x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Settings 29pt 1x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Settings 29pt 1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..907b2832c75cded4bca5e65ec9da25f3c04d572a
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Settings 29pt 1x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Settings 29pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Settings 29pt 2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..2aade831c23ada90101c8fc4cd8b07442a68fcb8
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Settings 29pt 2x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Spotlight 40pt 1x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Spotlight 40pt 1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a5a33677bdedee2496d9f1bf25f34dc88b0a473
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Spotlight 40pt 1x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Spotlight 40pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Spotlight 40pt 2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..c35f34b4c2a4bea13a14c6901964057817ec0a0c
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Spotlight 40pt 2x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone App 60pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone App 60pt 2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..911a010e155c39f2a82f8dd2b472a2dfbcfa486e
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone App 60pt 2x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone App 60pt 3x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone App 60pt 3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc5a7a7ac44be361e8fb67318af7b3028630d2f0
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone App 60pt 3x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Notification 20pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Notification 20pt 2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a5a33677bdedee2496d9f1bf25f34dc88b0a473
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Notification 20pt 2x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Notification 20pt 3x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Notification 20pt 3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..3561cb40fa8325368092ed54c78d8ebaa670d170
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Notification 20pt 3x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Settings 29pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Settings 29pt 2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..2aade831c23ada90101c8fc4cd8b07442a68fcb8
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Settings 29pt 2x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Settings 29pt 3x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Settings 29pt 3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..2719654ceaa888998261e08e89b94143165c1b50
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Settings 29pt 3x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight 40pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight 40pt 2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..c35f34b4c2a4bea13a14c6901964057817ec0a0c
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight 40pt 2x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight 40pt 3x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight 40pt 3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..911a010e155c39f2a82f8dd2b472a2dfbcfa486e
Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight 40pt 3x.png differ
diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/Contents.json b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/Contents.json
new file mode 100644
index 0000000000000000000000000000000000000000..73c00596a7fca3f3d4bdd64053b69d86745f9e10
--- /dev/null
+++ b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/Examples/xx-messenger/README.md b/Examples/xx-messenger/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..6863cdab629da2701b2a732ebaf04fce1455ccfe
--- /dev/null
+++ b/Examples/xx-messenger/README.md
@@ -0,0 +1,32 @@
+# xx-messenger
+
+Example iOS messenger application built with **Elixxir dApps Swift SDK**.
+
+![Swift 5.6](https://img.shields.io/badge/swift-5.6-orange.svg)
+![platform iOS](https://img.shields.io/badge/platform-iOS-blue.svg)
+
+## 🛠 Development
+
+Open `XXMessenger.xcworkspace` in Xcode (≥13.4).
+
+### Project structure
+
+```
+XXMessenger [Xcode Workspace]
+ ├─ xx-messenger [Swift Package]
+ |   ├─ AppFeature [Library]
+ |   └─ ...
+ └─ XXMessenger [Xcode Project]
+     └─ XXMessenger (iOS) [iOS App Target]
+```
+
+### Build schemes
+
+- Use `XXMessenger` scheme to build, test, and run the app.
+- Use other schemes (like `AppFeature`) for building and testing individual libraries in isolation.
+
+## 📄 License
+
+Copyright © 2022 xx network SEZC
+
+[License](LICENSE)
diff --git a/Examples/xx-messenger/Sources/AppCore/DBManager/DBManager.swift b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManager.swift
new file mode 100644
index 0000000000000000000000000000000000000000..178e1078e56aaddaf6ef8170834ea830b944aac5
--- /dev/null
+++ b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManager.swift
@@ -0,0 +1,31 @@
+import XXModels
+
+public struct DBManager {
+  public var hasDB: DBManagerHasDB
+  public var makeDB: DBManagerMakeDB
+  public var getDB: DBManagerGetDB
+}
+
+extension DBManager {
+  public static func live() -> DBManager {
+    class Container {
+      var db: Database?
+    }
+
+    let container = Container()
+
+    return DBManager(
+      hasDB: .init { container.db != nil },
+      makeDB: .live(setDB: { container.db = $0 }),
+      getDB: .live(getDB: { container.db })
+    )
+  }
+}
+
+extension DBManager {
+  public static let unimplemented = DBManager(
+    hasDB: .unimplemented,
+    makeDB: .unimplemented,
+    getDB: .unimplemented
+  )
+}
diff --git a/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerGetDB.swift b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerGetDB.swift
new file mode 100644
index 0000000000000000000000000000000000000000..7b5898b7f4b57fdb49dec6b978e3ef04489251b5
--- /dev/null
+++ b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerGetDB.swift
@@ -0,0 +1,33 @@
+import XCTestDynamicOverlay
+import XXModels
+
+public struct DBManagerGetDB {
+  public enum Error: Swift.Error, Equatable {
+    case missingDB
+  }
+
+  public var run: () throws -> Database
+
+  public func callAsFunction() throws -> Database {
+    try run()
+  }
+}
+
+extension DBManagerGetDB {
+  public static func live(
+    getDB: @escaping () -> Database?
+  ) -> DBManagerGetDB {
+    DBManagerGetDB {
+      guard let db = getDB() else {
+        throw Error.missingDB
+      }
+      return db
+    }
+  }
+}
+
+extension DBManagerGetDB {
+  public static let unimplemented = DBManagerGetDB(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerHasDB.swift b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerHasDB.swift
new file mode 100644
index 0000000000000000000000000000000000000000..12fb1bb34ca0882404bf765f640e61496cbaedd5
--- /dev/null
+++ b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerHasDB.swift
@@ -0,0 +1,19 @@
+import XCTestDynamicOverlay
+
+public struct DBManagerHasDB {
+  init(run: @escaping () -> Bool) {
+    self.run = run
+  }
+
+  public var run: () -> Bool
+
+  public func callAsFunction() -> Bool {
+    run()
+  }
+}
+
+extension DBManagerHasDB {
+  public static let unimplemented = DBManagerHasDB(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerMakeDB.swift b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerMakeDB.swift
new file mode 100644
index 0000000000000000000000000000000000000000..a3f018b1d617ad402a4c5f8914b07a2c622150ac
--- /dev/null
+++ b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerMakeDB.swift
@@ -0,0 +1,41 @@
+import Foundation
+import XCTestDynamicOverlay
+import XXDatabase
+import XXModels
+
+public struct DBManagerMakeDB {
+  public var run: () throws -> Void
+
+  public func callAsFunction() throws -> Void {
+    try run()
+  }
+}
+
+extension DBManagerMakeDB {
+  public static func live(
+    setDB: @escaping (Database) -> Void
+  ) -> DBManagerMakeDB {
+    DBManagerMakeDB {
+      let dbDirectoryURL = FileManager.default
+        .urls(for: .applicationSupportDirectory, in: .userDomainMask)
+        .first!
+        .appendingPathComponent("database")
+
+      try? FileManager.default
+        .createDirectory(at: dbDirectoryURL, withIntermediateDirectories: true)
+
+      let dbFilePath = dbDirectoryURL
+        .appendingPathComponent("db")
+        .appendingPathExtension("sqlite")
+        .path
+
+      setDB(try Database.onDisk(path: dbFilePath))
+    }
+  }
+}
+
+extension DBManagerMakeDB {
+  public static let unimplemented = DBManagerMakeDB(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Examples/xx-messenger/Sources/AppFeature/App.swift b/Examples/xx-messenger/Sources/AppFeature/App.swift
new file mode 100644
index 0000000000000000000000000000000000000000..d6b0b722c4d610d823b5313aae797e3f72dc10a3
--- /dev/null
+++ b/Examples/xx-messenger/Sources/AppFeature/App.swift
@@ -0,0 +1,15 @@
+import ComposableArchitecture
+import SwiftUI
+
+@main
+struct App: SwiftUI.App {
+  var body: some Scene {
+    WindowGroup {
+      AppView(store: Store(
+        initialState: AppState(),
+        reducer: appReducer,
+        environment: .live()
+      ))
+    }
+  }
+}
diff --git a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift
new file mode 100644
index 0000000000000000000000000000000000000000..6b1df10d25b421f5530cc0b8b77146acdee6023b
--- /dev/null
+++ b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift
@@ -0,0 +1,52 @@
+import AppCore
+import Foundation
+import HomeFeature
+import LaunchFeature
+import RegisterFeature
+import RestoreFeature
+import WelcomeFeature
+import XXMessengerClient
+import XXModels
+
+extension AppEnvironment {
+  static func live() -> AppEnvironment {
+    let dbManager = DBManager.live()
+    let messengerEnv = MessengerEnvironment.live()
+    let messenger = Messenger.live(messengerEnv)
+    let mainQueue = DispatchQueue.main.eraseToAnyScheduler()
+    let bgQueue = DispatchQueue.global(qos: .background).eraseToAnyScheduler()
+
+    return AppEnvironment(
+      launch: {
+        LaunchEnvironment(
+          dbManager: dbManager,
+          messenger: messenger,
+          mainQueue: mainQueue,
+          bgQueue: bgQueue,
+          welcome: {
+            WelcomeEnvironment(
+              messenger: messenger,
+              mainQueue: mainQueue,
+              bgQueue: bgQueue
+            )
+          },
+          restore: {
+            RestoreEnvironment()
+          },
+          register: {
+            RegisterEnvironment(
+              messenger: messenger,
+              mainQueue: mainQueue,
+              bgQueue: bgQueue
+            )
+          }
+        )
+      },
+      home: {
+        HomeEnvironment(
+          messenger: messenger
+        )
+      }
+    )
+  }
+}
diff --git a/Examples/xx-messenger/Sources/AppFeature/AppFeature.swift b/Examples/xx-messenger/Sources/AppFeature/AppFeature.swift
new file mode 100644
index 0000000000000000000000000000000000000000..18927c0bc21af48ba57317be8b38c7c80ca27a0b
--- /dev/null
+++ b/Examples/xx-messenger/Sources/AppFeature/AppFeature.swift
@@ -0,0 +1,67 @@
+import ComposableArchitecture
+import ComposablePresentation
+import HomeFeature
+import LaunchFeature
+
+struct AppState: Equatable {
+  enum Screen: Equatable {
+    case launch(LaunchState)
+    case home(HomeState)
+  }
+
+  var screen: Screen = .launch(LaunchState())
+}
+
+extension AppState.Screen {
+  var asLaunch: LaunchState? {
+    get { (/AppState.Screen.launch).extract(from: self) }
+    set { if let newValue = newValue { self = .launch(newValue) } }
+  }
+  var asHome: HomeState? {
+    get { (/AppState.Screen.home).extract(from: self) }
+    set { if let newValue = newValue { self = .home(newValue) } }
+  }
+}
+
+enum AppAction: Equatable {
+  case home(HomeAction)
+  case launch(LaunchAction)
+}
+
+struct AppEnvironment {
+  var launch: () -> LaunchEnvironment
+  var home: () -> HomeEnvironment
+}
+
+extension AppEnvironment {
+  static let unimplemented = AppEnvironment(
+    launch: { .unimplemented },
+    home: { .unimplemented }
+  )
+}
+
+let appReducer = Reducer<AppState, AppAction, AppEnvironment>
+{ state, action, env in
+  switch action {
+  case .launch(.finished):
+    state.screen = .home(HomeState())
+    return .none
+
+  case .launch(_), .home(_):
+    return .none
+  }
+}
+.presenting(
+  launchReducer,
+  state: .keyPath(\.screen.asLaunch),
+  id: .notNil(),
+  action: /AppAction.launch,
+  environment: { $0.launch() }
+)
+.presenting(
+  homeReducer,
+  state: .keyPath(\.screen.asHome),
+  id: .notNil(),
+  action: /AppAction.home,
+  environment: { $0.home() }
+)
diff --git a/Examples/xx-messenger/Sources/AppFeature/AppView.swift b/Examples/xx-messenger/Sources/AppFeature/AppView.swift
new file mode 100644
index 0000000000000000000000000000000000000000..317560a3f749bd2b2eaa923318c7c4f4fc66fb1c
--- /dev/null
+++ b/Examples/xx-messenger/Sources/AppFeature/AppView.swift
@@ -0,0 +1,64 @@
+import ComposableArchitecture
+import SwiftUI
+import HomeFeature
+import LaunchFeature
+
+struct AppView: View {
+  let store: Store<AppState, AppAction>
+
+  enum ViewState: Equatable {
+    case launch
+    case home
+
+    init(_ state: AppState) {
+      switch state.screen {
+      case .launch(_): self = .launch
+      case .home(_): self = .home
+      }
+    }
+  }
+
+  var body: some View {
+    WithViewStore(store.scope(state: ViewState.init)) { viewStore in
+      ZStack {
+        SwitchStore(store.scope(state: \.screen)) {
+          CaseLet(
+            state: /AppState.Screen.launch,
+            action: AppAction.launch,
+            then: { store in
+              LaunchView(store: store)
+                .frame(maxWidth: .infinity, maxHeight: .infinity)
+                .transition(.opacity)
+            }
+          )
+
+          CaseLet(
+            state: /AppState.Screen.home,
+            action: AppAction.home,
+            then: { store in
+              HomeView(store: store)
+                .frame(maxWidth: .infinity, maxHeight: .infinity)
+                .transition(.asymmetric(
+                  insertion: .move(edge: .trailing),
+                  removal: .opacity
+                ))
+            }
+          )
+        }
+      }
+      .animation(.default, value: viewStore.state)
+    }
+  }
+}
+
+#if DEBUG
+struct AppView_Previews: PreviewProvider {
+  static var previews: some View {
+    AppView(store: Store(
+      initialState: AppState(),
+      reducer: .empty,
+      environment: ()
+    ))
+  }
+}
+#endif
diff --git a/Examples/xx-messenger/Sources/HomeFeature/HomeFeature.swift b/Examples/xx-messenger/Sources/HomeFeature/HomeFeature.swift
new file mode 100644
index 0000000000000000000000000000000000000000..4aad88dac7cb70cac5908b50bce45a6367b91ca8
--- /dev/null
+++ b/Examples/xx-messenger/Sources/HomeFeature/HomeFeature.swift
@@ -0,0 +1,35 @@
+import ComposableArchitecture
+import XXClient
+import XXMessengerClient
+
+public struct HomeState: Equatable {
+  public init() {}
+}
+
+public enum HomeAction: Equatable {
+  case start
+}
+
+public struct HomeEnvironment {
+  public init(
+    messenger: Messenger
+  ) {
+    self.messenger = messenger
+  }
+
+  public var messenger: Messenger
+}
+
+extension HomeEnvironment {
+  public static let unimplemented = HomeEnvironment(
+    messenger: .unimplemented
+  )
+}
+
+public let homeReducer = Reducer<HomeState, HomeAction, HomeEnvironment>
+{ state, action, env in
+  switch action {
+  case .start:
+    return .none
+  }
+}
diff --git a/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift b/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift
new file mode 100644
index 0000000000000000000000000000000000000000..0bda29bd8c2ea48b125337dd5a487e63334794f0
--- /dev/null
+++ b/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift
@@ -0,0 +1,39 @@
+import ComposableArchitecture
+import SwiftUI
+
+public struct HomeView: View {
+  public init(store: Store<HomeState, HomeAction>) {
+    self.store = store
+  }
+
+  let store: Store<HomeState, HomeAction>
+
+  struct ViewState: Equatable {
+    init(state: HomeState) {}
+  }
+
+  public var body: some View {
+    WithViewStore(store.scope(state: ViewState.init)) { viewStore in
+      NavigationView {
+        Form {
+
+        }
+        .navigationTitle("Home")
+      }
+      .navigationViewStyle(.stack)
+      .task { viewStore.send(.start) }
+    }
+  }
+}
+
+#if DEBUG
+public struct HomeView_Previews: PreviewProvider {
+  public static var previews: some View {
+    HomeView(store: Store(
+      initialState: HomeState(),
+      reducer: .empty,
+      environment: ()
+    ))
+  }
+}
+#endif
diff --git a/Examples/xx-messenger/Sources/LaunchFeature/LaunchErrorView.swift b/Examples/xx-messenger/Sources/LaunchFeature/LaunchErrorView.swift
new file mode 100644
index 0000000000000000000000000000000000000000..893492c0b9670af7389e341713527346eb6e4d26
--- /dev/null
+++ b/Examples/xx-messenger/Sources/LaunchFeature/LaunchErrorView.swift
@@ -0,0 +1,44 @@
+import ComposableArchitecture
+import SwiftUI
+
+struct LaunchErrorView: View {
+  var failure: String
+  var onRetry: () -> Void
+
+  var body: some View {
+    NavigationView {
+      VStack(spacing: 0) {
+        ScrollView {
+          Text(failure)
+            .frame(maxWidth: .infinity, alignment: .leading)
+            .padding()
+        }
+
+        Divider()
+
+        Button {
+          onRetry()
+        } label: {
+          Text("Retry")
+            .frame(maxWidth: .infinity)
+        }
+        .buttonStyle(.borderedProminent)
+        .controlSize(.large)
+        .padding()
+      }
+      .navigationTitle("Error")
+    }
+    .navigationViewStyle(.stack)
+  }
+}
+
+#if DEBUG
+struct LaunchErrorView_Previews: PreviewProvider {
+  static var previews: some View {
+    LaunchErrorView(
+      failure: "Something went wrong...",
+      onRetry: {}
+    )
+  }
+}
+#endif
diff --git a/Examples/xx-messenger/Sources/LaunchFeature/LaunchFeature.swift b/Examples/xx-messenger/Sources/LaunchFeature/LaunchFeature.swift
new file mode 100644
index 0000000000000000000000000000000000000000..39e3efdf0c70780ccd3f2343f17a0fc138fdab57
--- /dev/null
+++ b/Examples/xx-messenger/Sources/LaunchFeature/LaunchFeature.swift
@@ -0,0 +1,172 @@
+import AppCore
+import Combine
+import ComposableArchitecture
+import ComposablePresentation
+import RegisterFeature
+import RestoreFeature
+import WelcomeFeature
+import XXMessengerClient
+import XXModels
+
+public struct LaunchState: Equatable {
+  public enum Screen: Equatable {
+    case loading
+    case welcome(WelcomeState)
+    case restore(RestoreState)
+    case register(RegisterState)
+    case failure(String)
+  }
+
+  public init(
+    screen: Screen = .loading
+  ) {
+    self.screen = screen
+  }
+
+  @BindableState public var screen: Screen
+}
+
+extension LaunchState.Screen {
+  var asWelcome: WelcomeState? {
+    get { (/LaunchState.Screen.welcome).extract(from: self) }
+    set { if let state = newValue { self = .welcome(state) } }
+  }
+  var asRestore: RestoreState? {
+    get { (/LaunchState.Screen.restore).extract(from: self) }
+    set { if let state = newValue { self = .restore(state) } }
+  }
+  var asRegister: RegisterState? {
+    get { (/LaunchState.Screen.register).extract(from: self) }
+    set { if let state = newValue { self = .register(state) } }
+  }
+}
+
+public enum LaunchAction: Equatable, BindableAction {
+  case start
+  case finished
+  case binding(BindingAction<LaunchState>)
+  case welcome(WelcomeAction)
+  case restore(RestoreAction)
+  case register(RegisterAction)
+}
+
+public struct LaunchEnvironment {
+  public init(
+    dbManager: DBManager,
+    messenger: Messenger,
+    mainQueue: AnySchedulerOf<DispatchQueue>,
+    bgQueue: AnySchedulerOf<DispatchQueue>,
+    welcome: @escaping () -> WelcomeEnvironment,
+    restore: @escaping () -> RestoreEnvironment,
+    register: @escaping () -> RegisterEnvironment
+  ) {
+    self.dbManager = dbManager
+    self.messenger = messenger
+    self.mainQueue = mainQueue
+    self.bgQueue = bgQueue
+    self.welcome = welcome
+    self.restore = restore
+    self.register = register
+  }
+
+  public var dbManager: DBManager
+  public var messenger: Messenger
+  public var mainQueue: AnySchedulerOf<DispatchQueue>
+  public var bgQueue: AnySchedulerOf<DispatchQueue>
+  public var welcome: () -> WelcomeEnvironment
+  public var restore: () -> RestoreEnvironment
+  public var register: () -> RegisterEnvironment
+}
+
+extension LaunchEnvironment {
+  public static let unimplemented = LaunchEnvironment(
+    dbManager: .unimplemented,
+    messenger: .unimplemented,
+    mainQueue: .unimplemented,
+    bgQueue: .unimplemented,
+    welcome: { .unimplemented },
+    restore: { .unimplemented },
+    register: { .unimplemented }
+  )
+}
+
+public let launchReducer = Reducer<LaunchState, LaunchAction, LaunchEnvironment>
+{ state, action, env in
+  switch action {
+  case .start, .welcome(.finished), .restore(.finished), .register(.finished):
+    state.screen = .loading
+    return .future { fulfill in
+      do {
+        if env.dbManager.hasDB() == false {
+          try env.dbManager.makeDB()
+        }
+
+        if env.messenger.isLoaded() == false {
+          if env.messenger.isCreated() == false {
+            fulfill(.success(.set(\.$screen, .welcome(WelcomeState()))))
+            return
+          }
+          try env.messenger.load()
+        }
+
+        try env.messenger.start()
+
+        if env.messenger.isConnected() == false {
+          try env.messenger.connect()
+        }
+
+        if env.messenger.isLoggedIn() == false {
+          if try env.messenger.isRegistered() == false {
+            fulfill(.success(.set(\.$screen, .register(RegisterState()))))
+            return
+          }
+          try env.messenger.logIn()
+        }
+
+        fulfill(.success(.finished))
+      }
+      catch {
+        fulfill(.success(.set(\.$screen, .failure(error.localizedDescription))))
+      }
+    }
+    .subscribe(on: env.bgQueue)
+    .receive(on: env.mainQueue)
+    .eraseToEffect()
+
+  case .finished:
+    return .none
+
+  case .welcome(.restoreTapped):
+    state.screen = .restore(RestoreState())
+    return .none
+
+  case .welcome(.failed(let failure)):
+    state.screen = .failure(failure)
+    return .none
+
+  case .binding(_), .welcome(_), .restore(_), .register(_):
+    return .none
+  }
+}
+.binding()
+.presenting(
+  welcomeReducer,
+  state: .keyPath(\.screen.asWelcome),
+  id: .notNil(),
+  action: /LaunchAction.welcome,
+  environment: { $0.welcome() }
+)
+.presenting(
+  restoreReducer,
+  state: .keyPath(\.screen.asRestore),
+  id: .notNil(),
+  action: /LaunchAction.restore,
+  environment: { $0.restore() }
+)
+.presenting(
+  registerReducer,
+  state: .keyPath(\.screen.asRegister),
+  id: .notNil(),
+  action: /LaunchAction.register,
+  environment: { $0.register() }
+)
diff --git a/Examples/xx-messenger/Sources/LaunchFeature/LaunchView.swift b/Examples/xx-messenger/Sources/LaunchFeature/LaunchView.swift
new file mode 100644
index 0000000000000000000000000000000000000000..ed110302f45ff390664f9af2e939571c9bbb2646
--- /dev/null
+++ b/Examples/xx-messenger/Sources/LaunchFeature/LaunchView.swift
@@ -0,0 +1,118 @@
+import ComposableArchitecture
+import RegisterFeature
+import RestoreFeature
+import SwiftUI
+import WelcomeFeature
+
+public struct LaunchView: View {
+  public init(store: Store<LaunchState, LaunchAction>) {
+    self.store = store
+  }
+
+  struct ViewState: Equatable {
+    enum Screen: Equatable {
+      case loading
+      case welcome
+      case restore
+      case register
+      case failure(String)
+    }
+
+    init(_ state: LaunchState) {
+      switch state.screen {
+      case .loading: screen = .loading
+      case .welcome(_): screen = .welcome
+      case .restore(_): screen = .restore
+      case .register(_): screen = .register
+      case .failure(let failure): screen = .failure(failure)
+      }
+    }
+
+    var screen: Screen
+  }
+
+  let store: Store<LaunchState, LaunchAction>
+
+  public var body: some View {
+    WithViewStore(store.scope(state: ViewState.init)) { viewStore in
+      ZStack {
+        switch viewStore.screen {
+        case .loading:
+          ProgressView {
+            Text("Loading")
+          }
+          .controlSize(.large)
+          .frame(maxWidth: .infinity, maxHeight: .infinity)
+          .transition(.opacity)
+
+        case .welcome:
+          IfLetStore(
+            store.scope(
+              state: { (/LaunchState.Screen.welcome).extract(from: $0.screen) },
+              action: LaunchAction.welcome
+            ),
+            then: WelcomeView.init(store:)
+          )
+          .frame(maxWidth: .infinity, maxHeight: .infinity)
+          .transition(.asymmetric(
+            insertion: .move(edge: .trailing),
+            removal: .opacity
+          ))
+
+        case .restore:
+          IfLetStore(
+            store.scope(
+              state: { (/LaunchState.Screen.restore).extract(from: $0.screen) },
+              action: LaunchAction.restore
+            ),
+            then: RestoreView.init(store:)
+          )
+          .frame(maxWidth: .infinity, maxHeight: .infinity)
+          .transition(.asymmetric(
+            insertion: .move(edge: .trailing),
+            removal: .opacity
+          ))
+
+        case .register:
+          IfLetStore(
+            store.scope(
+              state: { (/LaunchState.Screen.register).extract(from: $0.screen) },
+              action: LaunchAction.register
+            ),
+            then: RegisterView.init(store:)
+          )
+          .frame(maxWidth: .infinity, maxHeight: .infinity)
+          .transition(.asymmetric(
+            insertion: .move(edge: .trailing),
+            removal: .opacity
+          ))
+
+        case .failure(let failure):
+          LaunchErrorView(
+            failure: failure,
+            onRetry: { viewStore.send(.start) }
+          )
+          .frame(maxWidth: .infinity, maxHeight: .infinity)
+          .transition(.asymmetric(
+            insertion: .move(edge: .trailing),
+            removal: .opacity
+          ))
+        }
+      }
+      .animation(.default, value: viewStore.screen)
+      .task { viewStore.send(.start) }
+    }
+  }
+}
+
+#if DEBUG
+public struct LaunchView_Previews: PreviewProvider {
+  public static var previews: some View {
+    LaunchView(store: Store(
+      initialState: LaunchState(),
+      reducer: .empty,
+      environment: ()
+    ))
+  }
+}
+#endif
diff --git a/Examples/xx-messenger/Sources/RegisterFeature/RegisterFeature.swift b/Examples/xx-messenger/Sources/RegisterFeature/RegisterFeature.swift
new file mode 100644
index 0000000000000000000000000000000000000000..f929d18fd5bdc1a004cd05f4bb366b5c0d835c03
--- /dev/null
+++ b/Examples/xx-messenger/Sources/RegisterFeature/RegisterFeature.swift
@@ -0,0 +1,89 @@
+import ComposableArchitecture
+import SwiftUI
+import XXMessengerClient
+
+public struct RegisterState: Equatable {
+  public enum Field: String, Hashable {
+    case username
+  }
+
+  public init(
+    focusedField: Field? = nil,
+    username: String = "",
+    isRegistering: Bool = false
+  ) {
+    self.focusedField = focusedField
+    self.username = username
+    self.isRegistering = isRegistering
+  }
+
+  @BindableState public var focusedField: Field?
+  @BindableState public var username: String
+  public var isRegistering: Bool
+  public var failure: String?
+}
+
+public enum RegisterAction: Equatable, BindableAction {
+  case registerTapped
+  case failed(String)
+  case finished
+  case binding(BindingAction<RegisterState>)
+}
+
+public struct RegisterEnvironment {
+  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>
+}
+
+extension RegisterEnvironment {
+  public static let unimplemented = RegisterEnvironment(
+    messenger: .unimplemented,
+    mainQueue: .unimplemented,
+    bgQueue: .unimplemented
+  )
+}
+
+public let registerReducer = Reducer<RegisterState, RegisterAction, RegisterEnvironment>
+{ state, action, env in
+  switch action {
+  case .binding(_):
+    return .none
+
+  case .registerTapped:
+    state.focusedField = nil
+    state.isRegistering = true
+    state.failure = nil
+    return .future { [username = state.username] fulfill in
+      do {
+        try env.messenger.register(username: username)
+        fulfill(.success(.finished))
+      }
+      catch {
+        fulfill(.success(.failed(error.localizedDescription)))
+      }
+    }
+    .subscribe(on: env.bgQueue)
+    .receive(on: env.mainQueue)
+    .eraseToEffect()
+
+  case .failed(let failure):
+    state.isRegistering = false
+    state.failure = failure
+    return .none
+
+  case .finished:
+    return .none
+  }
+}
+.binding()
diff --git a/Examples/xx-messenger/Sources/RegisterFeature/RegisterView.swift b/Examples/xx-messenger/Sources/RegisterFeature/RegisterView.swift
new file mode 100644
index 0000000000000000000000000000000000000000..27bc0962780d7214095ff26592d66c9f6703ae52
--- /dev/null
+++ b/Examples/xx-messenger/Sources/RegisterFeature/RegisterView.swift
@@ -0,0 +1,87 @@
+import ComposableArchitecture
+import SwiftUI
+
+public struct RegisterView: View {
+  public init(store: Store<RegisterState, RegisterAction>) {
+    self.store = store
+  }
+
+  let store: Store<RegisterState, RegisterAction>
+  @FocusState var focusedField: RegisterState.Field?
+
+  struct ViewState: Equatable {
+    init(_ state: RegisterState) {
+      focusedField = state.focusedField
+      username = state.username
+      isRegistering = state.isRegistering
+      failure = state.failure
+    }
+
+    var focusedField: RegisterState.Field?
+    var username: String
+    var isRegistering: Bool
+    var failure: String?
+  }
+
+  public var body: some View {
+    WithViewStore(store.scope(state: ViewState.init)) { viewStore in
+      NavigationView {
+        Form {
+          Section {
+            TextField(
+              text: viewStore.binding(
+                get: \.username,
+                send: { RegisterAction.set(\.$username, $0) }
+              ),
+              prompt: Text("Enter username"),
+              label: { Text("Username") }
+            )
+            .focused($focusedField, equals: .username)
+          } header: {
+            Text("Username")
+          }
+
+          Section {
+            Button {
+              viewStore.send(.registerTapped)
+            } label: {
+              HStack {
+                if viewStore.isRegistering {
+                  ProgressView().padding(.trailing)
+                  Text("Registering...")
+                } else {
+                  Text("Register")
+                }
+              }
+              .frame(maxWidth: .infinity)
+            }
+          }
+
+          if let failure = viewStore.failure {
+            Section {
+              Text(failure)
+            } header: {
+              Text("Error").foregroundColor(.red)
+            }
+          }
+        }
+        .disabled(viewStore.isRegistering)
+        .navigationTitle("Register")
+        .onChange(of: viewStore.focusedField) { focusedField = $0 }
+        .onChange(of: focusedField) { viewStore.send(.set(\.$focusedField, $0)) }
+      }
+    }
+  }
+}
+
+#if DEBUG
+public struct RegisterView_Previews: PreviewProvider {
+  public static var previews: some View {
+    RegisterView(store: Store(
+      initialState: RegisterState(),
+      reducer: .empty,
+      environment: ()
+    ))
+  }
+}
+#endif
diff --git a/Examples/xx-messenger/Sources/RestoreFeature/RestoreFeature.swift b/Examples/xx-messenger/Sources/RestoreFeature/RestoreFeature.swift
new file mode 100644
index 0000000000000000000000000000000000000000..6ce31e5d67acfde939a1bc9ba03e28226f4e0761
--- /dev/null
+++ b/Examples/xx-messenger/Sources/RestoreFeature/RestoreFeature.swift
@@ -0,0 +1,19 @@
+import ComposableArchitecture
+
+public struct RestoreState: Equatable {
+  public init() {}
+}
+
+public enum RestoreAction: Equatable {
+  case finished
+}
+
+public struct RestoreEnvironment {
+  public init() {}
+}
+
+extension RestoreEnvironment {
+  public static let unimplemented = RestoreEnvironment()
+}
+
+public let restoreReducer = Reducer<RestoreState, RestoreAction, RestoreEnvironment>.empty
diff --git a/Examples/xx-messenger/Sources/RestoreFeature/RestoreView.swift b/Examples/xx-messenger/Sources/RestoreFeature/RestoreView.swift
new file mode 100644
index 0000000000000000000000000000000000000000..137b55069b5c0e5df287b2351e181309abbe7181
--- /dev/null
+++ b/Examples/xx-messenger/Sources/RestoreFeature/RestoreView.swift
@@ -0,0 +1,49 @@
+import ComposableArchitecture
+import SwiftUI
+
+public struct RestoreView: View {
+  public init(store: Store<RestoreState, RestoreAction>) {
+    self.store = store
+  }
+
+  let store: Store<RestoreState, RestoreAction>
+
+  struct ViewState: Equatable {
+    init(state: RestoreState) {}
+  }
+
+  public var body: some View {
+    WithViewStore(store.scope(state: ViewState.init)) { viewStore in
+      NavigationView {
+        Form {
+          Section {
+            Text("Not implemented")
+          }
+
+          Section {
+            Button {
+              viewStore.send(.finished)
+            } label: {
+              Text("OK")
+                .frame(maxWidth: .infinity)
+            }
+          }
+        }
+        .navigationTitle("Restore")
+      }
+      .navigationViewStyle(.stack)
+    }
+  }
+}
+
+#if DEBUG
+public struct RestoreView_Previews: PreviewProvider {
+  public static var previews: some View {
+    RestoreView(store: Store(
+      initialState: RestoreState(),
+      reducer: .empty,
+      environment: ()
+    ))
+  }
+}
+#endif
diff --git a/Examples/xx-messenger/Sources/WelcomeFeature/WelcomeFeature.swift b/Examples/xx-messenger/Sources/WelcomeFeature/WelcomeFeature.swift
new file mode 100644
index 0000000000000000000000000000000000000000..6c6f2e22aa36e73ff0fc4acc441eb63b91f56e66
--- /dev/null
+++ b/Examples/xx-messenger/Sources/WelcomeFeature/WelcomeFeature.swift
@@ -0,0 +1,75 @@
+import ComposableArchitecture
+import SwiftUI
+import XXMessengerClient
+
+public struct WelcomeState: Equatable {
+  public init(
+    isCreatingCMix: Bool = false
+  ) {
+    self.isCreatingAccount = isCreatingCMix
+  }
+
+  public var isCreatingAccount: Bool
+}
+
+public enum WelcomeAction: Equatable {
+  case newAccountTapped
+  case restoreTapped
+  case finished
+  case failed(String)
+}
+
+public struct WelcomeEnvironment {
+  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>
+}
+
+extension WelcomeEnvironment {
+  public static let unimplemented = WelcomeEnvironment(
+    messenger: .unimplemented,
+    mainQueue: .unimplemented,
+    bgQueue: .unimplemented
+  )
+}
+
+public let welcomeReducer = Reducer<WelcomeState, WelcomeAction, WelcomeEnvironment>
+{ state, action, env in
+  switch action {
+  case .newAccountTapped:
+    state.isCreatingAccount = true
+    return .future { fulfill in
+      do {
+        try env.messenger.create()
+        fulfill(.success(.finished))
+      }
+      catch {
+        fulfill(.success(.failed(error.localizedDescription)))
+      }
+    }
+    .subscribe(on: env.bgQueue)
+    .receive(on: env.mainQueue)
+    .eraseToEffect()
+
+  case .restoreTapped:
+    return .none
+
+  case .finished:
+    state.isCreatingAccount = false
+    return .none
+
+  case .failed(_):
+    state.isCreatingAccount = false
+    return .none
+  }
+}
diff --git a/Examples/xx-messenger/Sources/WelcomeFeature/WelcomeView.swift b/Examples/xx-messenger/Sources/WelcomeFeature/WelcomeView.swift
new file mode 100644
index 0000000000000000000000000000000000000000..d3686c5aa5f1b410cea89176feecdcf050dccb3a
--- /dev/null
+++ b/Examples/xx-messenger/Sources/WelcomeFeature/WelcomeView.swift
@@ -0,0 +1,68 @@
+import ComposableArchitecture
+import SwiftUI
+
+public struct WelcomeView: View {
+  public init(store: Store<WelcomeState, WelcomeAction>) {
+    self.store = store
+  }
+
+  let store: Store<WelcomeState, WelcomeAction>
+
+  struct ViewState: Equatable {
+    init(_ state: WelcomeState) {
+      isCreatingAccount = state.isCreatingAccount
+    }
+
+    var isCreatingAccount: Bool
+  }
+
+  public var body: some View {
+    WithViewStore(store.scope(state: ViewState.init)) { viewStore in
+      NavigationView {
+        Form {
+          Section {
+            Text("xx messenger")
+          }
+
+          Section {
+            Button {
+              viewStore.send(.newAccountTapped)
+            } label: {
+              HStack {
+                if viewStore.isCreatingAccount {
+                  ProgressView().padding(.trailing)
+                  Text("Creating Account...")
+                } else {
+                  Text("New Account")
+                }
+              }
+              .frame(maxWidth: .infinity)
+            }
+
+            Button {
+              viewStore.send(.restoreTapped)
+            } label: {
+              Text("Restore from Backup")
+                .frame(maxWidth: .infinity)
+            }
+          }
+        }
+        .disabled(viewStore.isCreatingAccount)
+        .navigationTitle("Welcome")
+      }
+      .navigationViewStyle(.stack)
+    }
+  }
+}
+
+#if DEBUG
+public struct WelcomeView_Previews: PreviewProvider {
+  public static var previews: some View {
+    WelcomeView(store: Store(
+      initialState: WelcomeState(),
+      reducer: .empty,
+      environment: ()
+    ))
+  }
+}
+#endif
diff --git a/Examples/xx-messenger/Tests/AppCoreTests/AppCoreTests.swift b/Examples/xx-messenger/Tests/AppCoreTests/AppCoreTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..9a5658d4caa59cea2181061ff1ca1d2d6d38c5e4
--- /dev/null
+++ b/Examples/xx-messenger/Tests/AppCoreTests/AppCoreTests.swift
@@ -0,0 +1,9 @@
+import XCTest
+@testable import AppCore
+
+@MainActor
+final class AppCoreTests: XCTestCase {
+  func testExample() async throws {
+    XCTAssert(true)
+  }
+}
diff --git a/Examples/xx-messenger/Tests/AppFeatureTests/AppFeatureTests.swift b/Examples/xx-messenger/Tests/AppFeatureTests/AppFeatureTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..6563da86bb1d74e25b4cb0c551c7314c20542792
--- /dev/null
+++ b/Examples/xx-messenger/Tests/AppFeatureTests/AppFeatureTests.swift
@@ -0,0 +1,19 @@
+import ComposableArchitecture
+import HomeFeature
+import XCTest
+@testable import AppFeature
+
+@MainActor
+final class AppFeatureTests: XCTestCase {
+  func testLaunchFinished() async throws {
+    let store = TestStore(
+      initialState: AppState(),
+      reducer: appReducer,
+      environment: .unimplemented
+    )
+
+    await store.send(.launch(.finished)) {
+      $0.screen = .home(HomeState())
+    }
+  }
+}
diff --git a/Examples/xx-messenger/Tests/HomeFeatureTests/HomeFeatureTests.swift b/Examples/xx-messenger/Tests/HomeFeatureTests/HomeFeatureTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..21a25bb641274dced7d7dd83ebc49f073ada4420
--- /dev/null
+++ b/Examples/xx-messenger/Tests/HomeFeatureTests/HomeFeatureTests.swift
@@ -0,0 +1,16 @@
+import ComposableArchitecture
+import XCTest
+@testable import HomeFeature
+
+@MainActor
+final class HomeFeatureTests: XCTestCase {
+  func testStart() async throws {
+    let store = TestStore(
+      initialState: HomeState(),
+      reducer: homeReducer,
+      environment: .unimplemented
+    )
+
+    await store.send(.start)
+  }
+}
diff --git a/Examples/xx-messenger/Tests/LaunchFeatureTests/LaunchFeatureTests.swift b/Examples/xx-messenger/Tests/LaunchFeatureTests/LaunchFeatureTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..b2b3f856f79260ef652664f9c9892382296ede95
--- /dev/null
+++ b/Examples/xx-messenger/Tests/LaunchFeatureTests/LaunchFeatureTests.swift
@@ -0,0 +1,327 @@
+import AppCore
+import ComposableArchitecture
+import RegisterFeature
+import RestoreFeature
+import WelcomeFeature
+import XCTest
+import XXModels
+@testable import LaunchFeature
+
+@MainActor
+final class LaunchFeatureTests: XCTestCase {
+  func testStart() {
+    let store = TestStore(
+      initialState: LaunchState(),
+      reducer: launchReducer,
+      environment: .unimplemented
+    )
+
+    let mainQueue = DispatchQueue.test
+    let bgQueue = DispatchQueue.test
+    var didMakeDB = 0
+    var messengerDidLoad = 0
+    var messengerDidStart = 0
+    var messengerDidConnect = 0
+    var messengerDidLogIn = 0
+
+    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
+    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
+    store.environment.dbManager.hasDB.run = { false }
+    store.environment.dbManager.makeDB.run = { didMakeDB += 1 }
+    store.environment.messenger.isLoaded.run = { false }
+    store.environment.messenger.isCreated.run = { true }
+    store.environment.messenger.load.run = { messengerDidLoad += 1 }
+    store.environment.messenger.start.run = { _ in messengerDidStart += 1 }
+    store.environment.messenger.isConnected.run = { false }
+    store.environment.messenger.connect.run = { messengerDidConnect += 1 }
+    store.environment.messenger.isLoggedIn.run = { false }
+    store.environment.messenger.isRegistered.run = { true }
+    store.environment.messenger.logIn.run = { messengerDidLogIn += 1 }
+
+    store.send(.start)
+
+    bgQueue.advance()
+
+    XCTAssertNoDifference(didMakeDB, 1)
+    XCTAssertNoDifference(messengerDidLoad, 1)
+    XCTAssertNoDifference(messengerDidStart, 1)
+    XCTAssertNoDifference(messengerDidConnect, 1)
+    XCTAssertNoDifference(messengerDidLogIn, 1)
+
+    mainQueue.advance()
+
+    store.receive(.finished)
+  }
+
+  func testStartWithoutMessengerCreated() {
+    let store = TestStore(
+      initialState: LaunchState(),
+      reducer: launchReducer,
+      environment: .unimplemented
+    )
+
+    let mainQueue = DispatchQueue.test
+    let bgQueue = DispatchQueue.test
+
+    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
+    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
+    store.environment.dbManager.hasDB.run = { true }
+    store.environment.messenger.isLoaded.run = { false }
+    store.environment.messenger.isCreated.run = { false }
+
+    store.send(.start)
+
+    bgQueue.advance()
+    mainQueue.advance()
+
+    store.receive(.set(\.$screen, .welcome(WelcomeState()))) {
+      $0.screen = .welcome(WelcomeState())
+    }
+  }
+
+  func testStartUnregistered() {
+    let store = TestStore(
+      initialState: LaunchState(),
+      reducer: launchReducer,
+      environment: .unimplemented
+    )
+
+    let mainQueue = DispatchQueue.test
+    let bgQueue = DispatchQueue.test
+
+    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
+    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
+    store.environment.dbManager.hasDB.run = { true }
+    store.environment.messenger.isLoaded.run = { true }
+    store.environment.messenger.start.run = { _ in }
+    store.environment.messenger.isConnected.run = { true }
+    store.environment.messenger.isLoggedIn.run = { false }
+    store.environment.messenger.isRegistered.run = { false }
+
+    store.send(.start)
+
+    bgQueue.advance()
+    mainQueue.advance()
+
+    store.receive(.set(\.$screen, .register(RegisterState()))) {
+      $0.screen = .register(RegisterState())
+    }
+  }
+
+  func testStartMakeDBFailure() {
+    let store = TestStore(
+      initialState: LaunchState(),
+      reducer: launchReducer,
+      environment: .unimplemented
+    )
+
+    let mainQueue = DispatchQueue.test
+    let bgQueue = DispatchQueue.test
+    struct Error: Swift.Error {}
+    let error = Error()
+
+    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
+    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
+    store.environment.dbManager.hasDB.run = { false }
+    store.environment.dbManager.makeDB.run = { throw error }
+
+    store.send(.start)
+
+    bgQueue.advance()
+    mainQueue.advance()
+
+    store.receive(.set(\.$screen, .failure(error.localizedDescription))) {
+      $0.screen = .failure(error.localizedDescription)
+    }
+  }
+
+  func testStartMessengerLoadFailure() {
+    let store = TestStore(
+      initialState: LaunchState(),
+      reducer: launchReducer,
+      environment: .unimplemented
+    )
+
+    let mainQueue = DispatchQueue.test
+    let bgQueue = DispatchQueue.test
+    struct Error: Swift.Error {}
+    let error = Error()
+
+    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
+    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
+    store.environment.dbManager.hasDB.run = { true }
+    store.environment.messenger.isLoaded.run = { false }
+    store.environment.messenger.isCreated.run = { true }
+    store.environment.messenger.load.run = { throw error }
+
+    store.send(.start)
+
+    bgQueue.advance()
+    mainQueue.advance()
+
+    store.receive(.set(\.$screen, .failure(error.localizedDescription))) {
+      $0.screen = .failure(error.localizedDescription)
+    }
+  }
+
+  func testStartMessengerStartFailure() {
+    let store = TestStore(
+      initialState: LaunchState(),
+      reducer: launchReducer,
+      environment: .unimplemented
+    )
+
+    let mainQueue = DispatchQueue.test
+    let bgQueue = DispatchQueue.test
+    struct Error: Swift.Error {}
+    let error = Error()
+
+    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
+    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
+    store.environment.dbManager.hasDB.run = { true }
+    store.environment.messenger.isLoaded.run = { true }
+    store.environment.messenger.start.run = { _ in throw error }
+
+    store.send(.start)
+
+    bgQueue.advance()
+    mainQueue.advance()
+
+    store.receive(.set(\.$screen, .failure(error.localizedDescription))) {
+      $0.screen = .failure(error.localizedDescription)
+    }
+  }
+
+  func testStartMessengerConnectFailure() {
+    let store = TestStore(
+      initialState: LaunchState(),
+      reducer: launchReducer,
+      environment: .unimplemented
+    )
+
+    let mainQueue = DispatchQueue.test
+    let bgQueue = DispatchQueue.test
+    struct Error: Swift.Error {}
+    let error = Error()
+
+    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
+    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
+    store.environment.dbManager.hasDB.run = { true }
+    store.environment.messenger.isLoaded.run = { true }
+    store.environment.messenger.start.run = { _ in }
+    store.environment.messenger.isConnected.run = { false }
+    store.environment.messenger.connect.run = { throw error }
+
+    store.send(.start)
+
+    bgQueue.advance()
+    mainQueue.advance()
+
+    store.receive(.set(\.$screen, .failure(error.localizedDescription))) {
+      $0.screen = .failure(error.localizedDescription)
+    }
+  }
+
+  func testStartMessengerIsRegisteredFailure() {
+    let store = TestStore(
+      initialState: LaunchState(),
+      reducer: launchReducer,
+      environment: .unimplemented
+    )
+
+    let mainQueue = DispatchQueue.test
+    let bgQueue = DispatchQueue.test
+    struct Error: Swift.Error {}
+    let error = Error()
+
+    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
+    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
+    store.environment.dbManager.hasDB.run = { true }
+    store.environment.messenger.isLoaded.run = { true }
+    store.environment.messenger.start.run = { _ in }
+    store.environment.messenger.isConnected.run = { true }
+    store.environment.messenger.isLoggedIn.run = { false }
+    store.environment.messenger.isRegistered.run = { throw error }
+
+    store.send(.start)
+
+    bgQueue.advance()
+    mainQueue.advance()
+
+    store.receive(.set(\.$screen, .failure(error.localizedDescription))) {
+      $0.screen = .failure(error.localizedDescription)
+    }
+  }
+
+  func testStartMessengerLogInFailure() {
+    let store = TestStore(
+      initialState: LaunchState(),
+      reducer: launchReducer,
+      environment: .unimplemented
+    )
+
+    let mainQueue = DispatchQueue.test
+    let bgQueue = DispatchQueue.test
+    struct Error: Swift.Error {}
+    let error = Error()
+
+    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
+    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
+    store.environment.dbManager.hasDB.run = { true }
+    store.environment.messenger.isLoaded.run = { true }
+    store.environment.messenger.start.run = { _ in }
+    store.environment.messenger.isConnected.run = { true }
+    store.environment.messenger.isLoggedIn.run = { false }
+    store.environment.messenger.isRegistered.run = { true }
+    store.environment.messenger.logIn.run = { throw error }
+
+    store.send(.start)
+
+    bgQueue.advance()
+    mainQueue.advance()
+
+    store.receive(.set(\.$screen, .failure(error.localizedDescription))) {
+      $0.screen = .failure(error.localizedDescription)
+    }
+  }
+
+  func testWelcomeRestoreTapped() {
+    let store = TestStore(
+      initialState: LaunchState(
+        screen: .welcome(WelcomeState())
+      ),
+      reducer: launchReducer,
+      environment: .unimplemented
+    )
+
+    store.send(.welcome(.restoreTapped)) {
+      $0.screen = .restore(RestoreState())
+    }
+  }
+
+  func testWelcomeFailed() {
+    let store = TestStore(
+      initialState: LaunchState(
+        screen: .welcome(WelcomeState())
+      ),
+      reducer: launchReducer,
+      environment: .unimplemented
+    )
+
+    let failure = "Something went wrong"
+
+    store.send(.welcome(.failed(failure))) {
+      $0.screen = .failure(failure)
+    }
+  }
+
+  func testFinished() {
+    let store = TestStore(
+      initialState: LaunchState(),
+      reducer: launchReducer,
+      environment: .unimplemented
+    )
+
+    store.send(.finished)
+  }
+}
diff --git a/Examples/xx-messenger/Tests/RegisterFeatureTests/RegisterFeatureTests.swift b/Examples/xx-messenger/Tests/RegisterFeatureTests/RegisterFeatureTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..21d4da16412ab852ff11e1b40da58ac1a5fd5388
--- /dev/null
+++ b/Examples/xx-messenger/Tests/RegisterFeatureTests/RegisterFeatureTests.swift
@@ -0,0 +1,72 @@
+import ComposableArchitecture
+import XCTest
+@testable import RegisterFeature
+
+@MainActor
+final class RegisterFeatureTests: XCTestCase {
+  func testRegister() throws {
+    let store = TestStore(
+      initialState: RegisterState(),
+      reducer: registerReducer,
+      environment: .unimplemented
+    )
+
+    let mainQueue = DispatchQueue.test
+    let bgQueue = DispatchQueue.test
+    var messengerDidRegisterUsername: [String] = []
+
+    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
+    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
+    store.environment.messenger.register.run = { username in
+      messengerDidRegisterUsername.append(username)
+    }
+
+    store.send(.set(\.$username, "NewUser")) {
+      $0.username = "NewUser"
+    }
+
+    store.send(.registerTapped) {
+      $0.isRegistering = true
+    }
+
+    XCTAssertNoDifference(messengerDidRegisterUsername, [])
+
+    bgQueue.advance()
+
+    XCTAssertNoDifference(messengerDidRegisterUsername, ["NewUser"])
+
+    mainQueue.advance()
+
+    store.receive(.finished)
+  }
+
+  func testRegisterFailure() throws {
+    struct Error: Swift.Error, Equatable {}
+    let error = Error()
+
+    let store = TestStore(
+      initialState: RegisterState(),
+      reducer: registerReducer,
+      environment: .unimplemented
+    )
+
+    let mainQueue = DispatchQueue.test
+    let bgQueue = DispatchQueue.test
+
+    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
+    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
+    store.environment.messenger.register.run = { _ in throw error }
+
+    store.send(.registerTapped) {
+      $0.isRegistering = true
+    }
+
+    bgQueue.advance()
+    mainQueue.advance()
+
+    store.receive(.failed(error.localizedDescription)) {
+      $0.isRegistering = false
+      $0.failure = error.localizedDescription
+    }
+  }
+}
diff --git a/Examples/xx-messenger/Tests/RestoreFeatureTests/RestoreFeatureTests.swift b/Examples/xx-messenger/Tests/RestoreFeatureTests/RestoreFeatureTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..1c3e1c97da4f95ddedf16116d44a155a3c2200da
--- /dev/null
+++ b/Examples/xx-messenger/Tests/RestoreFeatureTests/RestoreFeatureTests.swift
@@ -0,0 +1,16 @@
+import ComposableArchitecture
+import XCTest
+@testable import RestoreFeature
+
+@MainActor
+final class RestoreFeatureTests: XCTestCase {
+  func testFinish() async throws {
+    let store = TestStore(
+      initialState: RestoreState(),
+      reducer: restoreReducer,
+      environment: .unimplemented
+    )
+
+    await store.send(.finished)
+  }
+}
diff --git a/Examples/xx-messenger/Tests/WelcomeFeatureTests/WelcomeFeatureTests.swift b/Examples/xx-messenger/Tests/WelcomeFeatureTests/WelcomeFeatureTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..eb6b08566af0f4193c10b5167271bd86b2897330
--- /dev/null
+++ b/Examples/xx-messenger/Tests/WelcomeFeatureTests/WelcomeFeatureTests.swift
@@ -0,0 +1,74 @@
+import ComposableArchitecture
+import XCTest
+@testable import WelcomeFeature
+
+@MainActor
+final class WelcomeFeatureTests: XCTestCase {
+  func testNewAccountTapped() {
+    let store = TestStore(
+      initialState: WelcomeState(),
+      reducer: welcomeReducer,
+      environment: .unimplemented
+    )
+
+    let mainQueue = DispatchQueue.test
+    let bgQueue = DispatchQueue.test
+    var messengerDidCreate = false
+
+    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
+    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
+    store.environment.messenger.create.run = { messengerDidCreate = true }
+
+    store.send(.newAccountTapped) {
+      $0.isCreatingAccount = true
+    }
+
+    bgQueue.advance()
+
+    XCTAssertTrue(messengerDidCreate)
+
+    mainQueue.advance()
+
+    store.receive(.finished) {
+      $0.isCreatingAccount = false
+    }
+  }
+
+  func testNewAccountTappedMessengerCreateFailure() {
+    let store = TestStore(
+      initialState: WelcomeState(),
+      reducer: welcomeReducer,
+      environment: .unimplemented
+    )
+
+    let mainQueue = DispatchQueue.test
+    let bgQueue = DispatchQueue.test
+    struct Error: Swift.Error, Equatable {}
+    let error = Error()
+
+    store.environment.mainQueue = mainQueue.eraseToAnyScheduler()
+    store.environment.bgQueue = bgQueue.eraseToAnyScheduler()
+    store.environment.messenger.create.run = { throw error }
+
+    store.send(.newAccountTapped) {
+      $0.isCreatingAccount = true
+    }
+
+    bgQueue.advance()
+    mainQueue.advance()
+
+    store.receive(.failed(error.localizedDescription)) {
+      $0.isCreatingAccount = false
+    }
+  }
+
+  func testRestore() {
+    let store = TestStore(
+      initialState: WelcomeState(),
+      reducer: welcomeReducer,
+      environment: .unimplemented
+    )
+
+    store.send(.restoreTapped)
+  }
+}
diff --git a/Examples/xx-messenger/XXMessenger.xcworkspace/contents.xcworkspacedata b/Examples/xx-messenger/XXMessenger.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000000000000000000000000000000000000..b101ba6c89faef725536d6bee514440ad3b906db
--- /dev/null
+++ b/Examples/xx-messenger/XXMessenger.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:">
+   </FileRef>
+   <FileRef
+      location = "group:Project/XXMessenger.xcodeproj">
+   </FileRef>
+</Workspace>
diff --git a/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000000000000000000000000000000000000..18d981003d68d0546c4804ac2ff47dd97c6e7921
--- /dev/null
+++ b/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git a/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000000000000000000000000000000000000..08de0be8d3c8c1786ebe04545dd772526853eef4
--- /dev/null
+++ b/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>
+	<false/>
+</dict>
+</plist>
diff --git a/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/swiftpm/Package.resolved
new file mode 100644
index 0000000000000000000000000000000000000000..c330aa9448492ecb8f33d3b05ee260fe3897d417
--- /dev/null
+++ b/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -0,0 +1,104 @@
+{
+  "pins" : [
+    {
+      "identity" : "client-ios-db",
+      "kind" : "remoteSourceControl",
+      "location" : "https://git.xx.network/elixxir/client-ios-db.git",
+      "state" : {
+        "revision" : "f8e3e0088de8301d6c4816e12f0aca1d6f02a280",
+        "version" : "1.1.0"
+      }
+    },
+    {
+      "identity" : "combine-schedulers",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/pointfreeco/combine-schedulers",
+      "state" : {
+        "revision" : "8fee20f993e64bbbf22bc3e3f444758ac2d05692",
+        "version" : "0.7.2"
+      }
+    },
+    {
+      "identity" : "grdb.swift",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/groue/GRDB.swift",
+      "state" : {
+        "revision" : "23f4254ae36fa19aecd73047c0577a9f49850d1c",
+        "version" : "5.26.0"
+      }
+    },
+    {
+      "identity" : "keychainaccess",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/kishikawakatsumi/KeychainAccess.git",
+      "state" : {
+        "revision" : "84e546727d66f1adc5439debad16270d0fdd04e7",
+        "version" : "4.2.2"
+      }
+    },
+    {
+      "identity" : "swift-case-paths",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/pointfreeco/swift-case-paths",
+      "state" : {
+        "revision" : "a09839348486db8866f85a727b8550be1d671c50",
+        "version" : "0.9.1"
+      }
+    },
+    {
+      "identity" : "swift-collections",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/apple/swift-collections",
+      "state" : {
+        "revision" : "48254824bb4248676bf7ce56014ff57b142b77eb",
+        "version" : "1.0.2"
+      }
+    },
+    {
+      "identity" : "swift-composable-architecture",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/pointfreeco/swift-composable-architecture.git",
+      "state" : {
+        "revision" : "108e3a536fcebb16c4f247ef92c2d7326baf9fe3",
+        "version" : "0.39.0"
+      }
+    },
+    {
+      "identity" : "swift-composable-presentation",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/darrarski/swift-composable-presentation.git",
+      "state" : {
+        "revision" : "1f4d17fae1f7ed41cbed17929083190fd9a78ee6",
+        "version" : "0.5.2"
+      }
+    },
+    {
+      "identity" : "swift-custom-dump",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/pointfreeco/swift-custom-dump",
+      "state" : {
+        "revision" : "21ec1d717c07cea5a026979cb0471dd95c7087e7",
+        "version" : "0.5.0"
+      }
+    },
+    {
+      "identity" : "swift-identified-collections",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/pointfreeco/swift-identified-collections",
+      "state" : {
+        "revision" : "2d6b7ffcc67afd9077fac5e5a29bcd6d39b71076",
+        "version" : "0.4.0"
+      }
+    },
+    {
+      "identity" : "xctest-dynamic-overlay",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay.git",
+      "state" : {
+        "revision" : "38bc9242e4388b80bd23ddfdf3071428859e3260",
+        "version" : "0.4.0"
+      }
+    }
+  ],
+  "version" : 2
+}