diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResult.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResult.kt
new file mode 100644
index 0000000000000000000000000000000000000000..2e5fddde8240297e34d433432909351b3b477156
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResult.kt
@@ -0,0 +1,53 @@
+package de.rki.coronawarnapp.ui.view
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ScrollView
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.content.withStyledAttributes
+import de.rki.coronawarnapp.R
+import kotlinx.android.synthetic.main.view_step_entry.view.step_entry_icon
+import kotlinx.android.synthetic.main.view_step_entry.view.step_entry_line
+
+/**
+ * The [TestResult] Displays the appropriate test result.
+ */
+open class TestResult @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0
+) : ScrollView(context, attrs, defStyleAttr) {
+
+    val body: ConstraintLayout?
+
+    init {
+        inflate(context, R.layout.view_step_entry, this)
+
+        body = findViewById(R.id.step_entry_wrapper_children)
+
+        context.withStyledAttributes(attrs, R.styleable.StepEntry) {
+            val icon = getDrawable(R.styleable.StepEntry_step_entry_icon)
+            step_entry_icon.setImageDrawable(icon)
+
+            val isFinal = getBoolean(R.styleable.StepEntry_step_entry_final, false)
+            step_entry_line.visibility = if (isFinal) {
+                View.INVISIBLE
+            } else {
+                View.VISIBLE
+            }
+        }
+    }
+
+    override fun addView(
+        child: View?,
+        index: Int,
+        params: ViewGroup.LayoutParams?
+    ) {
+        if (body == null)
+            super.addView(child, index, params)
+        else
+            body.addView(child, index, params)
+    }
+}
diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_consent_given.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_consent_given.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ee0a184d4625380fd510031f549af97ba29de376
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_consent_given.xml
@@ -0,0 +1,106 @@
+<?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">
+
+    <data>
+
+        <import type="de.rki.coronawarnapp.util.formatter.FormatterSubmissionHelper" />
+
+        <variable
+            name="uiState"
+            type="de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState" />
+    </data>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/submission_test_result_container"
+        android:contentDescription="@string/submission_test_result_headline"
+        android:accessibilityLiveRegion="assertive"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <include
+            android:id="@+id/submission_test_result_consent_given_header"
+            layout="@layout/include_header"
+            android:layout_width="@dimen/match_constraint"
+            android:layout_height="wrap_content"
+            app:icon="@{@drawable/ic_close}"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:title="@{@string/submission_test_result_headline}" />
+
+        <ProgressBar
+            android:id="@+id/submission_test_result_spinner"
+            style="?android:attr/progressBarStyle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:visibility="@{FormatterSubmissionHelper.formatTestResultSpinnerVisible(uiState.apiRequestState)}"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <include
+            android:id="@+id/submission_test_result_consent_given_content"
+            layout="@layout/include_submission_test_result"
+            android:accessibilityLiveRegion="assertive"
+            android:importantForAccessibility="yes"
+            android:layout_width="@dimen/match_constraint"
+            android:layout_height="@dimen/match_constraint"
+            android:layout_marginBottom="@dimen/button_padding_top_bottom"
+            android:visibility="@{FormatterSubmissionHelper.formatTestResultVisible(uiState.apiRequestState)}"
+            app:layout_constraintBottom_toTopOf="@+id/include_submission_test_result_consent_given_buttons"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/submission_test_result_consent_given_header"
+            app:uiState="@{uiState}" />
+
+        <androidx.constraintlayout.widget.Barrier
+            android:id="@+id/include_submission_test_result_consent_given_buttons"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:barrierAllowsGoneWidgets="false"
+            app:barrierDirection="top"
+            app:constraint_referenced_ids="submission_test_result_button_consent_given_continue" />
+
+        <Button
+            android:id="@+id/submission_test_result_button_consent_given_continue"
+            style="@style/buttonPrimary"
+            android:layout_width="@dimen/match_constraint"
+            android:layout_height="wrap_content"
+            android:text="@string/submission_test_result_positive_continue_button_with_symptoms"
+            android:visibility="@{FormatterSubmissionHelper.formatTestResultPositiveStepsVisible(uiState.deviceUiState)}"
+            app:layout_constraintBottom_toTopOf="@+id/submission_test_result_button__consent_given_continue_without_symptoms"
+            app:layout_constraintEnd_toStartOf="@+id/guideline_end"
+            app:layout_constraintStart_toStartOf="@id/guideline_start"
+            app:layout_constraintTop_toBottomOf="@+id/guideline_action_large" />
+
+        <Button
+            android:id="@+id/submission_test_result_button_consent_given_continue_without_symptoms"
+            style="@style/buttonLight"
+            android:layout_width="@dimen/match_constraint"
+            android:layout_height="wrap_content"
+            android:text="@string/submission_test_result_positive_continue_button_wo_symptoms"
+            android:visibility="@{FormatterSubmissionHelper.formatTestResultPositiveStepsVisible(uiState.deviceUiState)}"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@+id/guideline_end"
+            app:layout_constraintStart_toStartOf="@id/guideline_start"
+            app:layout_constraintTop_toBottomOf="@+id/submission_test_result_button_consent_given_continue" />
+
+        <include layout="@layout/merge_guidelines_side" />
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline_action_large"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            app:layout_constraintGuide_end="@dimen/guideline_action_large" />
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline_action"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            app:layout_constraintGuide_end="@dimen/guideline_action" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>
\ No newline at end of file