diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment.kt
index a9c953118a6983ab44db4e83d669d41185e25c00..7f95fa7c859f30d8b35da16d36e28aea968e2f1d 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment.kt
@@ -40,7 +40,11 @@ class SubmissionTanFragment : Fragment(R.layout.fragment_submission_tan), AutoIn
             binding.uiState = it
 
             submission_tan_character_error.setGone(it.areCharactersCorrect)
-            submission_tan_error.setGone(it.isTanValidFormat)
+            if (it.isCorrectLength) {
+                submission_tan_error.setGone(it.isTanValid)
+            } else {
+                submission_tan_error.setGone(true)
+            }
         }
 
         binding.submissionTanContent.submissionTanInput.listener = { tan ->
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModel.kt
index c947e09a91c7507945441f918e49abe8306814a2..28dbe39bc10303fb8df48d1c1458be736bde5f4f 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModel.kt
@@ -28,7 +28,8 @@ class SubmissionTanViewModel @AssistedInject constructor(
         UIState(
             isTanValid = currentTan.isTanValid,
             isTanValidFormat = currentTan.isTanValidFormat,
-            areCharactersCorrect = currentTan.areCharactersValid
+            areCharactersCorrect = currentTan.areCharactersValid,
+            isCorrectLength = currentTan.isCorrectLength
         )
     }.asLiveData(context = dispatcherProvider.Default)
 
@@ -73,7 +74,8 @@ class SubmissionTanViewModel @AssistedInject constructor(
     data class UIState(
         val isTanValid: Boolean = false,
         val areCharactersCorrect: Boolean = false,
-        val isTanValidFormat: Boolean = false
+        val isTanValidFormat: Boolean = false,
+        val isCorrectLength: Boolean = false
     )
 
     @AssistedInject.Factory
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/Tan.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/Tan.kt
index a4d883605477fbc1295047d10155bb8bb5305b22..8cfc0e09483da70ab08b16405b7a9aac1ce9bb34 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/Tan.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/Tan.kt
@@ -8,8 +8,9 @@ data class Tan(
     val value: String
 ) {
 
+    val isCorrectLength = value.length == MAX_LENGTH
     val areCharactersValid = allCharactersValid(value)
-    val isTanValidFormat = value.length == MAX_LENGTH && isChecksumValid(value)
+    val isTanValidFormat = isCorrectLength && isChecksumValid(value)
     val isTanValid = areCharactersValid && isTanValidFormat
 
     companion object {
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModelTest.kt
index fe2bd9043d442472d3a2b8739ffa07a583545f85..ee57585af900af56835c3bf36089e72e85ece59b 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModelTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModelTest.kt
@@ -28,15 +28,19 @@ class SubmissionTanViewModelTest : BaseTest() {
 
         viewModel.onTanChanged("ZWFPC7NG47")
         viewModel.state.value!!.isTanValid shouldBe true
+        viewModel.state.value!!.isCorrectLength shouldBe true
 
         viewModel.onTanChanged("ABC")
         viewModel.state.value!!.isTanValid shouldBe false
+        viewModel.state.value!!.isCorrectLength shouldBe false
 
         viewModel.onTanChanged("ZWFPC7NG48")
         viewModel.state.value!!.isTanValid shouldBe false
+        viewModel.state.value!!.isCorrectLength shouldBe true
 
         viewModel.onTanChanged("ZWFPC7NG4A")
         viewModel.state.value!!.isTanValid shouldBe false
+        viewModel.state.value!!.isCorrectLength shouldBe true
     }
 
     @Test
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/TanTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/TanTest.kt
index 4a011b972587c5bc14a74e2b0bf002a1e70259ce..927c107ed5ebf2d5494a8fc5a6cfd43ceea030cd 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/TanTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/TanTest.kt
@@ -46,6 +46,26 @@ class TanTest : BaseTest() {
         }
     }
 
+    @Test
+    fun isTanValid() {
+        val validTans = arrayOf(
+            "9A3B578UMG", "DEU7TKSV3H", "PTPHM35RP4", "V923D59AT8", "H9NC5CQ34E"
+        )
+        for (tan in validTans) {
+            Tan.allCharactersValid(tan)  shouldBe true
+            Tan.isChecksumValid(tan) shouldBe true
+            (tan.length == Tan.MAX_LENGTH) shouldBe true
+        }
+
+        // invalid tans due to length and/or invalid characters
+        val invalidTans = arrayOf(
+            "ABÖAA1", "-1234", "PTPHM15RP4", "aAASd A"
+        )
+        for (tan in invalidTans) {
+           Tan.allCharactersValid(tan) shouldBe false
+        }
+    }
+
     @Test
     fun isChecksumValid() {
         // valid