diff --git a/tests/features/keycodes/test.ktest b/tests/features/keycodes/test.ktest
new file mode 100644
index 00000000..0878dbe2
--- /dev/null
+++ b/tests/features/keycodes/test.ktest
@@ -0,0 +1,36 @@
+VERSION 1
+TYPE Keycode
+NAME Keyboard Non Modifiers
+
+KEYSWITCH A 2 1
+KEYSWITCH S 2 2
+KEYSWITCH LeftShift 3 7
+
+RUN 10 ms
+PRESS A
+RUN 1 cycle
+EXPECT keyboard-report Key_A # Report should contain only 'a'
+
+RUN 25 ms
+RELEASE A
+
+EXPECT keyboard-report empty # Report should be empty
+
+# TODO, this should be generate a second test stanza
+# TYPE Keycode
+# NAME Keyboard Modifiers
+
+RUN 10 ms
+PRESS LeftShift
+
+RUN 1 cycle
+EXPECT keyboard-report Key_LeftShift # Report should contain only `shift`
+
+
+RUN 25 ms
+RELEASE LeftShift
+
+RUN 1 cycle
+
+EXPECT keyboard-report empty # No keys should be pressed
+
diff --git a/tests/features/keycodes/test/testcase.cpp b/tests/features/keycodes/test/testcase.cpp
deleted file mode 100644
index 9353e28b..00000000
--- a/tests/features/keycodes/test/testcase.cpp
+++ /dev/null
@@ -1,89 +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"
-
-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_LeftShift{3, 7};
-constexpr uint8_t keycode_LeftShift{Key_LeftShift.getKeyCode()};
-
-class Keycodes : public VirtualDeviceTest {};
-
-TEST_F(Keycodes, KeyboardNonModifier) {
-
- std::set expected_keycodes{};
-
- // Press `A`
- sim_.Press(key_addr_A);
- expected_keycodes.insert(Key_A.getKeyCode());
-
- auto state = VirtualDeviceTest::RunCycle();
-
- ASSERT_EQ(state->HIDReports()->Keyboard().size(), 1);
- EXPECT_THAT(state->HIDReports()->Keyboard(0).ActiveNonModifierKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes));
- EXPECT_THAT(state->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes));
-
- sim_.Release(key_addr_A);
- expected_keycodes.erase(Key_A.getKeyCode());
-
- state = VirtualDeviceTest::RunCycle();
-
- ASSERT_EQ(state->HIDReports()->Keyboard().size(), 1);
- EXPECT_THAT(state->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes));
-}
-
-TEST_F(Keycodes, KeyboardModifier) {
-
- std::set expected_keycodes{};
-
- // Press `LeftShift`
- sim_.Press(key_addr_LeftShift);
- expected_keycodes.insert(keycode_LeftShift);
-
- auto state = VirtualDeviceTest::RunCycle();
-
- ASSERT_EQ(state->HIDReports()->Keyboard().size(), 1);
- EXPECT_THAT(state->HIDReports()->Keyboard(0).ActiveModifierKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes));
- EXPECT_THAT(state->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes));
-
- uint8_t bit_LeftShift = keycode_LeftShift - HID_KEYBOARD_FIRST_MODIFIER;
- uint8_t expected_modifiers = 1 << bit_LeftShift;
-
- sim_.Release(key_addr_LeftShift);
- expected_keycodes.erase(Key_LeftShift.getKeyCode());
-
- state = VirtualDeviceTest::RunCycle();
-
- ASSERT_EQ(state->HIDReports()->Keyboard().size(), 1);
- EXPECT_THAT(state->HIDReports()->Keyboard(0).ActiveKeycodes(),
- ::testing::ElementsAreArray(expected_keycodes));
-}
-
-} // namespace
-} // namespace testing
-} // namespace kaleidoscope