diff --git a/tests/issues/970/test.ktest b/tests/issues/970/test.ktest
new file mode 100644
index 00000000..6bb39c17
--- /dev/null
+++ b/tests/issues/970/test.ktest
@@ -0,0 +1,25 @@
+NAME Issue 970 Qukeys min prior interval overflow
+
+KEYSWITCH A 2 1
+
+PRESS A
+RUN 10 ms
+
+RELEASE A
+RUN 1 cycle
+EXPECT keyboard-report Key_A # Report should contain only `A`
+RUN 1 cycle
+EXPECT keyboard-report empty # Report should be empty
+
+RUN 65536 ms
+
+PRESS A
+RUN 201 ms
+EXPECT keyboard-report Key_LeftGui # Report should contain only `LeftGui`
+
+RUN 10 ms
+
+RELEASE A
+# I'm not sure why it takes 2 cycles before the report is sent
+RUN 2 cycles
+EXPECT keyboard-report empty # Report should be empty
diff --git a/tests/issues/970/test/testcase.cpp b/tests/issues/970/test/testcase.cpp
deleted file mode 100644
index f00cd535..00000000
--- a/tests/issues/970/test/testcase.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-/* -*- mode: c++ -*-
- * Copyright (C) 2020 Keyboard.io, Inc.
- *
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, version 3.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program. If not, see .
- */
-
-#include "testing/setup-googletest.h"
-
-#include "../common.h"
-
-SETUP_GOOGLETEST();
-
-namespace kaleidoscope {
-namespace testing {
-namespace {
-
-constexpr KeyAddr key_addr_A{2, 1};
-constexpr KeyAddr key_addr_S{2, 2};
-constexpr KeyAddr key_addr_D{2, 3};
-constexpr KeyAddr key_addr_F{2, 4};
-constexpr KeyAddr key_addr_X{3, 2};
-
-using ::testing::IsEmpty;
-
-class QukeysBasic : public VirtualDeviceTest {
- protected:
- std::set expected_keycodes_ = {};
- std::unique_ptr state_ = nullptr;
-};
-
-TEST_F(QukeysBasic, TapQukeyAlone) {
- // Press `A`
- sim_.Press(key_addr_A);
-
- state_ = RunCycle();
-
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 0)
- << "There should be no HID report after the qukey is pressed";
- sim_.RunForMillis(20);
- // Release `A`
- sim_.Release(key_addr_A);
-
- sim_.RunCycles(2);
- state_ = RunCycle();
-
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 2)
- << "There should be two HID reports after the release of a tapped qukey";
-
- expected_keycodes_.insert(Key_A.getKeyCode());
- EXPECT_THAT(state_->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes_))
- << "The first report should include only `A`";
-
- expected_keycodes_.erase(Key_A.getKeyCode());
- EXPECT_THAT(state_->HIDReports()->Keyboard(1).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes_))
- << "The second report should be empty";
-
- state_ = RunCycle();
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 0);
-}
-
-TEST_F(QukeysBasic, MinPriorIntervalOverflow) {
- // Wait until integer overflow causes the timestamp to catch up
- sim_.RunForMillis(65535);
-
- // Press `A`
- sim_.Press(key_addr_A);
-
- state_ = RunCycle();
-
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 0);
-
- uint32_t t0 = Kaleidoscope.millisAtCycleStart();
-
- // To test the hold timeout, we check after every cycle to see if there's new
- // HID report. We can't just call `RunForMillis()` because we care about when
- // that report was sent.
- do {
- state_ = RunCycle();
- } while (state_->HIDReports()->Keyboard().size() == 0 &&
- (Kaleidoscope.millisAtCycleStart() - t0 < QUKEYS_HOLD_TIMEOUT + 1));
-
- uint32_t t1 = Kaleidoscope.millisAtCycleStart();
-
- EXPECT_THAT(t1 - t0, ::testing::Ge(QUKEYS_HOLD_TIMEOUT))
- << "The HID report should be sent after the hold timeout has elapsed";
-
- expected_keycodes_.insert(Key_LeftGui.getKeyCode());
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 1)
- << "There should be only one HID report";
- EXPECT_THAT(state_->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes_))
- << "The HID report should contain just `Key_LeftGui`";
-
- sim_.RunForMillis(100);
-
- sim_.Release(key_addr_A);
- sim_.RunCycles(2);
- state_ = RunCycle();
-
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 1)
- << "There should be a HID report immediately after the key is released";
-
- expected_keycodes_.erase(Key_LeftGui.getKeyCode());
- EXPECT_THAT(state_->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes_))
- << "The HID report should be empty at this point";
-
- state_ = RunCycle();
- ASSERT_EQ(state_->HIDReports()->Keyboard().size(), 0);
-}
-
-} // namespace
-} // namespace testing
-} // namespace kaleidoscope