diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/TanInput.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/TanInput.kt
deleted file mode 100644
index 05cafbe81e156cc76ec698e114abecf04ec43028..0000000000000000000000000000000000000000
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/TanInput.kt
+++ /dev/null
@@ -1,117 +0,0 @@
-package de.rki.coronawarnapp.ui.submission
-
-import android.content.Context
-import android.os.Handler
-import android.text.InputFilter
-import android.util.AttributeSet
-import android.view.inputmethod.InputMethodManager
-import android.widget.FrameLayout
-import androidx.core.widget.doOnTextChanged
-import de.rki.coronawarnapp.R
-import de.rki.coronawarnapp.ui.submission.TanConstants.MAX_LENGTH
-import de.rki.coronawarnapp.util.TanHelper
-import kotlinx.android.synthetic.main.view_tan_input.view.dash_view_1
-import kotlinx.android.synthetic.main.view_tan_input.view.dash_view_2
-import kotlinx.android.synthetic.main.view_tan_input.view.tan_input_edittext
-import kotlinx.android.synthetic.main.view_tan_input.view.tan_input_textview_1
-import kotlinx.android.synthetic.main.view_tan_input.view.tan_input_textview_10
-import kotlinx.android.synthetic.main.view_tan_input.view.tan_input_textview_2
-import kotlinx.android.synthetic.main.view_tan_input.view.tan_input_textview_3
-import kotlinx.android.synthetic.main.view_tan_input.view.tan_input_textview_4
-import kotlinx.android.synthetic.main.view_tan_input.view.tan_input_textview_5
-import kotlinx.android.synthetic.main.view_tan_input.view.tan_input_textview_6
-import kotlinx.android.synthetic.main.view_tan_input.view.tan_input_textview_7
-import kotlinx.android.synthetic.main.view_tan_input.view.tan_input_textview_8
-import kotlinx.android.synthetic.main.view_tan_input.view.tan_input_textview_9
-import java.util.Locale
-
-class TanInput(context: Context, attrs: AttributeSet) : FrameLayout(context, attrs) {
-
-    companion object {
-        private const val KEYBOARD_TRIGGER_DELAY = 100L
-    }
-
-    private val whitespaceFilter =
-        InputFilter { source, _, _, _, _, _ -> source.filter { !it.isWhitespace() } }
-    private val alphaNumericFilter = InputFilter { source, _, _, _, _, _ ->
-        source.filter {
-            TanConstants.ALPHA_NUMERIC_CHARS.contains(it)
-        }
-    }
-    private var lengthFilter = InputFilter.LengthFilter(MAX_LENGTH)
-
-    var listener: ((String?) -> Unit)? = null
-
-    private var tan: String? = null
-
-    init {
-        inflate(context, R.layout.view_tan_input, this)
-
-        tan_input_edittext.filters = arrayOf(whitespaceFilter, alphaNumericFilter, lengthFilter)
-
-        dash_view_1.text = "-"
-        dash_view_2.text = "-"
-
-        // register listener
-        tan_input_edittext.doOnTextChanged { text, _, _, _ -> updateTan(text) }
-        setOnClickListener { showKeyboard() }
-
-        // initially show the keyboard
-        Handler().postDelayed({ showKeyboard() }, KEYBOARD_TRIGGER_DELAY)
-    }
-
-    private fun showKeyboard() {
-        if (tan_input_edittext.requestFocus()) {
-            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
-            imm.showSoftInput(tan_input_edittext, InputMethodManager.SHOW_IMPLICIT)
-        }
-    }
-
-    private fun limitLength(length: Int?) {
-        lengthFilter = InputFilter.LengthFilter(if (length != null) length else MAX_LENGTH)
-        tan_input_edittext.filters = arrayOf(whitespaceFilter, alphaNumericFilter, lengthFilter)
-    }
-
-    private fun updateTan(text: CharSequence?) {
-        this.tan = text?.toString()?.toUpperCase(Locale.ROOT)
-        updateDigits()
-        tan?.let {
-            limitLength(
-                if (TanHelper.allCharactersValid(it)) null
-                else it.length
-            )
-        }
-        notifyListener()
-    }
-
-    private fun notifyListener() = listener?.invoke(tan)
-
-    private fun updateDigits() = listOf(
-        tan_input_textview_1,
-        tan_input_textview_2,
-        tan_input_textview_3,
-        tan_input_textview_4,
-        tan_input_textview_5,
-        tan_input_textview_6,
-        tan_input_textview_7,
-        tan_input_textview_8,
-        tan_input_textview_9,
-        tan_input_textview_10
-    ).forEachIndexed { i, tanDigit ->
-        tanDigit.text = digitAtIndex(i)
-        tanDigit.background =
-            if (digitAtIndex(i) == "")
-                resources.getDrawable(R.drawable.tan_input_digit, null)
-            else if (TanHelper.isTanCharacterValid(digitAtIndex(i)))
-                resources.getDrawable(R.drawable.tan_input_digit_entered, null)
-            else resources.getDrawable(R.drawable.tan_input_digit_error, null)
-
-        tanDigit.setTextColor(
-            if (TanHelper.isTanCharacterValid(digitAtIndex(i)))
-                resources.getColor(R.color.colorTextSemanticNeutral, null)
-            else resources.getColor(R.color.colorTextSemanticRed, null)
-        )
-    }
-
-    private fun digitAtIndex(index: Int): String = tan?.getOrNull(index)?.toString() ?: ""
-}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TanInput.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TanInput.kt
new file mode 100644
index 0000000000000000000000000000000000000000..4f1ee0e9aa14cacdbd4f438b67a130be686b6471
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TanInput.kt
@@ -0,0 +1,195 @@
+package de.rki.coronawarnapp.ui.view
+
+import android.content.Context
+import android.os.Handler
+import android.text.InputFilter
+import android.util.AttributeSet
+import android.view.ViewGroup
+import android.view.inputmethod.InputMethodManager
+import android.widget.EditText
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.core.view.children
+import androidx.core.widget.doOnTextChanged
+import de.rki.coronawarnapp.R
+import de.rki.coronawarnapp.ui.submission.TanConstants
+import de.rki.coronawarnapp.ui.submission.TanConstants.MAX_LENGTH
+import de.rki.coronawarnapp.util.TanHelper
+import kotlinx.android.synthetic.main.view_tan_input_edittext.view.tan_input_edittext
+import java.util.Locale
+import kotlin.math.max
+
+class TanInput(context: Context, attrs: AttributeSet) : ViewGroup(context, attrs) {
+
+    companion object {
+        private const val KEYBOARD_TRIGGER_DELAY = 100L
+        private const val EMPTY_STRING = ""
+    }
+
+    private val whitespaceFilter =
+        InputFilter { source, _, _, _, _, _ -> source.filter { !it.isWhitespace() } }
+    private val alphaNumericFilter = InputFilter { source, _, _, _, _, _ ->
+        source.filter {
+            TanConstants.ALPHA_NUMERIC_CHARS.contains(it)
+        }
+    }
+    private var lengthFilter = InputFilter.LengthFilter(MAX_LENGTH)
+
+    var listener: ((String?) -> Unit)? = null
+
+    private var tan: String? = null
+
+    private val lineSpacing: Int
+
+    init {
+        // add "hidden" edittext for input handling
+        inflate(context, R.layout.view_tan_input_edittext, this)
+
+        // add 3 blocks of digits
+        inflate(context, R.layout.view_tan_input_group_3, this)
+        inflate(context, R.layout.view_tan_input_group_3, this)
+        inflate(context, R.layout.view_tan_input_group_4, this)
+
+        lineSpacing = context.resources.getDimension(R.dimen.submission_tan_line_spacing).toInt()
+
+        tan_input_edittext.filters = arrayOf(whitespaceFilter, alphaNumericFilter, lengthFilter)
+
+        // register listener
+        tan_input_edittext.doOnTextChanged { text, _, _, _ -> updateTan(text) }
+        setOnClickListener { showKeyboard() }
+
+        // initially show the keyboard
+        Handler().postDelayed({ showKeyboard() },
+            KEYBOARD_TRIGGER_DELAY
+        )
+    }
+
+    private fun showKeyboard() {
+        if (tan_input_edittext.requestFocus()) {
+            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+            imm.showSoftInput(tan_input_edittext, InputMethodManager.SHOW_IMPLICIT)
+        }
+    }
+
+    private fun limitLength(length: Int?) {
+        lengthFilter = InputFilter.LengthFilter(if (length != null) length else MAX_LENGTH)
+        tan_input_edittext.filters = arrayOf(whitespaceFilter, alphaNumericFilter, lengthFilter)
+    }
+
+    private fun updateTan(text: CharSequence?) {
+        this.tan = text?.toString()?.toUpperCase(Locale.ROOT)
+        updateDigits()
+        tan?.let {
+            limitLength(
+                if (TanHelper.allCharactersValid(it)) null
+                else it.length
+            )
+        }
+        notifyListener()
+    }
+
+    private fun notifyListener() = listener?.invoke(tan)
+
+    // returns all digits
+    private fun digits(): List<TextView> = children
+        .filterIsInstance(LinearLayout::class.java) // filter to 3 groups, ignoring edittext
+        .flatMap {
+            it.children.filterIsInstance(TextView::class.java) // ignore separators
+        }
+        .toList()
+
+    private fun updateDigits() = digits().forEachIndexed { i, tanDigit ->
+        val text = digitAtIndex(i)
+        tanDigit.text = text
+        tanDigit.background = when {
+            text == EMPTY_STRING -> resources.getDrawable(R.drawable.tan_input_digit, null)
+            TanHelper.isTanCharacterValid(text) -> resources.getDrawable(
+                R.drawable.tan_input_digit_entered,
+                null
+            )
+            else -> resources.getDrawable(R.drawable.tan_input_digit_error, null)
+        }
+
+        tanDigit.setTextColor(
+            if (TanHelper.isTanCharacterValid(text))
+                resources.getColor(R.color.colorTextPrimary1, null)
+            else
+                resources.getColor(R.color.colorTextSemanticRed, null)
+        )
+    }
+
+    private fun digitAtIndex(index: Int): String = tan?.getOrNull(index)?.toString() ?: EMPTY_STRING
+
+    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
+
+        val availableWith = MeasureSpec.getSize(widthMeasureSpec)
+
+        var lines = 1
+        var remainingWidthInLine = availableWith
+        var longestLineWidth = 0
+
+        // calculate number of lines and longest line
+        for (i in 0 until childCount) {
+            val child = getChildAt(i)
+            measureChild(child, widthMeasureSpec, heightMeasureSpec)
+
+            if (child is EditText) {
+                // no need to place "hidden" input in line
+                continue
+            }
+
+            // is there sill enough place at current line?
+            if (child.measuredWidth <= remainingWidthInLine) {
+                // child can be placed at current line
+                remainingWidthInLine -= child.measuredWidth
+                longestLineWidth = max(longestLineWidth, availableWith - remainingWidthInLine)
+            } else {
+                // child needs to be placed at next line
+                lines++
+                remainingWidthInLine = availableWith - child.measuredWidth
+                longestLineWidth = max(longestLineWidth, availableWith - remainingWidthInLine)
+            }
+        }
+
+        // calculate height assuming all groups have same height
+        val childrenHeight = children.first { it is LinearLayout }.measuredHeight
+        val resultingHeight = lines * childrenHeight + (lineSpacing * (lines - 1))
+
+        val resultingWidth = longestLineWidth
+
+        setMeasuredDimension(resultingWidth, resultingHeight)
+    }
+
+    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
+        val availableWidth = right - left
+        var remainingWidthInLine = availableWidth
+        var currentLineStart = 0
+
+        for (i in 0 until childCount) {
+            val child = getChildAt(i)
+
+            if (child is EditText) {
+                // layout "hidden" edittext
+                child.layout(0, 0, 1, 1)
+                continue
+            }
+
+            val childWidth = child.measuredWidth
+
+            // if not enough space in current line, target next
+            if (childWidth > remainingWidthInLine) {
+                currentLineStart += (child.measuredHeight + lineSpacing)
+                remainingWidthInLine = availableWidth
+            }
+
+            // layout child at line
+            val childTop = currentLineStart
+            val childBottom = currentLineStart + child.measuredHeight
+            val childStart = availableWidth - remainingWidthInLine
+            val childEnd = childStart + childWidth
+            remainingWidthInLine -= childWidth
+            child.layout(childStart, childTop, childEnd, childBottom)
+        }
+    }
+}
diff --git a/Corona-Warn-App/src/main/res/drawable/tan_input_digit.xml b/Corona-Warn-App/src/main/res/drawable/tan_input_digit.xml
index e5629f0e74c26134c9889cefd5462a7cdc83de18..f748bc904ab4d9af7924f7f230496403983150ba 100644
--- a/Corona-Warn-App/src/main/res/drawable/tan_input_digit.xml
+++ b/Corona-Warn-App/src/main/res/drawable/tan_input_digit.xml
@@ -1,17 +1,15 @@
 <?xml version="1.0" encoding="utf-8"?>
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
     <item>
-        <shape xmlns:android="http://schemas.android.com/apk/res/android"
-            android:shape="rectangle">
+        <shape android:shape="rectangle">
             <corners android:radius="@dimen/submission_tan_input_digit_radius" />
             <solid android:color="@color/colorSurface2" />
         </shape>
     </item>
     <item
-        android:height="1.5dp"
+        android:height="@dimen/submission_tan_input_digit_stroke"
         android:gravity="bottom">
-        <shape xmlns:android="http://schemas.android.com/apk/res/android"
-            android:shape="rectangle">
+        <shape android:shape="rectangle">
             <corners android:bottomLeftRadius="@dimen/submission_tan_input_digit_radius" />
             <corners android:bottomRightRadius="@dimen/submission_tan_input_digit_radius" />
             <solid android:color="@color/colorTextSemanticNeutral" />
diff --git a/Corona-Warn-App/src/main/res/drawable/tan_input_digit_error.xml b/Corona-Warn-App/src/main/res/drawable/tan_input_digit_error.xml
index 01780eeb09b0b18076cb5bd414e1a2274c3d4015..8e293e04fc5f65d2ea027dfa86effb787eb5a4b0 100644
--- a/Corona-Warn-App/src/main/res/drawable/tan_input_digit_error.xml
+++ b/Corona-Warn-App/src/main/res/drawable/tan_input_digit_error.xml
@@ -1,17 +1,15 @@
 <?xml version="1.0" encoding="utf-8"?>
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
     <item>
-        <shape xmlns:android="http://schemas.android.com/apk/res/android"
-            android:shape="rectangle">
+        <shape android:shape="rectangle">
             <corners android:radius="@dimen/submission_tan_input_digit_radius" />
             <solid android:color="@color/colorSurface2" />
         </shape>
     </item>
     <item
-        android:height="1.5dp"
+        android:height="@dimen/submission_tan_input_digit_stroke"
         android:gravity="bottom">
-        <shape xmlns:android="http://schemas.android.com/apk/res/android"
-            android:shape="rectangle">
+        <shape android:shape="rectangle">
             <corners android:bottomLeftRadius="@dimen/submission_tan_input_digit_radius" />
             <corners android:bottomRightRadius="@dimen/submission_tan_input_digit_radius" />
             <solid android:color="@color/colorTextSemanticRed" />
diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml b/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml
index 229d109eead4749864ff93b30c2a5057de8b4b16..b86713c29c6865f66be70d38e61475cd142113e0 100644
--- a/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml
+++ b/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml
@@ -34,11 +34,11 @@
                 app:layout_constraintStart_toStartOf="@+id/guideline_start"
                 app:layout_constraintTop_toTopOf="parent" />
 
-            <de.rki.coronawarnapp.ui.submission.TanInput
+            <de.rki.coronawarnapp.ui.view.TanInput
                 android:id="@+id/submission_tan_input"
                 android:layout_width="@dimen/match_constraint"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="@dimen/spacing_normal"
+                android:layout_marginTop="@dimen/spacing_large"
                 app:layout_constraintEnd_toStartOf="@+id/guideline_end"
                 app:layout_constraintStart_toStartOf="@+id/guideline_start"
                 app:layout_constraintTop_toBottomOf="@+id/submission_tan_body" />
@@ -49,6 +49,7 @@
                 android:layout_width="@dimen/match_constraint"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="@dimen/spacing_small"
+                android:accessibilityLiveRegion="assertive"
                 android:text="@string/submission_tan_character_error"
                 android:textColor="@color/colorTextSemanticRed"
                 android:visibility="@{FormatterSubmissionHelper.formatShowTanCharacterError(viewmodel.tanCharactersValid, viewmodel.tanChecksumValid)}"
@@ -62,6 +63,7 @@
                 android:layout_width="@dimen/match_constraint"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="@dimen/spacing_small"
+                android:accessibilityLiveRegion="assertive"
                 android:text="@string/submission_tan_error"
                 android:textColor="@color/colorTextSemanticRed"
                 android:visibility="@{FormatterHelper.formatVisibility(!viewmodel.tanChecksumValid)}"
diff --git a/Corona-Warn-App/src/main/res/layout/view_tan_input.xml b/Corona-Warn-App/src/main/res/layout/view_tan_input.xml
deleted file mode 100644
index 9083b562845012532d3bc66852b9b20a93ee1ffa..0000000000000000000000000000000000000000
--- a/Corona-Warn-App/src/main/res/layout/view_tan_input.xml
+++ /dev/null
@@ -1,125 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools">
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-        <EditText
-            android:id="@+id/tan_input_edittext"
-            style="@style/tanInputEdittext"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
-
-        <TextView
-            android:id="@+id/tan_input_textview_1"
-            style="@style/tanInputDigit"
-            app:layout_constraintEnd_toStartOf="@+id/tan_input_textview_2"
-            app:layout_constraintHorizontal_chainStyle="spread_inside"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="X" />
-
-
-        <TextView
-            android:id="@+id/tan_input_textview_2"
-            style="@style/tanInputDigit"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintEnd_toStartOf="@+id/tan_input_textview_3"
-            app:layout_constraintStart_toEndOf="@+id/tan_input_textview_1"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="X" />
-
-        <TextView
-            android:id="@+id/tan_input_textview_3"
-            style="@style/tanInputDigit"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintEnd_toStartOf="@+id/dash_view_1"
-            app:layout_constraintStart_toEndOf="@+id/tan_input_textview_2"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="X" />
-
-        <TextView
-            android:id="@+id/dash_view_1"
-            style="@style/tanInputDash"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintEnd_toStartOf="@+id/tan_input_textview_4"
-            app:layout_constraintStart_toEndOf="@+id/tan_input_textview_3"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="-" />
-
-        <TextView
-            android:id="@+id/tan_input_textview_4"
-            style="@style/tanInputDigit"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintEnd_toStartOf="@+id/tan_input_textview_5"
-            app:layout_constraintStart_toEndOf="@+id/dash_view_1"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="X" />
-
-        <TextView
-            android:id="@+id/tan_input_textview_5"
-            style="@style/tanInputDigit"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintEnd_toStartOf="@+id/tan_input_textview_6"
-            app:layout_constraintStart_toEndOf="@+id/tan_input_textview_4"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="X" />
-
-        <TextView
-            android:id="@+id/tan_input_textview_6"
-            style="@style/tanInputDigit"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintEnd_toStartOf="@+id/dash_view_2"
-            app:layout_constraintStart_toEndOf="@+id/tan_input_textview_5"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="X" />
-
-        <TextView
-            android:id="@+id/dash_view_2"
-            style="@style/tanInputDash"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintEnd_toStartOf="@+id/tan_input_textview_7"
-            app:layout_constraintStart_toEndOf="@+id/tan_input_textview_6"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="-" />
-
-        <TextView
-            android:id="@+id/tan_input_textview_7"
-            style="@style/tanInputDigit"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintEnd_toStartOf="@+id/tan_input_textview_8"
-            app:layout_constraintStart_toEndOf="@+id/dash_view_2"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="X" />
-
-        <TextView
-            android:id="@+id/tan_input_textview_8"
-            style="@style/tanInputDigit"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintEnd_toStartOf="@+id/tan_input_textview_9"
-            app:layout_constraintStart_toEndOf="@+id/tan_input_textview_7"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="X" />
-
-        <TextView
-            android:id="@+id/tan_input_textview_9"
-            style="@style/tanInputDigit"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintEnd_toStartOf="@+id/tan_input_textview_10"
-            app:layout_constraintStart_toEndOf="@+id/tan_input_textview_8"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="X" />
-
-        <TextView
-            android:id="@+id/tan_input_textview_10"
-            style="@style/tanInputDigit"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toEndOf="@+id/tan_input_textview_9"
-            app:layout_constraintTop_toTopOf="parent"
-            tools:text="X" />
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
-</layout>
diff --git a/Corona-Warn-App/src/main/res/layout/view_tan_input_edittext.xml b/Corona-Warn-App/src/main/res/layout/view_tan_input_edittext.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9aca2e5aabbc809514cd30cab4f85190a6aa26d6
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/layout/view_tan_input_edittext.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <EditText
+        android:id="@+id/tan_input_edittext"
+        style="@style/tanInputEdittext" />
+
+</layout>
diff --git a/Corona-Warn-App/src/main/res/layout/view_tan_input_group_3.xml b/Corona-Warn-App/src/main/res/layout/view_tan_input_group_3.xml
new file mode 100644
index 0000000000000000000000000000000000000000..99d15420c57f0fb92da05751c4a3b0afd230b1d7
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/layout/view_tan_input_group_3.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/tan_input_1"
+            style="@style/tanInputDigit"
+            android:layout_marginStart="@dimen/no_padding"
+            tools:text="X" />
+
+        <TextView
+            android:id="@+id/tan_input_2"
+            style="@style/tanInputDigit"
+            tools:text="X" />
+
+        <TextView
+            android:id="@+id/tan_input_3"
+            style="@style/tanInputDigit"
+            tools:text="X" />
+
+        <View style="@style/tanInputDash" />
+
+    </LinearLayout>
+
+</layout>
diff --git a/Corona-Warn-App/src/main/res/layout/view_tan_input_group_4.xml b/Corona-Warn-App/src/main/res/layout/view_tan_input_group_4.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a6b07ef390bcef69160dd7808da471dcf0fe7692
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/layout/view_tan_input_group_4.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/tan_input_1"
+            style="@style/tanInputDigit"
+            android:layout_marginStart="@dimen/no_padding"
+            tools:text="X" />
+
+        <TextView
+            android:id="@+id/tan_input_2"
+            style="@style/tanInputDigit"
+            tools:text="X" />
+
+        <TextView
+            android:id="@+id/tan_input_3"
+            style="@style/tanInputDigit"
+            tools:text="X" />
+
+        <TextView
+            android:id="@+id/tan_input_4"
+            style="@style/tanInputDigit"
+            tools:text="X" />
+
+    </LinearLayout>
+
+</layout>
diff --git a/Corona-Warn-App/src/main/res/values/dimens.xml b/Corona-Warn-App/src/main/res/values/dimens.xml
index 5e5d81a76a4aa111d66d3a29f615af72a81f678f..3c52614f94bbf02778ccd1238338d79b02c2cc9a 100644
--- a/Corona-Warn-App/src/main/res/values/dimens.xml
+++ b/Corona-Warn-App/src/main/res/values/dimens.xml
@@ -94,10 +94,15 @@
     <!-- Submission Tan Input -->
     <dimen name="submission_tan_input_edittext_size">1dp</dimen>
     <dimen name="submission_tan_input_digit_radius">2dp</dimen>
-    <dimen name="submission_tan_input_digit_width">22dp</dimen>
-    <dimen name="submission_tan_input_digit_height">40dp</dimen>
-    <dimen name="submission_tan_input_dash_width">11dp</dimen>
-    <dimen name="submission_tan_input_dash_height">40dp</dimen>
+    <dimen name="submission_tan_input_digit_width">24dp</dimen>
+    <dimen name="submission_tan_input_digit_height">32dp</dimen>
+    <dimen name="submission_tan_input_digit_spacing">3dp</dimen>
+    <dimen name="submission_tan_input_digit_stroke">2dp</dimen>
+    <dimen name="submission_tan_dash_width">6dp</dimen>
+    <dimen name="submission_tan_dash_height">2dp</dimen>
+    <dimen name="submission_tan_dash_spacing_start">2dp</dimen>
+    <dimen name="submission_tan_dash_spacing_end">5dp</dimen>
+    <dimen name="submission_tan_line_spacing">16dp</dimen>
 
     <!-- Submission QR Code Scan -->
     <dimen name="submission_scan_qr_code_viewfinder_size">240dp</dimen>
diff --git a/Corona-Warn-App/src/main/res/values/styles.xml b/Corona-Warn-App/src/main/res/values/styles.xml
index e4e112a37bdead8cacc4b9f3f883b0e2c25a29b5..26dde88b16e45db9962f3422d01165ab3cd2db7a 100644
--- a/Corona-Warn-App/src/main/res/values/styles.xml
+++ b/Corona-Warn-App/src/main/res/values/styles.xml
@@ -235,13 +235,17 @@
         <item name="android:layout_height">@dimen/submission_tan_input_digit_height</item>
         <item name="android:background">@drawable/tan_input_digit</item>
         <item name="android:gravity">center</item>
+        <item name="android:layout_marginStart">@dimen/submission_tan_input_digit_spacing</item>
+        <item name="android:layout_marginEnd">@dimen/submission_tan_input_digit_spacing</item>
     </style>
 
     <style name="tanInputDash" parent="headline6">
-        <item name="android:layout_width">@dimen/submission_tan_input_dash_width</item>
-        <item name="android:layout_height">@dimen/submission_tan_input_dash_height</item>
-        <item name="android:background">@null</item>
+        <item name="android:layout_width">@dimen/submission_tan_dash_width</item>
+        <item name="android:layout_height">@dimen/submission_tan_dash_height</item>
+        <item name="android:background">@color/colorTextSemanticNeutral</item>
         <item name="android:gravity">center</item>
+        <item name="android:layout_marginStart">@dimen/submission_tan_dash_spacing_start</item>
+        <item name="android:layout_marginEnd">@dimen/submission_tan_dash_spacing_end</item>
     </style>
 
     <style name="tanInputEdittext">