diff --git a/Corona-Warn-App/src/androidTest/java/testhelpers/RecyclerViewScrollAction.kt b/Corona-Warn-App/src/androidTest/java/testhelpers/RecyclerViewScrollAction.kt
new file mode 100644
index 0000000000000000000000000000000000000000..a8d9bc58fd391438b6feff49ad6425f074e8c2c6
--- /dev/null
+++ b/Corona-Warn-App/src/androidTest/java/testhelpers/RecyclerViewScrollAction.kt
@@ -0,0 +1,31 @@
+package testhelpers
+
+import android.view.View
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import androidx.test.espresso.UiController
+import androidx.test.espresso.ViewAction
+import androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom
+import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
+import org.hamcrest.CoreMatchers.allOf
+import org.hamcrest.Matcher
+
+fun recyclerScrollTo(position: Int? = null): ViewAction = RecyclerViewScrollAction(position)
+
+private class RecyclerViewScrollAction(private val position: Int? = null) : ViewAction {
+    override fun getDescription(): String {
+        return "scroll RecyclerView to bottom"
+    }
+
+    override fun getConstraints(): Matcher<View> {
+        return allOf(isAssignableFrom(RecyclerView::class.java), isDisplayed())
+    }
+
+    override fun perform(uiController: UiController?, view: View?) {
+        val recyclerView = view as RecyclerView
+        val itemCount = recyclerView.adapter?.itemCount
+        val itemPosition = position ?: itemCount?.minus(1) ?: 0
+        recyclerView.scrollToPosition(itemPosition)
+        uiController?.loopMainThreadUntilIdle()
+    }
+}