diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt
index 9f23a0958369ed53342a94d09c7dd527d98ef72b..3b2323a43678459565c662bdf8a5b3d398b1a3f5 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt
@@ -136,6 +136,11 @@ class SubmissionQRCodeScanFragment : Fragment() {
         })
 
         viewModel.registrationState.observeEvent(viewLifecycleOwner, {
+            binding.submissionQrCodeScanSpinner.visibility = when (it) {
+                ApiRequestState.STARTED -> View.VISIBLE
+                else -> View.GONE
+            }
+
             if (ApiRequestState.SUCCESS == it) {
                 findNavController().doNavigate(
                     SubmissionQRCodeScanFragmentDirections
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt
index 58d651827b5faf9752ca52ffb1fb8cb5648ab373..7b28f7cdf85e2e50696cb26e80b72732ec2223ff 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt
@@ -52,6 +52,8 @@ class SubmissionResultPositiveOtherWarningFragment : Fragment(),
     }
 
     override fun onFailure(exception: Exception?) {
+        binding.submissionPositiveOtherWarningButtonNext.isEnabled = true
+        binding.submissionPositiveOtherWarningSpinner.visibility = View.GONE
         submissionFailed = true
     }
 
@@ -137,6 +139,16 @@ class SubmissionResultPositiveOtherWarningFragment : Fragment(),
         })
 
         submissionViewModel.submissionState.observeEvent(viewLifecycleOwner, {
+            binding.submissionPositiveOtherWarningButtonNext.isEnabled = when (it) {
+                ApiRequestState.STARTED -> false
+                else -> true
+            }
+
+            binding.submissionPositiveOtherWarningSpinner.visibility = when (it) {
+                ApiRequestState.STARTED -> View.VISIBLE
+                else -> View.GONE
+            }
+
             if (it == ApiRequestState.SUCCESS) {
                 findNavController().doNavigate(
                     SubmissionResultPositiveOtherWarningFragmentDirections
@@ -148,6 +160,8 @@ class SubmissionResultPositiveOtherWarningFragment : Fragment(),
 
     private fun setButtonOnClickListener() {
         binding.submissionPositiveOtherWarningButtonNext.setOnClickListener {
+            binding.submissionPositiveOtherWarningButtonNext.isEnabled = false
+            binding.submissionPositiveOtherWarningSpinner.visibility = View.VISIBLE
             initiateWarningOthers()
         }
         binding.submissionPositiveOtherWarningHeader.headerButtonBack.buttonIcon.setOnClickListener {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt
index 99d00bfe09b590b55b6a3f49661018ca168be732..a7c7a04ed15f33e27dfefebdc7c84a8891208014 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt
@@ -101,6 +101,11 @@ class SubmissionTanFragment : Fragment() {
         binding.submissionTanHeader.headerButtonBack.buttonIcon.setOnClickListener { navigateToDispatchScreen() }
 
         submissionViewModel.registrationState.observeEvent(viewLifecycleOwner, {
+            binding.submissionTanSpinner.visibility = when (it) {
+                ApiRequestState.STARTED -> View.VISIBLE
+                else -> View.GONE
+            }
+
             if (ApiRequestState.SUCCESS == it) {
                 findNavController().doNavigate(
                     SubmissionTanFragmentDirections.actionSubmissionTanFragmentToSubmissionResultFragment()
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt
index 60376083e3218e6f765c16708cc0e5b579a356b8..7e78fd840c0bfef3902a54c7d54e7c95a9c0257c 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt
@@ -5,6 +5,7 @@ import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import de.rki.coronawarnapp.exception.ExceptionCategory
+import de.rki.coronawarnapp.exception.TransactionException
 import de.rki.coronawarnapp.exception.http.CwaWebException
 import de.rki.coronawarnapp.exception.reporting.report
 import de.rki.coronawarnapp.service.submission.SubmissionService
@@ -121,7 +122,15 @@ class SubmissionViewModel : ViewModel() {
             } catch (err: CwaWebException) {
                 exceptionLiveData?.value = Event(err)
                 state.value = Event(ApiRequestState.FAILED)
+            } catch (err: TransactionException) {
+                if (err.cause is CwaWebException) {
+                    exceptionLiveData?.value = Event(err.cause)
+                } else {
+                    err.report(ExceptionCategory.INTERNAL)
+                }
+                state.value = Event(ApiRequestState.FAILED)
             } catch (err: Exception) {
+                state.value = Event(ApiRequestState.FAILED)
                 err.report(ExceptionCategory.INTERNAL)
             }
         }
diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml
index 9abda2c0f7385896b0dd40bce9f7c458665afcbb..9d7c44dc6f31a213e364c820d12c18d37c2168af 100644
--- a/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml
+++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml
@@ -41,6 +41,19 @@
             app:layout_constraintStart_toStartOf="@id/guideline_start"
             app:layout_constraintTop_toBottomOf="@id/guideline_action" />
 
+        <ProgressBar
+            android:id="@+id/submission_positive_other_warning_spinner"
+            style="?android:attr/progressBarStyleHorizontal"
+            android:layout_width="@dimen/match_constraint"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/spacing_large"
+            android:indeterminate="true"
+            android:visibility="gone"
+            app:layout_constraintBottom_toBottomOf="@+id/submission_positive_other_warning_button_next"
+            app:layout_constraintEnd_toEndOf="@+id/submission_positive_other_warning_button_next"
+            app:layout_constraintStart_toStartOf="@+id/submission_positive_other_warning_button_next"
+            app:layout_constraintTop_toTopOf="@+id/submission_positive_other_warning_button_next" />
+
         <androidx.constraintlayout.widget.Guideline
             android:id="@+id/guideline_action"
             android:layout_width="wrap_content"
diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml
index 2e0406745742677dd41e23f8ce8b351f8bd5f58a..ffca652df4eaa17528ff38460e9f03926876b4a2 100644
--- a/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml
+++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml
@@ -40,6 +40,17 @@
             app:layout_constraintStart_toStartOf="@+id/submission_qr_code_scan_preview"
             app:layout_constraintTop_toBottomOf="@+id/submission_qr_code_scan_guideline_center" />
 
+        <ProgressBar
+            android:id="@+id/submission_qr_code_scan_spinner"
+            style="?android:attr/progressBarStyle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/spacing_normal"
+            android:visibility="gone"
+            app:layout_constraintEnd_toEndOf="@+id/submission_qr_code_scan_body"
+            app:layout_constraintStart_toStartOf="@+id/submission_qr_code_scan_body"
+            app:layout_constraintTop_toBottomOf="@+id/submission_qr_code_scan_body" />
+
         <include
             android:id="@+id/submission_qr_code_scan_close"
             layout="@layout/include_button_icon"
diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml
index a880483f4cb00481bf8fddc79232611ce1a5fcf1..0806273fc493d4ada0889377129427bf640400e5 100644
--- a/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml
+++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml
@@ -41,6 +41,17 @@
             app:layout_constraintTop_toBottomOf="@+id/submission_tan_header"
             app:viewmodel="@{viewmodel}" />
 
+        <ProgressBar
+            android:id="@+id/submission_tan_spinner"
+            style="?android:attr/progressBarStyle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/spacing_normal"
+            android:visibility="gone"
+            app:layout_constraintBottom_toTopOf="@+id/guideline_action"
+            app:layout_constraintEnd_toEndOf="@id/guideline_end"
+            app:layout_constraintStart_toStartOf="@id/guideline_start" />
+
         <Button
             android:id="@+id/submission_tan_button_enter"
             style="@style/buttonPrimary"