diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt
index 6a995cde61ed9e1b4ec6d593b9bc0b705c777644..3e97c4c07361cfd76db91c4566c0b3068a17934c 100644
--- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt
@@ -36,13 +36,16 @@ import dagger.hilt.android.qualifiers.ApplicationContext
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
 import org.briarproject.mailbox.R
-import org.briarproject.mailbox.android.StatusManager.AfterRunning
 import org.briarproject.mailbox.android.StatusManager.ErrorClockSkew
 import org.briarproject.mailbox.android.StatusManager.ErrorNoNetwork
 import org.briarproject.mailbox.android.StatusManager.MailboxAppState
+import org.briarproject.mailbox.android.StatusManager.NotStarted
 import org.briarproject.mailbox.android.StatusManager.StartedSettingUp
 import org.briarproject.mailbox.android.StatusManager.StartedSetupComplete
 import org.briarproject.mailbox.android.StatusManager.Starting
+import org.briarproject.mailbox.android.StatusManager.Stopped
+import org.briarproject.mailbox.android.StatusManager.Stopping
+import org.briarproject.mailbox.android.StatusManager.Wiping
 import org.briarproject.mailbox.android.ui.MainActivity
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -110,7 +113,8 @@ class MailboxNotificationManager @Inject constructor(
                     setContentTitle(ctx.getString(R.string.notification_mailbox_title_offline))
                     setContentText(ctx.getString(R.string.notification_mailbox_content_clock_skew))
                 }
-                AfterRunning -> error("No notifications when lifecycle not running")
+                NotStarted, Stopping, Stopped, Wiping ->
+                    error("No notifications when lifecycle not running")
             }
             setSmallIcon(R.drawable.ic_notification_foreground)
             setContentIntent(pendingIntent)
diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/StatusManager.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/StatusManager.kt
index 8e8f2c2d6d936510aca427656d77296015cd316c..29df60ca472a1a66e7fe6ccc9f127bb6cf9193ec 100644
--- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/StatusManager.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/StatusManager.kt
@@ -63,19 +63,25 @@ class StatusManager @Inject constructor(
      * Possible values for [appState]
      */
     sealed class MailboxAppState
+    object NotStarted : MailboxAppState()
     data class Starting(val status: String) : MailboxAppState()
     data class StartedSettingUp(val qrCode: Bitmap) : MailboxAppState()
     object StartedSetupComplete : MailboxAppState()
-    object AfterRunning : MailboxAppState()
     object ErrorClockSkew : MailboxAppState()
     object ErrorNoNetwork : MailboxAppState()
+    object Wiping : MailboxAppState()
+    object Stopping : MailboxAppState()
+    object Stopped : MailboxAppState()
 
     @Suppress("OPT_IN_USAGE")
     val appState: Flow<MailboxAppState> = combine(
         lifecycleState, torPluginState, setupComplete
     ) { ls, ts, sc ->
         when {
-            ls.isAfter(LifecycleState.RUNNING) -> AfterRunning
+            ls == LifecycleState.NOT_STARTED -> NotStarted
+            ls == LifecycleState.WIPING -> Wiping
+            ls == LifecycleState.STOPPING -> Stopping
+            ls == LifecycleState.STOPPED -> Stopped
             ls != LifecycleState.RUNNING -> Starting(getString(R.string.startup_starting_services))
             // RUNNING
             ts != TorState.Published -> when (ts) {
@@ -103,9 +109,10 @@ class StatusManager @Inject constructor(
     }.flowOn(Dispatchers.IO)
         .distinctUntilChanged()
         .onEach { state ->
-            if (state != AfterRunning) notificationManager.onMailboxAppStateChanged(state)
+            if (state != NotStarted && state != Wiping && state != Stopping && state != Stopped)
+                notificationManager.onMailboxAppStateChanged(state)
         }
-        .stateIn(GlobalScope, Lazily, Starting(getString(R.string.startup_starting_services)))
+        .stateIn(GlobalScope, Lazily, NotStarted)
 
     private fun getString(@StringRes resId: Int, vararg formatArgs: Any?): String {
         return context.getString(resId, *formatArgs)
diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/ClockSkewFragment.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/ClockSkewFragment.kt
index 4b2fd9e9f6381aed81e0d82f786263714559ebb3..c3d4189374830cba87bbdc387955b46f21fb724b 100644
--- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/ClockSkewFragment.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/ClockSkewFragment.kt
@@ -24,20 +24,12 @@ import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import androidx.fragment.app.Fragment
-import androidx.fragment.app.activityViewModels
-import androidx.navigation.fragment.findNavController
 import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.coroutines.flow.collect
 import org.briarproject.mailbox.R
-import org.briarproject.mailbox.android.StatusManager.ErrorClockSkew
-import org.briarproject.mailbox.android.StatusManager.MailboxAppState
-import org.briarproject.mailbox.android.ui.ClockSkewFragmentDirections.actionClockSkewFragmentToStartupFragment
 
 @AndroidEntryPoint
 class ClockSkewFragment : Fragment() {
 
-    private val viewModel: MailboxViewModel by activityViewModels()
-
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
@@ -45,17 +37,4 @@ class ClockSkewFragment : Fragment() {
     ): View? {
         return inflater.inflate(R.layout.fragment_clock_skew, container, false)
     }
-
-    override fun onViewCreated(v: View, savedInstanceState: Bundle?) {
-        launchAndRepeatWhileStarted {
-            viewModel.appState.collect { onSetupStateChanged(it) }
-        }
-    }
-
-    private fun onSetupStateChanged(state: MailboxAppState) {
-        if (state != ErrorClockSkew) {
-            findNavController().navigate(actionClockSkewFragmentToStartupFragment())
-        }
-    }
-
 }
diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt
index 782bffae6bbff7f9a5c022ec452df09101f4f69e..f78b1b3ef50993e4c8ca296f5d0646fce5f059c2 100644
--- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt
@@ -32,19 +32,28 @@ import androidx.lifecycle.lifecycleScope
 import androidx.navigation.NavController
 import androidx.navigation.fragment.NavHostFragment
 import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.launch
 import org.briarproject.android.dontkillmelib.DozeUtils.needsDozeWhitelisting
+import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalClockSkewFragment
+import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalDoNotKillMeFragment
+import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalNoNetworkFragment
+import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalQrCodeFragment
+import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalStartupFragment
+import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalStatusFragment
 import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalStoppingFragment
 import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalWipingFragment
 import org.briarproject.mailbox.R
-import org.briarproject.mailbox.android.dontkillme.DoNotKillMeFragmentDirections.actionDoNotKillMeFragmentToStartupFragment
-import org.briarproject.mailbox.android.dontkillme.DoNotKillMeFragmentDirections.actionGlobalDoNotKillMeFragment
-import org.briarproject.mailbox.android.ui.InitFragmentDirections.actionInitFragmentToDoNotKillMeFragment
-import org.briarproject.mailbox.android.ui.InitFragmentDirections.actionInitFragmentToStartupFragment
+import org.briarproject.mailbox.android.StatusManager.ErrorClockSkew
+import org.briarproject.mailbox.android.StatusManager.ErrorNoNetwork
+import org.briarproject.mailbox.android.StatusManager.MailboxAppState
+import org.briarproject.mailbox.android.StatusManager.NotStarted
+import org.briarproject.mailbox.android.StatusManager.StartedSettingUp
+import org.briarproject.mailbox.android.StatusManager.StartedSetupComplete
+import org.briarproject.mailbox.android.StatusManager.Starting
+import org.briarproject.mailbox.android.StatusManager.Stopped
+import org.briarproject.mailbox.android.StatusManager.Stopping
+import org.briarproject.mailbox.android.StatusManager.Wiping
 import org.briarproject.mailbox.core.lifecycle.LifecycleManager.LifecycleState.NOT_STARTED
-import org.briarproject.mailbox.core.lifecycle.LifecycleManager.LifecycleState.STOPPING
-import org.briarproject.mailbox.core.lifecycle.LifecycleManager.LifecycleState.WIPING
 import org.briarproject.mailbox.core.util.LogUtils.info
 import org.slf4j.LoggerFactory.getLogger
 
@@ -73,19 +82,12 @@ class MainActivity : AppCompatActivity(), ActivityResultCallback<ActivityResult>
 
         viewModel.doNotKillComplete.observe(this) { complete ->
             if (complete && nav.currentDestination?.id == R.id.doNotKillMeFragment) nav.navigate(
-                actionDoNotKillMeFragmentToStartupFragment()
+                actionGlobalStartupFragment()
             )
         }
 
         launchAndRepeatWhileStarted {
-            viewModel.lifecycleState.collect { state ->
-                LOG.info { "lifecycle state: $state" }
-                when (state) {
-                    STOPPING -> nav.navigate(actionGlobalStoppingFragment())
-                    WIPING -> nav.navigate(actionGlobalWipingFragment())
-                    else -> {}
-                }
-            }
+            viewModel.appState.collect { onAppStateChanged(it) }
         }
 
         LOG.info { "do we have a saved instance state? " + (savedInstanceState != null) }
@@ -97,6 +99,27 @@ class MainActivity : AppCompatActivity(), ActivityResultCallback<ActivityResult>
         }
     }
 
+    private fun onAppStateChanged(state: MailboxAppState) {
+        when (state) {
+            NotStarted -> {} // do not navigate anywhere yet
+            is Starting -> if (nav.currentDestination?.id != R.id.startupFragment)
+                nav.navigate(actionGlobalStartupFragment())
+            is StartedSettingUp -> if (nav.currentDestination?.id != R.id.qrCodeFragment)
+                nav.navigate(actionGlobalQrCodeFragment())
+            StartedSetupComplete -> if (nav.currentDestination?.id != R.id.statusFragment)
+                nav.navigate(actionGlobalStatusFragment())
+            ErrorNoNetwork -> if (nav.currentDestination?.id != R.id.noNetworkFragment)
+                nav.navigate(actionGlobalNoNetworkFragment())
+            ErrorClockSkew -> if (nav.currentDestination?.id != R.id.clockSkewFragment)
+                nav.navigate(actionGlobalClockSkewFragment())
+            Stopping -> if (nav.currentDestination?.id != R.id.stoppingFragment)
+                nav.navigate(actionGlobalStoppingFragment())
+            Wiping -> if (nav.currentDestination?.id != R.id.wipingFragment)
+                nav.navigate(actionGlobalWipingFragment())
+            Stopped -> {} // nothing to do but needs to be exhaustive for Kotlin 1.7
+        }
+    }
+
     private fun onDbChecked(hasDb: Boolean, savedInstanceState: Bundle?) {
         if (lifecycle.currentState == DESTROYED) {
             return
@@ -105,9 +128,9 @@ class MainActivity : AppCompatActivity(), ActivityResultCallback<ActivityResult>
             if (!hasDb) {
                 startForResult.launch(Intent(this, OnboardingActivity::class.java))
             } else if (needsDozeWhitelisting(this)) {
-                nav.navigate(actionInitFragmentToDoNotKillMeFragment())
+                nav.navigate(actionGlobalDoNotKillMeFragment())
             } else {
-                nav.navigate(actionInitFragmentToStartupFragment())
+                nav.navigate(actionGlobalStartupFragment())
             }
         } else {
             // At this point, when we do not have a db, this can be either of two situations:
@@ -139,9 +162,9 @@ class MainActivity : AppCompatActivity(), ActivityResultCallback<ActivityResult>
         // only show next fragment when user went throw onboarding
         // result doesn't matter as we kill the app when user backs out in onboarding
         if (viewModel.needToShowDoNotKillMeFragment) {
-            nav.navigate(actionInitFragmentToDoNotKillMeFragment())
+            nav.navigate(actionGlobalDoNotKillMeFragment())
         } else {
-            nav.navigate(actionInitFragmentToStartupFragment())
+            nav.navigate(actionGlobalStartupFragment())
         }
     }
 
diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/NoNetworkFragment.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/NoNetworkFragment.kt
index b35b2191eb5729b510c1daa2af1cf4d1ef47ac59..43f4aaa2c8827651bcf5ed21ee7b601d06aca02c 100644
--- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/NoNetworkFragment.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/NoNetworkFragment.kt
@@ -24,20 +24,12 @@ import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import androidx.fragment.app.Fragment
-import androidx.fragment.app.activityViewModels
-import androidx.navigation.fragment.findNavController
 import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.coroutines.flow.collect
 import org.briarproject.mailbox.R
-import org.briarproject.mailbox.android.StatusManager.ErrorNoNetwork
-import org.briarproject.mailbox.android.StatusManager.MailboxAppState
-import org.briarproject.mailbox.android.ui.NoNetworkFragmentDirections.actionNoNetworkFragmentToStartupFragment
 
 @AndroidEntryPoint
 class NoNetworkFragment : Fragment() {
 
-    private val viewModel: MailboxViewModel by activityViewModels()
-
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
@@ -45,17 +37,4 @@ class NoNetworkFragment : Fragment() {
     ): View? {
         return inflater.inflate(R.layout.fragment_no_network, container, false)
     }
-
-    override fun onViewCreated(v: View, savedInstanceState: Bundle?) {
-        launchAndRepeatWhileStarted {
-            viewModel.appState.collect { onAppStateChanged(it) }
-        }
-    }
-
-    private fun onAppStateChanged(state: MailboxAppState) {
-        if (state != ErrorNoNetwork) {
-            findNavController().navigate(actionNoNetworkFragmentToStartupFragment())
-        }
-    }
-
 }
diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/QrCodeFragment.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/QrCodeFragment.kt
index a3c73ab441babdda62deb383391b6042857fb7cf..44cb232a1c4219876d76ebe87ae58658d1f6669a 100644
--- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/QrCodeFragment.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/QrCodeFragment.kt
@@ -27,14 +27,11 @@ import android.widget.Button
 import android.widget.ImageView
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
-import androidx.navigation.fragment.findNavController
 import dagger.hilt.android.AndroidEntryPoint
 import kotlinx.coroutines.flow.collect
 import org.briarproject.mailbox.R
 import org.briarproject.mailbox.android.StatusManager.MailboxAppState
 import org.briarproject.mailbox.android.StatusManager.StartedSettingUp
-import org.briarproject.mailbox.android.StatusManager.StartedSetupComplete
-import org.briarproject.mailbox.android.ui.QrCodeFragmentDirections.actionQrCodeFragmentToSetupCompleteFragment
 
 @AndroidEntryPoint
 class QrCodeFragment : Fragment() {
@@ -66,12 +63,8 @@ class QrCodeFragment : Fragment() {
     }
 
     private fun onAppStateChanged(state: MailboxAppState) {
-        when (state) {
-            is StartedSettingUp -> qrCodeView.setImageBitmap(state.qrCode)
-            is StartedSetupComplete -> findNavController().navigate(
-                actionQrCodeFragmentToSetupCompleteFragment()
-            )
-            else -> error("Unexpected app state: $state")
+        if (state is StartedSettingUp) {
+            qrCodeView.setImageBitmap(state.qrCode)
         }
     }
 
diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/SetupCompleteFragment.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/SetupCompleteFragment.kt
index c5867be9a787403a125b63d26e43c50c4bc850ed..3b0f4d953999236228fbaed89db992d60ba35d3c 100644
--- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/SetupCompleteFragment.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/SetupCompleteFragment.kt
@@ -25,16 +25,14 @@ import android.view.View
 import android.view.ViewGroup
 import android.widget.Button
 import androidx.fragment.app.Fragment
-import androidx.fragment.app.activityViewModels
 import androidx.navigation.fragment.findNavController
 import dagger.hilt.android.AndroidEntryPoint
+import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalStatusFragment
 import org.briarproject.mailbox.R
-import org.briarproject.mailbox.android.ui.SetupCompleteFragmentDirections.actionSetupCompleteFragmentToStatusFragment
 
 @AndroidEntryPoint
 class SetupCompleteFragment : Fragment() {
 
-    private val viewModel: MailboxViewModel by activityViewModels()
     private lateinit var button: Button
 
     override fun onCreateView(
@@ -48,7 +46,7 @@ class SetupCompleteFragment : Fragment() {
     override fun onViewCreated(v: View, savedInstanceState: Bundle?) {
         button = v.findViewById(R.id.button)
         button.setOnClickListener {
-            findNavController().navigate(actionSetupCompleteFragmentToStatusFragment())
+            findNavController().navigate(actionGlobalStatusFragment())
         }
     }
 
diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/StartupFragment.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/StartupFragment.kt
index c8d3d877fea9b05a89176fb53935910377733df1..42ea8b19ef8cde14689bca40c721fae09e9613d1 100644
--- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/StartupFragment.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/StartupFragment.kt
@@ -26,20 +26,11 @@ import android.view.ViewGroup
 import android.widget.TextView
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
-import androidx.navigation.fragment.findNavController
 import dagger.hilt.android.AndroidEntryPoint
 import kotlinx.coroutines.flow.collect
 import org.briarproject.mailbox.R
-import org.briarproject.mailbox.android.StatusManager.ErrorClockSkew
-import org.briarproject.mailbox.android.StatusManager.ErrorNoNetwork
 import org.briarproject.mailbox.android.StatusManager.MailboxAppState
-import org.briarproject.mailbox.android.StatusManager.StartedSettingUp
-import org.briarproject.mailbox.android.StatusManager.StartedSetupComplete
 import org.briarproject.mailbox.android.StatusManager.Starting
-import org.briarproject.mailbox.android.ui.StartupFragmentDirections.actionStartupFragmentToClockSkewFragment
-import org.briarproject.mailbox.android.ui.StartupFragmentDirections.actionStartupFragmentToNoNetworkFragment
-import org.briarproject.mailbox.android.ui.StartupFragmentDirections.actionStartupFragmentToQrCodeFragment
-import org.briarproject.mailbox.android.ui.StartupFragmentDirections.actionStartupFragmentToStatusFragment
 
 @AndroidEntryPoint
 class StartupFragment : Fragment() {
@@ -66,20 +57,8 @@ class StartupFragment : Fragment() {
     }
 
     private fun onAppStateChanged(state: MailboxAppState) {
-        when (state) {
-            is Starting -> statusTextView.text = state.status
-            is StartedSettingUp -> findNavController().navigate(
-                actionStartupFragmentToQrCodeFragment()
-            )
-            is StartedSetupComplete -> findNavController().navigate(
-                actionStartupFragmentToStatusFragment()
-            )
-            is ErrorNoNetwork -> findNavController().navigate(
-                actionStartupFragmentToNoNetworkFragment()
-            )
-            is ErrorClockSkew -> findNavController().navigate(
-                actionStartupFragmentToClockSkewFragment()
-            )
+        if (state is Starting) {
+            statusTextView.text = state.status
         }
     }
 
diff --git a/mailbox-android/src/main/res/navigation/nav_main.xml b/mailbox-android/src/main/res/navigation/nav_main.xml
index 2100a74c3137acc2b5fe00704795f47ee8da29df..1e8162752618a57754ec8fef1e1bf2458b6921cc 100644
--- a/mailbox-android/src/main/res/navigation/nav_main.xml
+++ b/mailbox-android/src/main/res/navigation/nav_main.xml
@@ -9,90 +9,27 @@
         android:id="@+id/initFragment"
         android:name="org.briarproject.mailbox.android.ui.InitFragment"
         android:label="InitFragment"
-        tools:layout="@layout/fragment_init">
-        <action
-            android:id="@+id/action_initFragment_to_doNotKillMeFragment"
-            app:destination="@id/doNotKillMeFragment"
-            app:popUpTo="@id/initFragment"
-            app:popUpToInclusive="true" />
-        <action
-            android:id="@+id/action_initFragment_to_startupFragment"
-            app:destination="@id/startupFragment"
-            app:popUpTo="@id/initFragment"
-            app:popUpToInclusive="true" />
-        <action
-            android:id="@+id/action_initFragment_to_stoppingFragment"
-            app:destination="@id/stoppingFragment"
-            app:popUpTo="@id/initFragment"
-            app:popUpToInclusive="true" />
-        <action
-            android:id="@+id/action_initFragment_to_wipingFragment"
-            app:destination="@id/wipingFragment"
-            app:popUpTo="@id/initFragment"
-            app:popUpToInclusive="true" />
-    </fragment>
+        tools:layout="@layout/fragment_init" />
     <fragment
         android:id="@+id/doNotKillMeFragment"
         android:name="org.briarproject.mailbox.android.dontkillme.DoNotKillMeFragment"
         android:label="DoNotKillMeFragment"
-        tools:layout="@layout/fragment_dont_kill_me">
-        <action
-            android:id="@+id/action_doNotKillMeFragment_to_startupFragment"
-            app:destination="@id/startupFragment"
-            app:popUpTo="@id/doNotKillMeFragment"
-            app:popUpToInclusive="true" />
-    </fragment>
-    <action
-        android:id="@+id/action_global_doNotKillMeFragment"
-        app:destination="@id/doNotKillMeFragment"
-        app:popUpTo="@id/nav_onboarding"
-        app:popUpToInclusive="true" />
+        tools:layout="@layout/fragment_dont_kill_me" />
     <fragment
         android:id="@+id/startupFragment"
         android:name="org.briarproject.mailbox.android.ui.StartupFragment"
         android:label="StartupFragment"
-        tools:layout="@layout/fragment_startup">
-        <action
-            android:id="@+id/action_startupFragment_to_qrCodeFragment"
-            app:destination="@id/qrCodeFragment"
-            app:popUpTo="@id/startupFragment"
-            app:popUpToInclusive="true" />
-        <action
-            android:id="@+id/action_startupFragment_to_statusFragment"
-            app:destination="@id/statusFragment"
-            app:popUpTo="@id/startupFragment"
-            app:popUpToInclusive="true" />
-        <action
-            android:id="@+id/action_startupFragment_to_noNetworkFragment"
-            app:destination="@id/noNetworkFragment"
-            app:popUpTo="@id/startupFragment"
-            app:popUpToInclusive="true" />
-        <action
-            android:id="@+id/action_startupFragment_to_clockSkewFragment"
-            app:destination="@id/clockSkewFragment" />
-    </fragment>
+        tools:layout="@layout/fragment_startup" />
     <fragment
         android:id="@+id/qrCodeFragment"
         android:name="org.briarproject.mailbox.android.ui.QrCodeFragment"
         android:label="QrCodeFragment"
-        tools:layout="@layout/fragment_qr">
-        <action
-            android:id="@+id/action_qrCodeFragment_to_setupCompleteFragment"
-            app:destination="@id/setupCompleteFragment"
-            app:popUpTo="@id/qrCodeFragment"
-            app:popUpToInclusive="true" />
-    </fragment>
+        tools:layout="@layout/fragment_qr" />
     <fragment
         android:id="@+id/setupCompleteFragment"
         android:name="org.briarproject.mailbox.android.ui.SetupCompleteFragment"
         android:label="SetupCompleteFragment"
-        tools:layout="@layout/fragment_setup_complete">
-        <action
-            android:id="@+id/action_setupCompleteFragment_to_statusFragment"
-            app:destination="@id/statusFragment"
-            app:popUpTo="@id/setupCompleteFragment"
-            app:popUpToInclusive="true" />
-    </fragment>
+        tools:layout="@layout/fragment_setup_complete" />
     <fragment
         android:id="@+id/statusFragment"
         android:name="org.briarproject.mailbox.android.ui.StatusFragment"
@@ -102,20 +39,12 @@
         android:id="@+id/noNetworkFragment"
         android:name="org.briarproject.mailbox.android.ui.NoNetworkFragment"
         android:label="NoNetworkFragment"
-        tools:layout="@layout/fragment_no_network">
-        <action
-            android:id="@+id/action_noNetworkFragment_to_startupFragment"
-            app:destination="@id/startupFragment" />
-    </fragment>
+        tools:layout="@layout/fragment_no_network" />
     <fragment
         android:id="@+id/clockSkewFragment"
         android:name="org.briarproject.mailbox.android.ui.ClockSkewFragment"
         android:label="ClockSkewFragment"
-        tools:layout="@layout/fragment_clock_skew">
-        <action
-            android:id="@+id/action_clockSkewFragment_to_startupFragment"
-            app:destination="@id/startupFragment" />
-    </fragment>
+        tools:layout="@layout/fragment_clock_skew" />
     <fragment
         android:id="@+id/stoppingFragment"
         android:name="org.briarproject.mailbox.android.ui.StoppingFragment"
@@ -126,6 +55,36 @@
         android:name="org.briarproject.mailbox.android.ui.WipingFragment"
         android:label="WipingFragment"
         tools:layout="@layout/fragment_wiping" />
+    <action
+        android:id="@+id/action_global_doNotKillMeFragment"
+        app:destination="@id/doNotKillMeFragment"
+        app:popUpTo="@id/nav_onboarding"
+        app:popUpToInclusive="true" />
+    <action
+        android:id="@+id/action_global_startupFragment"
+        app:destination="@id/startupFragment"
+        app:popUpTo="@id/nav_onboarding"
+        app:popUpToInclusive="true" />
+    <action
+        android:id="@+id/action_global_qrCodeFragment"
+        app:destination="@id/qrCodeFragment"
+        app:popUpTo="@id/nav_onboarding"
+        app:popUpToInclusive="true" />
+    <action
+        android:id="@+id/action_global_statusFragment"
+        app:destination="@id/statusFragment"
+        app:popUpTo="@id/nav_onboarding"
+        app:popUpToInclusive="true" />
+    <action
+        android:id="@+id/action_global_noNetworkFragment"
+        app:destination="@id/noNetworkFragment"
+        app:popUpTo="@id/nav_onboarding"
+        app:popUpToInclusive="true" />
+    <action
+        android:id="@+id/action_global_clockSkewFragment"
+        app:destination="@id/clockSkewFragment"
+        app:popUpTo="@id/nav_onboarding"
+        app:popUpToInclusive="true" />
     <action
         android:id="@+id/action_global_wipingFragment"
         app:destination="@id/wipingFragment"