diff --git a/Sources/LaunchFeature/LaunchController.swift b/Sources/LaunchFeature/LaunchController.swift
index 2684c669cd4860ec49c7efebba6abba9ea138fd4..8a9b10717cf85e70c0bd20ee2581e1e79898ecca 100644
--- a/Sources/LaunchFeature/LaunchController.swift
+++ b/Sources/LaunchFeature/LaunchController.swift
@@ -27,7 +27,7 @@ public final class LaunchController: UIViewController {
       .statePublisher
       .receive(on: DispatchQueue.main)
       .sink { [unowned self] in
-        guard $0.shouldPushChats == false else {
+        guard $0.shouldPushEndDestination != .some(.chats) else {
           guard $0.shouldShowTerms == false else {
             navigator.perform(PresentTermsAndConditions(replacing: true, on: navigationController!))
             return
@@ -39,7 +39,7 @@ public final class LaunchController: UIViewController {
           navigator.perform(PresentChatList(on: navigationController!))
           return
         }
-        guard $0.shouldPushOnboarding == false else {
+        guard $0.shouldPushEndDestination != .some(.onboarding) else {
           navigator.perform(PresentOnboardingStart(on: navigationController!))
           return
         }
diff --git a/Sources/LaunchFeature/LaunchViewModel.swift b/Sources/LaunchFeature/LaunchViewModel.swift
index 30ac8e249af08f34a2e281b1ed190f5e28f8a06b..732d2e2dd3bd4155d0b10376f17ac8e20af75c2b 100644
--- a/Sources/LaunchFeature/LaunchViewModel.swift
+++ b/Sources/LaunchFeature/LaunchViewModel.swift
@@ -29,6 +29,10 @@ import class XXClient.Cancellable
 import PulseLogHandler
 
 final class LaunchViewModel {
+  enum Destination {
+    case chats, onboarding
+  }
+
   struct UpdateModel {
     let content: String
     let urlString: String
@@ -39,9 +43,8 @@ final class LaunchViewModel {
 
   struct ViewState {
     var shouldShowTerms = false
-    var shouldPushChats = false
     var shouldOfferUpdate: UpdateModel?
-    var shouldPushOnboarding = false
+    var shouldPushEndDestination: Destination?
   }
 
   @Dependency(\.app.log) var log
@@ -202,41 +205,41 @@ extension LaunchViewModel {
 
     try dummyTrafficManager.setStatus(dummyTrafficOn)
 
-    var shouldPushChats = false
-    var shouldPushOnboarding = false
+    let endDestination: Destination
+
+    if messenger.isLoggedIn() == false {
+      if try messenger.isRegistered() {
+        try messenger.logIn()
+        endDestination = .chats
+      } else {
+        try? sftpManager.unlink()
+        try? dropboxManager.unlink()
+        endDestination = .onboarding
+      }
+    } else {
+      endDestination = .chats
+    }
 
     defer {
       hudManager.hide()
-      if shouldPushChats {
+      if endDestination == .chats {
         if isBiometricsOn, permissions.biometrics.status() {
           permissions.biometrics.request { [weak self] granted in
             guard let self else { return }
             if granted {
-              self.stateSubject.value.shouldPushChats = true
+              self.stateSubject.value.shouldPushEndDestination = .chats
             } else {
-              // DO WHAT?
+              // TODO: A fallback state for failing biometrics
             }
           }
         } else {
-          stateSubject.value.shouldPushChats = true
+          stateSubject.value.shouldPushEndDestination = .chats
         }
       } else {
-        stateSubject.value.shouldPushOnboarding = shouldPushOnboarding
+        stateSubject.value.shouldPushEndDestination = .onboarding
       }
     }
 
-    if messenger.isLoggedIn() == false {
-      if try messenger.isRegistered() {
-        try messenger.logIn()
-        shouldPushChats = true
-      } else {
-        try? sftpManager.unlink()
-        try? dropboxManager.unlink()
-        shouldPushOnboarding = true
-      }
-    } else {
-      shouldPushChats = true
-    }
     if !messenger.isBackupRunning() {
       try? messenger.resumeBackup()
     }