diff --git a/cypress/e2e/read-receipts/high-level.spec.ts b/cypress/e2e/read-receipts/high-level.spec.ts
index b3f25e4132533387be6d5c720a84f7d7b12d620b..c3d793b3008a036a974590cec4e45100bb73faa7 100644
--- a/cypress/e2e/read-receipts/high-level.spec.ts
+++ b/cypress/e2e/read-receipts/high-level.spec.ts
@@ -39,29 +39,15 @@ limitations under the License.
 
 /// <reference types="cypress" />
 
-import type { MatrixClient } from "matrix-js-sdk/src/matrix";
+import type { MatrixClient, MatrixEvent } from "matrix-js-sdk/src/matrix";
 import { HomeserverInstance } from "../../plugins/utils/homeserver";
 import {
-    assertMessageLoaded,
-    assertMessageNotLoaded,
     assertRead,
-    assertReadThread,
-    assertStillRead,
     assertUnread,
-    assertUnreadGreaterThan,
-    assertUnreadThread,
-    closeThreadsPanel,
     customEvent,
     goTo,
-    many,
     markAsRead,
     Message,
-    MessageContentSpec,
-    MessageFinder,
-    openThread,
-    openThreadList,
-    pageUp,
-    saveAndReload,
     sendMessageAsClient,
 } from "./read-receipts-utils";
 
@@ -76,19 +62,12 @@ describe("Read receipts", () => {
     let alphaRoomId: string;
     let bot: MatrixClient | undefined;
 
-    let messageFinder: MessageFinder;
-
-    function threadedOff(rootMessage: string, newMessage: string): MessageContentSpec {
-        return messageFinder.threadedOff(rootMessage, newMessage);
-    }
-
-    function manyThreadedOff(rootMessage: string, newMessages: Array<string>): Array<MessageContentSpec> {
-        return messageFinder.manyThreadedOff(rootMessage, newMessages);
-    }
-
-    function jumpTo(room: string, message: string, includeThreads = false) {
-        return messageFinder.jumpTo(room, message, includeThreads);
-    }
+    /**
+     * Map of message content -> event. Allows us to find e.g. edited or
+     * redacted messages even if their content has changed or disappeared from
+     * screen.
+     */
+    const messages = new Map<String, MatrixEvent>();
 
     before(() => {
         // Note: unusually for the Cypress tests in this repo, we share a single
@@ -109,7 +88,7 @@ describe("Read receipts", () => {
     });
 
     beforeEach(() => {
-        messageFinder = new MessageFinder();
+        messages.clear();
 
         // Create 2 rooms: Alpha & Beta. We join the bot to both of them
         cy.initTestUser(homeserver, userName)
@@ -217,217 +196,11 @@ describe("Read receipts", () => {
     });
 
     describe("Paging up", () => {
-        it("Paging up through old messages after a room is read leaves the room read", () => {
-            // Given lots of messages are in the room, but we have read them
-            goTo(room1);
-            receiveMessages(room2, many("Msg", 110));
-            assertUnread(room2, 110);
-            goTo(room2);
-            assertRead(room2);
-            goTo(room1);
-
-            // When we restart, so only recent messages are loaded
-            saveAndReload();
-            goTo(room2);
-            assertMessageNotLoaded("Msg0010");
-
-            // And we page up, loading in old messages
-            pageUp();
-            pageUp();
-            pageUp();
-            assertMessageLoaded("Msg0010");
-
-            // Then the room remains read
-            assertStillRead(room2);
-        });
-        it("Paging up through old messages of an unread room leaves the room unread", () => {
-            // Given lots of messages are in the room, and they are not read
-            goTo(room1);
-            receiveMessages(room2, many("x\ny\nz\nMsg", 40)); // newline to spread out messages
-            assertUnread(room2, 40);
-
-            // When I jump to a message in the middle and page up
-            jumpTo(room2, "x\ny\nz\nMsg0020");
-            pageUp();
-
-            // Then the room is still unread
-            assertUnreadGreaterThan(room2, 1);
-        });
-        it("Paging up to find old threads that were previously read leaves the room read", () => {
-            // Given lots of messages in threads are all read
-            goTo(room1);
-            receiveMessages(room2, [
-                "Root1",
-                "Root2",
-                "Root3",
-                ...manyThreadedOff("Root1", many("T", 20)),
-                ...manyThreadedOff("Root2", many("T", 20)),
-                ...manyThreadedOff("Root3", many("T", 20)),
-            ]);
-            goTo(room2);
-            assertUnread(room2, 60);
-            openThread("Root1");
-            assertUnread(room2, 40);
-            assertReadThread("Root1");
-            openThread("Root2");
-            assertUnread(room2, 20);
-            assertReadThread("Root2");
-            openThread("Root3");
-            assertRead(room2);
-            assertReadThread("Root3");
-
-            // When I restart and page up to load old thread roots
-            goTo(room1);
-            saveAndReload();
-            goTo(room2);
-            pageUp();
-
-            // Then the room and threads remain read
-            assertRead(room2);
-            assertReadThread("Root1");
-            assertReadThread("Root2");
-            assertReadThread("Root3");
-        });
-        it("Paging up to find old threads that were never read keeps the room unread", () => {
-            // Given lots of messages in threads that are unread
-            goTo(room1);
-            receiveMessages(room2, [
-                "Root1",
-                "Root2",
-                "Root3",
-                ...manyThreadedOff("Root1", many("T", 2)),
-                ...manyThreadedOff("Root2", many("T", 2)),
-                ...manyThreadedOff("Root3", many("T", 2)),
-                ...many("Msg", 100),
-            ]);
-            goTo(room2);
-            assertUnread(room2, 6);
-            assertUnreadThread("Root1");
-            assertUnreadThread("Root2");
-            assertUnreadThread("Root3");
-
-            // When I restart
-            closeThreadsPanel();
-            goTo(room1);
-            saveAndReload();
-
-            // Then the room remembers it's unread
-            // TODO: I (andyb) think this will fall in an encrypted room
-            assertUnread(room2, 6);
-
-            // And when I page up to load old thread roots
-            goTo(room2);
-            pageUp();
-
-            // Then the room remains unread
-            assertUnread(room2, 6);
-            assertUnreadThread("Root1");
-            assertUnreadThread("Root2");
-            assertUnreadThread("Root3");
-        });
-        it("Looking in thread view to find old threads that were never read makes the room unread", () => {
-            // Given lots of messages in threads that are unread
-            goTo(room1);
-            receiveMessages(room2, [
-                "Root1",
-                "Root2",
-                "Root3",
-                ...manyThreadedOff("Root1", many("T", 2)),
-                ...manyThreadedOff("Root2", many("T", 2)),
-                ...manyThreadedOff("Root3", many("T", 2)),
-                ...many("Msg", 100),
-            ]);
-            goTo(room2);
-            assertUnread(room2, 6);
-            assertUnreadThread("Root1");
-            assertUnreadThread("Root2");
-            assertUnreadThread("Root3");
-
-            // When I restart
-            closeThreadsPanel();
-            goTo(room1);
-            saveAndReload();
-
-            // Then the room remembers it's unread
-            // TODO: I (andyb) think this will fall in an encrypted room
-            assertUnread(room2, 6);
-
-            // And when I open the threads view
-            goTo(room2);
-            openThreadList();
-
-            // Then the room remains unread
-            assertUnread(room2, 6);
-            assertUnreadThread("Root1");
-            assertUnreadThread("Root2");
-            assertUnreadThread("Root3");
-        });
-        it("After marking room as read, paging up to find old threads that were never read leaves the room read", () => {
-            // Given lots of messages in threads that are unread but I marked as read on a main timeline message
-            goTo(room1);
-            receiveMessages(room2, [
-                "Root1",
-                "Root2",
-                "Root3",
-                ...manyThreadedOff("Root1", many("T", 2)),
-                ...manyThreadedOff("Root2", many("T", 2)),
-                ...manyThreadedOff("Root3", many("T", 2)),
-                ...many("Msg", 100),
-            ]);
-            markAsRead(room2);
-            assertRead(room2);
-
-            // When I restart
-            saveAndReload();
-
-            // Then the room remembers it's read
-            assertRead(room2);
-
-            // And when I page up to load old thread roots
-            goTo(room2);
-            pageUp();
-            pageUp();
-            pageUp();
-
-            // Then the room remains read
-            assertStillRead(room2);
-            assertReadThread("Root1");
-            assertReadThread("Root2");
-            assertReadThread("Root3");
-        });
-        // XXX: fails because we see a dot instead of an unread number - probably the server and client disagree
-        it.skip("After marking room as read based on a thread message, opening threads view to find old threads that were never read leaves the room read", () => {
-            // Given lots of messages in threads that are unread but I marked as read on a thread message
-            goTo(room1);
-            receiveMessages(room2, [
-                "Root1",
-                "Root2",
-                "Root3",
-                ...manyThreadedOff("Root1", many("T1-", 2)),
-                ...manyThreadedOff("Root2", many("T2-", 2)),
-                ...manyThreadedOff("Root3", many("T3-", 2)),
-                ...many("Msg", 100),
-                threadedOff("Msg0099", "Thread off 99"),
-            ]);
-            markAsRead(room2);
-            assertRead(room2);
-
-            // When I restart
-            saveAndReload();
-
-            // Then the room remembers it's read
-            assertRead(room2);
-
-            // And when I page up to load old thread roots
-            goTo(room2);
-            openThreadList();
-
-            // Then the room remains read
-            assertStillRead(room2);
-            assertReadThread("Root1");
-            assertReadThread("Root2");
-            assertReadThread("Root3");
-        });
+        it.skip("Paging up through old messages after a room is read leaves the room read", () => {});
+        it.skip("Paging up through old messages of an unread room leaves the room unread", () => {});
+        it.skip("Paging up to find old threads that were previously read leaves the room read", () => {});
+        it.skip("?? Paging up to find old threads that were never read marks the room unread", () => {});
+        it.skip("After marking room as read, paging up to find old threads that were never read leaves the room read", () => {});
     });
 
     describe("Room list order", () => {