diff --git a/Makefile b/Makefile
index df7e404..3a72d3d 100644
--- a/Makefile
+++ b/Makefile
@@ -220,22 +220,6 @@
 CFLAGS += -DDETACHABLE=0
 endif
 
-# Enable the menu-based user interface.
-ifneq ($(filter-out 0,${MENU_UI}),)
-CFLAGS += -DMENU_UI=1
-else
-CFLAGS += -DMENU_UI=0
-endif
-
-# LEGACY_MENU_UI controls whether to enable legacy menu UI, which is used with
-# devices that don't have a keyboard (detachables).
-# Pass LEGACY_MENU_UI= (or =0) to make to disable feature.
-ifneq ($(filter-out 0,${LEGACY_MENU_UI}),)
-CFLAGS += -DLEGACY_MENU_UI=1
-else
-CFLAGS += -DLEGACY_MENU_UI=0
-endif
-
 # pass DIAGNOSTIC_UI= (or =0) to make to disable feature
 ifneq ($(filter-out 0,${DIAGNOSTIC_UI}),)
 CFLAGS += -DDIAGNOSTIC_UI=1
@@ -424,11 +408,7 @@
 $(if ${FIRMWARE_ARCH},FWLIB_SRCS,TESTLIB_SRCS) += \
 	firmware/2lib/2ui.c \
 	firmware/2lib/2ui_screens.c \
-	firmware/lib/vboot_audio.c \
-	firmware/lib/vboot_ui_legacy.c \
-	firmware/lib/vboot_ui_legacy_clamshell.c \
-	firmware/lib/vboot_ui_legacy_menu.c \
-	firmware/lib/vboot_ui_legacy_wilco.c
+	firmware/lib/vboot_audio.c
 
 # TPM lightweight command library
 ifeq (${TPM2_MODE},)
@@ -447,14 +427,6 @@
 	firmware/lib/tpm_lite/mocked_tlcl.c
 endif
 
-ifneq (${VENDOR_DATA_LENGTH},)
-CFLAGS += -DVENDOR_DATA_LENGTH=${VENDOR_DATA_LENGTH}
-else ifeq (${FIRMWARE_ARCH},)
-CFLAGS += -DVENDOR_DATA_LENGTH=4
-else
-CFLAGS += -DVENDOR_DATA_LENGTH=0
-endif
-
 ifeq (${FIRMWARE_ARCH},)
 # Include BIOS stubs in the firmware library when compiling for host
 # TODO: split out other stub funcs too
@@ -720,10 +692,6 @@
 	tests/vboot_api_kernel4_tests \
 	tests/vboot_api_kernel_tests \
 	tests/vboot_kernel_tests \
-	tests/vboot_ui_legacy_clamshell_beep_tests \
-	tests/vboot_ui_legacy_clamshell_tests \
-	tests/vboot_ui_legacy_menu_tests \
-	tests/vboot_ui_legacy_tests \
 	tests/verify_kernel
 
 ifeq (${MOCK_TPM}${TPM2_MODE},)
@@ -1268,10 +1236,6 @@
 	${RUNTEST} ${BUILD_RUN}/tests/vboot_api_kernel4_tests
 	${RUNTEST} ${BUILD_RUN}/tests/vboot_api_kernel_tests
 	${RUNTEST} ${BUILD_RUN}/tests/vboot_kernel_tests
-	${RUNTEST} ${BUILD_RUN}/tests/vboot_ui_legacy_clamshell_beep_tests
-	${RUNTEST} ${BUILD_RUN}/tests/vboot_ui_legacy_clamshell_tests
-	${RUNTEST} ${BUILD_RUN}/tests/vboot_ui_legacy_menu_tests
-	${RUNTEST} ${BUILD_RUN}/tests/vboot_ui_legacy_tests
 
 .PHONY: run2tests
 run2tests: install_for_test
diff --git a/firmware/2lib/include/2api.h b/firmware/2lib/include/2api.h
index 9448e12..94f0df5 100644
--- a/firmware/2lib/include/2api.h
+++ b/firmware/2lib/include/2api.h
@@ -182,8 +182,12 @@
 	 */
 	VB2_CONTEXT_NVDATA_V2 = (1 << 18),
 
-	/* Allow vendor data to be set via the vendor data ui. */
-	VB2_CONTEXT_VENDOR_DATA_SETTABLE = (1 << 19),
+	/*
+	 * Allow vendor data to be set via the vendor data ui.
+	 *
+	 * Deprecated with CL:2512740.
+	 */
+	VB2_CONTEXT_DEPRECATED_VENDOR_DATA_SETTABLE = (1 << 19),
 
 	/*
 	 * Caller may set this before running vb2api_fw_phase1.  In this case,
diff --git a/firmware/2lib/include/2return_codes.h b/firmware/2lib/include/2return_codes.h
index 4abe16a..49f9935 100644
--- a/firmware/2lib/include/2return_codes.h
+++ b/firmware/2lib/include/2return_codes.h
@@ -728,8 +728,9 @@
 	/* AUXFW peripheral busy. Cannot upgrade firmware at present. */
 	VB2_ERROR_EX_AUXFW_PERIPHERAL_BUSY,
 
-	/* Error setting vendor data (see: VbExSetVendorData). */
-	VB2_ERROR_EX_SET_VENDOR_DATA,
+	/* Error setting vendor data (see: VbExSetVendorData).
+	 * Deprecated: functionality removed with legacy UI (b/167643628) */
+	VB2_ERROR_DEPRECATED_EX_SET_VENDOR_DATA,
 
 	/* The memory test is running but the output buffer was unchanged. */
 	VB2_ERROR_EX_DIAG_TEST_RUNNING,
diff --git a/firmware/include/vboot_api.h b/firmware/include/vboot_api.h
index d55fde2..739019a 100644
--- a/firmware/include/vboot_api.h
+++ b/firmware/include/vboot_api.h
@@ -252,146 +252,6 @@
  */
 void VbExStreamClose(VbExStream_t stream);
 
-
-/*****************************************************************************/
-/* Display */
-
-/* Predefined (default) screens for VbExDisplayScreen(). */
-enum VbScreenType_t {
-	/* Blank (clear) screen */
-	VB_SCREEN_BLANK = 0,
-	/* Developer - warning */
-	VB_SCREEN_DEVELOPER_WARNING = 0x101,
-	/* REMOVED: Developer - easter egg (0x102) */
-	/* REMOVED: Recovery - remove inserted devices (0x201) */
-	/* Recovery - insert recovery image */
-	VB_SCREEN_RECOVERY_INSERT   = 0x202,
-	/* Recovery - inserted image invalid */
-	VB_SCREEN_RECOVERY_NO_GOOD  = 0x203,
-	/* Recovery - confirm dev mode */
-	VB_SCREEN_RECOVERY_TO_DEV   = 0x204,
-	/* Developer - confirm normal mode */
-	VB_SCREEN_DEVELOPER_TO_NORM = 0x205,
-	/* Please wait - programming EC */
-	VB_SCREEN_WAIT              = 0x206,
-	/* Confirm after DEVELOPER_TO_NORM */
-	VB_SCREEN_TO_NORM_CONFIRMED = 0x207,
-	/* Broken screen shown after verification failure */
-	VB_SCREEN_OS_BROKEN         = 0x208,
-	/* REMOVED: Display base screen (no icons, no text) (0x209) */
-	/* Detachable Menu - Developer Warning */
-	VB_SCREEN_DEVELOPER_WARNING_MENU = 0x20a,
-	/* Detachable Menu - Developer Boot */
-	VB_SCREEN_DEVELOPER_MENU = 0x20b,
-	/* REMOVED: Detachable Menu - Recovery (0x20c) */
-	/* Detachable Menu - Confirm Dev Mode */
-	VB_SCREEN_RECOVERY_TO_DEV_MENU = 0x20d,
-	/* Detachable Menu - Confirm Normal Mode */
-	VB_SCREEN_DEVELOPER_TO_NORM_MENU = 0x20e,
-	/* Detachable Menu - Languages */
-	VB_SCREEN_LANGUAGES_MENU = 0x20f,
-	/* Detachable Menu - Options */
-	VB_SCREEN_OPTIONS_MENU = 0x210,
-	/* REMOVED: Alt OS picker screen (0x211) */
-	/* Alt firmware picker screen (for keyboard UI) */
-	VB_SCREEN_ALT_FW_PICK = 0x212,
-	/* Alt firmware menu screen (for detachable UI ) */
-	VB_SCREEN_ALT_FW_MENU = 0x213,
-	/* 0x300-0x350 reserved for device-specific screens */
-	/* Vendor data not set warning screen */
-	VB_COMPLETE_VENDOR_DATA = 0x300,
-	/* Set vendor data menu screen */
-	VB_SCREEN_SET_VENDOR_DATA = 0x301,
-	/* Confirm vendor data menu screen */
-	VB_SCREEN_CONFIRM_VENDOR_DATA = 0x302,
-	/* Confirm reboot for running diagnostics rom */
-	VB_SCREEN_CONFIRM_DIAG = 0x303,
-};
-
-/* Flags to control behavior of device-specific screens. */
-enum VbVendorDataFlags_t {
-	/* When set display a cursor after the prompt */
-	VB_VENDOR_DATA_SHOW_CURSOR = 1 << 0,
-	/* When set only redraw the cursor */
-	VB_VENDOR_DATA_ONLY_DRAW_CURSOR = 1 << 1,
-};
-
-/**
- * Extra data needed when displaying vendor data screens
- */
-typedef struct VbVendorData
-{
-	/* Current state of the the vendor data input */
-	const char *input_text;
-	/* Flags (See VbVendorDataFlags_t) */
-	uint32_t flags;
-	/* Current confirmation selection for new vendor data */
-	uint32_t selected_index;
-} VbVendorData;
-
-/**
- * Extra data that may be used when displaying a screen
- */
-typedef struct VbScreenData
-{
-	union {
-		VbVendorData vendor_data;
-	};
-} VbScreenData;
-
-/**
- * Display a predefined screen; see VB_SCREEN_* for valid screens.
- *
- * This is a backup method of screen display, intended for use if the GBB does
- * not contain a full set of bitmaps.  It is acceptable for the backup screen
- * to be simple ASCII text such as "NO GOOD" or "INSERT"; these screens should
- * only be seen during development.
- */
-vb2_error_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale,
-			    const VbScreenData *data);
-
-/**
- * Display a predefined menu screen; see VB_SCREEN_* for valid screens.
- *
- * @param screen_type       ID of screen to draw
- * @param locale            language to display
- * @param selected_index    Index of menu item that is currently selected.
- * @param disabled_idx_mask Bitmap for enabling/disabling certain menu items.
- *                          each bit corresponds to the menu item's index.
- * @param redraw_base       Setting 1 will force a full redraw of the screen
- *
- * @return VB2_SUCCESS or error code on error.
- */
-vb2_error_t VbExDisplayMenu(uint32_t screen_type, uint32_t locale,
-			  uint32_t selected_index, uint32_t disabled_idx_mask,
-			  uint32_t redraw_base);
-
-/**
- * Display a string containing debug information on the screen, rendered in a
- * platform-dependent font.  Should be able to handle newlines '\n' in the
- * string.  Firmware must support displaying at least 20 lines of text, where
- * each line may be at least 80 characters long.  If the firmware has its own
- * debug state, it may display it to the screen below this information if the
- * full_info parameter is set.
- *
- * @param info_str	The debug string to display
- * @param full_info	1 if firmware should append its own info, 0 if not
- *
- * @return VB2_SUCCESS or error code on error.
- */
-vb2_error_t VbExDisplayDebugInfo(const char *info_str, int full_info);
-
-/**
- * Write vendor data to read-only VPD
- *
- * @param vendor_data_value   The value of vendor data to write to VPD. The
- *                            string length will be exactly VENDOR_DATA_LENGTH
- *                            characters and null-terminated.
- *
- * @return VB2_SUCCESS or error code on error.
- */
-vb2_error_t VbExSetVendorData(const char *vendor_data_value);
-
 /*****************************************************************************/
 /* Keyboard and switches */
 
@@ -522,21 +382,6 @@
  */
 vb2_error_t VbExLegacy(enum VbAltFwIndex_t altfw_num);
 
-enum vb_altfw {
-	VB_ALTFW_COUNT	= 9,	/* We allow 9 bootloaders, numbered 1-9 */
-};
-
-/**
- * Get a mask of available alternative firmware options
- *
- * There are up to 9 bootloaders, numbered 1 to 9, using bits 1 to 9 of this
- * mask. Bit 0 is unused.
- *
- * @return Bit mask indicating which bootloaders are present (bit n indicates
- *	bootloader n is present)
- */
-uint32_t VbExGetAltFwIdxMask(void);
-
 #ifdef __cplusplus
 }
 #endif  /* __cplusplus */
diff --git a/firmware/lib/include/vboot_kernel.h b/firmware/lib/include/vboot_kernel.h
index 81e523d..661f0c4 100644
--- a/firmware/lib/include/vboot_kernel.h
+++ b/firmware/lib/include/vboot_kernel.h
@@ -106,49 +106,4 @@
  */
 vb2_error_t VbTryLoadKernel(struct vb2_context *ctx, uint32_t get_info_flags);
 
-/* Flags for VbUserConfirms() */
-#define VB_CONFIRM_MUST_TRUST_KEYBOARD (1 << 0)
-#define VB_CONFIRM_SPACE_MEANS_NO      (1 << 1)
-
-/**
- * Ask the user to confirm something.
- *
- * We should display whatever the question is first, then call this. ESC is
- * always "no", ENTER is always "yes", and we'll specify what SPACE means. We
- * don't return until one of those keys is pressed, or until asked to shut
- * down.
- *
- * Additionally, in some situations we don't accept confirmations from an
- * untrusted keyboard (such as a USB device).  In those cases, a recovery
- * button press is needed for confirmation, instead of ENTER.
- *
- * Returns: 1=yes, 0=no, -1 = shutdown.
- */
-int VbUserConfirms(struct vb2_context *ctx, uint32_t confirm_flags);
-
-/**
- * Handle a developer-mode boot using legacy clamshell UI.
- */
-vb2_error_t VbBootDeveloperLegacyClamshell(struct vb2_context *ctx);
-
-/**
- * Handle a diagnostic-mode boot using legacy clamshell UI.
- */
-vb2_error_t VbBootDiagnosticLegacyClamshell(struct vb2_context *ctx);
-
-/**
- * Handle a recovery-mode boot using legacy clamshell UI.
- */
-vb2_error_t VbBootRecoveryLegacyClamshell(struct vb2_context *ctx);
-
-/**
- * Handle a developer-mode boot using legacy menu UI.
- */
-vb2_error_t VbBootDeveloperLegacyMenu(struct vb2_context *ctx);
-
-/**
- * Handle a recovery-mode boot using legacy menu UI.
- */
-vb2_error_t VbBootRecoveryLegacyMenu(struct vb2_context *ctx);
-
 #endif  /* VBOOT_REFERENCE_VBOOT_KERNEL_H_ */
diff --git a/firmware/lib/include/vboot_ui_legacy.h b/firmware/lib/include/vboot_ui_legacy.h
deleted file mode 100644
index a0f6f12..0000000
--- a/firmware/lib/include/vboot_ui_legacy.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Common code used by both legacy_clamshell_ui and legacy_menu_ui.
- */
-
-#ifndef VBOOT_REFERENCE_VBOOT_UI_LEGACY_H_
-#define VBOOT_REFERENCE_VBOOT_UI_LEGACY_H_
-
-extern const char dev_disable_msg[];
-
-vb2_error_t VbDisplayScreen(struct vb2_context *ctx, uint32_t screen, int force,
-			    const VbScreenData *data);
-vb2_error_t VbDisplayMenu(struct vb2_context *ctx,
-			uint32_t screen, int force, uint32_t selected_index,
-			uint32_t disabled_idx_mask);
-vb2_error_t VbDisplayDebugInfo(struct vb2_context *ctx);
-vb2_error_t VbCheckDisplayKey(struct vb2_context *ctx, uint32_t key,
-			      uint32_t screen, const VbScreenData *data);
-
-#define KEY_DELAY_MS	20	/* Delay between key scans in UI loops */
-
-enum vb2_beep_type {
-	VB_BEEP_FAILED,		/* Permitted but the operation failed */
-	VB_BEEP_NOT_ALLOWED,	/* Operation disabled by user setting */
-};
-
-/**
- * Reinitialize global state. This should only need to be called
- * by vboot_ui::vb2_init_ui() for init tests.
- */
-void vb2_reset_power_button(void);
-
-/**
- * Emit beeps to indicate an error
- */
-void vb2_error_beep(enum vb2_beep_type beep);
-
-/**
- * Prints a message to screen, logs a possibly different message to log,
- * and beeps to notify user.
- *
- * @print_msg	Display message. NULL message will be ignored.
- * @log_msg	Log message. If NULL, uses @print_msg (if that's not NULL).
- * @beep	Type of beep sound.
- */
-void vb2_error_notify(const char *print_msg,
-		      const char *log_msg,
-		      enum vb2_beep_type beep);
-
-/** Display an error and beep to indicate that altfw is not available */
-void vb2_error_no_altfw(void);
-
-/**
- * Jump to a bootloader if possible
- *
- * This checks if the operation is permitted. If it is, then it jumps to the
- * selected bootloader and execution continues there, never returning.
- *
- * Will beep and return if one of the following is true:
- *   - operation is not permitted (allowed == 0)
- *   - vboot data fails to commit
- *   - secdata_kernel fails to lock
- *   - bootloader cannot be found
- *   - bootloader fails to start
- *
- * @param ctx		Context pointer
- * @param allowed	1 if allowed, 0 if not allowed
- * @param altfw_num	Number of bootloader to start (0=any, 1=first, etc.)
- */
-void vb2_try_altfw(struct vb2_context *ctx, int allowed,
-		   enum VbAltFwIndex_t altfw_num);
-
-/**
- * Checks GBB flags against VbExIsShutdownRequested() shutdown request to
- * determine if a shutdown is required.
- *
- * Returns zero or more of the following flags (if any are set then typically
- * shutdown is required):
- * VB_SHUTDOWN_REQUEST_LID_CLOSED
- * VB_SHUTDOWN_REQUEST_POWER_BUTTON
- */
-int vb2_want_shutdown(struct vb2_context *ctx, uint32_t key);
-
-#endif  /* VBOOT_REFERENCE_VBOOT_UI_LEGACY_H_ */
diff --git a/firmware/lib/include/vboot_ui_legacy_menu_private.h b/firmware/lib/include/vboot_ui_legacy_menu_private.h
deleted file mode 100644
index 9c1a6b4..0000000
--- a/firmware/lib/include/vboot_ui_legacy_menu_private.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Private declarations for vboot_ui_legacy_menu.c. Defined here for easier
- * testing.
- */
-
-#ifndef VBOOT_REFERENCE_VBOOT_UI_LEGACY_MENU_PRIVATE_H_
-#define VBOOT_REFERENCE_VBOOT_UI_LEGACY_MENU_PRIVATE_H_
-
-#include "2api.h"
-
-struct vb2_menu_item {
-	const char *text;
-	vb2_error_t (*action)(struct vb2_context *ctx);
-};
-
-struct vb2_menu {
-	const char *name;
-	uint16_t size;
-	uint16_t screen;
-	struct vb2_menu_item *items;
-};
-
-typedef enum _VB_MENU {
-	VB_MENU_DEV_WARNING,
-	VB_MENU_DEV,
-	VB_MENU_TO_NORM,
-	VB_MENU_TO_DEV,
-	VB_MENU_LANGUAGES,
-	VB_MENU_OPTIONS,
-	VB_MENU_RECOVERY_INSERT,
-	VB_MENU_RECOVERY_NO_GOOD,
-	VB_MENU_RECOVERY_BROKEN,
-	VB_MENU_TO_NORM_CONFIRMED,
-	VB_MENU_ALT_FW,
-	VB_MENU_COUNT,
-} VB_MENU;
-
-typedef enum _VB_DEV_WARNING_MENU {
-	VB_WARN_OPTIONS,
-	VB_WARN_DBG_INFO,
-	VB_WARN_ENABLE_VER,
-	VB_WARN_POWER_OFF,
-	VB_WARN_LANGUAGE,
-	VB_WARN_COUNT,
-} VB_DEV_WARNING_MENU;
-
-typedef enum _VB_DEV_MENU {
-	VB_DEV_NETWORK,
-	VB_DEV_LEGACY,
-	VB_DEV_USB,
-	VB_DEV_DISK,
-	VB_DEV_CANCEL,
-	VB_DEV_POWER_OFF,
-	VB_DEV_LANGUAGE,
-	VB_DEV_COUNT,
-} VB_DEV_MENU;
-
-typedef enum _VB_TO_NORM_MENU {
-	VB_TO_NORM_CONFIRM,
-	VB_TO_NORM_CANCEL,
-	VB_TO_NORM_POWER_OFF,
-	VB_TO_NORM_LANGUAGE,
-	VB_TO_NORM_COUNT,
-} VB_TO_NORM_MENU;
-
-typedef enum _VB_TO_DEV_MENU {
-	VB_TO_DEV_CONFIRM,
-	VB_TO_DEV_CANCEL,
-	VB_TO_DEV_POWER_OFF,
-	VB_TO_DEV_LANGUAGE,
-	VB_TO_DEV_COUNT,
-} VB_TO_DEV_MENU;
-
-// TODO: currently we're only supporting
-// english.  Will need to somehow find mapping
-// from language to localization index.
-typedef enum _VB_LANGUAGES_MENU {
-	VB_LANGUAGES_EN_US,
-	VB_LANGUAGES_COUNT,
-} VB_LANGUAGES_MENU;
-
-typedef enum _VB_OPTIONS_MENU {
-	VB_OPTIONS_DBG_INFO,
-	VB_OPTIONS_CANCEL,
-	VB_OPTIONS_POWER_OFF,
-	VB_OPTIONS_LANGUAGE,
-	VB_OPTIONS_COUNT,
-} VB_OPTIONS_MENU;
-
-#endif  /* VBOOT_REFERENCE_VBOOT_UI_LEGACY_MENU_PRIVATE_H_ */
diff --git a/firmware/lib/include/vboot_ui_legacy_wilco.h b/firmware/lib/include/vboot_ui_legacy_wilco.h
deleted file mode 100644
index 397777e..0000000
--- a/firmware/lib/include/vboot_ui_legacy_wilco.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Wilco-specific feature support for vboot_ui
- */
-
-#ifndef VBOOT_REFERENCE_VBOOT_UI_WILCO_H_
-#define VBOOT_REFERENCE_VBOOT_UI_WILCO_H_
-
-#define CURSOR_BLINK_MS 400	/* Speed that the vendor data cursor blinks */
-
-/*
- * User interface for setting the vendor data in VPD
- */
-vb2_error_t vb2_vendor_data_ui(struct vb2_context *ctx);
-
-/*
- * Determine whether the user has pressed the keys to enter diagnostics mode
- */
-vb2_error_t vb2_check_diagnostic_key(struct vb2_context *ctx, uint32_t key);
-
-/*
- * User interface for confirming launch of diagnostics rom
- *
- * This asks the user to confirm the launch of the diagnostics rom. The user
- * can press the power button to confirm or press escape. There is a 30-second
- * timeout which acts the same as escape.
- */
-vb2_error_t vb2_diagnostics_ui(struct vb2_context *ctx);
-
-#endif  /* VBOOT_REFERENCE_VBOOT_UI_WILCO_H_ */
diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c
index a910b55..e2d1431 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -230,30 +230,16 @@
 			VB2_DEBUG("NO_BOOT in RECOVERY mode\n");
 
 		/* Recovery boot.  This has UI. */
-		if (MENU_UI) {
-			if (vb2_allow_recovery(ctx))
-				VB2_TRY(vb2_manual_recovery_menu(ctx));
-			else
-				VB2_TRY(vb2_broken_recovery_menu(ctx));
-		} else if (LEGACY_MENU_UI) {
-			VB2_TRY(VbBootRecoveryLegacyMenu(ctx));
-		} else {
-			VB2_TRY(VbBootRecoveryLegacyClamshell(ctx));
-		}
+		if (vb2_allow_recovery(ctx))
+			VB2_TRY(vb2_manual_recovery_menu(ctx));
+		else
+			VB2_TRY(vb2_broken_recovery_menu(ctx));
 	} else if (DIAGNOSTIC_UI && vb2api_diagnostic_ui_enabled(ctx) &&
 		   vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST)) {
 		vb2_nv_set(ctx, VB2_NV_DIAG_REQUEST, 0);
 
 		/* Diagnostic boot.  This has UI. */
-		if (MENU_UI)
-			VB2_TRY(vb2_diagnostic_menu(ctx));
-		else
-			/*
-			 * Only power button is used for input so no
-			 * detachable-specific UI is needed.  This mode is also
-			 * 1-shot so it's placed before developer mode.
-			 */
-			VB2_TRY(VbBootDiagnosticLegacyClamshell(ctx));
+		VB2_TRY(vb2_diagnostic_menu(ctx));
 		/*
 		 * The diagnostic menu should either boot a rom, or
 		 * return either of reboot or shutdown.
@@ -261,12 +247,7 @@
 		return VB2_REQUEST_REBOOT;
 	} else if (ctx->flags & VB2_CONTEXT_DEVELOPER_MODE) {
 		/* Developer boot.  This has UI. */
-		if (MENU_UI)
-			VB2_TRY(vb2_developer_menu(ctx));
-		else if (LEGACY_MENU_UI)
-			VB2_TRY(VbBootDeveloperLegacyMenu(ctx));
-		else
-			VB2_TRY(VbBootDeveloperLegacyClamshell(ctx));
+		VB2_TRY(vb2_developer_menu(ctx));
 	} else {
 		/* Normal boot */
 		VB2_TRY(vb2_normal_boot(ctx));
diff --git a/firmware/lib/vboot_ui_legacy.c b/firmware/lib/vboot_ui_legacy.c
deleted file mode 100644
index 5f84716..0000000
--- a/firmware/lib/vboot_ui_legacy.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/* Copyright 2018 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * High-level firmware wrapper API - user interface for RW firmware
- */
-
-#include "2api.h"
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2sysincludes.h"
-#include "vboot_api.h"
-#include "vboot_kernel.h"
-#include "vboot_test.h"
-#include "vboot_ui_legacy.h"
-
-const char dev_disable_msg[] =
-	"Developer mode is disabled on this device by system policy.\n"
-	"For more information, see http://dev.chromium.org/chromium-os/fwmp\n"
-	"\n";
-
-static void Uint8ToString(char *buf, uint8_t val)
-{
-	const char *trans = "0123456789abcdef";
-	*buf++ = trans[val >> 4];
-	*buf = trans[val & 0xF];
-}
-
-static void FillInSha1Sum(char *outbuf, struct vb2_packed_key *key)
-{
-	uint8_t *buf = ((uint8_t *)key) + key->key_offset;
-	uint64_t buflen = key->key_size;
-	uint8_t digest[VB2_SHA1_DIGEST_SIZE];
-	int i;
-
-	vb2_digest_buffer(buf, buflen, VB2_HASH_SHA1, digest, sizeof(digest));
-	for (i = 0; i < sizeof(digest); i++) {
-		Uint8ToString(outbuf, digest[i]);
-		outbuf += 2;
-	}
-	*outbuf = '\0';
-}
-
-#define DEBUG_INFO_SIZE 1024
-#define DEBUG_INFO_APPEND(format, args...) do { \
-	if (used < DEBUG_INFO_SIZE) \
-		used += snprintf(buf + used, DEBUG_INFO_SIZE - used, format, \
-				 ## args); \
-} while (0)
-
-vb2_error_t VbDisplayDebugInfo(struct vb2_context *ctx)
-{
-	struct vb2_shared_data *sd = vb2_get_sd(ctx);
-	struct vb2_gbb_header *gbb = vb2_get_gbb(ctx);
-	struct vb2_workbuf wb;
-	char buf[DEBUG_INFO_SIZE] = "";
-	char sha1sum[VB2_SHA1_DIGEST_SIZE * 2 + 1];
-	int32_t used = 0;
-	vb2_error_t ret;
-	uint32_t i;
-
-	vb2_workbuf_from_ctx(ctx, &wb);
-
-	/* Add hardware ID */
-	{
-		char hwid[VB2_GBB_HWID_MAX_SIZE];
-		uint32_t size = sizeof(hwid);
-		ret = vb2api_gbb_read_hwid(ctx, hwid, &size);
-		if (ret)
-			strcpy(hwid, "{INVALID}");
-		DEBUG_INFO_APPEND("HWID: %s", hwid);
-	}
-
-	/* Add recovery reason and subcode */
-	i = vb2_nv_get(ctx, VB2_NV_RECOVERY_SUBCODE);
-	DEBUG_INFO_APPEND("\nrecovery_reason: %#.2x / %#.2x  %s",
-			  sd->recovery_reason, i,
-			  vb2_get_recovery_reason_string(sd->recovery_reason));
-
-	/* Add vb2_context and vb2_shared_data flags */
-	DEBUG_INFO_APPEND("\ncontext.flags: %#.16" PRIx64, ctx->flags);
-	DEBUG_INFO_APPEND("\nshared_data.flags: %#.8x", sd->flags);
-	DEBUG_INFO_APPEND("\nshared_data.status: %#.8x", sd->status);
-
-	/* Add raw contents of nvdata */
-	DEBUG_INFO_APPEND("\nnvdata:");
-	if (vb2_nv_get_size(ctx) > 16)  /* Multi-line starts on next line */
-		DEBUG_INFO_APPEND("\n  ");
-	for (i = 0; i < vb2_nv_get_size(ctx); i++) {
-		/* Split into 16-byte blocks */
-		if (i > 0 && i % 16 == 0)
-			DEBUG_INFO_APPEND("\n  ");
-		DEBUG_INFO_APPEND(" %02x", ctx->nvdata[i]);
-	}
-
-	/* Add dev_boot_usb flag */
-	i = vb2_nv_get(ctx, VB2_NV_DEV_BOOT_EXTERNAL);
-	DEBUG_INFO_APPEND("\ndev_boot_usb: %d", i);
-
-	/* Add dev_boot_legacy flag */
-	i = vb2_nv_get(ctx, VB2_NV_DEV_BOOT_LEGACY);
-	DEBUG_INFO_APPEND("\ndev_boot_legacy: %d", i);
-
-	/* Add dev_default_boot flag */
-	i = vb2_nv_get(ctx, VB2_NV_DEV_DEFAULT_BOOT);
-	DEBUG_INFO_APPEND("\ndev_default_boot: %d", i);
-
-	/* Add dev_boot_signed_only flag */
-	i = vb2_nv_get(ctx, VB2_NV_DEV_BOOT_SIGNED_ONLY);
-	DEBUG_INFO_APPEND("\ndev_boot_signed_only: %d", i);
-
-	/* Add TPM versions */
-	DEBUG_INFO_APPEND("\nTPM: fwver=%#.8x kernver=%#.8x",
-			  sd->fw_version_secdata, sd->kernel_version_secdata);
-
-	/* Add GBB flags */
-	DEBUG_INFO_APPEND("\ngbb.flags: %#.8x", gbb->flags);
-
-	/* Add sha1sum for Root & Recovery keys */
-	{
-		struct vb2_packed_key *key;
-		struct vb2_workbuf wblocal = wb;
-		ret = vb2_gbb_read_root_key(ctx, &key, NULL, &wblocal);
-		if (!ret) {
-			FillInSha1Sum(sha1sum, key);
-			DEBUG_INFO_APPEND("\ngbb.rootkey: %s", sha1sum);
-		}
-	}
-
-	{
-		struct vb2_packed_key *key;
-		struct vb2_workbuf wblocal = wb;
-		ret = vb2_gbb_read_recovery_key(ctx, &key, NULL, &wblocal);
-		if (!ret) {
-			FillInSha1Sum(sha1sum, key);
-			DEBUG_INFO_APPEND("\ngbb.recovery_key: %s", sha1sum);
-		}
-	}
-
-	/* If we're in dev-mode, show the kernel subkey that we expect, too. */
-	if (!(ctx->flags & VB2_CONTEXT_RECOVERY_MODE) &&
-	    sd->kernel_key_offset) {
-		struct vb2_packed_key *key =
-			vb2_member_of(sd, sd->kernel_key_offset);
-		FillInSha1Sum(sha1sum, key);
-		DEBUG_INFO_APPEND("\nkernel_subkey: %s", sha1sum);
-	}
-
-	/* Make sure we finish with a newline */
-	DEBUG_INFO_APPEND("\n");
-
-	/* TODO: add more interesting data:
-	 * - Information on current disks */
-
-	buf[DEBUG_INFO_SIZE - 1] = '\0';
-	VB2_DEBUG("[TAB] Debug Info:\n%s", buf);
-	return VbExDisplayDebugInfo(buf, 1);
-}
-
-vb2_error_t VbCheckDisplayKey(struct vb2_context *ctx, uint32_t key,
-			      uint32_t screen, const VbScreenData *data)
-{
-	uint32_t loc = 0;
-	uint32_t count = 0;
-
-	switch (key) {
-	case '\t':
-		/* Tab = display debug info */
-		return VbDisplayDebugInfo(ctx);
-	case VB_KEY_ESC:
-		/* Force redraw current screen (to clear Tab debug output) */
-		return VbDisplayScreen(ctx, screen, 1, data);
-	case VB_KEY_LEFT:
-	case VB_KEY_RIGHT:
-	case VB_KEY_UP:
-	case VB_KEY_DOWN:
-		/* Arrow keys = change localization */
-		loc = vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX);
-		count = vb2ex_get_locale_count();
-		if (count == 0)
-			loc = 0;  /* No localization count (bad GBB?) */
-		else if (VB_KEY_RIGHT == key || VB_KEY_UP == key)
-			loc = (loc < count - 1 ? loc + 1 : 0);
-		else
-			loc = (loc > 0 ? loc - 1 : count - 1);
-		VB2_DEBUG("VbCheckDisplayKey() - change localization to %d\n",
-			  (int)loc);
-		vb2_nv_set(ctx, VB2_NV_LOCALIZATION_INDEX, loc);
-		vb2_nv_set(ctx, VB2_NV_BACKUP_NVRAM_REQUEST, 1);
-
-		/*
-		 * Non-manual recovery mode is meant to be left via three-finger
-		 * salute (into manual recovery mode). Need to commit nvdata
-		 * changes immediately.  Ignore commit errors in recovery mode.
-		 */
-		if ((ctx->flags & VB2_CONTEXT_RECOVERY_MODE) &&
-		    !vb2_allow_recovery(ctx))
-			 vb2ex_commit_data(ctx);
-
-		/* Force redraw of current screen */
-		return VbDisplayScreen(ctx, screen, 1, data);
-	}
-
-	return VB2_SUCCESS;
-}
-
-static enum {
-	POWER_BUTTON_HELD_SINCE_BOOT = 0,
-	POWER_BUTTON_RELEASED,
-	POWER_BUTTON_PRESSED,  /* Must have been previously released */
-} power_button_state;
-
-void vb2_reset_power_button(void) {
-	power_button_state = POWER_BUTTON_HELD_SINCE_BOOT;
-}
-
-void vb2_error_beep(enum vb2_beep_type beep)
-{
-	switch (beep) {
-	case VB_BEEP_FAILED:
-		vb2ex_beep(250, 200);
-		break;
-	default:
-	case VB_BEEP_NOT_ALLOWED:
-		vb2ex_beep(120, 400);
-		vb2ex_msleep(120);
-		vb2ex_beep(120, 400);
-		break;
-	}
-}
-
-void vb2_error_notify(const char *print_msg,
-		      const char *log_msg,
-		      enum vb2_beep_type beep)
-{
-	if (print_msg)
-		VbExDisplayDebugInfo(print_msg, 0);
-	if (!log_msg)
-		log_msg = print_msg;
-	if (log_msg)
-		VB2_DEBUG(log_msg);
-	vb2_error_beep(beep);
-}
-
-void vb2_error_no_altfw(void)
-{
-	VB2_DEBUG("Legacy boot is disabled\n");
-	VbExDisplayDebugInfo("WARNING: Booting legacy BIOS has not been "
-			     "enabled. Refer to the developer-mode "
-			     "documentation for details.\n", 0);
-	vb2_error_beep(VB_BEEP_NOT_ALLOWED);
-}
-
-void vb2_try_altfw(struct vb2_context *ctx, int allowed,
-		   enum VbAltFwIndex_t altfw_num)
-{
-	if (!allowed) {
-		vb2_error_no_altfw();
-		return;
-	}
-
-	if (vb2ex_commit_data(ctx)) {
-		vb2_error_notify("Error committing data on legacy boot.\n",
-				 NULL, VB_BEEP_FAILED);
-		return;
-	}
-
-	/* Will not return if successful */
-	VbExLegacy(altfw_num);
-
-	vb2_error_notify("Legacy boot failed. Missing BIOS?\n", NULL,
-			 VB_BEEP_FAILED);
-}
-
-int vb2_want_shutdown(struct vb2_context *ctx, uint32_t key)
-{
-	struct vb2_gbb_header *gbb = vb2_get_gbb(ctx);
-	uint32_t shutdown_request = VbExIsShutdownRequested();
-
-	/*
-	 * Ignore power button push until after we have seen it released.
-	 * This avoids shutting down immediately if the power button is still
-	 * being held on startup. After we've recognized a valid power button
-	 * push then don't report the event until after the button is released.
-	 */
-	if (shutdown_request & VB_SHUTDOWN_REQUEST_POWER_BUTTON) {
-		shutdown_request &= ~VB_SHUTDOWN_REQUEST_POWER_BUTTON;
-		if (power_button_state == POWER_BUTTON_RELEASED)
-			power_button_state = POWER_BUTTON_PRESSED;
-	} else {
-		if (power_button_state == POWER_BUTTON_PRESSED)
-			shutdown_request |= VB_SHUTDOWN_REQUEST_POWER_BUTTON;
-		power_button_state = POWER_BUTTON_RELEASED;
-	}
-
-	if (key == VB_BUTTON_POWER_SHORT_PRESS)
-		shutdown_request |= VB_SHUTDOWN_REQUEST_POWER_BUTTON;
-
-	/* If desired, ignore shutdown request due to lid closure. */
-	if (gbb->flags & VB2_GBB_FLAG_DISABLE_LID_SHUTDOWN)
-		shutdown_request &= ~VB_SHUTDOWN_REQUEST_LID_CLOSED;
-
-	return shutdown_request;
-}
diff --git a/firmware/lib/vboot_ui_legacy_clamshell.c b/firmware/lib/vboot_ui_legacy_clamshell.c
deleted file mode 100644
index 027b49e..0000000
--- a/firmware/lib/vboot_ui_legacy_clamshell.c
+++ /dev/null
@@ -1,545 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * High-level firmware wrapper API - user interface for RW firmware
- */
-
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2rsa.h"
-#include "2secdata.h"
-#include "2sysincludes.h"
-#include "load_kernel_fw.h"
-#include "tlcl.h"
-#include "vb2_common.h"
-#include "vboot_api.h"
-#include "vboot_audio.h"
-#include "vboot_kernel.h"
-#include "vboot_struct.h"
-#include "vboot_test.h"
-#include "vboot_ui_legacy.h"
-#include "vboot_ui_legacy_wilco.h"
-
-static uint32_t disp_current_screen = VB_SCREEN_BLANK;
-
-test_mockable
-vb2_error_t VbDisplayScreen(struct vb2_context *ctx, uint32_t screen, int force,
-			    const VbScreenData *data)
-{
-	uint32_t locale;
-
-	/* If requested screen is the same as the current one, we're done. */
-	if (disp_current_screen == screen && !force)
-		return VB2_SUCCESS;
-
-	/* Keep track of the currently displayed screen */
-	disp_current_screen = screen;
-
-	/* Read the locale last saved */
-	locale = vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX);
-
-	return VbExDisplayScreen(screen, locale, data);
-}
-
-static vb2_error_t VbTryUsb(struct vb2_context *ctx)
-{
-	int retval = VbTryLoadKernel(ctx, VB_DISK_FLAG_REMOVABLE);
-	if (VB2_SUCCESS == retval) {
-		VB2_DEBUG("developer UI - booting USB\n");
-	} else {
-		vb2_error_notify("Could not boot from USB\n",
-				 "developer UI - no kernel found on USB\n",
-				 VB_BEEP_FAILED);
-	}
-	return retval;
-}
-
-int VbUserConfirms(struct vb2_context *ctx, uint32_t confirm_flags)
-{
-	uint32_t key;
-	uint32_t key_flags;
-	uint32_t btn;
-	int button_pressed = 0;
-	int shutdown_requested = 0;
-
-	VB2_DEBUG("Entering(%x)\n", confirm_flags);
-
-	/* Await further instructions */
-	do {
-		key = VbExKeyboardReadWithFlags(&key_flags);
-		shutdown_requested = vb2_want_shutdown(ctx, key);
-		switch (key) {
-		case VB_KEY_ENTER:
-			/* If we are using a trusted keyboard or a trusted
-			 * keyboard is not required then return yes, otherwise
-			 * keep waiting (for instance if the user is using a
-			 * USB keyboard).
-			 */
-			if (!(confirm_flags & VB_CONFIRM_MUST_TRUST_KEYBOARD) ||
-			     (key_flags & VB_KEY_FLAG_TRUSTED_KEYBOARD)) {
-				VB2_DEBUG("Yes (1)\n");
-				return 1;
-			}
-
-			/*
-			 * If physical presence is confirmed using the keyboard,
-			 * beep and notify the user when the ENTER key comes
-			 * from an untrusted keyboard.
-			 *
-			 * If physical presence is confirmed using a physical
-			 * button, the existing message on the screen will
-			 * instruct the user which button to push.  Silently
-			 * ignore any ENTER presses.
-			 */
-			if (PHYSICAL_PRESENCE_KEYBOARD)
-				vb2_error_notify("Please use internal keyboard "
-					"to confirm\n",
-					"VbUserConfirms() - "
-					"Trusted keyboard is required\n",
-					VB_BEEP_NOT_ALLOWED);
-
-			break;
-		case ' ':
-			VB2_DEBUG("Space (%d)\n",
-				  confirm_flags & VB_CONFIRM_SPACE_MEANS_NO);
-			if (confirm_flags & VB_CONFIRM_SPACE_MEANS_NO)
-				return 0;
-			break;
-		case VB_KEY_ESC:
-			VB2_DEBUG("No (0)\n");
-			return 0;
-		default:
-			/*
-			 * If the physical presence button is separate from the
-			 * keyboard, and is pressed, this is also a YES, but
-			 * must wait for release.
-			 */
-			if (!PHYSICAL_PRESENCE_KEYBOARD) {
-				btn = vb2ex_physical_presence_pressed();
-				if (btn) {
-					VB2_DEBUG("Presence button pressed, "
-						  "awaiting release\n");
-					button_pressed = 1;
-				} else if (button_pressed) {
-					VB2_DEBUG("Presence button released "
-						  "(1)\n");
-					return 1;
-				}
-			}
-			VbCheckDisplayKey(ctx, key, disp_current_screen, NULL);
-		}
-		vb2ex_msleep(KEY_DELAY_MS);
-	} while (!shutdown_requested);
-
-	return -1;
-}
-
-/*
- * User interface for selecting alternative firmware
- *
- * This shows the user a list of bootloaders and allows selection of one of
- * them. We loop forever until something is chosen or Escape is pressed.
- */
-static vb2_error_t vb2_altfw_ui(struct vb2_context *ctx)
-{
-	int active = 1;
-
-	VbDisplayScreen(ctx, VB_SCREEN_ALT_FW_PICK, 0, NULL);
-
-	/* We'll loop until the user decides what to do */
-	do {
-		uint32_t key = VbExKeyboardRead();
-
-		if (vb2_want_shutdown(ctx, key)) {
-			VB2_DEBUG("developer UI - shutdown requested!\n");
-			return VB2_REQUEST_SHUTDOWN;
-		}
-		switch (key) {
-		case 0:
-			/* nothing pressed */
-			break;
-		case VB_KEY_ESC:
-			/* Escape pressed - return to developer screen */
-			VB2_DEBUG("developer UI - user pressed Esc; "
-				  "exit to Developer screen\n");
-			active = 0;
-			break;
-		/* We allow selection of the default '0' bootloader here */
-		case '0'...'9':
-			VB2_DEBUG("developer UI - user pressed key '%c';"
-				  "Boot alternative firmware\n", key);
-			/*
-			 * This will not return if successful. Drop out to
-			 * developer mode on failure.
-			 */
-			vb2_try_altfw(ctx, 1, key - '0');
-			active = 0;
-			break;
-		default:
-			VB2_DEBUG("developer UI - pressed key %#x\n", key);
-			VbCheckDisplayKey(ctx, key, disp_current_screen, NULL);
-			break;
-		}
-		vb2ex_msleep(KEY_DELAY_MS);
-	} while (active);
-
-	/* Back to developer screen */
-	VbDisplayScreen(ctx, VB_SCREEN_DEVELOPER_WARNING, 0, NULL);
-
-	return 0;
-}
-
-static vb2_error_t vb2_developer_ui(struct vb2_context *ctx)
-{
-	struct vb2_shared_data *sd = vb2_get_sd(ctx);
-	struct vb2_gbb_header *gbb = vb2_get_gbb(ctx);
-
-	uint32_t disable_dev_boot = 0;
-	uint32_t use_usb = 0;
-	uint32_t use_legacy = 0;
-	uint32_t ctrl_d_pressed = 0;
-
-	VB2_DEBUG("Entering\n");
-
-	/* Check if booting from external disk is allowed */
-	uint32_t allow_usb = vb2_nv_get(ctx, VB2_NV_DEV_BOOT_EXTERNAL);
-	uint32_t allow_legacy = vb2_nv_get(ctx, VB2_NV_DEV_BOOT_LEGACY);
-
-	/* Check if the default boot target: internal/external disk or legacy */
-	uint32_t default_boot = vb2_nv_get(ctx, VB2_NV_DEV_DEFAULT_BOOT);
-
-	if (default_boot == VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL)
-		use_usb = 1;
-	if (default_boot == VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY)
-		use_legacy = 1;
-
-	/* Handle GBB flag override */
-	if (gbb->flags & VB2_GBB_FLAG_FORCE_DEV_BOOT_USB)
-		allow_usb = 1;
-	if (gbb->flags & VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY)
-		allow_legacy = 1;
-	if (gbb->flags & VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY) {
-		use_legacy = 1;
-		use_usb = 0;
-	}
-
-	/* Handle FWMP override */
-	if (vb2_secdata_fwmp_get_flag(ctx, VB2_SECDATA_FWMP_DEV_ENABLE_EXTERNAL))
-		allow_usb = 1;
-	if (vb2_secdata_fwmp_get_flag(ctx, VB2_SECDATA_FWMP_DEV_ENABLE_LEGACY))
-		allow_legacy = 1;
-	if (vb2_secdata_fwmp_get_flag(ctx, VB2_SECDATA_FWMP_DEV_DISABLE_BOOT)) {
-		if (gbb->flags & VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON) {
-			VB2_DEBUG("FWMP_DEV_DISABLE_BOOT rejected by "
-				  "FORCE_DEV_SWITCH_ON\n");
-		} else {
-			disable_dev_boot = 1;
-		}
-	}
-
-	/* If dev mode is disabled, only allow TONORM */
-	while (disable_dev_boot) {
-		VB2_DEBUG("dev_disable_boot is set\n");
-		VbDisplayScreen(ctx,
-				VB_SCREEN_DEVELOPER_TO_NORM, 0, NULL);
-		VbExDisplayDebugInfo(dev_disable_msg, 0);
-
-		/* Ignore space in VbUserConfirms()... */
-		switch (VbUserConfirms(ctx, 0)) {
-		case 1:
-			VB2_DEBUG("leaving dev-mode\n");
-			vb2_nv_set(ctx, VB2_NV_DISABLE_DEV_REQUEST, 1);
-			VbDisplayScreen(ctx,
-				VB_SCREEN_TO_NORM_CONFIRMED, 0, NULL);
-			vb2ex_msleep(5 * VB2_MSEC_PER_SEC);
-			return VB2_REQUEST_REBOOT;
-		case -1:
-			VB2_DEBUG("shutdown requested\n");
-			return VB2_REQUEST_SHUTDOWN;
-		default:
-			/* Ignore user attempt to cancel */
-			VB2_DEBUG("ignore cancel TONORM\n");
-		}
-	}
-
-	if ((ctx->flags & VB2_CONTEXT_VENDOR_DATA_SETTABLE) &&
-		VENDOR_DATA_LENGTH > 0) {
-		vb2_error_t ret;
-		VB2_DEBUG("developer UI - Vendor data not set\n");
-		ret = vb2_vendor_data_ui(ctx);
-		if (ret)
-			return ret;
-        }
-
-        /* Show the dev mode warning screen */
-        VbDisplayScreen(ctx, VB_SCREEN_DEVELOPER_WARNING, 0, NULL);
-
-	/* Initialize audio/delay context */
-	vb2_audio_start(ctx);
-
-	/* We'll loop until we finish the delay or are interrupted */
-	do {
-		uint32_t key = VbExKeyboardRead();
-		if (vb2_want_shutdown(ctx, key)) {
-			VB2_DEBUG("developer UI - shutdown requested!\n");
-			return VB2_REQUEST_SHUTDOWN;
-		}
-
-		switch (key) {
-		case 0:
-			/* nothing pressed */
-			break;
-		case VB_KEY_ENTER:
-			/* Only disable virtual dev switch if allowed by GBB */
-			if (!(gbb->flags & VB2_GBB_FLAG_ENTER_TRIGGERS_TONORM))
-				break;
-			VBOOT_FALLTHROUGH;
-		case ' ':
-			/* See if we should disable virtual dev-mode switch. */
-			VB2_DEBUG("sd->flags=%#x\n", sd->flags);
-
-			/* Validity check, should never fail. */
-			VB2_ASSERT(sd->flags & VB2_SD_FLAG_DEV_MODE_ENABLED);
-
-			/* Stop the countdown while we go ask... */
-			if (gbb->flags & VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON) {
-				/*
-				 * TONORM won't work (only for
-				 * non-shipping devices).
-				 */
-				vb2_error_notify(
-					"WARNING: TONORM prohibited by "
-					"GBB FORCE_DEV_SWITCH_ON.\n",
-					NULL, VB_BEEP_NOT_ALLOWED);
-				break;
-			}
-			VbDisplayScreen(ctx, VB_SCREEN_DEVELOPER_TO_NORM,
-					0, NULL);
-			/* Ignore space in VbUserConfirms()... */
-			switch (VbUserConfirms(ctx, 0)) {
-			case 1:
-				VB2_DEBUG("leaving dev-mode\n");
-				vb2_nv_set(ctx, VB2_NV_DISABLE_DEV_REQUEST, 1);
-				VbDisplayScreen(ctx,
-					VB_SCREEN_TO_NORM_CONFIRMED, 0, NULL);
-				vb2ex_msleep(5 * VB2_MSEC_PER_SEC);
-				return VB2_REQUEST_REBOOT;
-			case -1:
-				VB2_DEBUG("shutdown requested\n");
-				return VB2_REQUEST_SHUTDOWN;
-			default:
-				/* Stay in dev-mode */
-				VB2_DEBUG("stay in dev-mode\n");
-				VbDisplayScreen(ctx,
-					VB_SCREEN_DEVELOPER_WARNING, 0, NULL);
-				/* Start new countdown */
-				vb2_audio_start(ctx);
-			}
-			break;
-		case VB_KEY_CTRL('D'):
-			/* Ctrl+D = dismiss warning; advance to timeout */
-			VB2_DEBUG("developer UI - user pressed Ctrl+D; "
-				  "skip delay\n");
-			ctrl_d_pressed = 1;
-			goto fallout;
-		case VB_KEY_CTRL('L'):
-			VB2_DEBUG("developer UI - user pressed Ctrl+L; "
-				  "Try alt firmware\n");
-			if (allow_legacy) {
-				vb2_error_t ret;
-
-				ret = vb2_altfw_ui(ctx);
-				if (ret)
-					return ret;
-			} else {
-				vb2_error_no_altfw();
-			}
-			break;
-		case VB_KEY_CTRL_ENTER:
-			/*
-			 * The Ctrl-Enter is special for Lumpy test purpose;
-			 * fall through to Ctrl+U handler.
-			 */
-		case VB_KEY_CTRL('U'):
-			/* Ctrl+U = try USB boot, or beep if failure */
-			VB2_DEBUG("developer UI - user pressed Ctrl+U; "
-				  "try USB\n");
-			if (!allow_usb) {
-				vb2_error_notify(
-					"WARNING: Booting from external media "
-					"(USB/SD) has not been enabled. Refer "
-					"to the developer-mode documentation "
-					"for details.\n",
-					"developer UI - "
-					"USB booting is disabled\n",
-					VB_BEEP_NOT_ALLOWED);
-			} else {
-				/*
-				 * Clear the screen to show we get the Ctrl+U
-				 * key press.
-				 */
-				VbDisplayScreen(ctx, VB_SCREEN_BLANK, 0, NULL);
-				if (VB2_SUCCESS == VbTryUsb(ctx)) {
-					return VB2_SUCCESS;
-				} else {
-					/* Show dev mode warning screen again */
-					VbDisplayScreen(ctx,
-						VB_SCREEN_DEVELOPER_WARNING,
-						0, NULL);
-				}
-			}
-			break;
-		/* We allow selection of the default '0' bootloader here */
-		case '0'...'9':
-			VB2_DEBUG("developer UI - user pressed key '%c'; "
-				  "Boot alternative firmware\n", key);
-			vb2_try_altfw(ctx, allow_legacy, key - '0');
-			break;
-		default:
-			VB2_DEBUG("developer UI - pressed key %#x\n", key);
-			VbCheckDisplayKey(ctx, key, disp_current_screen, NULL);
-			break;
-		}
-
-		vb2ex_msleep(KEY_DELAY_MS);
-	} while(vb2_audio_looping());
-
- fallout:
-
-	/* If defaulting to legacy boot, try that unless Ctrl+D was pressed */
-	if (use_legacy && !ctrl_d_pressed) {
-		VB2_DEBUG("developer UI - defaulting to legacy\n");
-		vb2_try_altfw(ctx, allow_legacy, 0);
-	}
-
-	if ((use_usb && !ctrl_d_pressed) && allow_usb) {
-		if (VB2_SUCCESS == VbTryUsb(ctx)) {
-			return VB2_SUCCESS;
-		}
-	}
-
-	/* Timeout or Ctrl+D; attempt loading from fixed disk */
-	VB2_DEBUG("developer UI - trying fixed disk\n");
-	return VbTryLoadKernel(ctx, VB_DISK_FLAG_FIXED);
-}
-
-vb2_error_t VbBootDeveloperLegacyClamshell(struct vb2_context *ctx)
-{
-	vb2_reset_power_button();
-	vb2_error_t retval = vb2_developer_ui(ctx);
-	VbDisplayScreen(ctx, VB_SCREEN_BLANK, 0, NULL);
-	return retval;
-}
-
-vb2_error_t VbBootDiagnosticLegacyClamshell(struct vb2_context *ctx)
-{
-	vb2_reset_power_button();
-	vb2_error_t retval = vb2_diagnostics_ui(ctx);
-	VbDisplayScreen(ctx, VB_SCREEN_BLANK, 0, NULL);
-	return retval;
-}
-
-static vb2_error_t recovery_ui(struct vb2_context *ctx)
-{
-	struct vb2_shared_data *sd = vb2_get_sd(ctx);
-	uint32_t retval;
-	uint32_t key;
-	const char release_button_msg[] =
-		"Release the recovery button and try again\n";
-	const char recovery_pressed_msg[] =
-		"^D but recovery switch is pressed\n";
-
-	VB2_DEBUG("recovery UI - start\n");
-
-	if (!vb2_allow_recovery(ctx)) {
-		VbDisplayScreen(ctx, VB_SCREEN_OS_BROKEN, 0, NULL);
-		VB2_DEBUG("recovery UI - waiting for manual recovery\n");
-		while (1) {
-			key = VbExKeyboardRead();
-			VbCheckDisplayKey(ctx, key, disp_current_screen, NULL);
-			if (vb2_want_shutdown(ctx, key))
-				return VB2_REQUEST_SHUTDOWN;
-			else if ((retval =
-				  vb2_check_diagnostic_key(ctx, key)) !=
-				  VB2_SUCCESS)
-				return retval;
-			vb2ex_msleep(KEY_DELAY_MS);
-		}
-	}
-
-	/* Loop and wait for a recovery image */
-	VB2_DEBUG("recovery UI - waiting for a recovery image\n");
-	while (1) {
-		retval = VbTryLoadKernel(ctx, VB_DISK_FLAG_REMOVABLE);
-
-		if (VB2_SUCCESS == retval)
-			break; /* Found a recovery kernel */
-
-		enum VbScreenType_t next_screen =
-			retval == VB2_ERROR_LK_NO_DISK_FOUND ?
-			VB_SCREEN_RECOVERY_INSERT : VB_SCREEN_RECOVERY_NO_GOOD;
-		VbDisplayScreen(ctx, next_screen, 0, NULL);
-
-		key = VbExKeyboardRead();
-		/*
-		 * We might want to enter dev-mode from the Insert
-		 * screen if all of the following are true:
-		 *   - user pressed Ctrl-D
-		 *   - we can honor the virtual dev switch
-		 *   - not already in dev mode
-		 *   - user forced recovery mode
-		 */
-		if (key == VB_KEY_CTRL('D') &&
-		    !(sd->flags & VB2_SD_FLAG_DEV_MODE_ENABLED) &&
-		    (sd->flags & VB2_SD_FLAG_MANUAL_RECOVERY)) {
-			if (!PHYSICAL_PRESENCE_KEYBOARD &&
-			    vb2ex_physical_presence_pressed()) {
-				/*
-				 * Is the presence button stuck?  In any case
-				 * we don't like this.  Beep and ignore.
-				 */
-				vb2_error_notify(release_button_msg,
-						 recovery_pressed_msg,
-						 VB_BEEP_NOT_ALLOWED);
-				continue;
-			}
-
-			/* Ask the user to confirm entering dev-mode */
-			VbDisplayScreen(ctx, VB_SCREEN_RECOVERY_TO_DEV,
-					0, NULL);
-			/* SPACE means no... */
-			uint32_t vbc_flags = VB_CONFIRM_SPACE_MEANS_NO |
-					     VB_CONFIRM_MUST_TRUST_KEYBOARD;
-			switch (VbUserConfirms(ctx, vbc_flags)) {
-			case 1:
-				vb2_enable_developer_mode(ctx);
-				return VB2_REQUEST_REBOOT_EC_TO_RO;
-			case -1:
-				VB2_DEBUG("Shutdown requested\n");
-				return VB2_REQUEST_SHUTDOWN;
-			default: /* zero, actually */
-				VB2_DEBUG("Not enabling dev-mode\n");
-				break;
-			}
-		} else if ((retval = vb2_check_diagnostic_key(ctx, key)) !=
-			   VB2_SUCCESS) {
-			return retval;
-		} else {
-			VbCheckDisplayKey(ctx, key, disp_current_screen, NULL);
-		}
-		if (vb2_want_shutdown(ctx, key))
-			return VB2_REQUEST_SHUTDOWN;
-		vb2ex_msleep(KEY_DELAY_MS);
-	}
-
-	return VB2_SUCCESS;
-}
-
-vb2_error_t VbBootRecoveryLegacyClamshell(struct vb2_context *ctx)
-{
-	vb2_error_t retval = recovery_ui(ctx);
-	VbDisplayScreen(ctx, VB_SCREEN_BLANK, 0, NULL);
-	return retval;
-}
diff --git a/firmware/lib/vboot_ui_legacy_menu.c b/firmware/lib/vboot_ui_legacy_menu.c
deleted file mode 100644
index 4bad564..0000000
--- a/firmware/lib/vboot_ui_legacy_menu.c
+++ /dev/null
@@ -1,935 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * High-level firmware wrapper API - user interface for RW firmware
- */
-
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2rsa.h"
-#include "2secdata.h"
-#include "2sysincludes.h"
-#include "load_kernel_fw.h"
-#include "vb2_common.h"
-#include "vboot_api.h"
-#include "vboot_audio.h"
-#include "vboot_kernel.h"
-#include "vboot_struct.h"
-#include "vboot_ui_legacy.h"
-#include "vboot_ui_legacy_menu_private.h"
-
-static VB_MENU current_menu, prev_menu;
-static int current_menu_idx, cur_disabled_idx_mask, usb_nogood, force_redraw;
-static uint32_t default_boot;
-static uint32_t disable_dev_boot;
-static uint32_t altfw_allowed;
-static struct vb2_menu menus[];
-static const char no_legacy[] = "Legacy boot failed. Missing BIOS?\n";
-
-static uint32_t disp_current_screen = VB_SCREEN_BLANK;
-static uint32_t disp_current_index = 0;
-static uint32_t disp_disabled_idx_mask = 0;
-
-test_mockable
-vb2_error_t VbDisplayMenu(struct vb2_context *ctx, uint32_t screen, int force,
-			  uint32_t selected_index, uint32_t disabled_idx_mask)
-{
-	uint32_t locale;
-	uint32_t redraw_base_screen = 0;
-
-	/*
-	 * If requested screen/selected_index is the same as the current one,
-	 * we're done.
-	 */
-	if (disp_current_screen == screen &&
-	    disp_current_index == selected_index &&
-	    !force)
-		return VB2_SUCCESS;
-
-	/*
-	 * If current screen is not the same, make sure we redraw the base
-	 * screen as well to avoid having artifacts from the menu.
-	 */
-	if (disp_current_screen != screen || force)
-		redraw_base_screen = 1;
-
-	/*
-	 * Keep track of the currently displayed screen and
-	 * selected_index
-	 */
-	disp_current_screen = screen;
-	disp_current_index = selected_index;
-	disp_disabled_idx_mask = disabled_idx_mask;
-
-	/* Read the locale last saved */
-	locale = vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX);
-
-	return VbExDisplayMenu(screen, locale, selected_index,
-			       disabled_idx_mask, redraw_base_screen);
-}
-
-/**
- * Checks GBB flags against VbExIsShutdownRequested() shutdown request to
- * determine if a shutdown is required.
- *
- * Returns true if a shutdown is required and false if no shutdown is required.
- */
-static int VbWantShutdownMenu(struct vb2_context *ctx)
-{
-	struct vb2_gbb_header *gbb = vb2_get_gbb(ctx);
-	uint32_t shutdown_request = VbExIsShutdownRequested();
-
-	/* If desired, ignore shutdown request due to lid closure. */
-	if (gbb->flags & VB2_GBB_FLAG_DISABLE_LID_SHUTDOWN)
-		shutdown_request &= ~VB_SHUTDOWN_REQUEST_LID_CLOSED;
-
-	/*
-	 * In detachables, disabling shutdown due to power button.
-	 * We are using it for selection instead.
-	 */
-	shutdown_request &= ~VB_SHUTDOWN_REQUEST_POWER_BUTTON;
-
-	return !!shutdown_request;
-}
-
-/* (Re-)Draw the menu identified by current_menu[_idx] to the screen. */
-static vb2_error_t vb2_draw_current_screen(struct vb2_context *ctx) {
-	vb2_error_t ret = VbDisplayMenu(ctx, menus[current_menu].screen,
-			force_redraw, current_menu_idx, cur_disabled_idx_mask);
-	force_redraw = 0;
-	return ret;
-}
-
-/* Flash the screen to black to catch user awareness, then redraw menu. */
-static void vb2_flash_screen(struct vb2_context *ctx)
-{
-	VbDisplayMenu(ctx, VB_SCREEN_BLANK, 0, 0, 0);
-	vb2ex_msleep(50);
-	vb2_draw_current_screen(ctx);
-}
-
-static void vb2_log_menu_change(void)
-{
-	if (menus[current_menu].size)
-		VB2_DEBUG("================ %s Menu ================ [ %s ]\n",
-			  menus[current_menu].name,
-			  menus[current_menu].items[current_menu_idx].text);
-	else
-		VB2_DEBUG("=============== %s Screen ===============\n",
-			  menus[current_menu].name);
-}
-
-/**
- * Switch to a new menu (but don't draw it yet).
- *
- * @param new_current_menu:	new menu to set current_menu to
- * @param new_current_menu_idx: new idx to set current_menu_idx to
- */
-static void vb2_change_menu(VB_MENU new_current_menu,
-			    int new_current_menu_idx)
-{
-	prev_menu = current_menu;
-	current_menu = new_current_menu;
-
-	/* Reconfigure cur_disabled_idx_mask for the new menu */
-	cur_disabled_idx_mask = 0;
-	/* Disable Network Boot Option */
-	if (current_menu == VB_MENU_DEV)
-		cur_disabled_idx_mask |= 1 << VB_DEV_NETWORK;
-	/* Disable cancel option if enterprise disabled dev mode */
-	if (current_menu == VB_MENU_TO_NORM &&
-	    disable_dev_boot == 1)
-		cur_disabled_idx_mask |= 1 << VB_TO_NORM_CANCEL;
-
-	/* Enable menu items for the selected bootloaders */
-	if (current_menu == VB_MENU_ALT_FW) {
-		cur_disabled_idx_mask = ~(VbExGetAltFwIdxMask() >> 1);
-
-		/* Make sure 'cancel' is shown even with an invalid mask */
-		cur_disabled_idx_mask &= (1 << VB_ALTFW_COUNT) - 1;
-	}
-	/* We assume that there is at least one enabled item */
-	while ((1 << new_current_menu_idx) & cur_disabled_idx_mask)
-		new_current_menu_idx++;
-	if (new_current_menu_idx < menus[current_menu].size)
-		current_menu_idx = new_current_menu_idx;
-
-	vb2_log_menu_change();
-}
-
-/************************
- *    Menu Actions      *
- ************************/
-
-/* Boot from internal disk if allowed. */
-static vb2_error_t boot_disk_action(struct vb2_context *ctx)
-{
-	if (disable_dev_boot) {
-		vb2_flash_screen(ctx);
-		vb2_error_notify("Developer mode disabled\n", NULL,
-				 VB_BEEP_NOT_ALLOWED);
-		return VB2_REQUEST_UI_CONTINUE;
-	}
-	VB2_DEBUG("trying fixed disk\n");
-	return VbTryLoadKernel(ctx, VB_DISK_FLAG_FIXED);
-}
-
-/* Boot legacy BIOS if allowed and available. */
-static vb2_error_t boot_legacy_action(struct vb2_context *ctx)
-{
-	if (disable_dev_boot) {
-		vb2_flash_screen(ctx);
-		vb2_error_notify("Developer mode disabled\n", NULL,
-				 VB_BEEP_NOT_ALLOWED);
-		return VB2_REQUEST_UI_CONTINUE;
-	}
-
-	if (!altfw_allowed) {
-		vb2_flash_screen(ctx);
-		vb2_error_notify("WARNING: Booting legacy BIOS has not "
-				 "been enabled. Refer to the developer"
-				 "-mode documentation for details.\n",
-				 "Legacy boot is disabled\n",
-				 VB_BEEP_NOT_ALLOWED);
-		return VB2_REQUEST_UI_CONTINUE;
-	}
-
-	vb2_try_altfw(ctx, 1, VB_ALTFW_DEFAULT);
-	vb2_flash_screen(ctx);
-	return VB2_REQUEST_UI_CONTINUE;
-}
-
-/* Boot from USB or SD card if allowed and available. */
-static vb2_error_t boot_usb_action(struct vb2_context *ctx)
-{
-	const char no_kernel[] = "No bootable kernel found on USB/SD.\n";
-
-	if (disable_dev_boot) {
-		vb2_flash_screen(ctx);
-		vb2_error_notify("Developer mode disabled\n", NULL,
-				 VB_BEEP_NOT_ALLOWED);
-		return VB2_REQUEST_UI_CONTINUE;
-	}
-
-	if (!vb2_nv_get(ctx, VB2_NV_DEV_BOOT_EXTERNAL) &&
-	    !(vb2_get_gbb(ctx)->flags & VB2_GBB_FLAG_FORCE_DEV_BOOT_USB) &&
-	    !vb2_secdata_fwmp_get_flag(ctx, VB2_SECDATA_FWMP_DEV_ENABLE_EXTERNAL)) {
-		vb2_flash_screen(ctx);
-		vb2_error_notify("WARNING: Booting from external media "
-				 "(USB/SD) has not been enabled. Refer "
-				 "to the developer-mode documentation "
-				 "for details.\n",
-				 "USB booting is disabled\n",
-				 VB_BEEP_NOT_ALLOWED);
-		return VB2_REQUEST_UI_CONTINUE;
-	}
-
-	if (VB2_SUCCESS == VbTryLoadKernel(ctx, VB_DISK_FLAG_REMOVABLE)) {
-		VB2_DEBUG("booting USB\n");
-		return VB2_SUCCESS;
-	}
-
-	vb2_flash_screen(ctx);
-	vb2_error_notify(no_kernel, NULL, VB_BEEP_FAILED);
-	return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t enter_developer_menu(struct vb2_context *ctx)
-{
-	int menu_idx;
-	switch(default_boot) {
-	default:
-	case VB2_DEV_DEFAULT_BOOT_TARGET_INTERNAL:
-		menu_idx = VB_DEV_DISK;
-		break;
-	case VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL:
-		menu_idx = VB_DEV_USB;
-		break;
-	case VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY:
-		menu_idx = VB_DEV_LEGACY;
-		break;
-	}
-	vb2_change_menu(VB_MENU_DEV, menu_idx);
-	vb2_draw_current_screen(ctx);
-	return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t enter_dev_warning_menu(struct vb2_context *ctx)
-{
-	vb2_change_menu(VB_MENU_DEV_WARNING, VB_WARN_POWER_OFF);
-	vb2_draw_current_screen(ctx);
-	return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t enter_language_menu(struct vb2_context *ctx)
-{
-	vb2_change_menu(VB_MENU_LANGUAGES,
-			vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX));
-	vb2_draw_current_screen(ctx);
-	return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t enter_recovery_base_screen(struct vb2_context *ctx)
-{
-	if (!vb2_allow_recovery(ctx))
-		vb2_change_menu(VB_MENU_RECOVERY_BROKEN, 0);
-	else if (usb_nogood)
-		vb2_change_menu(VB_MENU_RECOVERY_NO_GOOD, 0);
-	else
-		vb2_change_menu(VB_MENU_RECOVERY_INSERT, 0);
-	vb2_draw_current_screen(ctx);
-	return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t enter_options_menu(struct vb2_context *ctx)
-{
-	vb2_change_menu(VB_MENU_OPTIONS, VB_OPTIONS_CANCEL);
-	vb2_draw_current_screen(ctx);
-	return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t enter_to_dev_menu(struct vb2_context *ctx)
-{
-	const char dev_already_on[] =
-		"WARNING: TODEV rejected, developer mode is already on.\n";
-	if (vb2_get_sd(ctx)->flags & VB2_SD_FLAG_DEV_MODE_ENABLED) {
-		vb2_flash_screen(ctx);
-		vb2_error_notify(dev_already_on, NULL, VB_BEEP_NOT_ALLOWED);
-		return VB2_REQUEST_UI_CONTINUE;
-	}
-	vb2_change_menu(VB_MENU_TO_DEV, VB_TO_DEV_CANCEL);
-	vb2_draw_current_screen(ctx);
-	return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t enter_to_norm_menu(struct vb2_context *ctx)
-{
-	vb2_change_menu(VB_MENU_TO_NORM, VB_TO_NORM_CONFIRM);
-	vb2_draw_current_screen(ctx);
-	/* Make sure user knows dev mode disabled */
-	if (disable_dev_boot)
-		VbExDisplayDebugInfo(dev_disable_msg, 0);
-	return VB2_REQUEST_UI_CONTINUE;
-}
-
-/* Boot alternative bootloader if allowed and available. */
-static vb2_error_t enter_altfw_menu(struct vb2_context *ctx)
-{
-	VB2_DEBUG("enter_altfw_menu()\n");
-	if (disable_dev_boot) {
-		vb2_flash_screen(ctx);
-		vb2_error_beep(VB_BEEP_NOT_ALLOWED);
-		return VB2_REQUEST_UI_CONTINUE;
-	}
-	if (!altfw_allowed) {
-		vb2_flash_screen(ctx);
-		vb2_error_no_altfw();
-		return VB2_REQUEST_UI_CONTINUE;
-	}
-	vb2_change_menu(VB_MENU_ALT_FW, 0);
-	vb2_draw_current_screen(ctx);
-
-	return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t debug_info_action(struct vb2_context *ctx)
-{
-	force_redraw = 1;
-	VbDisplayDebugInfo(ctx);
-	return VB2_REQUEST_UI_CONTINUE;
-}
-
-/* Action when selecting a language entry in the language menu. */
-static vb2_error_t language_action(struct vb2_context *ctx)
-{
-	/* Write selected language ID back to NVRAM. */
-	vb2_nv_set(ctx, VB2_NV_LOCALIZATION_INDEX, current_menu_idx);
-
-	/*
-	 * Non-manual recovery mode is meant to be left via three-finger
-	 * salute (into manual recovery mode). Need to commit nvdata
-	 * changes immediately.  Ignore commit errors in recovery mode.
-	 */
-	if ((ctx->flags & VB2_CONTEXT_RECOVERY_MODE) &&
-	    !vb2_allow_recovery(ctx))
-		vb2ex_commit_data(ctx);
-
-	/* Return to previous menu. */
-	switch (prev_menu) {
-	case VB_MENU_DEV_WARNING:
-		return enter_dev_warning_menu(ctx);
-	case VB_MENU_DEV:
-		return enter_developer_menu(ctx);
-	case VB_MENU_TO_NORM:
-		return enter_to_norm_menu(ctx);
-	case VB_MENU_TO_DEV:
-		return enter_to_dev_menu(ctx);
-	case VB_MENU_OPTIONS:
-		return enter_options_menu(ctx);
-	default:
-		/* This should never happen. */
-		VB2_DEBUG("ERROR: prev_menu state corrupted, force shutdown\n");
-		return VB2_REQUEST_SHUTDOWN;
-	}
-}
-
-/* Action when selecting a bootloader in the alternative firmware menu. */
-static vb2_error_t altfw_action(struct vb2_context *ctx)
-{
-	vb2_try_altfw(ctx, 1, current_menu_idx + 1);
-	vb2_flash_screen(ctx);
-	VB2_DEBUG(no_legacy);
-	VbExDisplayDebugInfo(no_legacy, 0);
-
-	return VB2_REQUEST_UI_CONTINUE;
-}
-
-/* Action that enables developer mode and reboots. */
-static vb2_error_t to_dev_action(struct vb2_context *ctx)
-{
-	/* Validity check, should never happen. */
-	if ((vb2_get_sd(ctx)->flags & VB2_SD_FLAG_DEV_MODE_ENABLED) ||
-	    !vb2_allow_recovery(ctx))
-		return VB2_REQUEST_UI_CONTINUE;
-
-	vb2_enable_developer_mode(ctx);
-
-	return VB2_REQUEST_REBOOT_EC_TO_RO;
-}
-
-/* Action that disables developer mode, shows TO_NORM_CONFIRMED and reboots. */
-static vb2_error_t to_norm_action(struct vb2_context *ctx)
-{
-	if (vb2_get_gbb(ctx)->flags & VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON) {
-		vb2_flash_screen(ctx);
-		vb2_error_notify("WARNING: TONORM prohibited by "
-				 "GBB FORCE_DEV_SWITCH_ON.\n", NULL,
-				 VB_BEEP_NOT_ALLOWED);
-		return VB2_REQUEST_UI_CONTINUE;
-	}
-
-	VB2_DEBUG("leaving dev-mode.\n");
-	vb2_nv_set(ctx, VB2_NV_DISABLE_DEV_REQUEST, 1);
-	vb2_change_menu(VB_MENU_TO_NORM_CONFIRMED, 0);
-	vb2_draw_current_screen(ctx);
-	vb2ex_msleep(5 * VB2_MSEC_PER_SEC);
-	return VB2_REQUEST_REBOOT;
-}
-
-/* Action that will power off the system. */
-static vb2_error_t power_off_action(struct vb2_context *ctx)
-{
-	VB2_DEBUG("Power off requested from screen %#x\n",
-		  menus[current_menu].screen);
-	return VB2_REQUEST_SHUTDOWN;
-}
-
-/**
- * Updates current_menu_idx upon an up/down key press, taking into
- * account disabled indices (from cur_disabled_idx_mask).  The cursor
- * will not wrap, meaning that we block on the 0 or max index when
- * we hit the ends of the menu.
- *
- * @param  key      VOL_KEY_UP = increase index selection
- *                  VOL_KEY_DOWN = decrease index selection.
- *                  Every other key has no effect now.
- */
-static void vb2_update_selection(uint32_t key) {
-	int idx;
-
-	switch (key) {
-	case VB_BUTTON_VOL_UP_SHORT_PRESS:
-	case VB_KEY_UP:
-		idx = current_menu_idx - 1;
-		while (idx >= 0 &&
-		       ((1 << idx) & cur_disabled_idx_mask))
-		  idx--;
-		/* Only update if idx is valid */
-		if (idx >= 0)
-			current_menu_idx = idx;
-		break;
-	case VB_BUTTON_VOL_DOWN_SHORT_PRESS:
-	case VB_KEY_DOWN:
-		idx = current_menu_idx + 1;
-		while (idx < menus[current_menu].size &&
-		       ((1 << idx) & cur_disabled_idx_mask))
-		  idx++;
-		/* Only update if idx is valid */
-		if (idx < menus[current_menu].size)
-			current_menu_idx = idx;
-		break;
-	default:
-		VB2_DEBUG("ERROR: %s called with key %#x!\n", __func__, key);
-		break;
-	}
-
-	vb2_log_menu_change();
-}
-
-static vb2_error_t vb2_handle_menu_input(struct vb2_context *ctx,
-					 uint32_t key, uint32_t key_flags)
-{
-	switch (key) {
-	case 0:
-		/* nothing pressed */
-		break;
-	case '\t':
-		/* Tab = display debug info */
-		return debug_info_action(ctx);
-	case VB_KEY_ESC:
-		/* Esc = redraw screen (to clear old debug info) */
-		vb2_draw_current_screen(ctx);
-		break;
-	case VB_KEY_UP:
-	case VB_KEY_DOWN:
-	case VB_BUTTON_VOL_UP_SHORT_PRESS:
-	case VB_BUTTON_VOL_DOWN_SHORT_PRESS:
-		/* Untrusted (USB keyboard) input disabled for TO_DEV menu. */
-		if (current_menu == VB_MENU_TO_DEV &&
-		    !(key_flags & VB_KEY_FLAG_TRUSTED_KEYBOARD)) {
-			vb2_flash_screen(ctx);
-			vb2_error_notify("Please use the on-device volume "
-					 "buttons to navigate\n",
-					 "vb2_handle_menu_input() - Untrusted "
-					 "(USB keyboard) input disabled\n",
-					 VB_BEEP_NOT_ALLOWED);
-			break;
-		}
-
-		/* Menuless screens enter OPTIONS on volume button press. */
-		if (!menus[current_menu].size) {
-			enter_options_menu(ctx);
-			break;
-		}
-
-		vb2_update_selection(key);
-		vb2_draw_current_screen(ctx);
-		break;
-	case VB_BUTTON_POWER_SHORT_PRESS:
-	case VB_KEY_ENTER:
-		/* Menuless screens shut down on power button press. */
-		if (!menus[current_menu].size)
-			return VB2_REQUEST_SHUTDOWN;
-
-		return menus[current_menu].items[current_menu_idx].action(ctx);
-	default:
-		VB2_DEBUG("pressed key %#x\n", key);
-		break;
-	}
-
-	if (VbWantShutdownMenu(ctx)) {
-		VB2_DEBUG("shutdown requested!\n");
-		return VB2_REQUEST_SHUTDOWN;
-	}
-
-	return VB2_REQUEST_UI_CONTINUE;
-}
-
-/* Master table of all menus. Menus with size == 0 count as menuless screens. */
-static struct vb2_menu menus[VB_MENU_COUNT] = {
-	[VB_MENU_DEV_WARNING] = {
-		.name = "Developer Warning",
-		.size = VB_WARN_COUNT,
-		.screen = VB_SCREEN_DEVELOPER_WARNING_MENU,
-		.items = (struct vb2_menu_item[]){
-			[VB_WARN_OPTIONS] = {
-				.text = "Developer Options",
-				.action = enter_developer_menu,
-			},
-			[VB_WARN_DBG_INFO] = {
-				.text = "Show Debug Info",
-				.action = debug_info_action,
-			},
-			[VB_WARN_ENABLE_VER] = {
-				.text = "Enable OS Verification",
-				.action = enter_to_norm_menu,
-			},
-			[VB_WARN_POWER_OFF] = {
-				.text = "Power Off",
-				.action = power_off_action,
-			},
-			[VB_WARN_LANGUAGE] = {
-				.text = "Language",
-				.action = enter_language_menu,
-			},
-		},
-	},
-	[VB_MENU_DEV] = {
-		.name = "Developer Boot Options",
-		.size = VB_DEV_COUNT,
-		.screen = VB_SCREEN_DEVELOPER_MENU,
-		.items = (struct vb2_menu_item[]){
-			[VB_DEV_NETWORK] = {
-				.text = "Boot From Network",
-				.action = NULL,	/* unimplemented */
-			},
-			[VB_DEV_LEGACY] = {
-				.text = "Boot Legacy BIOS",
-				.action = enter_altfw_menu,
-			},
-			[VB_DEV_USB] = {
-				.text = "Boot From USB or SD Card",
-				.action = boot_usb_action,
-			},
-			[VB_DEV_DISK] = {
-				.text = "Boot From Internal Disk",
-				.action = boot_disk_action,
-			},
-			[VB_DEV_CANCEL] = {
-				.text = "Cancel",
-				.action = enter_dev_warning_menu,
-			},
-			[VB_DEV_POWER_OFF] = {
-				.text = "Power Off",
-				.action = power_off_action,
-			},
-			[VB_DEV_LANGUAGE] = {
-				.text = "Language",
-				.action = enter_language_menu,
-			},
-		},
-	},
-	[VB_MENU_TO_NORM] = {
-		.name = "TO_NORM Confirmation",
-		.size = VB_TO_NORM_COUNT,
-		.screen = VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		.items = (struct vb2_menu_item[]){
-			[VB_TO_NORM_CONFIRM] = {
-				.text = "Confirm Enabling OS Verification",
-				.action = to_norm_action,
-			},
-			[VB_TO_NORM_CANCEL] = {
-				.text = "Cancel",
-				.action = enter_dev_warning_menu,
-			},
-			[VB_TO_NORM_POWER_OFF] = {
-				.text = "Power Off",
-				.action = power_off_action,
-			},
-			[VB_TO_NORM_LANGUAGE] = {
-				.text = "Language",
-				.action = enter_language_menu,
-			},
-		},
-	},
-	[VB_MENU_TO_DEV] = {
-		.name = "TO_DEV Confirmation",
-		.size = VB_TO_DEV_COUNT,
-		.screen = VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		.items = (struct vb2_menu_item[]){
-			[VB_TO_DEV_CONFIRM] = {
-				.text = "Confirm Disabling OS Verification",
-				.action = to_dev_action,
-			},
-			[VB_TO_DEV_CANCEL] = {
-				.text = "Cancel",
-				.action = enter_recovery_base_screen,
-			},
-			[VB_TO_DEV_POWER_OFF] = {
-				.text = "Power Off",
-				.action = power_off_action,
-			},
-			[VB_TO_DEV_LANGUAGE] = {
-				.text = "Language",
-				.action = enter_language_menu,
-			},
-		},
-	},
-	[VB_MENU_LANGUAGES] = {
-		.name = "Language Selection",
-		.screen = VB_SCREEN_LANGUAGES_MENU,
-		/* Rest is filled out dynamically by vb2_init_menus() */
-	},
-	[VB_MENU_OPTIONS] = {
-		.name = "Options",
-		.size = VB_OPTIONS_COUNT,
-		.screen = VB_SCREEN_OPTIONS_MENU,
-		.items = (struct vb2_menu_item[]){
-			[VB_OPTIONS_DBG_INFO] = {
-				.text = "Show Debug Info",
-				.action = debug_info_action,
-			},
-			[VB_OPTIONS_CANCEL] = {
-				.text = "Cancel",
-				.action = enter_recovery_base_screen,
-			},
-			[VB_OPTIONS_POWER_OFF] = {
-				.text = "Power Off",
-				.action = power_off_action,
-			},
-			[VB_OPTIONS_LANGUAGE] = {
-				.text = "Language",
-				.action = enter_language_menu,
-			},
-		},
-	},
-	[VB_MENU_RECOVERY_INSERT] = {
-		.name = "Recovery INSERT",
-		.size = 0,
-		.screen = VB_SCREEN_RECOVERY_INSERT,
-		.items = NULL,
-	},
-	[VB_MENU_RECOVERY_NO_GOOD] = {
-		.name = "Recovery NO_GOOD",
-		.size = 0,
-		.screen = VB_SCREEN_RECOVERY_NO_GOOD,
-		.items = NULL,
-	},
-	[VB_MENU_RECOVERY_BROKEN] = {
-		.name = "Non-manual Recovery (BROKEN)",
-		.size = 0,
-		.screen = VB_SCREEN_OS_BROKEN,
-		.items = NULL,
-	},
-	[VB_MENU_TO_NORM_CONFIRMED] = {
-		.name = "TO_NORM Interstitial",
-		.size = 0,
-		.screen = VB_SCREEN_TO_NORM_CONFIRMED,
-		.items = NULL,
-	},
-	[VB_MENU_ALT_FW] = {
-		.name = "Alternative Firmware Selection",
-		.screen = VB_SCREEN_ALT_FW_MENU,
-		.size = VB_ALTFW_COUNT + 1,
-		.items = (struct vb2_menu_item[]) {{
-				.text = "Bootloader 1",
-				.action = altfw_action,
-			}, {
-				.text = "Bootloader 2",
-				.action = altfw_action,
-			}, {
-				.text = "Bootloader 3",
-				.action = altfw_action,
-			}, {
-				.text = "Bootloader 4",
-				.action = altfw_action,
-			}, {
-				.text = "Bootloader 5",
-				.action = altfw_action,
-			}, {
-				.text = "Bootloader 6",
-				.action = altfw_action,
-			}, {
-				.text = "Bootloader 7",
-				.action = altfw_action,
-			}, {
-				.text = "Bootloader 8",
-				.action = altfw_action,
-			}, {
-				.text = "Bootloader 9",
-				.action = altfw_action,
-			}, {
-				.text = "Cancel",
-				.action = enter_developer_menu,
-			},
-		},
-	},
-};
-
-/* Initialize menu state. Must be called once before displaying any menus. */
-static vb2_error_t vb2_init_menus(struct vb2_context *ctx)
-{
-	struct vb2_menu_item *items;
-	uint32_t count;
-	int i;
-
-	/* Initialize language menu with the correct amount of entries. */
-	count = vb2ex_get_locale_count();
-	if (count == 0)
-		count = 1;  /* Fall back to 1 language entry on failure */
-
-	items = malloc(count * sizeof(struct vb2_menu_item));
-	if (!items)
-		return VB2_ERROR_UNKNOWN;
-
-	for (i = 0; i < count; i++) {
-		/* The actual language is drawn by the bootloader */
-		items[i].text = "Some Language";
-		items[i].action = language_action;
-	}
-	menus[VB_MENU_LANGUAGES].size = count;
-	menus[VB_MENU_LANGUAGES].items = items;
-
-	return VB2_SUCCESS;
-}
-
-/**
- * Main function that handles developer warning menu functionality
- *
- * @param ctx		Vboot2 context
- * @return VB2_SUCCESS, or non-zero error code if error.
- */
-static vb2_error_t vb2_developer_legacy_menu(struct vb2_context *ctx)
-{
-	struct vb2_gbb_header *gbb = vb2_get_gbb(ctx);
-	vb2_error_t ret;
-
-	/* Check if the default is to boot using disk, usb, or legacy */
-	default_boot = vb2_nv_get(ctx, VB2_NV_DEV_DEFAULT_BOOT);
-	if (gbb->flags & VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY)
-		default_boot = VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY;
-
-	/* Check if developer mode is disabled by FWMP */
-	disable_dev_boot = 0;
-	if (vb2_secdata_fwmp_get_flag(ctx, VB2_SECDATA_FWMP_DEV_DISABLE_BOOT)) {
-		if (gbb->flags & VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON) {
-			VB2_DEBUG("FWMP_DEV_DISABLE_BOOT rejected by"
-				  "FORCE_DEV_SWITCH_ON\n");
-		} else {
-			/* If dev mode is disabled, only allow TONORM */
-			disable_dev_boot = 1;
-			VB2_DEBUG("dev_disable_boot is set.\n");
-		}
-	}
-
-	altfw_allowed = vb2_nv_get(ctx, VB2_NV_DEV_BOOT_LEGACY) ||
-	    (gbb->flags & VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY) ||
-	    vb2_secdata_fwmp_get_flag(ctx, VB2_SECDATA_FWMP_DEV_ENABLE_LEGACY);
-
-	/* Show appropriate initial menu */
-	if (disable_dev_boot)
-		enter_to_norm_menu(ctx);
-	else
-		enter_dev_warning_menu(ctx);
-
-	/* Get audio/delay context */
-	vb2_audio_start(ctx);
-
-	/* We'll loop until we finish the delay or are interrupted */
-	do {
-		uint32_t key = VbExKeyboardRead();
-
-		switch (key) {
-		case VB_BUTTON_VOL_DOWN_LONG_PRESS:
-		case VB_KEY_CTRL('D'):
-			/* Ctrl+D = boot from internal disk */
-			ret = boot_disk_action(ctx);
-			break;
-		case VB_KEY_CTRL('L'):
-			/* Ctrl+L = boot alternative bootloader */
-			ret = enter_altfw_menu(ctx);
-			break;
-		case VB_BUTTON_VOL_UP_LONG_PRESS:
-		case VB_KEY_CTRL('U'):
-			/* Ctrl+U = boot from USB or SD card */
-			ret = boot_usb_action(ctx);
-			break;
-		/* We allow selection of the default '0' bootloader here */
-		case '0'...'9':
-			VB2_DEBUG("developer UI - "
-				  "user pressed key '%c': Boot alternative "
-				  "firmware\n", key);
-			vb2_try_altfw(ctx, altfw_allowed, key - '0');
-			ret = VB2_REQUEST_UI_CONTINUE;
-			break;
-		default:
-			ret = vb2_handle_menu_input(ctx, key, 0);
-			break;
-		}
-
-		/* We may have loaded a kernel or decided to shut down now. */
-		if (ret != VB2_REQUEST_UI_CONTINUE)
-			return ret;
-
-		/* Reset 30 second timer whenever we see a new key. */
-		if (key != 0)
-			vb2_audio_start(ctx);
-
-		vb2ex_msleep(KEY_DELAY_MS);
-
-		/* If dev mode was disabled, loop forever (never timeout) */
-	} while (disable_dev_boot ? 1 : vb2_audio_looping());
-
-	if (default_boot == VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY)
-		boot_legacy_action(ctx);	/* Doesn't return on success. */
-
-	if (default_boot == VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL)
-		if (VB2_SUCCESS == boot_usb_action(ctx))
-			return VB2_SUCCESS;
-
-	return boot_disk_action(ctx);
-}
-
-/* Developer mode entry point. */
-vb2_error_t VbBootDeveloperLegacyMenu(struct vb2_context *ctx)
-{
-	vb2_error_t retval = vb2_init_menus(ctx);
-	if (VB2_SUCCESS != retval)
-		return retval;
-	retval = vb2_developer_legacy_menu(ctx);
-	VbDisplayMenu(ctx, VB_SCREEN_BLANK, 0, 0, 0);
-	return retval;
-}
-
-/* Main function that handles non-manual recovery (BROKEN) menu functionality */
-static vb2_error_t broken_ui(struct vb2_context *ctx)
-{
-	enter_recovery_base_screen(ctx);
-
-	/* Loop and wait for the user to reset or shut down. */
-	VB2_DEBUG("waiting for manual recovery\n");
-	while (1) {
-		uint32_t key = VbExKeyboardRead();
-		vb2_error_t ret = vb2_handle_menu_input(ctx, key, 0);
-		if (ret != VB2_REQUEST_UI_CONTINUE)
-			return ret;
-	}
-}
-
-/**
- * Main function that handles recovery menu functionality
- *
- * @param ctx		Vboot2 context
- * @return VB2_SUCCESS, or non-zero error code if error.
- */
-static vb2_error_t recovery_ui(struct vb2_context *ctx)
-{
-	uint32_t key;
-	uint32_t key_flags;
-	vb2_error_t ret;
-
-	/* Loop and wait for a recovery image */
-	VB2_DEBUG("waiting for a recovery image\n");
-	usb_nogood = -1;
-	while (1) {
-		ret = VbTryLoadKernel(ctx, VB_DISK_FLAG_REMOVABLE);
-
-		if (VB2_SUCCESS == ret)
-			return ret; /* Found a recovery kernel */
-
-		if (usb_nogood != (ret != VB2_ERROR_LK_NO_DISK_FOUND)) {
-			/* USB state changed, force back to base screen */
-			usb_nogood = ret != VB2_ERROR_LK_NO_DISK_FOUND;
-			enter_recovery_base_screen(ctx);
-		}
-
-		key = VbExKeyboardReadWithFlags(&key_flags);
-		if (key == VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS) {
-			if (key_flags & VB_KEY_FLAG_TRUSTED_KEYBOARD)
-				enter_to_dev_menu(ctx);
-			else
-				VB2_DEBUG("ERROR: untrusted combo?!\n");
-		} else {
-			ret = vb2_handle_menu_input(ctx, key, key_flags);
-			if (ret != VB2_REQUEST_UI_CONTINUE)
-				return ret;
-		}
-		vb2ex_msleep(KEY_DELAY_MS);
-	}
-}
-
-/* Recovery mode entry point. */
-vb2_error_t VbBootRecoveryLegacyMenu(struct vb2_context *ctx)
-{
-	vb2_error_t retval = vb2_init_menus(ctx);
-	if (VB2_SUCCESS != retval)
-		return retval;
-	if (vb2_allow_recovery(ctx))
-		retval = recovery_ui(ctx);
-	else
-		retval = broken_ui(ctx);
-	VbDisplayScreen(ctx, VB_SCREEN_BLANK, 0, NULL);
-	return retval;
-}
diff --git a/firmware/lib/vboot_ui_legacy_wilco.c b/firmware/lib/vboot_ui_legacy_wilco.c
deleted file mode 100644
index 7838bcf..0000000
--- a/firmware/lib/vboot_ui_legacy_wilco.c
+++ /dev/null
@@ -1,367 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Code used by vboot_ui_legacy_clamshell for Wilco-specific features.
- */
-
-#include "2common.h"
-#include "2nvstorage.h"
-#include "2sysincludes.h"
-#include "vboot_api.h"
-#include "vboot_ui_legacy.h"
-#include "vboot_ui_legacy_wilco.h"
-
-static inline int is_vowel(uint32_t key)
-{
-	return key == 'A' || key == 'E' || key == 'I' ||
-	       key == 'O' || key == 'U';
-}
-
-static int vendor_data_length(char *data_value)
-{
-	for (int len = 0; len <= VENDOR_DATA_LENGTH; len++) {
-		if (data_value[len] == '\0')
-			return len;
-	}
-
-	return VENDOR_DATA_LENGTH;
-}
-
-/*
- * Prompt the user to enter the serial number
- */
-static vb2_error_t vb2_enter_vendor_data_ui(struct vb2_context *ctx,
-					    char *data_value)
-{
-	int len = vendor_data_length(data_value);
-	int blinks = CURSOR_BLINK_MS / KEY_DELAY_MS;
-	int blink_count = 0;
-	VbScreenData data = {
-		.vendor_data = {
-			.input_text = data_value,
-			.flags = VB_VENDOR_DATA_SHOW_CURSOR,
-			.selected_index = 1,
-		}
-	};
-
-	VbDisplayScreen(ctx, VB_SCREEN_SET_VENDOR_DATA, 1, &data);
-
-	/* We'll loop until the user decides what to do */
-	do {
-		uint32_t key = VbExKeyboardRead();
-
-		if (vb2_want_shutdown(ctx, key)) {
-			VB2_DEBUG("Vendor Data UI - shutdown requested!\n");
-			return VB2_REQUEST_SHUTDOWN;
-		}
-		switch (key) {
-		case 0:
-			/* Nothing pressed */
-			break;
-		case VB_KEY_ESC:
-			/* Escape pressed - return to developer screen */
-			VB2_DEBUG("Vendor Data UI - user pressed Esc: "
-				  "exit to Developer screen\n");
-			data_value[0] = '\0';
-			return VB2_SUCCESS;
-		case 'a'...'z':
-			key = toupper(key);
-			VBOOT_FALLTHROUGH;
-		case '0'...'9':
-		case 'A'...'Z':
-			if ((len > 0 && is_vowel(key)) ||
-			     len >= VENDOR_DATA_LENGTH) {
-				vb2_error_beep(VB_BEEP_NOT_ALLOWED);
-			} else {
-				data_value[len++] = key;
-				data_value[len] = '\0';
-				VbDisplayScreen(ctx, VB_SCREEN_SET_VENDOR_DATA,
-						1, &data);
-			}
-
-			VB2_DEBUG("Vendor Data UI - vendor_data: %s\n",
-				  data_value);
-			break;
-		case VB_KEY_BACKSPACE:
-			if (len > 0) {
-				data_value[--len] = '\0';
-				VbDisplayScreen(ctx, VB_SCREEN_SET_VENDOR_DATA,
-						1, &data);
-			}
-
-			VB2_DEBUG("Vendor Data UI - vendor_data: %s\n",
-				  data_value);
-			break;
-		case VB_KEY_ENTER:
-			if (len == VENDOR_DATA_LENGTH) {
-				/* Enter pressed - confirm input */
-				VB2_DEBUG("Vendor Data UI - user pressed "
-					  "Enter: confirm vendor data\n");
-				return VB2_SUCCESS;
-			} else {
-				vb2_error_beep(VB_BEEP_NOT_ALLOWED);
-			}
-			break;
-		default:
-			VB2_DEBUG("Vendor Data UI - pressed key %#x\n", key);
-			VbCheckDisplayKey(ctx, key, VB_SCREEN_SET_VENDOR_DATA,
-					  &data);
-			break;
-		}
-		vb2ex_msleep(KEY_DELAY_MS);
-
-		if (++blink_count == blinks) {
-			blink_count = 0;
-			data.vendor_data.flags ^= VB_VENDOR_DATA_SHOW_CURSOR;
-			data.vendor_data.flags |=
-				VB_VENDOR_DATA_ONLY_DRAW_CURSOR;
-
-			VbDisplayScreen(ctx, VB_SCREEN_SET_VENDOR_DATA,
-					1, &data);
-
-			data.vendor_data.flags &=
-				~(VB_VENDOR_DATA_ONLY_DRAW_CURSOR);
-		}
-	} while (1);
-
-	return VB2_SUCCESS;
-}
-
-/*
- * Prompt the user to confirm the serial number and write to memory
- */
-static vb2_error_t vb2_confirm_vendor_data_ui(struct vb2_context *ctx,
-					      char* data_value, VbScreenData *data)
-{
-	VbDisplayScreen(ctx, VB_SCREEN_CONFIRM_VENDOR_DATA, 1, data);
-	/* We'll loop until the user decides what to do */
-	do {
-		uint32_t key_confirm = VbExKeyboardRead();
-
-		if (vb2_want_shutdown(ctx, key_confirm)) {
-			VB2_DEBUG("Confirm Vendor Data UI "
-				  "- shutdown requested!\n");
-			return VB2_REQUEST_SHUTDOWN;
-		}
-		switch (key_confirm) {
-		case 0:
-			/* Nothing pressed */
-			break;
-		case VB_KEY_ESC:
-			/* Escape pressed - return to developer screen */
-			VB2_DEBUG("Confirm Vendor Data UI - user "
-				  "pressed Esc: exit to Developer screen\n");
-			return VB2_SUCCESS;
-		case VB_KEY_RIGHT:
-		case VB_KEY_LEFT:
-			data->vendor_data.selected_index =
-				data->vendor_data.selected_index ^ 1;
-			VbDisplayScreen(ctx, VB_SCREEN_CONFIRM_VENDOR_DATA,
-					1, data);
-			VB2_DEBUG("selected_index:%d\n",
-				  data->vendor_data.selected_index);
-			break;
-		case VB_KEY_ENTER:
-			/* Enter pressed - write vendor data */
-			if (data->vendor_data.selected_index == 0) {
-				VB2_DEBUG("Confirm Vendor Data UI - user "
-					  "selected YES: "
-					  "write vendor data (%s) to VPD\n",
-					  data_value);
-				vb2_error_t ret = VbExSetVendorData(data_value);
-
-				if (ret == VB2_SUCCESS) {
-					vb2_nv_set(ctx,
-						   VB2_NV_DISABLE_DEV_REQUEST,
-						   1);
-					return VB2_REQUEST_REBOOT;
-				} else {
-					vb2_error_notify(
-						"ERROR: Vendor data was not "
-						"set.\n"
-						"System will now shutdown\n",
-						NULL, VB_BEEP_FAILED);
-					vb2ex_msleep(5 * VB2_MSEC_PER_SEC);
-					return VB2_REQUEST_SHUTDOWN;
-				}
-			} else {
-				VB2_DEBUG("Confirm Vendor Data UI - user "
-					  "selected NO: "
-					  "Returning to set screen\n");
-				return VB2_SUCCESS;
-			}
-		default:
-			VB2_DEBUG("Confirm Vendor Data UI - pressed "
-				  "key %#x\n", key_confirm);
-			VbCheckDisplayKey(ctx, key_confirm,
-					  VB_SCREEN_CONFIRM_VENDOR_DATA, data);
-			break;
-		}
-		vb2ex_msleep(KEY_DELAY_MS);
-	} while (1);
-	return VB2_SUCCESS;
-}
-
-vb2_error_t vb2_vendor_data_ui(struct vb2_context *ctx)
-{
-	char data_value[VENDOR_DATA_LENGTH + 1];
-
-	VbScreenData data = {.vendor_data = {data_value, 0, 0}};
-	VbDisplayScreen(ctx, VB_COMPLETE_VENDOR_DATA, 0, NULL);
-
-	do {
-		uint32_t key_set = VbExKeyboardRead();
-
-		if (vb2_want_shutdown(ctx, key_set)) {
-			VB2_DEBUG("Vendor Data UI - shutdown requested!\n");
-			return VB2_REQUEST_SHUTDOWN;
-		}
-
-		switch (key_set) {
-		case 0:
-			/* Nothing pressed - do nothing. */
-			break;
-		case VB_KEY_ESC:
-			/* ESC pressed - boot normally */
-			VB2_DEBUG("Vendor Data UI - boot normally\n");
-			return VB2_SUCCESS;
-			break;
-		case VB_KEY_ENTER:
-			data_value[0] = '\0';
-			do {
-				/* ENTER pressed -
-				   enter vendor data set screen */
-				VB2_DEBUG("Vendor Data UI - Enter VD set "
-					  "screen\n");
-				vb2_error_t ret = vb2_enter_vendor_data_ui(
-					ctx, data_value);
-
-				if (ret)
-					return ret;
-
-				/* Vendor data was not entered just return */
-				if (vendor_data_length(data_value) == 0) {
-					return VB2_SUCCESS;
-				}
-
-				/* Reset confirmation answer to YES */
-				data.vendor_data.selected_index = 0;
-
-				ret = vb2_confirm_vendor_data_ui(
-					ctx, data_value, &data);
-
-				if (ret)
-					return ret;
-
-				/* Break if vendor data confirmed */
-				if (data.vendor_data.selected_index == 0)
-					return VB2_SUCCESS;
-			} while (1);
-			break;
-		default:
-			break;
-		}
-	} while (1);
-	return VB2_SUCCESS;
-}
-
-vb2_error_t vb2_check_diagnostic_key(struct vb2_context *ctx, uint32_t key)
-{
-	if (DIAGNOSTIC_UI && (key == VB_KEY_CTRL('C') || key == VB_KEY_F(12))) {
-		VB2_DEBUG("Diagnostic mode requested, rebooting\n");
-		vb2_nv_set(ctx, VB2_NV_DIAG_REQUEST, 1);
-
-		return VB2_REQUEST_REBOOT;
-	}
-
-	return VB2_SUCCESS;
-}
-
-vb2_error_t vb2_diagnostics_ui(struct vb2_context *ctx)
-{
-	int active = 1;
-	int button_released = 0;
-	int button_pressed = 0;
-	vb2_error_t result = VB2_REQUEST_REBOOT;
-	int action_confirmed = 0;
-	uint32_t start_time_ms;
-
-	VbDisplayScreen(ctx, VB_SCREEN_CONFIRM_DIAG, 0, NULL);
-
-	start_time_ms = vb2ex_mtime();
-
-	/* We'll loop until the user decides what to do */
-	do {
-		uint32_t key = VbExKeyboardRead();
-		/* Note that we need to check that the physical presence button
-		   was pressed *and then* released. */
-		if (vb2ex_physical_presence_pressed()) {
-			/* Wait for a release before registering a press. */
-			if (button_released)
-				button_pressed = 1;
-		} else {
-			button_released = 1;
-			if (button_pressed) {
-				VB2_DEBUG("vb2_diagnostics_ui() - power released\n");
-				action_confirmed = 1;
-				active = 0;
-				break;
-			}
-		}
-
-		/* Check the lid and ignore the power button. */
-		if (vb2_want_shutdown(ctx, 0) & ~VB_SHUTDOWN_REQUEST_POWER_BUTTON) {
-			VB2_DEBUG("vb2_diagnostics_ui() - shutdown request\n");
-			result = VB2_REQUEST_SHUTDOWN;
-			active = 0;
-			break;
-		}
-
-		switch (key) {
-		case 0:
-			/* Nothing pressed */
-			break;
-		case VB_KEY_ESC:
-			/* Escape pressed - reboot */
-			VB2_DEBUG("vb2_diagnostics_ui() - user pressed Esc\n");
-			active = 0;
-			break;
-		default:
-			VB2_DEBUG("vb2_diagnostics_ui() - pressed key %#x\n",
-				  key);
-			VbCheckDisplayKey(ctx, key, VB_SCREEN_CONFIRM_DIAG,
-					  NULL);
-			break;
-		}
-		if (vb2ex_mtime() - start_time_ms >= 30 * VB2_MSEC_PER_SEC) {
-			VB2_DEBUG("vb2_diagnostics_ui() - timeout\n");
-			break;
-		}
-		if (active) {
-			vb2ex_msleep(KEY_DELAY_MS);
-		}
-	} while (active);
-
-	VbDisplayScreen(ctx, VB_SCREEN_BLANK, 0, NULL);
-
-	if (action_confirmed) {
-		VB2_DEBUG("Diagnostic requested, running\n");
-
-		if (vb2ex_tpm_set_mode(VB2_TPM_MODE_DISABLED) !=
-			   VB2_SUCCESS) {
-			VB2_DEBUG("Failed to disable TPM\n");
-			vb2api_fail(ctx, VB2_RECOVERY_TPM_DISABLE_FAILED, 0);
-		} else {
-			vb2_try_altfw(ctx, 1, VB_ALTFW_DIAGNOSTIC);
-			VB2_DEBUG("Diagnostic failed to run\n");
-			/*
-			 * Assuming failure was due to bad hash, though
-			 * the rom could just be missing or invalid.
-			 */
-			vb2api_fail(ctx, VB2_RECOVERY_ALTFW_HASH_FAILED, 0);
-		}
-	}
-
-	return result;
-}
diff --git a/firmware/stub/vboot_api_stub.c b/firmware/stub/vboot_api_stub.c
index 5678521..fe1c13d 100644
--- a/firmware/stub/vboot_api_stub.c
+++ b/firmware/stub/vboot_api_stub.c
@@ -26,24 +26,6 @@
 {
 }
 
-vb2_error_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale,
-			      const VbScreenData *data)
-{
-	return VB2_SUCCESS;
-}
-
-vb2_error_t VbExDisplayMenu(uint32_t screen_type, uint32_t locale,
-			    uint32_t selected_index, uint32_t disabled_idx_mask,
-			    uint32_t redraw_base)
-{
-	return VB2_SUCCESS;
-}
-
-vb2_error_t VbExDisplayDebugInfo(const char *info_str, int full_info)
-{
-	return VB2_SUCCESS;
-}
-
 uint32_t vb2ex_get_locale_count(void)
 {
 	return 0;
@@ -54,11 +36,6 @@
 	return 0;
 }
 
-uint32_t VbExGetAltFwIdxMask(void)
-{
-	return 0;
-}
-
 uint32_t VbExKeyboardRead(void)
 {
 	return 0;
@@ -155,8 +132,3 @@
 {
 	return VB2_SUCCESS;
 }
-
-vb2_error_t VbExSetVendorData(const char *vendor_data_value)
-{
-	return VB2_SUCCESS;
-}
diff --git a/tests/vb2_auxfw_sync_tests.c b/tests/vb2_auxfw_sync_tests.c
index 358f706..f779ac0 100644
--- a/tests/vb2_auxfw_sync_tests.c
+++ b/tests/vb2_auxfw_sync_tests.c
@@ -19,7 +19,6 @@
 #include "vboot_audio.h"
 #include "vboot_kernel.h"
 #include "vboot_struct.h"
-#include "vboot_ui_legacy.h"
 
 /* Mock data */
 static struct vb2_context *ctx;
diff --git a/tests/vb2_ec_sync_tests.c b/tests/vb2_ec_sync_tests.c
index 6c06caf..be86fbb 100644
--- a/tests/vb2_ec_sync_tests.c
+++ b/tests/vb2_ec_sync_tests.c
@@ -16,7 +16,6 @@
 #include "vboot_audio.h"
 #include "vboot_kernel.h"
 #include "vboot_struct.h"
-#include "vboot_ui_legacy.h"
 
 /* Mock data */
 static int ec_ro_updated;
diff --git a/tests/vboot_api_kernel4_tests.c b/tests/vboot_api_kernel4_tests.c
index 1e68748..5229ee5 100644
--- a/tests/vboot_api_kernel4_tests.c
+++ b/tests/vboot_api_kernel4_tests.c
@@ -144,16 +144,6 @@
 	return boot_dev(c);
 }
 
-vb2_error_t VbBootDeveloperLegacyClamshell(struct vb2_context *c)
-{
-	return boot_dev(c);
-}
-
-vb2_error_t VbBootDeveloperLegacyMenu(struct vb2_context *c)
-{
-	return boot_dev(c);
-}
-
 static void rec_check(struct vb2_context *c)
 {
 	TEST_EQ(current_recovery_reason, expected_recovery_reason,
@@ -179,34 +169,6 @@
 
 vb2_error_t vb2_diagnostic_menu(struct vb2_context *c)
 {
-	TEST_TRUE(MENU_UI, "Using menu_ui");
-	if (vbboot_retval == -5)
-		return VB2_ERROR_MOCK;
-
-	return vbboot_retval;
-}
-
-vb2_error_t VbBootRecoveryLegacyClamshell(struct vb2_context *c)
-{
-	rec_check(c);
-	/* Don't care if it's manual recovery or not */
-	if (vbboot_retval == -3 || vbboot_retval == -4)
-		return VB2_ERROR_MOCK;
-	return vbboot_retval;
-}
-
-vb2_error_t VbBootRecoveryLegacyMenu(struct vb2_context *c)
-{
-	rec_check(c);
-	/* Don't care if it's manual recovery or not */
-	if (vbboot_retval == -3 || vbboot_retval == -4)
-		return VB2_ERROR_MOCK;
-	return vbboot_retval;
-}
-
-vb2_error_t VbBootDiagnosticLegacyClamshell(struct vb2_context *c)
-{
-	TEST_TRUE(!MENU_UI, "Not using menu_ui");
 	if (vbboot_retval == -5)
 		return VB2_ERROR_MOCK;
 
diff --git a/tests/vboot_ui_legacy_clamshell_beep_tests.c b/tests/vboot_ui_legacy_clamshell_beep_tests.c
deleted file mode 100644
index cb0b476..0000000
--- a/tests/vboot_ui_legacy_clamshell_beep_tests.c
+++ /dev/null
@@ -1,274 +0,0 @@
-/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Tests for vboot_api_firmware
- */
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2secdata.h"
-#include "2sysincludes.h"
-#include "crc32.h"
-#include "host_common.h"
-#include "load_kernel_fw.h"
-#include "test_common.h"
-#include "vboot_kernel.h"
-#include "vboot_struct.h"
-
-/* Expected results */
-
-#define MAX_NOTE_EVENTS 10
-#define TIME_FUZZ 500
-#define KBD_READ_TIME 60
-
-typedef struct {
-	uint16_t msec;
-	uint16_t freq;
-	int time;
-} note_event_t;
-
-typedef struct {
-	const char *name;
-	uint32_t gbb_flags;
-	uint32_t keypress_key;
-	int keypress_at_count;
-	int num_events;
-	note_event_t notes[MAX_NOTE_EVENTS];
-} test_case_t;
-
-test_case_t test[] = {
-
-	{ "VbBootDeveloperSoundTest( fast )",
-	  VB2_GBB_FLAG_DEV_SCREEN_SHORT_DELAY, 0, 0,
-	  1,
-	  {
-		{0, 0, 2000},		// off and return at 2 seconds
-	  }},
-
-	{ "VbBootDeveloperSoundTest( normal )",
-	  0, 0, 0,
-	  3,
-	  {
-		{250, 400, 20000},	// first beep at 20 seconds
-		{250, 400, 20510},	// second beep shortly after
-		{0, 0, 30020},	// off and return at 30 seconds
-	  }},
-
-	// Now with some keypresses
-
-	{ "VbBootDeveloperSoundTest( normal, Ctrl-D )",
-	  0, 4, 20400,			// Ctrl-D between beeps
-	  2,
-	  {
-		{250, 400, 20000},	// first beep at 20 seconds
-		{0, 0, 20400},	// sees Ctrl-D, sound off, return
-	  }},
-
-	{ "VbBootDeveloperSoundTest( normal, Ctrl-U not allowed )",
-	  0, 21, 10000,                          // Ctrl-U at 10 seconds
-	  5,
-	  {
-		{120, 400, 10000},	// complains about Ctrl-U (one beep)
-		{120, 400, 10240},	// complains about Ctrl-U (two beeps)
-		{250, 400, 20000},	// starts first beep at 20 seconds
-		{250, 400, 20510},	// starts second beep
-		{0, 0, 30020},	// returns at 30 seconds + 360ms
-	  }},
-};
-
-/* Mock data */
-static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
-	__attribute__((aligned(VB2_WORKBUF_ALIGN)));
-static struct vb2_context *ctx;
-static struct vb2_shared_data *sd;
-static struct vb2_gbb_header gbb;
-static uint32_t current_time;
-static uint32_t current_ticks;
-static int current_event;
-static int max_events;
-static int matched_events;
-static int kbd_fire_at;
-static uint32_t kbd_fire_key;
-static note_event_t *expected_event;
-
-/* Audio open count, so we can reset it */
-extern int audio_open_count;
-
-/* Reset mock data (for use before each test) */
-static void ResetMocks(void)
-{
-	TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
-		  "vb2api_init failed");
-	vb2_nv_init(ctx);
-
-	sd = vb2_get_sd(ctx);
-
-	ctx->flags |= VB2_CONTEXT_NO_SECDATA_FWMP;
-	sd->status |= VB2_SD_STATUS_SECDATA_FWMP_INIT;
-
-	memset(&gbb, 0, sizeof(gbb));
-
-	current_ticks = 0;
-	current_time = 0;
-
-	current_event = 0;
-	kbd_fire_at = 0;
-	kbd_fire_key = 0;
-	audio_open_count = 0;
-
-	matched_events = 0;
-	max_events = 0;
-}
-
-/****************************************************************************/
-/* Mocked verification functions */
-struct vb2_gbb_header *vb2_get_gbb(struct vb2_context *c)
-{
-	return &gbb;
-}
-
-vb2_error_t vb2ex_commit_data(struct vb2_context *c)
-{
-	return VB2_SUCCESS;
-}
-
-vb2_error_t VbExDiskGetInfo(VbDiskInfo** infos_ptr, uint32_t* count,
-			    uint32_t disk_flags)
-{
-	return VB2_ERROR_UNKNOWN;
-}
-
-vb2_error_t VbExDiskFreeInfo(VbDiskInfo* infos,
-			     VbExDiskHandle_t preserve_handle)
-{
-	return VB2_SUCCESS;
-}
-
-vb2_error_t VbExDiskRead(VbExDiskHandle_t handle, uint64_t lba_start,
-			 uint64_t lba_count, void* buffer)
-{
-	return VB2_ERROR_UNKNOWN;
-}
-
-vb2_error_t VbExDiskWrite(VbExDiskHandle_t handle, uint64_t lba_start,
-			  uint64_t lba_count, const void* buffer)
-{
-	return VB2_ERROR_UNKNOWN;
-}
-
-uint32_t VbExIsShutdownRequested(void)
-{
-	return 0;
-}
-
-uint32_t VbExKeyboardRead(void)
-{
-	uint32_t tmp;
-	uint32_t now;
-
-	vb2ex_msleep(KBD_READ_TIME);
-	now = current_time;
-
-	if (kbd_fire_key && now >= kbd_fire_at) {
-		VB2_DEBUG("returning %d at %d msec\n",
-			  kbd_fire_key, now);
-		tmp = kbd_fire_key;
-		kbd_fire_key = 0;
-		return tmp;
-	}
-	VB2_DEBUG("returning %d at %d msec\n", 0, now);
-	return 0;
-}
-
-void vb2ex_msleep(uint32_t msec)
-{
-	current_ticks += msec;
-	current_time = current_ticks;
-	VB2_DEBUG("msec=%d at %d msec\n", msec, current_time);
-}
-
-uint32_t vb2ex_mtime(void)
-{
-	return current_ticks;
-}
-
-void vb2ex_beep(uint32_t msec, uint32_t frequency)
-{
-	VB2_DEBUG("msec=%d, frequency=%d at %d msec\n",
-		  msec, frequency, current_time);
-
-	if (current_event < max_events &&
-	    msec == expected_event[current_event].msec &&
-	    frequency == expected_event[current_event].freq &&
-	    (current_time - expected_event[current_event].time) < TIME_FUZZ)
-		matched_events++;
-
-	if (msec)
-		vb2ex_msleep(msec);
-	current_event++;
-}
-
-vb2_error_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale,
-			      const VbScreenData *data)
-{
-	switch (screen_type) {
-		case VB_SCREEN_BLANK:
-			VB2_DEBUG("screen_type=BLANK\n");
-			break;
-		case VB_SCREEN_DEVELOPER_WARNING:
-			VB2_DEBUG("screen_type=DEV\n");
-			break;
-		case VB_SCREEN_RECOVERY_INSERT:
-			VB2_DEBUG("screen_type=INSERT\n");
-			break;
-		case VB_SCREEN_RECOVERY_NO_GOOD:
-			VB2_DEBUG("screen_type=NO_GOOD\n");
-			break;
-		case VB_SCREEN_OS_BROKEN:
-			VB2_DEBUG("screen_type=BROKEN\n");
-			break;
-		default:
-			VB2_DEBUG("screen_type=%#x\n", screen_type);
-	}
-
-	VB2_DEBUG("current_time is %d msec\n", current_time);
-
-	return VB2_SUCCESS;
-}
-
-/****************************************************************************/
-
-static void VbBootDeveloperSoundTest(void)
-{
-	int i;
-	int num_tests =  sizeof(test) / sizeof(test_case_t);
-
-	for (i = 0; i < num_tests; i++) {
-		VB2_DEBUG("STARTING %s ...\n", test[i].name);
-		ResetMocks();
-		gbb.flags = test[i].gbb_flags;
-		kbd_fire_key = test[i].keypress_key;
-		kbd_fire_at = test[i].keypress_at_count;
-		max_events = test[i].num_events;
-		expected_event = test[i].notes;
-		VbBootDeveloperLegacyClamshell(ctx);
-		vb2ex_beep(0, 0);  /* Dummy call to determine end time */
-		VB2_DEBUG("INFO: matched %d total %d expected %d\n",
-			  matched_events, current_event, test[i].num_events);
-		TEST_TRUE(matched_events == test[i].num_events &&
-			  current_event == test[i].num_events, test[i].name);
-	}
-}
-
-int main(int argc, char* argv[])
-{
-	VbBootDeveloperSoundTest();
-	return gTestSuccess ? 0 : 255;
-}
diff --git a/tests/vboot_ui_legacy_clamshell_tests.c b/tests/vboot_ui_legacy_clamshell_tests.c
deleted file mode 100644
index d33cb71..0000000
--- a/tests/vboot_ui_legacy_clamshell_tests.c
+++ /dev/null
@@ -1,1655 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Tests for vboot_api_kernel, part 2
- */
-
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2secdata.h"
-#include "2secdata_struct.h"
-#include "host_common.h"
-#include "load_kernel_fw.h"
-#include "test_common.h"
-#include "tss_constants.h"
-#include "vboot_audio.h"
-#include "vboot_kernel.h"
-#include "vboot_struct.h"
-#include "vboot_test.h"
-#include "vboot_ui_legacy.h"
-
-/* Mock data */
-static LoadKernelParams lkp;
-static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
-	__attribute__((aligned(VB2_WORKBUF_ALIGN)));
-static struct vb2_context *ctx;
-static struct vb2_shared_data *sd;
-static struct vb2_gbb_header gbb;
-static struct vb2_secdata_fwmp *fwmp;
-
-static int audio_looping_calls_left;
-static uint32_t vbtlk_retval;
-static int vbtlk_expect_fixed;
-static int vbtlk_expect_removable;
-static int vbexlegacy_called;
-static enum VbAltFwIndex_t altfw_num;
-static uint32_t current_ticks;
-static int trust_ec;
-static int virtdev_set;
-static uint32_t virtdev_fail;
-static uint32_t mock_keypress[16];
-static uint32_t mock_keyflags[8];
-static uint32_t mock_keypress_count;
-
-#define GPIO_SHUTDOWN   1
-#define GPIO_PRESENCE   2
-#define GPIO_LID_CLOSED 4
-typedef struct GpioState {
-	uint32_t gpio_flags;
-	uint32_t count;
-} GpioState;
-struct GpioState mock_gpio[8];
-static uint32_t mock_gpio_count;
-
-static uint32_t screens_displayed[8];
-static uint32_t screens_count = 0;
-static uint32_t mock_num_disks[8];
-static uint32_t mock_num_disks_count;
-static int tpm_set_mode_called;
-static enum vb2_tpm_mode tpm_mode;
-
-/* Extra character to guarantee null termination. */
-static char set_vendor_data[VENDOR_DATA_LENGTH + 2];
-static int set_vendor_data_called;
-
-/*
- * Mocks the assertion of 1 or more gpios in |gpio_flags| for 100 ticks after
- * an optional |ticks| delay.
- */
-static void MockGpioAfter(uint32_t ticks, uint32_t gpio_flags)
-{
-	uint32_t index = 0;
-	if (ticks > 0)
-		mock_gpio[index++].count = ticks - 1;
-
-	mock_gpio[index].gpio_flags = gpio_flags;
-	mock_gpio[index].count = 100;
-}
-
-/* Reset mock data (for use before each test) */
-static void ResetMocks(void)
-{
-	vb2_reset_power_button();
-
-	memset(&lkp, 0, sizeof(lkp));
-
-	TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
-		  "vb2api_init failed");
-	vb2_nv_init(ctx);
-
-	sd = vb2_get_sd(ctx);
-	sd->flags |= VB2_SD_FLAG_DISPLAY_AVAILABLE;
-
-	/* CRC will be invalid after here, but nobody's checking */
-	sd->status |= VB2_SD_STATUS_SECDATA_FWMP_INIT;
-	fwmp = (struct vb2_secdata_fwmp *)ctx->secdata_fwmp;
-
-	memset(&gbb, 0, sizeof(gbb));
-
-	audio_looping_calls_left = 30;
-	vbtlk_retval = VB2_ERROR_MOCK;
-	vbtlk_expect_fixed = 0;
-	vbtlk_expect_removable = 0;
-	vbexlegacy_called = 0;
-	altfw_num = -100;
-	current_ticks = 0;
-	trust_ec = 0;
-	virtdev_set = 0;
-	virtdev_fail = 0;
-	set_vendor_data_called = 0;
-
-	memset(screens_displayed, 0, sizeof(screens_displayed));
-	screens_count = 0;
-
-	memset(mock_keypress, 0, sizeof(mock_keypress));
-	memset(mock_keyflags, 0, sizeof(mock_keyflags));
-	mock_keypress_count = 0;
-	memset(mock_gpio, 0, sizeof(mock_gpio));
-	mock_gpio_count = 0;
-	memset(mock_num_disks, 0, sizeof(mock_num_disks));
-	mock_num_disks_count = 0;
-
-	tpm_set_mode_called = 0;
-	tpm_mode = VB2_TPM_MODE_ENABLED_TENTATIVE;
-}
-
-/* Mock functions */
-
-struct vb2_gbb_header *vb2_get_gbb(struct vb2_context *c)
-{
-	return &gbb;
-}
-
-uint32_t VbExIsShutdownRequested(void)
-{
-	uint32_t result = 0;
-	if (mock_gpio_count >= ARRAY_SIZE(mock_gpio))
-		return 0;
-	if (mock_gpio[mock_gpio_count].gpio_flags & GPIO_SHUTDOWN)
-		result |= VB_SHUTDOWN_REQUEST_POWER_BUTTON;
-	if (mock_gpio[mock_gpio_count].gpio_flags & GPIO_LID_CLOSED)
-		result |= VB_SHUTDOWN_REQUEST_LID_CLOSED;
-	if (mock_gpio[mock_gpio_count].count > 0) {
-		--mock_gpio[mock_gpio_count].count;
-	} else {
-		++mock_gpio_count;
-	}
-	return result;
-}
-
-uint32_t VbExKeyboardRead(void)
-{
-	return VbExKeyboardReadWithFlags(NULL);
-}
-
-uint32_t VbExKeyboardReadWithFlags(uint32_t *key_flags)
-{
-	if (mock_keypress_count < ARRAY_SIZE(mock_keypress)) {
-		if (key_flags != NULL &&
-		    mock_keypress_count < ARRAY_SIZE(mock_keyflags))
-			*key_flags = mock_keyflags[mock_keypress_count];
-		return mock_keypress[mock_keypress_count++];
-	} else
-		return 0;
-}
-
-int vb2ex_physical_presence_pressed(void)
-{
-	uint32_t result = 0;
-
-	if (mock_gpio_count >= ARRAY_SIZE(mock_gpio))
-		return 0;
-
-	if ((mock_gpio[mock_gpio_count].gpio_flags & GPIO_PRESENCE))
-		result = 1;
-
-	if (mock_gpio[mock_gpio_count].count > 0)
-		--mock_gpio[mock_gpio_count].count;
-	else
-		++mock_gpio_count;
-
-	return result;
-}
-
-vb2_error_t VbExLegacy(enum VbAltFwIndex_t _altfw_num)
-{
-	vbexlegacy_called++;
-	altfw_num = _altfw_num;
-
-	/* VbExLegacy() can only return failure, or not return at all. */
-	return VB2_ERROR_UNKNOWN;
-}
-
-void vb2ex_msleep(uint32_t msec)
-{
-	current_ticks += msec;
-}
-
-uint32_t vb2ex_mtime(void)
-{
-	return current_ticks;
-}
-
-vb2_error_t VbExDiskGetInfo(VbDiskInfo **infos_ptr, uint32_t *count,
-			    uint32_t disk_flags)
-{
-	if (mock_num_disks_count < ARRAY_SIZE(mock_num_disks)) {
-		if (mock_num_disks[mock_num_disks_count] == -1)
-			return VB2_ERROR_MOCK;
-		else
-			*count = mock_num_disks[mock_num_disks_count++];
-	} else {
-		*count = 0;
-	}
-	return VB2_SUCCESS;
-}
-
-vb2_error_t VbExDiskFreeInfo(VbDiskInfo *infos,
-			     VbExDiskHandle_t preserve_handle)
-{
-	return VB2_SUCCESS;
-}
-
-int vb2ex_ec_trusted(void)
-{
-	return trust_ec;
-}
-
-int vb2_audio_looping(void)
-{
-	if (audio_looping_calls_left == 0)
-		return 0;
-	else if (audio_looping_calls_left > 0)
-		audio_looping_calls_left--;
-
-	return 1;
-}
-
-vb2_error_t VbTryLoadKernel(struct vb2_context *c, uint32_t get_info_flags)
-{
-	/*
-	 * TODO: Currently we don't have a good way of testing for an ordered
-	 * sequence of VB_DISK_FLAG_FIXED and then VB_DISK_FLAG_REMOVABLE.  If
-	 * both are set, then just assume success.
-	 */
-	if (vbtlk_expect_fixed && vbtlk_expect_removable)
-		return vbtlk_retval;
-
-	TEST_EQ(!!vbtlk_expect_fixed,
-		!!(get_info_flags & VB_DISK_FLAG_FIXED),
-		"  VbTryLoadKernel unexpected fixed disk call");
-	TEST_EQ(!!vbtlk_expect_removable,
-		!!(get_info_flags & VB_DISK_FLAG_REMOVABLE),
-		"  VbTryLoadKernel unexpected removable disk call");
-
-	return vbtlk_retval;
-}
-
-vb2_error_t VbDisplayScreen(struct vb2_context *c, uint32_t screen, int force,
-			    const VbScreenData *data)
-{
-	if (screens_count < ARRAY_SIZE(screens_displayed))
-		screens_displayed[screens_count++] = screen;
-
-	return VB2_SUCCESS;
-}
-
-void vb2_enable_developer_mode(struct vb2_context *c)
-{
-	VB2_ASSERT(!virtdev_fail);
-	virtdev_set = 1;
-}
-
-vb2_error_t VbExSetVendorData(const char *vendor_data_value)
-{
-	set_vendor_data_called = 1;
-	/*
-	 * set_vendor_data is a global variable, so it is automatically
-	 * initialized to zero, and so the -1 will ensure the string is null
-	 * terminated.
-	 */
-	strncpy(set_vendor_data, vendor_data_value, sizeof(set_vendor_data) - 1);
-
-	return VB2_SUCCESS;
-}
-
-vb2_error_t vb2ex_tpm_set_mode(enum vb2_tpm_mode mode_val)
-{
-	tpm_set_mode_called = 1;
-
-	/* Fail if the TPM is already disabled. */
-	if (tpm_mode == VB2_TPM_MODE_DISABLED)
-		return VB2_ERROR_UNKNOWN;
-
-	tpm_mode = mode_val;
-	return VB2_SUCCESS;
-}
-
-/* Tests */
-
-/*
- * Helper function to test VbUserConfirms against a sequence of gpio events.
- * caller specifies a sequence of gpio events and the expected confirm vs.
- * reboot result.
- *
- * Non-asserted gpios are used for 5 events, then 'first' for 5 events,
- * 'second' for 5 events, and 'third' for 5 events.
- * Typically most tests want 5 events of each type (so they'll specify 0 for
- * 'first' and use 'second' through 'fourth'), but a few tests want the
- * shutdown event to be seen once.
- */
-static void VbUserConfirmsTestGpio(uint32_t first, uint32_t second,
-				   uint32_t third, uint32_t confirm,
-				   const char *msg)
-{
-	ResetMocks();
-	mock_gpio[0].gpio_flags = 0;
-	mock_gpio[0].count = 4;
-	mock_gpio[1].gpio_flags = first;
-	mock_gpio[1].count = 4;
-	mock_gpio[2].gpio_flags = second;
-	mock_gpio[2].count = 4;
-	mock_gpio[3].gpio_flags = third;
-	mock_gpio[3].count = 4;
-	if (confirm) {
-		TEST_EQ(VbUserConfirms(ctx,
-			VB_CONFIRM_SPACE_MEANS_NO |
-			VB_CONFIRM_MUST_TRUST_KEYBOARD),
-			1, msg);
-	} else {
-		TEST_EQ(VbUserConfirms(ctx,
-			VB_CONFIRM_SPACE_MEANS_NO |
-			VB_CONFIRM_MUST_TRUST_KEYBOARD),
-			-1, msg);
-	}
-}
-
-static void VbUserConfirmsKeyboardTest(void)
-{
-	VB2_DEBUG("Testing VbUserConfirms()...\n");
-
-	ResetMocks();
-	MockGpioAfter(1, GPIO_SHUTDOWN);
-	TEST_EQ(VbUserConfirms(ctx, 0), -1, "Shutdown requested");
-
-	ResetMocks();
-	mock_keypress[0] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbUserConfirms(ctx, 0), -1, "Shutdown requested");
-
-	ResetMocks();
-	mock_keypress[0] = VB_KEY_ENTER;
-	TEST_EQ(VbUserConfirms(ctx, 0), 1, "Enter");
-
-	ResetMocks();
-	mock_keypress[0] = VB_KEY_ESC;
-	TEST_EQ(VbUserConfirms(ctx, 0), 0, "Esc");
-
-	ResetMocks();
-	mock_keypress[0] = ' ';
-	MockGpioAfter(1, GPIO_SHUTDOWN);
-	TEST_EQ(VbUserConfirms(ctx, VB_CONFIRM_SPACE_MEANS_NO), 0,
-		"Space means no");
-
-	ResetMocks();
-	mock_keypress[0] = ' ';
-	MockGpioAfter(1, GPIO_SHUTDOWN);
-	TEST_EQ(VbUserConfirms(ctx, 0), -1, "Space ignored");
-
-	ResetMocks();
-	mock_keypress[0] = VB_KEY_ENTER;
-	mock_keyflags[0] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	TEST_EQ(VbUserConfirms(ctx, VB_CONFIRM_MUST_TRUST_KEYBOARD),
-		1, "Enter with trusted keyboard");
-
-	ResetMocks();
-	mock_keypress[0] = VB_KEY_ENTER;	/* untrusted */
-	mock_keypress[1] = ' ';
-	TEST_EQ(VbUserConfirms(ctx,
-			       VB_CONFIRM_SPACE_MEANS_NO |
-			       VB_CONFIRM_MUST_TRUST_KEYBOARD),
-		0, "Untrusted keyboard");
-
-	ResetMocks();
-	mock_keypress[0] = VB_KEY_ENTER;
-	mock_keypress[1] = 'y';
-	mock_keypress[2] = 'z';
-	mock_keypress[3] = ' ';
-	mock_gpio[0].gpio_flags = GPIO_PRESENCE;
-	mock_gpio[0].count = ~0;
-	TEST_EQ(VbUserConfirms(ctx,
-			       VB_CONFIRM_SPACE_MEANS_NO |
-			       VB_CONFIRM_MUST_TRUST_KEYBOARD),
-		0, "Recovery button stuck");
-
-	VB2_DEBUG("...done.\n");
-}
-
-static void VbUserConfirmsPhysicalPresenceTest(void)
-{
-	ResetMocks();
-	MockGpioAfter(0, GPIO_PRESENCE);
-	TEST_EQ(VbUserConfirms(ctx,
-			       VB_CONFIRM_SPACE_MEANS_NO |
-			       VB_CONFIRM_MUST_TRUST_KEYBOARD),
-		1, "Presence button");
-
-	/*
-	 * List of possiblities for shutdown and physical presence events that
-	 * occur over time.  Time advanced from left to right (where each
-	 * represents the gpio[s] that are seen during a given iteration of
-	 * the loop).  The meaning of the characters:
-	 *
-	 *   _ means no gpio
-	 *   s means shutdown gpio
-	 *   p means presence gpio
-	 *   B means both shutdown and presence gpio
-	 *
-	 *  1: ______ppp______ -> confirm
-	 *  2: ______sss______ -> shutdown
-	 *  3: ___pppsss______ -> confirm
-	 *  4: ___sssppp______ -> shutdown
-	 *  5: ___pppBBB______ -> confirm
-	 *  6: ___pppBBBppp___ -> shutdown
-	 *  7: ___pppBBBsss___ -> confirm
-	 *  8: ___sssBBB______ -> confirm
-	 *  9: ___sssBBBppp___ -> shutdown
-	 * 10: ___sssBBBsss___ -> confirm
-	 * 11: ______BBB______ -> confirm
-	 * 12: ______BBBsss___ -> confirm
-	 * 13: ______BBBppp___ -> shutdown
-	 */
-
-	/* 1: presence means confirm */
-	VbUserConfirmsTestGpio(GPIO_PRESENCE, 0, 0, 1, "presence");
-
-	/* 2: shutdown means shutdown */
-	VbUserConfirmsTestGpio(GPIO_SHUTDOWN, 0, 0, 0, "shutdown");
-
-	/* 3: presence then shutdown means confirm */
-	VbUserConfirmsTestGpio(GPIO_PRESENCE, GPIO_SHUTDOWN, 0, 1,
-			       "presence then shutdown");
-
-	/* 4: shutdown then presence means shutdown */
-	VbUserConfirmsTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE, 0, 0,
-			       "shutdown then presence");
-
-	/* 5: presence then shutdown+presence then none mean confirm */
-	VbUserConfirmsTestGpio(GPIO_PRESENCE, GPIO_PRESENCE | GPIO_SHUTDOWN,
-			       0, 1, "presence, both, none");
-
-	/* 6: presence then shutdown+presence then presence means shutdown */
-	VbUserConfirmsTestGpio(GPIO_PRESENCE, GPIO_PRESENCE | GPIO_SHUTDOWN,
-			       GPIO_PRESENCE, 0, "presence, both, presence");
-
-	/* 7: presence then shutdown+presence then shutdown means confirm */
-	VbUserConfirmsTestGpio(GPIO_PRESENCE, GPIO_PRESENCE | GPIO_SHUTDOWN,
-			       GPIO_SHUTDOWN, 1, "presence, both, shutdown");
-
-	/* 8: shutdown then shutdown+presence then none means confirm */
-	VbUserConfirmsTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE | GPIO_SHUTDOWN,
-			       0, 1, "shutdown, both, none");
-
-	/* 9: shutdown then shutdown+presence then presence means shutdown */
-	VbUserConfirmsTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE | GPIO_SHUTDOWN,
-			       GPIO_PRESENCE, 0, "shutdown, both, presence");
-
-	/* 10: shutdown then shutdown+presence then shutdown means confirm */
-	VbUserConfirmsTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE | GPIO_SHUTDOWN,
-			       GPIO_SHUTDOWN, 1, "shutdown, both, shutdown");
-
-	/* 11: shutdown+presence then none means confirm */
-	VbUserConfirmsTestGpio(GPIO_PRESENCE | GPIO_SHUTDOWN, 0, 0, 1,
-			       "both");
-
-	/* 12: shutdown+presence then shutdown means confirm */
-	VbUserConfirmsTestGpio(GPIO_PRESENCE | GPIO_SHUTDOWN,
-			       GPIO_SHUTDOWN, 0, 1, "both, shutdown");
-
-	/* 13: shutdown+presence then presence means shutdown */
-	VbUserConfirmsTestGpio(GPIO_PRESENCE | GPIO_SHUTDOWN,
-			       GPIO_PRESENCE, 0, 0, "both, presence");
-
-}
-
-static void VbBootDevTest(void)
-{
-	int key;
-
-	VB2_DEBUG("Testing VbBootDeveloperLegacyClamshell()...\n");
-
-	/* Proceed after timeout */
-	ResetMocks();
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Timeout");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING,
-		"  warning screen");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
-		"  recovery reason");
-	TEST_EQ(audio_looping_calls_left, 0, "  used up audio");
-
-	/* Proceed to legacy after timeout if GBB flag set */
-	ResetMocks();
-	gbb.flags |= VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY |
-			VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Timeout");
-	TEST_EQ(vbexlegacy_called, 1, "  try legacy");
-	TEST_EQ(altfw_num, 0, "  check altfw_num");
-
-	/* Proceed to legacy after timeout if GBB flag set */
-	ResetMocks();
-	gbb.flags |= VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY |
-			VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Timeout");
-	TEST_EQ(vbexlegacy_called, 1, "  try legacy");
-	TEST_EQ(altfw_num, 0, "  check altfw_num");
-
-	/* Proceed to legacy after timeout if boot legacy and default boot
-	   legacy are set */
-	ResetMocks();
-	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
-		   VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY);
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Timeout");
-	TEST_EQ(vbexlegacy_called, 1, "  try legacy");
-	TEST_EQ(altfw_num, 0, "  check altfw_num");
-
-	/* Proceed to legacy boot mode only if enabled */
-	ResetMocks();
-	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
-		   VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY);
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Timeout");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-
-	/* Proceed to external disk after timeout if boot external and default
-	 * boot external are set */
-	ResetMocks();
-	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
-		   VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	vbtlk_retval = VB2_SUCCESS;
-	vbtlk_expect_removable = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), 0, "Ctrl+U external");
-
-	/* Proceed to external boot mode only if enabled */
-	ResetMocks();
-	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
-		   VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Timeout");
-
-	/* If no external tries fixed disk */
-	ResetMocks();
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
-		   VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
-	vbtlk_expect_fixed = 1;
-	vbtlk_expect_removable = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Ctrl+U enabled");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-
-	/* Up arrow is uninteresting / passed to VbCheckDisplayKey() */
-	ResetMocks();
-	mock_keypress[0] = VB_KEY_UP;
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Up arrow");
-
-	/* Shutdown requested in loop */
-	ResetMocks();
-	mock_gpio[0].gpio_flags = 0;
-	mock_gpio[0].count = 2;
-	mock_gpio[1].gpio_flags = GPIO_SHUTDOWN;
-	mock_gpio[1].count = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-
-	/* Shutdown requested by keyboard in loop */
-	ResetMocks();
-	mock_keypress[0] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested by keyboard");
-
-	/* Space asks to disable virtual dev switch */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
-	mock_keypress[0] = ' ';
-	mock_keypress[1] = VB_KEY_ENTER;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Space = tonorm");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_TO_NORM,
-		"  tonorm screen");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_TO_NORM_CONFIRMED,
-		"  confirm screen");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST), 1,
-		"  disable dev request");
-
-	/* Space-space doesn't disable it */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
-	mock_keypress[0] = ' ';
-	mock_keypress[1] = ' ';
-	mock_keypress[2] = VB_KEY_ESC;
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Space-space");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_TO_NORM,
-		"  tonorm screen");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING,
-		"  warning screen");
-
-	/* Enter doesn't by default */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
-	mock_keypress[0] = VB_KEY_ENTER;
-	mock_keypress[1] = VB_KEY_ENTER;
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Enter ignored");
-
-	/* Enter does if GBB flag set */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
-	gbb.flags |= VB2_GBB_FLAG_ENTER_TRIGGERS_TONORM;
-	mock_keypress[0] = VB_KEY_ENTER;
-	mock_keypress[1] = VB_KEY_ENTER;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Enter = tonorm");
-
-	/* Tonorm ignored if GBB forces dev switch on */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
-	gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON;
-	mock_keypress[0] = ' ';
-	mock_keypress[1] = VB_KEY_ENTER;
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Can't tonorm gbb-dev");
-
-	/* Shutdown requested at tonorm screen */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
-	mock_keypress[0] = ' ';
-	MockGpioAfter(3, GPIO_SHUTDOWN);
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested at tonorm");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_TO_NORM,
-		"  tonorm screen");
-
-	/* Shutdown requested by keyboard at tonorm screen */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
-	mock_keypress[0] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested by keyboard at nonorm");
-
-	/* Ctrl+D dismisses warning */
-	ResetMocks();
-	mock_keypress[0] = VB_KEY_CTRL('D');
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Ctrl+D");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
-		"  recovery reason");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-
-	/* Ctrl+D doesn't boot legacy even if GBB flag is set */
-	ResetMocks();
-	mock_keypress[0] = VB_KEY_CTRL('D');
-	gbb.flags |= VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY;
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Ctrl+D");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-
-	/* Ctrl+L tries legacy boot mode only if enabled */
-	ResetMocks();
-	mock_keypress[0] = VB_KEY_CTRL('L');
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Ctrl+L normal");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-
-	/* Enter altfw menu and time out */
-	ResetMocks();
-	MockGpioAfter(1000, GPIO_SHUTDOWN);
-	gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
-	mock_keypress[0] = VB_KEY_CTRL('L');
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_SHUTDOWN,
-		"Ctrl+L force legacy");
-	TEST_EQ(vbexlegacy_called, 0, "  try legacy");
-
-	/* Enter altfw menu and select firmware 0 */
-	ResetMocks();
-	gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
-	mock_keypress[0] = VB_KEY_CTRL('L');
-	mock_keypress[1] = '0';
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Ctrl+L force legacy");
-	TEST_EQ(vbexlegacy_called, 1, "  try legacy");
-	TEST_EQ(altfw_num, 0, "  check altfw_num");
-
-	/* Enter altfw menu and then exit it */
-	ResetMocks();
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
-	mock_keypress[0] = VB_KEY_CTRL('L');
-	mock_keypress[1] = VB_KEY_ESC;
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Ctrl+L nv legacy");
-	TEST_EQ(vbexlegacy_called, 0, "  try legacy");
-
-	/* Enter altfw menu and select firmware 0 */
-	ResetMocks();
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
-	mock_keypress[0] = VB_KEY_CTRL('L');
-	mock_keypress[1] = '0';
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Ctrl+L nv legacy");
-	TEST_EQ(vbexlegacy_called, 1, "  try legacy");
-	TEST_EQ(altfw_num, 0, "  check altfw_num");
-
-	/* Enter altfw menu and select firmware 0 */
-	ResetMocks();
-	fwmp->flags |= VB2_SECDATA_FWMP_DEV_ENABLE_LEGACY;
-	mock_keypress[0] = VB_KEY_CTRL('L');
-	mock_keypress[1] = '0';
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Ctrl+L fwmp legacy");
-	TEST_EQ(vbexlegacy_called, 1, "  fwmp legacy");
-	TEST_EQ(altfw_num, 0, "  check altfw_num");
-
-	/* Pressing 1-9 boots alternative firmware only if enabled */
-	for (key = '1'; key <= '9'; key++) {
-		ResetMocks();
-		mock_keypress[0] = key;
-		vbtlk_expect_fixed = 1;
-		TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-			"'1' normal");
-		TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-
-		ResetMocks();
-		gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
-		mock_keypress[0] = key;
-		vbtlk_expect_fixed = 1;
-		TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-			"Ctrl+L force legacy");
-		TEST_EQ(vbexlegacy_called, 1, "  try legacy");
-		TEST_EQ(altfw_num, key - '0', "  check altfw_num");
-
-		ResetMocks();
-		vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
-		mock_keypress[0] = key;
-		vbtlk_expect_fixed = 1;
-		TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-			"Ctrl+L nv legacy");
-		TEST_EQ(vbexlegacy_called, 1, "  try legacy");
-		TEST_EQ(altfw_num, key - '0', "  check altfw_num");
-
-		ResetMocks();
-		fwmp->flags |= VB2_SECDATA_FWMP_DEV_ENABLE_LEGACY;
-		mock_keypress[0] = key;
-		vbtlk_expect_fixed = 1;
-		TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-			"Ctrl+L fwmp legacy");
-		TEST_EQ(vbexlegacy_called, 1, "  fwmp legacy");
-		TEST_EQ(altfw_num, key - '0', "  check altfw_num");
-	}
-
-	/* Ctrl+U boots external only if enabled */
-	ResetMocks();
-	mock_keypress[0] = VB_KEY_CTRL('U');
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Ctrl+U normal");
-
-	/* Ctrl+U enabled, with good external boot */
-	ResetMocks();
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	mock_keypress[0] = VB_KEY_CTRL('U');
-	vbtlk_retval = VB2_SUCCESS;
-	vbtlk_expect_removable = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), 0, "Ctrl+U external");
-
-	/* Ctrl+U enabled via GBB */
-	ResetMocks();
-	gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_USB;
-	mock_keypress[0] = VB_KEY_CTRL('U');
-	vbtlk_retval = VB2_SUCCESS;
-	vbtlk_expect_removable = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), 0, "Ctrl+U force external");
-
-	/* Ctrl+U enabled via FWMP */
-	ResetMocks();
-	fwmp->flags |= VB2_SECDATA_FWMP_DEV_ENABLE_EXTERNAL;
-	mock_keypress[0] = VB_KEY_CTRL('U');
-	vbtlk_retval = VB2_SUCCESS;
-	vbtlk_expect_removable = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), 0, "Ctrl+U force external");
-
-	/* If no external disk, eventually times out and tries internal disk */
-	ResetMocks();
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	mock_keypress[0] = VB_KEY_CTRL('U');
-	/* TODO: Currently the test suite has no way of specifying the order in
-	   which the expected VbTryLoadKernel calls occur. */
-	vbtlk_expect_fixed = 1;
-	vbtlk_expect_removable = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Ctrl+U enabled");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
-		"  recovery reason");
-	TEST_EQ(audio_looping_calls_left, 0, "  used up audio");
-
-	/* If dev mode is disabled, goes to TONORM screen repeatedly */
-	ResetMocks();
-	fwmp->flags |= VB2_SECDATA_FWMP_DEV_DISABLE_BOOT;
-	mock_keypress[0] = VB_KEY_ESC;  /* Just causes TONORM again */
-	mock_keypress[1] = VB_KEY_ENTER;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"FWMP dev disabled");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_TO_NORM,
-		"  tonorm screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_TO_NORM,
-		"  tonorm screen");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_TO_NORM_CONFIRMED,
-		"  confirm screen");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST), 1,
-		"  disable dev request");
-
-	/* Shutdown requested when dev disabled */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
-	fwmp->flags |= VB2_SECDATA_FWMP_DEV_DISABLE_BOOT;
-	MockGpioAfter(1, GPIO_SHUTDOWN);
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested when dev disabled");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_TO_NORM,
-		"  tonorm screen");
-
-	/* Shutdown requested by keyboard when dev disabled */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
-	fwmp->flags |= VB2_SECDATA_FWMP_DEV_DISABLE_BOOT;
-	mock_keypress[0] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested by keyboard when dev disabled");
-
-	VB2_DEBUG("...done.\n");
-}
-
-static void VbBootDevVendorDataTest(void)
-{
-	/* Enter set vendor data and reboot */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ENTER;  /* Enter vendor data setting */
-	mock_keypress[1] = '4';
-	mock_keypress[2] = '3';
-	mock_keypress[3] = '2';
-	mock_keypress[4] = '1';
-	mock_keypress[5] = VB_KEY_ENTER;  /* Set vendor data */
-	mock_keypress[6] = VB_KEY_ENTER;  /* Confirm vendor data (Default YES) */
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Enter set vendor data, don't confirm, esc");
-	TEST_EQ(set_vendor_data_called, 1, "  VbExSetVendorData() called");
-	TEST_STR_EQ(set_vendor_data, "4321", "  Vendor data correct");
-
-	/* Enter set vendor data; don't confirm and esc */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ENTER;  /* Enter vendor data setting */
-	mock_keypress[1] = '4';
-	mock_keypress[2] = '3';
-	mock_keypress[3] = '2';
-	mock_keypress[4] = '1';
-	mock_keypress[5] = VB_KEY_ENTER;  /* Set vendor data */
-	mock_keypress[6] = VB_KEY_RIGHT;  /* Select NO */
-	mock_keypress[7] = VB_KEY_ENTER;  /* Do not confirm vendor data */
-	mock_keypress[8] = VB_KEY_ESC;  /* Escape to boot */
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Enter set vendor data, don't confirm, esc");
-	TEST_EQ(set_vendor_data_called, 0, "  VbExSetVendorData() not called");
-
-	/* Enter set vendor data; esc, don't confirm, and change last character */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ENTER;  /* Enter vendor data setting */
-	mock_keypress[1] = '4';
-	mock_keypress[2] = '3';
-	mock_keypress[3] = '2';
-	mock_keypress[4] = '1';
-	mock_keypress[5] = VB_KEY_ENTER;
-	mock_keypress[6] = VB_KEY_RIGHT;  /* Select NO */
-	mock_keypress[7] = VB_KEY_ENTER;  /* Do not confirm vendor data */
-	mock_keypress[8] = VB_KEY_BACKSPACE;  /* Remove last character */
-	mock_keypress[9] = 'B';
-	mock_keypress[10] = VB_KEY_ENTER;  /* Set vendor data */
-	mock_keypress[11] = VB_KEY_ENTER;  /* Confirm vendor data */
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Enter set vendor data esc, don't confirm, change last character");
-	TEST_EQ(set_vendor_data_called, 1, "  VbExSetVendorData() called");
-	TEST_STR_EQ(set_vendor_data, "432B", "  Vendor data correct");
-
-	/* Enter set vendor data; extra keys ignored */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ENTER;  /* Enter vendor data setting */
-	mock_keypress[1] = '4';
-	mock_keypress[2] = '3';
-	mock_keypress[3] = '2';
-	mock_keypress[4] = '1';
-	mock_keypress[5] = '5';
-	mock_keypress[6] = VB_KEY_ENTER;  /* Set vendor data */
-	mock_keypress[7] = VB_KEY_ENTER;  /* Confirm vendor data (Default YES) */
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Enter set vendor data extra keys ignored");
-	TEST_EQ(set_vendor_data_called, 1, "  VbExSetVendorData() called");
-	TEST_STR_EQ(set_vendor_data, "4321", "  Vendor data correct");
-
-	/* Enter set vendor data; converts case */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ENTER;  /* Enter vendor data setting */
-	mock_keypress[1] = 'a';
-	mock_keypress[2] = 'B';
-	mock_keypress[3] = 'Y';
-	mock_keypress[4] = 'z';
-	mock_keypress[5] = VB_KEY_ENTER;  /* Set vendor data */
-	mock_keypress[6] = VB_KEY_ENTER;  /* Confirm vendor data (Default YES) */
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Enter set vendor data converts case");
-	TEST_EQ(set_vendor_data_called, 1, "  VbExSetVendorData() called");
-	TEST_STR_EQ(set_vendor_data, "ABYZ", "  Vendor data correct");
-
-	/* Enter set vendor data; backspace works */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ENTER;  /* Enter vendor data setting */
-	mock_keypress[1] = 'A';
-	mock_keypress[2] = 'B';
-	mock_keypress[3] = 'C';
-	mock_keypress[4] = VB_KEY_BACKSPACE;
-	mock_keypress[5] = VB_KEY_BACKSPACE;
-	mock_keypress[6] = '3';
-	mock_keypress[7] = '2';
-	mock_keypress[8] = '1';
-	mock_keypress[9] = VB_KEY_ENTER;  /* Set vendor data */
-	mock_keypress[10] = VB_KEY_ENTER;  /* Confirm vendor data (Default YES) */
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Enter set vendor data backspace works");
-	TEST_EQ(set_vendor_data_called, 1, "  VbExSetVendorData() called");
-	TEST_STR_EQ(set_vendor_data, "A321", "  Vendor data correct");
-
-	/* Enter set vendor data; invalid chars don't print */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ENTER;  /* Enter vendor data setting */
-	mock_keypress[1] = '4';
-	mock_keypress[2] = '-';
-	mock_keypress[3] = '^';
-	mock_keypress[4] = '&';
-	mock_keypress[5] = '$';
-	mock_keypress[6] = '.';
-	mock_keypress[7] = '3';
-	mock_keypress[8] = '2';
-	mock_keypress[9] = '1';
-	mock_keypress[10] = VB_KEY_ENTER;  /* Set vendor data */
-	mock_keypress[11] = VB_KEY_ENTER;  /* Confirm vendor data (Default YES) */
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Enter set vendor data invalid chars don't print");
-	TEST_EQ(set_vendor_data_called, 1, "  VbExSetVendorData() called");
-	TEST_STR_EQ(set_vendor_data, "4321", "  Vendor data correct");
-
-	/* Enter set vendor data; invalid chars don't print with backspace */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ENTER;  /* Enter vendor data setting */
-	mock_keypress[1] = '4';
-	mock_keypress[2] = '-';
-	mock_keypress[3] = VB_KEY_BACKSPACE;  /* Should delete 4 */
-	mock_keypress[4] = '3';
-	mock_keypress[5] = '2';
-	mock_keypress[6] = '1';
-	mock_keypress[7] = '0';
-	mock_keypress[8] = VB_KEY_ENTER;  /* Set vendor data */
-	mock_keypress[9] = VB_KEY_ENTER;  /* Confirm vendor data (Default YES) */
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Enter set vendor data invalid chars don't print with backspace");
-	TEST_EQ(set_vendor_data_called, 1, "  VbExSetVendorData() called");
-	TEST_STR_EQ(set_vendor_data, "3210", "  Vendor data correct");
-
-	/* Enter set vendor data; backspace only doesn't underrun */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ENTER;  /* Enter vendor data setting */
-	mock_keypress[1] = 'A';
-	mock_keypress[2] = VB_KEY_BACKSPACE;
-	mock_keypress[3] = VB_KEY_BACKSPACE;
-	mock_keypress[4] = '4';
-	mock_keypress[5] = '3';
-	mock_keypress[6] = '2';
-	mock_keypress[7] = '1';
-	mock_keypress[8] = VB_KEY_ENTER;  /* Set vendor data */
-	mock_keypress[9] = VB_KEY_ENTER;  /* Confirm vendor data (Default YES) */
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Enter set vendor data backspace only doesn't underrun");
-	TEST_EQ(set_vendor_data_called, 1, "  VbExSetVendorData() called");
-	TEST_STR_EQ(set_vendor_data, "4321", "  Vendor data correct");
-
-	/* Enter set vendor data; vowels not allowed after first char */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ENTER;  /* Enter vendor data setting */
-	mock_keypress[1] = 'A';
-	mock_keypress[2] = 'A';
-	mock_keypress[3] = 'B';
-	mock_keypress[4] = 'E';
-	mock_keypress[5] = 'i';
-	mock_keypress[6] = 'C';
-	mock_keypress[7] = 'O';
-	mock_keypress[8] = 'u';
-	mock_keypress[9] = 'D';
-	mock_keypress[10] = VB_KEY_ENTER;  /* Set vendor data */
-	mock_keypress[11] = VB_KEY_ENTER;  /* Confirm vendor data (Default YES) */
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Enter set vendor data vowels not allowed after first char");
-	TEST_EQ(set_vendor_data_called, 1, "  VbExSetVendorData() called");
-	TEST_STR_EQ(set_vendor_data, "ABCD", "  Vendor data correct");
-
-	/* Enter set vendor data; too short */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ENTER;  /* Enter vendor data setting */
-	mock_keypress[1] = '1';
-	mock_keypress[2] = '2';
-	mock_keypress[3] = '3';
-	/* Set vendor data (nothing happens) */
-	mock_keypress[4] = VB_KEY_ENTER;
-	/* Confirm vendor data (nothing happens) */
-	mock_keypress[5] = VB_KEY_ENTER;
-	mock_keypress[6] = VB_KEY_ESC;
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Enter set vendor data too short");
-	TEST_EQ(set_vendor_data_called, 0, "  VbExSetVendorData() not called");
-
-	/* Enter set vendor data; esc from set screen */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ENTER;  /* Enter vendor data setting */
-	mock_keypress[1] = VB_KEY_ESC;
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Enter set vendor data esc from set screen");
-	TEST_EQ(set_vendor_data_called, 0, "  VbExSetVendorData() not called");
-
-	/* Enter set vendor data; esc from set screen with tag */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ENTER;  /* Enter vendor data setting */
-	mock_keypress[1] = '4';
-	mock_keypress[2] = '3';
-	mock_keypress[3] = '2';
-	mock_keypress[4] = '1';
-	mock_keypress[5] = VB_KEY_ESC;
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Enter set vendor data esc from set screen with tag");
-	TEST_EQ(set_vendor_data_called, 0, "  VbExSetVendorData() not called");
-
-	/* Enter set vendor data; esc from confirm screen */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ENTER;  /* Enter vendor data setting */
-	mock_keypress[1] = '4';
-	mock_keypress[2] = '3';
-	mock_keypress[3] = '2';
-	mock_keypress[4] = '1';
-	mock_keypress[5] = VB_KEY_ENTER;  /* Set vendor data */
-	mock_keypress[6] = VB_KEY_ESC;
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Enter set vendor data esc from set screen");
-	TEST_EQ(set_vendor_data_called, 0, "  VbExSetVendorData() not called");
-
-	/* Escape from vendor data warning screen */
-	ResetMocks();
-	ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
-	mock_keypress[0] = VB_KEY_ESC;  /* Enter vendor data setting */
-	vbtlk_expect_fixed = 1;
-	TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
-		"Enter set vendor data esc, don't confirm, change last character");
-	TEST_EQ(set_vendor_data_called, 0, "  VbExSetVendorData() not called");
-
-	VB2_DEBUG("...done.\n");
-}
-
-/*
- * Helper function to test VbBootRecovery against a sequence of gpio events.
- * caller specifies a sequence of gpio events and the expected confirm vs.
- * reboot result.
- *
- * Non-asserted gpios are used for 5 events, then 'first' for 5 events,
- * 'second' for 5 events, and 'third' for 5 events.
- */
-static void VbBootRecTestGpio(uint32_t first, uint32_t second, uint32_t third,
-			      uint32_t confirm, const char *msg)
-{
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
-	vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
-	trust_ec = 1;
-	mock_keypress[0] = VB_KEY_CTRL('D');
-	mock_gpio[0].gpio_flags = 0;
-	mock_gpio[0].count = 4;
-	mock_gpio[1].gpio_flags = first;
-	mock_gpio[1].count = 4;
-	mock_gpio[2].gpio_flags = second;
-	mock_gpio[2].count = 4;
-	mock_gpio[3].gpio_flags = third;
-	mock_gpio[3].count = 4;
-	vbtlk_expect_removable = 1;
-
-	if (confirm) {
-		TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-			VB2_REQUEST_REBOOT_EC_TO_RO, msg);
-		TEST_EQ(virtdev_set, 1, "  virtual dev mode on");
-		TEST_EQ(vb2_nv_get(ctx, VB2_NV_DEV_BOOT_EXTERNAL),
-			!!BOOT_EXTERNAL_ON_DEV,
-			"  NV_DEV_BOOT_EXTERNAL enabled");
-	} else {
-		TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-			VB2_REQUEST_SHUTDOWN, msg);
-		TEST_EQ(virtdev_set, 0, "  virtual dev mode off");
-	}
-}
-
-static void VbBootRecTest(void)
-{
-	VB2_DEBUG("Testing VbBootRecoveryLegacyClamshell()...\n");
-
-	/* Shutdown requested in loop */
-	ResetMocks();
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested");
-
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
-		"  recovery reason");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-
-	/* Shutdown requested by keyboard */
-	ResetMocks();
-	mock_keypress[0] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested by keyboard");
-
-	/* Ignore power button held on boot */
-	ResetMocks();
-	mock_gpio[0].gpio_flags = GPIO_SHUTDOWN;
-	mock_gpio[0].count = 10;
-	mock_gpio[1].gpio_flags = 0;
-	mock_gpio[1].count = 10;
-	mock_gpio[2].gpio_flags = GPIO_SHUTDOWN;
-	mock_gpio[2].count = 10;
-	mock_gpio[3].gpio_flags = 0;
-	mock_gpio[3].count = 100;
-	sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
-	trust_ec = 1;
-	vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
-	vbtlk_expect_removable = 1;
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Ignore power button held on boot");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	/* Shutdown should happen while we're sending the 2nd block of events */
-
-	/* Broken screen */
-	ResetMocks();
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	mock_num_disks[0] = 1;
-	mock_num_disks[1] = 1;
-	mock_num_disks[2] = 1;
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Broken");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-
-	/* Broken screen even if dev switch is on */
-	ResetMocks();
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	mock_num_disks[0] = 1;
-	mock_num_disks[1] = 1;
-	sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Broken (dev)");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-
-	/* Force insert screen with GBB flag */
-	ResetMocks();
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	gbb.flags |= VB2_GBB_FLAG_FORCE_MANUAL_RECOVERY;
-	vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
-	vbtlk_expect_removable = 1;
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Insert (forced by GBB)");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-
-	/* No removal if recovery button physically pressed */
-	ResetMocks();
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	mock_num_disks[0] = 1;
-	mock_num_disks[1] = 1;
-	sd->flags |= VB2_SD_FLAG_MANUAL_RECOVERY;
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"No remove in rec");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-
-	/* Removal if no disk initially found, but found on second attempt */
-	ResetMocks();
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	mock_num_disks[0] = 0;
-	mock_num_disks[1] = 1;
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Remove");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-
-	/* Bad disk count doesn't require removal */
-	ResetMocks();
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	mock_num_disks[0] = -1;
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Bad disk count");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-
-	/* Ctrl+D ignored for many reasons... */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	mock_keypress[0] = VB_KEY_CTRL('D');
-	trust_ec = 0;
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Ctrl+D ignored if EC not trusted");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode off");
-	TEST_NEQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
-		 "  todev screen");
-
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY | VB2_SD_FLAG_DEV_MODE_ENABLED;
-	trust_ec = 1;
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	mock_keypress[0] = VB_KEY_CTRL('D');
-	vbtlk_expect_removable = 1;
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Ctrl+D ignored if already in dev mode");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode off");
-	TEST_NEQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
-		 "  todev screen");
-
-	ResetMocks();
-	trust_ec = 1;
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	mock_keypress[0] = VB_KEY_CTRL('D');
-	vbtlk_expect_removable = 1;
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Ctrl+D ignored if recovery not manually triggered");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode off");
-	TEST_NEQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
-		 "  todev screen");
-
-	/* Ctrl+D then space means don't enable */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
-	MockGpioAfter(2, GPIO_SHUTDOWN);
-	vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
-	trust_ec = 1;
-	mock_keypress[0] = VB_KEY_CTRL('D');
-	mock_keypress[1] = ' ';
-	vbtlk_expect_removable = 1;
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Ctrl+D todev abort");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
-		"  todev screen");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode off");
-
-	/* Ctrl+D then enter means enable */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
-	trust_ec = 1;
-	mock_keypress[0] = VB_KEY_CTRL('D');
-	mock_keypress[1] = VB_KEY_ENTER;
-	mock_keyflags[1] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	vbtlk_expect_removable = 1;
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_REBOOT_EC_TO_RO,
-		"Ctrl+D todev confirm via enter");
-	TEST_EQ(virtdev_set, 1, "  virtual dev mode on");
-
-	/* Don't handle TPM error in enabling dev mode */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
-	trust_ec = 1;
-	mock_keypress[0] = VB_KEY_CTRL('D');
-	mock_keypress[1] = VB_KEY_ENTER;
-	mock_keyflags[1] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	virtdev_fail = 1;
-	vbtlk_expect_removable = 1;
-	TEST_ABORT(VbBootRecoveryLegacyClamshell(ctx),
-		   "Ctrl+D todev failure");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode still off");
-
-	/* Test Diagnostic Mode via Ctrl-C - display available */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
-	trust_ec = 1;
-	vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	mock_keypress[0] = VB_KEY_CTRL('C');
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST), 0,
-		"todiag is zero");
-	vbtlk_expect_removable = 1;
-	if (DIAGNOSTIC_UI)
-		TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-			VB2_REQUEST_REBOOT,
-			"Ctrl+C todiag - enabled");
-	else
-		TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-			VB2_REQUEST_SHUTDOWN,
-			"Ctrl+C todiag - disabled");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST), DIAGNOSTIC_UI,
-		"  todiag is updated for Ctrl-C");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISPLAY_REQUEST), 0,
-		"  todiag doesn't set unneeded DISPLAY_REQUEST");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-
-	/* Test Diagnostic Mode via F12 - display disabled */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
-	sd->flags &= ~VB2_SD_FLAG_DISPLAY_AVAILABLE;
-	trust_ec = 1;
-	vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	mock_keypress[0] = VB_KEY_F(12);
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST), 0,
-		"todiag is zero");
-	vbtlk_expect_removable = 1;
-	if (DIAGNOSTIC_UI)
-		TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-			VB2_REQUEST_REBOOT,
-			"F12 todiag - enabled");
-	else
-		TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-			VB2_REQUEST_SHUTDOWN,
-			"F12 todiag - disabled");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST), DIAGNOSTIC_UI,
-		"  todiag is updated for F12");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISPLAY_REQUEST), 0,
-		"  todiag doesn't set unneeded DISPLAY_REQUEST");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-
-	/* Test Diagnostic Mode via Ctrl-C OS broken - display available */
-	ResetMocks();
-	MockGpioAfter(10, GPIO_SHUTDOWN);
-	mock_keypress[0] = VB_KEY_CTRL('C');
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST), 0,
-		"todiag is zero");
-	if (DIAGNOSTIC_UI)
-		TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-			VB2_REQUEST_REBOOT,
-			"Ctrl+C todiag os broken - enabled");
-	else
-		TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-			VB2_REQUEST_SHUTDOWN,
-			"Ctrl+C todiag os broken - disabled");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST), DIAGNOSTIC_UI,
-		"  todiag is updated for Ctrl-C");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISPLAY_REQUEST), 0,
-		"  todiag doesn't set unneeded DISPLAY_REQUEST");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  os broken screen");
-
-	VB2_DEBUG("...done.\n");
-}
-
-static void VbBootRecPhysicalPresenceTest(void)
-{
-
-	/* Ctrl+D ignored because the physical presence switch is still pressed
-	   and we don't like that. */
-	ResetMocks();
-	sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
-	trust_ec = 1;
-	mock_keypress[0] = VB_KEY_CTRL('D');
-	mock_gpio[0].gpio_flags = GPIO_PRESENCE;
-	mock_gpio[0].count = 100;
-	mock_gpio[1].gpio_flags = GPIO_PRESENCE | GPIO_SHUTDOWN;
-	mock_gpio[1].count = 100;
-	vbtlk_expect_removable = 1;
-	TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN,
-		"Ctrl+D ignored if phys pres button is still pressed");
-	TEST_NEQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
-		 "  todev screen");
-
-	/*
-	 * List of possiblities for shutdown and physical presence events that
-	 * occur over time.  Time advanced from left to right (where each
-	 * represents the gpio[s] that are seen during a given iteration of
-	 * the loop).  The meaning of the characters:
-	 *
-	 *   _ means no gpio
-	 *   s means shutdown gpio
-	 *   p means presence gpio
-	 *   B means both shutdown and presence gpio
-	 *
-	 *  1: ______ppp______ -> confirm
-	 *  2: ______sss______ -> shutdown
-	 *  3: ___pppsss______ -> confirm
-	 *  4: ___sssppp______ -> shutdown
-	 *  5: ___pppBBB______ -> confirm
-	 *  6: ___pppBBBppp___ -> shutdown
-	 *  7: ___pppBBBsss___ -> confirm
-	 *  8: ___sssBBB______ -> confirm
-	 *  9: ___sssBBBppp___ -> shutdown
-	 * 10: ___sssBBBsss___ -> confirm
-	 * 11: ______BBB______ -> confirm
-	 * 12: ______BBBsss___ -> confirm
-	 * 13: ______BBBppp___ -> shutdown
-	 */
-
-	/* 1: Ctrl+D then presence means enable */
-	VbBootRecTestGpio(GPIO_PRESENCE, 0, 0, 1,
-			  "Ctrl+D todev confirm via presence");
-
-	/* 2: Ctrl+D then shutdown means shutdown */
-	VbBootRecTestGpio(GPIO_SHUTDOWN, 0, 0, 0,
-			  "Ctrl+D todev then shutdown");
-
-	/* 3: Ctrl+D then presence then shutdown means confirm */
-	VbBootRecTestGpio(GPIO_PRESENCE, GPIO_SHUTDOWN, 0, 1,
-			  "Ctrl+D todev confirm via presence then shutdown");
-
-	/* 4: Ctrl+D then 2+ instance shutdown then presence means shutdown */
-	VbBootRecTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE, 0, 0,
-			  "Ctrl+D todev then 2+ shutdown then presence");
-
-	/* 5: Ctrl+D then presence then shutdown+presence then none */
-	VbBootRecTestGpio(GPIO_PRESENCE, GPIO_PRESENCE | GPIO_SHUTDOWN, 0, 1,
-			  "Ctrl+D todev confirm via presence, both, none");
-
-	/* 6: Ctrl+D then presence then shutdown+presence then presence */
-	VbBootRecTestGpio(GPIO_PRESENCE, GPIO_PRESENCE | GPIO_SHUTDOWN,
-			  GPIO_PRESENCE, 0,
-			  "Ctrl+D todev confirm via presence, both, presence");
-
-	/* 7: Ctrl+D then presence then shutdown+presence then shutdown */
-	VbBootRecTestGpio(GPIO_PRESENCE, GPIO_PRESENCE | GPIO_SHUTDOWN,
-			  GPIO_SHUTDOWN, 1,
-			  "Ctrl+D todev confirm via presence, both, shutdown");
-
-	/* 8: Ctrl+D then shutdown then shutdown+presence then none */
-	VbBootRecTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE | GPIO_SHUTDOWN, 0, 1,
-			  "Ctrl+D todev then 2+ shutdown, both, none");
-
-	/* 9: Ctrl+D then shutdown then shutdown+presence then presence */
-	VbBootRecTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE | GPIO_SHUTDOWN,
-			  GPIO_PRESENCE, 0,
-			  "Ctrl+D todev then 2+ shutdown, both, presence");
-
-	/* 10: Ctrl+D then shutdown then shutdown+presence then shutdown */
-	VbBootRecTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE | GPIO_SHUTDOWN,
-			  GPIO_SHUTDOWN, 1,
-			  "Ctrl+D todev then 2+ shutdown, both, shutdown");
-
-	/* 11: Ctrl+D then shutdown+presence then none */
-	VbBootRecTestGpio(GPIO_PRESENCE | GPIO_SHUTDOWN, 0, 0, 1,
-			  "Ctrl+D todev confirm via both then none");
-
-	/* 12: Ctrl+D then shutdown+presence then shutdown */
-	VbBootRecTestGpio(GPIO_PRESENCE | GPIO_SHUTDOWN, GPIO_SHUTDOWN, 0, 1,
-			  "Ctrl+D todev confirm via both then shutdown");
-
-	/* 13: Ctrl+D then shutdown+presence then presence */
-	VbBootRecTestGpio(GPIO_PRESENCE | GPIO_SHUTDOWN, GPIO_PRESENCE, 0, 0,
-			  "Ctrl+D todev confirm via both then presence");
-}
-
-static void VbBootDiagTest(void)
-{
-	VB2_DEBUG("Testing VbBootDiagnosticLegacyClamshell()...\n");
-
-	/* No key pressed - timeout. */
-	ResetMocks();
-	TEST_EQ(VbBootDiagnosticLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Timeout");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_CONFIRM_DIAG,
-		"  confirm screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK,
-		"  blank screen");
-	TEST_EQ(tpm_set_mode_called, 0, "  no tpm call");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(current_ticks, 30 * VB2_MSEC_PER_SEC,
-		"  waited for 30 seconds");
-
-	/* Esc key pressed. */
-	ResetMocks();
-	mock_keypress[0] = VB_KEY_ESC;
-	TEST_EQ(VbBootDiagnosticLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Esc key");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_CONFIRM_DIAG,
-		"  confirm screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK,
-		"  blank screen");
-	TEST_EQ(tpm_set_mode_called, 0, "  no tpm call");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(current_ticks, 0, "  didn't wait at all");
-
-	/* Shutdown requested via lid close */
-	ResetMocks();
-	MockGpioAfter(10, GPIO_LID_CLOSED);
-	TEST_EQ(VbBootDiagnosticLegacyClamshell(ctx),
-		VB2_REQUEST_SHUTDOWN, "Shutdown");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_CONFIRM_DIAG,
-		"  confirm screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK,
-		"  blank screen");
-	TEST_EQ(tpm_set_mode_called, 0, "  no tpm call");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_TRUE(current_ticks < VB2_MSEC_PER_SEC, "  didn't wait long");
-
-	/* Power button pressed but not released. */
-	ResetMocks();
-	mock_gpio[0].gpio_flags = GPIO_PRESENCE;
-	mock_gpio[0].count = ~0;
-	TEST_EQ(VbBootDiagnosticLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Power held");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_CONFIRM_DIAG,
-		"  confirm screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK,
-		"  blank screen");
-	TEST_EQ(tpm_set_mode_called, 0, "  no tpm call");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-
-	/* Power button is pressed and released. */
-	ResetMocks();
-	MockGpioAfter(3, GPIO_PRESENCE);
-	TEST_EQ(VbBootDiagnosticLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Confirm");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_CONFIRM_DIAG,
-		"  confirm screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK,
-		"  blank screen");
-	TEST_EQ(tpm_set_mode_called, 1, "  tpm call");
-	TEST_EQ(tpm_mode, VB2_TPM_MODE_DISABLED, "  tpm disabled");
-	TEST_EQ(vbexlegacy_called, 1, "  legacy");
-	TEST_EQ(altfw_num, VB_ALTFW_DIAGNOSTIC, "  check altfw_num");
-	/*
-	 * Ideally we'd that no recovery request was recorded, but
-	 * VbExLegacy() can only fail or crash the tests.
-	 */
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
-		VB2_RECOVERY_ALTFW_HASH_FAILED,
-		"  recovery request");
-
-	/* Power button confirm, but now with a TPM failure. */
-	ResetMocks();
-	tpm_mode = VB2_TPM_MODE_DISABLED;
-	mock_gpio[0].gpio_flags = 0;
-	mock_gpio[0].count = 2;
-	mock_gpio[1].gpio_flags = GPIO_PRESENCE;
-	mock_gpio[1].count = 2;
-	TEST_EQ(VbBootDiagnosticLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
-		"Confirm but tpm fail");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_CONFIRM_DIAG,
-		"  confirm screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK,
-		"  blank screen");
-	TEST_EQ(tpm_set_mode_called, 1, "  tpm call");
-	TEST_EQ(tpm_mode, VB2_TPM_MODE_DISABLED, "  tpm disabled");
-	TEST_EQ(vbexlegacy_called, 0, "  legacy not called");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
-		VB2_RECOVERY_TPM_DISABLE_FAILED,
-		"  recovery request");
-
-	VB2_DEBUG("...done.\n");
-}
-
-
-int main(void)
-{
-	VbUserConfirmsKeyboardTest();
-	if (!PHYSICAL_PRESENCE_KEYBOARD)
-		VbUserConfirmsPhysicalPresenceTest();
-	VbBootDevTest();
-	VbBootDevVendorDataTest();
-	VbBootRecTest();
-	if (!PHYSICAL_PRESENCE_KEYBOARD)
-		VbBootRecPhysicalPresenceTest();
-	if (DIAGNOSTIC_UI)
-		VbBootDiagTest();
-
-	return gTestSuccess ? 0 : 255;
-}
diff --git a/tests/vboot_ui_legacy_menu_tests.c b/tests/vboot_ui_legacy_menu_tests.c
deleted file mode 100644
index 1dc9253..0000000
--- a/tests/vboot_ui_legacy_menu_tests.c
+++ /dev/null
@@ -1,2349 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Tests legacy menu UI
- */
-
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2secdata.h"
-#include "2secdata_struct.h"
-#include "host_common.h"
-#include "load_kernel_fw.h"
-#include "test_common.h"
-#include "tss_constants.h"
-#include "vboot_api.h"
-#include "vboot_audio.h"
-#include "vboot_kernel.h"
-#include "vboot_struct.h"
-#include "vboot_test.h"
-#include "vboot_ui_legacy.h"
-#include "vboot_ui_legacy_menu_private.h"
-
-/* Mock data */
-static LoadKernelParams lkp;
-static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
-	__attribute__((aligned(VB2_WORKBUF_ALIGN)));
-static struct vb2_context *ctx;
-static struct vb2_shared_data *sd;
-static struct vb2_gbb_header gbb;
-static struct vb2_secdata_fwmp *fwmp;
-
-static int shutdown_request_calls_left;
-static int audio_looping_calls_left;
-static vb2_error_t vbtlk_retval[5];
-static vb2_error_t vbtlk_last_retval;
-static int vbtlk_retval_count;
-static const vb2_error_t vbtlk_retval_fixed = 1002;
-static int vbexlegacy_called;
-static enum VbAltFwIndex_t altfw_num;
-static int debug_info_displayed;
-static int trust_ec;
-static int virtdev_set;
-static uint32_t virtdev_fail;
-static uint32_t mock_keypress[64];
-static uint32_t mock_keyflags[64];
-static uint32_t mock_keypress_count;
-static uint32_t screens_displayed[64];
-static uint32_t screens_count = 0;
-static uint32_t beeps_played[64];
-static uint32_t beeps_count = 0;
-static uint32_t mock_altfw_mask;
-static int vbexaltfwmask_called;
-
-/* Reset mock data (for use before each test) */
-static void ResetMocks(void)
-{
-	memset(&lkp, 0, sizeof(lkp));
-
-	TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
-		  "vb2api_init failed");
-	vb2_nv_init(ctx);
-
-	sd = vb2_get_sd(ctx);
-
-	/* CRC will be invalid after here, but nobody's checking */
-	sd->status |= VB2_SD_STATUS_SECDATA_FWMP_INIT;
-	fwmp = (struct vb2_secdata_fwmp *)ctx->secdata_fwmp;
-
-	memset(&gbb, 0, sizeof(gbb));
-
-	/* In recovery we have 50 keyscans per disk scan, this must be high. */
-	shutdown_request_calls_left = 301;
-	audio_looping_calls_left = 60;
-	vbexlegacy_called = 0;
-	altfw_num = -100;
-	debug_info_displayed = 0;
-	trust_ec = 0;
-	virtdev_set = 0;
-	virtdev_fail = 0;
-
-	vbtlk_last_retval = vbtlk_retval_fixed - VB_DISK_FLAG_FIXED;
-	memset(vbtlk_retval, 0, sizeof(vbtlk_retval));
-	vbtlk_retval_count = 0;
-
-	memset(screens_displayed, 0, sizeof(screens_displayed));
-	screens_count = 0;
-	memset(beeps_played, 0, sizeof(beeps_played));
-	beeps_count = 0;
-
-	memset(mock_keypress, 0, sizeof(mock_keypress));
-	memset(mock_keyflags, 0, sizeof(mock_keyflags));
-	mock_keypress_count = 0;
-
-	mock_altfw_mask = 3 << 1;	/* This mask selects 1 and 2 */
-	vbexaltfwmask_called = 0;
-}
-
-static void ResetMocksForDeveloper(void)
-{
-	ResetMocks();
-	sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
-	shutdown_request_calls_left = -1;
-}
-
-static void ResetMocksForManualRecovery(void)
-{
-	ResetMocks();
-	sd->flags |= VB2_SD_FLAG_MANUAL_RECOVERY;
-	trust_ec = 1;
-}
-
-/* Mock functions */
-
-struct vb2_gbb_header *vb2_get_gbb(struct vb2_context *c)
-{
-	return &gbb;
-}
-
-uint32_t vb2ex_get_locale_count(void) {
-	return 1;
-}
-
-uint32_t VbExGetAltFwIdxMask() {
-
-	vbexaltfwmask_called++;
-
-	return mock_altfw_mask;
-}
-
-uint32_t VbExIsShutdownRequested(void)
-{
-	if (shutdown_request_calls_left == 0)
-		return 1;
-	else if (shutdown_request_calls_left > 0)
-		shutdown_request_calls_left--;
-
-	return 0;
-}
-
-uint32_t VbExKeyboardRead(void)
-{
-	return VbExKeyboardReadWithFlags(NULL);
-}
-
-uint32_t VbExKeyboardReadWithFlags(uint32_t *key_flags)
-{
-	if (mock_keypress_count < ARRAY_SIZE(mock_keypress)) {
-		if (key_flags != NULL)
-			*key_flags = mock_keyflags[mock_keypress_count];
-		return mock_keypress[mock_keypress_count++];
-	} else
-		return 0;
-}
-
-vb2_error_t VbExLegacy(enum VbAltFwIndex_t _altfw_num)
-{
-	vbexlegacy_called++;
-	altfw_num = _altfw_num;
-
-	return 0;
-}
-
-int vb2ex_ec_trusted(void)
-{
-	return trust_ec;
-}
-
-int vb2_audio_looping(void)
-{
-	if (audio_looping_calls_left == 0)
-		return 0;
-	else if (audio_looping_calls_left > 0)
-		audio_looping_calls_left--;
-
-	return 1;
-}
-
-vb2_error_t VbTryLoadKernel(struct vb2_context *c, uint32_t get_info_flags)
-{
-	if (vbtlk_retval_count < ARRAY_SIZE(vbtlk_retval) &&
-	    vbtlk_retval[vbtlk_retval_count] != 0)
-		vbtlk_last_retval = vbtlk_retval[vbtlk_retval_count++];
-	return vbtlk_last_retval + get_info_flags;
-}
-
-vb2_error_t VbDisplayScreen(struct vb2_context *c, uint32_t screen, int force,
-			    const VbScreenData *data)
-{
-	if (screens_count < ARRAY_SIZE(screens_displayed))
-		screens_displayed[screens_count++] = screen;
-	VB2_DEBUG("screens_displayed[%d] = %#x\n",
-		  screens_count - 1, screen);
-	return VB2_SUCCESS;
-}
-
-vb2_error_t VbDisplayMenu(struct vb2_context *c, uint32_t screen, int force,
-			  uint32_t selected_index, uint32_t disabled_idx_mask)
-{
-	if (screens_count < ARRAY_SIZE(screens_displayed))
-		screens_displayed[screens_count++] = screen;
-	else
-		VB2_DEBUG("Ran out of screens_displayed entries!\n");
-	VB2_DEBUG("screens_displayed[%d] = %#x,"
-		  " selected_index = %u, disabled_idx_mask = %#x\n",
-		  screens_count - 1, screen,
-		  selected_index, disabled_idx_mask);
-
-	return VB2_SUCCESS;
-}
-
-vb2_error_t VbDisplayDebugInfo(struct vb2_context *c)
-{
-	debug_info_displayed = 1;
-	return VB2_SUCCESS;
-}
-
-void vb2ex_beep(uint32_t msec, uint32_t frequency)
-{
-	if (beeps_count < ARRAY_SIZE(beeps_played))
-		beeps_played[beeps_count++] = frequency;
-	VB2_DEBUG("beeps_played[%d] = %dHz for %dms\n",
-		  beeps_count - 1, frequency, msec);
-}
-
-void vb2_enable_developer_mode(struct vb2_context *c)
-{
-	VB2_ASSERT(!virtdev_fail);
-	virtdev_set = 1;
-}
-
-/* Tests */
-
-static void VbBootDevTest(void)
-{
-	int i;
-
-	VB2_DEBUG("Testing VbBootDeveloperLegacyMenu()...\n");
-
-	/* Proceed after timeout */
-	ResetMocksForDeveloper();
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed, "Timeout");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
-		"  recovery reason");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(audio_looping_calls_left, 0, "  used up audio");
-	TEST_EQ(beeps_count, 0, "  no beeps on normal boot");
-
-	/* Proceed to legacy after timeout if GBB flag set */
-	ResetMocksForDeveloper();
-	gbb.flags |= VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY |
-		     VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"default legacy GBB");
-	TEST_EQ(vbexlegacy_called, 1, "  try legacy");
-	TEST_EQ(altfw_num, 0, "  check altfw_num");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(audio_looping_calls_left, 0, "  used up audio");
-	TEST_EQ(beeps_count, 1, "  error beep: legacy BIOS not found");
-	TEST_EQ(beeps_played[0], 200, "    low-frequency error beep");
-
-	/* Proceed to legacy after timeout if boot legacy and default boot
-	 * legacy are set */
-	ResetMocksForDeveloper();
-	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
-		   VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY);
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"default legacy NV");
-	TEST_EQ(vbexlegacy_called, 1, "  try legacy");
-	TEST_EQ(altfw_num, 0, "  check altfw_num");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(audio_looping_calls_left, 0, "  used up audio");
-	TEST_EQ(beeps_count, 1, "  error beep: legacy BIOS not found");
-	TEST_EQ(beeps_played[0], 200, "    low-frequency error beep");
-
-	/* Proceed to legacy boot mode only if enabled */
-	ResetMocksForDeveloper();
-	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
-		   VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY);
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"default legacy not enabled");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(audio_looping_calls_left, 0, "  used up audio");
-	TEST_EQ(beeps_count, 2, "  error beeps: legacy boot not enabled");
-	TEST_EQ(beeps_played[0], 400, "    first error beep");
-	TEST_EQ(beeps_played[1], 400, "    second error beep");
-
-	/* Proceed to usb after timeout if boot usb and default boot
-	 * usb are set */
-	ResetMocksForDeveloper();
-	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
-		   VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), 0, "Ctrl+U USB");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(audio_looping_calls_left, 0, "  used up audio");
-	TEST_EQ(beeps_count, 0, "  no beeps on USB boot");
-
-	/* Proceed to usb boot mode only if enabled */
-	ResetMocksForDeveloper();
-	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
-		   VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"default USB not enabled");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(audio_looping_calls_left, 0, "  used up audio");
-	TEST_EQ(beeps_count, 2, "  error beeps: USB boot not enabled");
-	TEST_EQ(beeps_played[0], 400, "    first error beep");
-	TEST_EQ(beeps_played[1], 400, "    second error beep");
-
-	/* If no USB tries fixed disk */
-	ResetMocksForDeveloper();
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
-		   VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"default USB with no disk");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(audio_looping_calls_left, 0, "  used up audio");
-	TEST_EQ(beeps_count, 1, "  error beep: USB not found");
-	TEST_EQ(beeps_played[0], 200, "    low-frequency error beep");
-
-	/* Shutdown requested in loop */
-	ResetMocksForDeveloper();
-	shutdown_request_calls_left = 2;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/*
-	 * Pushing power should shut down the DUT because default
-	 * selection is power off
-	 */
-	ResetMocksForDeveloper();
-	mock_keypress[0] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"dev warning menu: default to power off");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* Selecting Power Off in developer options. */
-	ResetMocksForDeveloper();
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Cancel
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Power Off
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Power Off in DEVELOPER");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: developer options");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: disk boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps on USB boot");
-
-	/* Pressing ENTER is equivalent to power button. */
-	ResetMocksForDeveloper();
-	mock_keypress[0] = VB_KEY_ENTER;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"dev warning menu: ENTER is power button");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* ENTER functionality is unaffected by GBB flag in detachable UI. */
-	ResetMocksForDeveloper();
-	gbb.flags |= VB2_GBB_FLAG_ENTER_TRIGGERS_TONORM;
-	mock_keypress[0] = VB_KEY_ENTER;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"dev warning menu: ENTER unaffected by GBB");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* Pressing SPACE or VolUp+Down combo has no effect in dev mode */
-	ResetMocksForDeveloper();
-	mock_keypress[0] = ' ';
-	mock_keypress[1] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS;
-	mock_keypress[2] = VB_BUTTON_POWER_SHORT_PRESS;	// select Power Off
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"SPACE or VolUp+Down have no effect");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* Disable developer mode */
-	ResetMocksForDeveloper();
-	sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
-	mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS;
-	mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[2] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_REBOOT,
-		"disable developer mode");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  tonorm screen");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_TO_NORM_CONFIRMED,
-		"  confirm screen");
-	TEST_EQ(screens_displayed[4], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 5, "  no extra screens");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST), 1,
-		"  disable dev request");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(beeps_count, 0, "  no beep on reboot");
-
-	/* Tonorm ignored if GBB forces dev switch on */
-	ResetMocksForDeveloper();
-	sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
-	gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON;
-	mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS;
-	mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[2] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"Can't tonorm gbb-dev");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen: power off");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  wanring screen: enable verification");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  tonorm screen: confirm");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK,
-		"  blank (error flash)");
-	TEST_EQ(screens_displayed[4], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  tonorm screen: confirm");
-	TEST_EQ(screens_displayed[5], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 6, "  no extra screens");
-	TEST_EQ(audio_looping_calls_left, 0, "  audio timeout");
-	TEST_EQ(beeps_count, 2, "  played error beeps");
-	TEST_EQ(beeps_played[0], 400, "    first beep");
-	TEST_EQ(beeps_played[1], 400, "    second beep");
-
-	/* Shutdown requested at tonorm screen */
-	ResetMocksForDeveloper();
-	sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
-	mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS;
-	mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
-	shutdown_request_calls_left = 2;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested at tonorm");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		" developer warning screen: power off");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  developer warning screen: enable root verification");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  developer warning screen: power off");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps on shutdown");
-
-	/* Ctrl+D dismisses warning */
-	ResetMocksForDeveloper();
-	mock_keypress[0] = VB_KEY_CTRL('D');
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed, "Ctrl+D");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
-		"  recovery reason");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps on normal boot");
-
-	/* Ctrl+D doesn't boot legacy even if GBB flag is set */
-	ResetMocksForDeveloper();
-	mock_keypress[0] = VB_KEY_CTRL('D');
-	gbb.flags |= VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed, "Ctrl+D");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-
-	/* Volume-down long press shortcut acts like Ctrl+D */
-	ResetMocksForDeveloper();
-	mock_keypress[0] = VB_BUTTON_VOL_DOWN_LONG_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"VolDown long press");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
-		"  recovery reason");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps on normal boot");
-
-	/* Ctrl+L tries legacy boot mode only if enabled */
-	ResetMocksForDeveloper();
-	mock_keypress[0] = VB_KEY_CTRL('L');
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"Ctrl+L normal");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(audio_looping_calls_left, 0, "  audio timed out");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(beeps_count, 2, "  played error beeps");
-	TEST_EQ(beeps_played[0], 400, "    first beep");
-	TEST_EQ(beeps_played[1], 400, "    second beep");
-
-	/* Ctrl+L boots legacy if enabled by GBB flag */
-	ResetMocksForDeveloper();
-	gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
-	mock_keypress[0] = VB_KEY_CTRL('L');
-	mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"Ctrl+L force legacy");
-	TEST_EQ(vbexlegacy_called, 1, "  try legacy");
-	TEST_EQ(altfw_num, 1, "  check altfw_num");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_ALT_FW_MENU, "  altfw");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_ALT_FW_MENU, "  altfw");
-	TEST_EQ(screens_displayed[4], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_count, 5, "  no extra screens");
-	TEST_EQ(beeps_count, 1, "  error beep: legacy BIOS not found");
-	TEST_EQ(beeps_played[0], 200, "    low-frequency error beep");
-
-	/* Ctrl+L boots legacy if enabled by NVRAM */
-	ResetMocksForDeveloper();
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
-	mock_keypress[0] = VB_KEY_CTRL('L');
-	mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"Ctrl+L nv legacy");
-	TEST_EQ(vbexlegacy_called, 1, "  try legacy");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_ALT_FW_MENU, "  altfw");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_ALT_FW_MENU, "  altfw");
-	TEST_EQ(screens_displayed[4], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_count, 5, "  no extra screens");
-	TEST_EQ(beeps_count, 1, "  error beep: legacy BIOS not found");
-	TEST_EQ(beeps_played[0], 200, "    low-frequency error beep");
-
-	/* Ctrl+L boots legacy if enabled by FWMP */
-	ResetMocksForDeveloper();
-	fwmp->flags |= VB2_SECDATA_FWMP_DEV_ENABLE_LEGACY;
-	mock_keypress[0] = VB_KEY_CTRL('L');
-	mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"Ctrl+L fwmp legacy");
-	TEST_EQ(vbexlegacy_called, 1, "  fwmp legacy");
-	TEST_EQ(altfw_num, 1, "  check altfw_num");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_ALT_FW_MENU, "  altfw");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_ALT_FW_MENU, "  altfw");
-	TEST_EQ(screens_displayed[4], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 5, "  no extra screens");
-	TEST_EQ(beeps_count, 1, "  error beep: legacy BIOS not found");
-	TEST_EQ(beeps_played[0], 200, "    low-frequency error beep");
-
-	/* TODO(sjg@chromium.org): Add a test for there being no bootloaders */
-
-	/* Ctrl+U boots USB only if enabled */
-	ResetMocksForDeveloper();
-	mock_keypress[0] = VB_KEY_CTRL('U');
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"Ctrl+U not enabled");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(audio_looping_calls_left, 0, "  audio timed out");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(beeps_count, 2, "  played error beeps");
-	TEST_EQ(beeps_played[0], 400, "    first beep");
-	TEST_EQ(beeps_played[1], 400, "    second beep");
-
-	/* Ctrl+U enabled, with good USB boot */
-	ResetMocksForDeveloper();
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	mock_keypress[0] = VB_KEY_CTRL('U');
-	vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS, "Ctrl+U USB");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps on USB boot");
-
-	/* Ctrl+U enabled, without valid USB */
-	ResetMocksForDeveloper();
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	mock_keypress[0] = VB_KEY_CTRL('U');
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"Ctrl+U without valid USB");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(audio_looping_calls_left, 0, "  used up audio");
-	TEST_EQ(beeps_count, 1, "  error beep: USB not found");
-	TEST_EQ(beeps_played[0], 200, "    low-frequency error beep");
-
-	/* Ctrl+U enabled via GBB */
-	ResetMocksForDeveloper();
-	gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_USB;
-	mock_keypress[0] = VB_KEY_CTRL('U');
-	vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS,
-		"Ctrl+U force USB");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps on USB boot");
-
-	/* Ctrl+U enabled via FWMP */
-	ResetMocksForDeveloper();
-	fwmp->flags |= VB2_SECDATA_FWMP_DEV_ENABLE_EXTERNAL;
-	mock_keypress[0] = VB_KEY_CTRL('U');
-	vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS,
-		"Ctrl+U force USB");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps on USB boot");
-
-	/* If no valid USB, eventually times out and tries fixed disk */
-	ResetMocksForDeveloper();
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	mock_keypress[0] = VB_KEY_CTRL('U');
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"Ctrl+U failed - no USB");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(audio_looping_calls_left, 0, "  used up audio");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(beeps_count, 1, "  error beep: USB not found");
-	TEST_EQ(beeps_played[0], 200, "    low-frequency error beep");
-
-	/* Now go to USB boot through menus */
-	ResetMocksForDeveloper();
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From USB
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS,
-		"Menu selected USB boot");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: developer options");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: disk boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: USB boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps on USB boot");
-
-	/* If default USB, the option is preselected */
-	ResetMocksForDeveloper();
-	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
-		   VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS,
-		"Menu selected USB default boot");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: developer options");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: USB boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps on USB boot");
-
-	/* If invalid USB, we still timeout after selecting it in menu */
-	ResetMocksForDeveloper();
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From USB
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"Menu selected invalid USB boot");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(audio_looping_calls_left, 0, "  used up audio");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: developer options");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: disk boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: USB boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  blank (flash)");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: USB boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 1, "  error beep: USB not found");
-	TEST_EQ(beeps_played[0], 200, "    low-frequency error beep");
-
-	/* If USB is disabled, we error flash/beep from the menu option */
-	ResetMocksForDeveloper();
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From USB
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"Menu selected disabled USB boot");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(audio_looping_calls_left, 0, "  used up audio");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: developer options");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: disk boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: USB boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  blank (flash)");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: USB boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 2, "  played error beeps");
-	TEST_EQ(beeps_played[0], 400, "    first beep");
-	TEST_EQ(beeps_played[1], 400, "    second beep");
-
-	/* Boot Legacy via menu and default */
-	ResetMocksForDeveloper();
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // Enter altfw menu
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // Select first option
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // and again
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
-	vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
-		   VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY);
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"Menu selected legacy boot");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(vbexlegacy_called, 2, "  tried legacy boot twice");
-	TEST_EQ(altfw_num, 0, "  check altfw_num");
-	TEST_EQ(audio_looping_calls_left, 0, "  audio timeout");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: developer options");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: legacy boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, "  altfw");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  blank (flash)");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, "  altfw");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  blank (flash)");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, "  altfw");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  blank (flash)");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 2, "  two error beeps: legacy BIOS not found");
-	TEST_EQ(beeps_played[0], 200, "    low-frequency error beep");
-	TEST_EQ(beeps_played[1], 200, "    low-frequency error beep");
-
-	/* Refuse to boot legacy via menu if not enabled */
-	ResetMocksForDeveloper();
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From USB
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot Legacy BIOS
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"Menu selected legacy boot when not enabled");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(vbexlegacy_called, 0, "  did not attempt legacy boot");
-	TEST_EQ(audio_looping_calls_left, 0, "  audio timeout");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: developer options");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: disk boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: USB boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: legacy boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  blank (flash)");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: legacy boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 2, "  played error beeps");
-	TEST_EQ(beeps_played[0], 400, "    first beep");
-	TEST_EQ(beeps_played[1], 400, "    second beep");
-
-	/* Use volume-up long press shortcut to boot USB */
-	ResetMocksForDeveloper();
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	mock_keypress[0] = VB_BUTTON_VOL_UP_LONG_PRESS;
-	vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS, "VolUp USB");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps on USB boot");
-
-	/* Can boot a valid USB image after failing to boot invalid image */
-	ResetMocksForDeveloper();
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	mock_keypress[0] = VB_BUTTON_VOL_UP_LONG_PRESS;
-	mock_keypress[1] = VB_BUTTON_VOL_UP_LONG_PRESS;
-	vbtlk_retval[0] = VB2_ERROR_MOCK - VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[1] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS,
-		"VolUp USB valid after invalid");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(beeps_count, 1, "  error beep: first USB invalid");
-	TEST_EQ(beeps_played[0], 200, "    low-frequency error beep");
-
-	/* Volume-up long press only works if USB is enabled */
-	ResetMocksForDeveloper();
-	mock_keypress[0] = VB_BUTTON_VOL_UP_LONG_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"VolUp not enabled");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(audio_looping_calls_left, 0, "  audio timed out");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(beeps_count, 2, "  played error beeps");
-	TEST_EQ(beeps_played[0], 400, "    first beep");
-	TEST_EQ(beeps_played[1], 400, "    second beep");
-
-	/* Volume-up long press without valid USB will still time out */
-	ResetMocksForDeveloper();
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	mock_keypress[0] = VB_BUTTON_VOL_UP_LONG_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"VolUp without valid USB");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  blank (error flash)");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(audio_looping_calls_left, 0, "  used up audio");
-	TEST_EQ(beeps_count, 1, "  error beep: USB not found");
-	TEST_EQ(beeps_played[0], 200, "    low-frequency error beep");
-
-	/* Volume-up long press works from other menus, like LANGUAGE */
-	ResetMocksForDeveloper();
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Cancel
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Power Off
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Language
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_LONG_PRESS;
-	vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS,
-		"VolUp USB from LANGUAGE");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: developer options");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: disk boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
-		"  language menu");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps on USB boot");
-
-	/* Can disable developer mode through TONORM screen */
-	ResetMocksForDeveloper();
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enable os verification
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // confirm is the default
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_REBOOT,
-		"TONORM via menu");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST), 1,
-		"  disable dev request");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning: enable os verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  tonorm: confirm");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_TO_NORM_CONFIRMED,
-		"  confirm screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps on reboot");
-
-	/* If dev mode is disabled, goes to TONORM screen repeatedly */
-	ResetMocksForDeveloper();
-	fwmp->flags |= VB2_SECDATA_FWMP_DEV_DISABLE_BOOT;
-	audio_looping_calls_left = 1;	/* Confirm audio doesn't tick down. */
-	i = 0;
-	mock_keypress[i++] = VB_KEY_CTRL('D');  /* Just stays on TONORM and flashes */
-	mock_keypress[i++] = VB_KEY_CTRL('U');  /* same */
-	mock_keypress[i++] = VB_KEY_CTRL('L');  /* same */
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_LONG_PRESS;	/* same */
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_LONG_PRESS;	/* same */
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS;	/* noop */
-	mock_keypress[i++] = VB_KEY_ENTER;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_REBOOT,
-		"FWMP dev disabled");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST), 1,
-		"  disable dev request");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  tonorm screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  blank (flash)");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  tonorm screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  blank (flash)");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  tonorm screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  blank (flash)");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  tonorm screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  blank (flash)");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  tonorm screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  blank (flash)");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  tonorm screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_TO_NORM_CONFIRMED,
-		"  confirm screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 10, "  5 * 2 error beeps: booting not allowed");
-	TEST_EQ(beeps_played[0], 400, "    first error beep");
-	TEST_EQ(beeps_played[1], 400, "    second error beep");
-	TEST_EQ(beeps_played[2], 400, "    first error beep");
-	TEST_EQ(beeps_played[3], 400, "    second error beep");
-	TEST_EQ(beeps_played[4], 400, "    first error beep");
-	TEST_EQ(beeps_played[5], 400, "    second error beep");
-	TEST_EQ(beeps_played[6], 400, "    first error beep");
-	TEST_EQ(beeps_played[7], 400, "    second error beep");
-	TEST_EQ(beeps_played[8], 400, "    first error beep");
-	TEST_EQ(beeps_played[9], 400, "    second error beep");
-
-	/* Shutdown requested when dev disabled */
-	ResetMocksForDeveloper();
-	fwmp->flags |= VB2_SECDATA_FWMP_DEV_DISABLE_BOOT;
-	shutdown_request_calls_left = 1;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested when dev disabled");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST), 0,
-		"  did not exit dev mode");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  tonorm screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* Explicit Power Off when dev disabled */
-	ResetMocksForDeveloper();
-	fwmp->flags |= VB2_SECDATA_FWMP_DEV_DISABLE_BOOT;
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS;	// Power Off
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Power Off when dev disabled");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST), 0,
-		"  did not exit dev mode");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_NEQ(audio_looping_calls_left, 0, "  aborts audio");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  tonorm screen: confirm enabling OS verification");
-	/* Cancel option is removed with dev_disable_boot! */
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  tonorm screen: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps for power off");
-
-	/* Show Debug Info displays debug info, then times out to boot */
-	ResetMocksForDeveloper();
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"Show Debug Info");
-	TEST_EQ(debug_info_displayed, 1, "  debug info displayed");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(audio_looping_calls_left, 0, "  audio timed out");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps for debug info");
-
-	/* Pressing Tab displays debug info, then times out to boot */
-	ResetMocksForDeveloper();
-	i = 0;
-	mock_keypress[i++] = '\t';
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"Show Debug Info (Tab shortcut)");
-	TEST_EQ(debug_info_displayed, 1, "  debug info displayed");
-	TEST_EQ(vbexlegacy_called, 0, "  not legacy");
-	TEST_EQ(audio_looping_calls_left, 0, "  audio timed out");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps for debug info");
-
-
-	VB2_DEBUG("...done.\n");
-}
-
-static void VbBootRecTest(void)
-{
-	int i;
-
-	VB2_DEBUG("Testing VbBootRecoveryLegacyMenu()...\n");
-
-	/* Shutdown requested in BROKEN */
-	ResetMocks();
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested in BROKEN");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-	TEST_EQ(vbexaltfwmask_called, 0, "  VbExGetAltFwIdxMask not called");
-
-	/* BROKEN screen with disks inserted */
-	ResetMocks();
-	vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[1] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[2] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[3] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested in BROKEN with disks");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* BROKEN screen with disks on second attempt */
-	ResetMocks();
-	vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[1] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested in BROKEN with later disk");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* BROKEN screen even if dev switch is on */
-	ResetMocks();
-	vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[1] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[2] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested in BROKEN with dev switch");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* go to INSERT if recovery button physically pressed and EC trusted */
-	ResetMocksForManualRecovery();
-	vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested in INSERT with manual rec");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* go to INSERT if forced by GBB flag */
-	ResetMocks();
-	vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	gbb.flags |= VB2_GBB_FLAG_FORCE_MANUAL_RECOVERY;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Shutdown requested in INSERT forced by GBB flag");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* Stay at BROKEN if recovery button not physically pressed */
-	ResetMocksForManualRecovery();
-	vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	sd->flags &= ~VB2_SD_FLAG_MANUAL_RECOVERY;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Go to BROKEN if recovery not manually requested");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* Stay at BROKEN if EC is untrusted */
-	ResetMocksForManualRecovery();
-	vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	trust_ec = 0;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Go to BROKEN if EC is not trusted");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* INSERT boots without screens if we have a valid image on first try */
-	ResetMocksForManualRecovery();
-	vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[1] = VB2_ERROR_MOCK - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_SUCCESS,
-		"INSERT boots without screens if valid on first try");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode off");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 1, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* INSERT boots eventually if we get a valid image later */
-	ResetMocksForManualRecovery();
-	vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[1] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[2] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[3] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[4] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_SUCCESS,
-		"INSERT boots after valid image appears");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode off");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* invalid image, then remove, then valid image */
-	ResetMocksForManualRecovery();
-	vbtlk_retval[0] = VB2_ERROR_MOCK - VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[1] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[2] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[3] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[4] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_SUCCESS,
-		"INSERT boots after valid image appears");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode off");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_NO_GOOD,
-		"  nogood screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 3, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep on shutdown");
-
-	/* Shortcuts that are always ignored in BROKEN for detachables. */
-	ResetMocks();
-	i = 0;
-	mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_KEY_CTRL('D');
-	mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_KEY_CTRL('U');
-	mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_KEY_CTRL('L');
-	mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS;
-	mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_LONG_PRESS;
-	mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_LONG_PRESS;
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Shortcuts ignored in BROKEN");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode off");
-	TEST_NEQ(shutdown_request_calls_left, 0, "  powered down explicitly");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep from invalid keys");
-
-	/* Shortcuts that are always ignored in INSERT for detachables. */
-	ResetMocksForManualRecovery();
-	i = 0;
-	mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_KEY_CTRL('D');
-	mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_KEY_CTRL('U');
-	mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_KEY_CTRL('L');
-	mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_LONG_PRESS;
-	mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_LONG_PRESS;
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Shortcuts ignored in INSERT");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode off");
-	TEST_NEQ(shutdown_request_calls_left, 0, "  powered down explicitly");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep from invalid keys");
-
-	/* Power Off BROKEN through OPTIONS menu */
-	ResetMocks();
-	mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter options
-	mock_keypress[1] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keypress[2] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Power Off BROKEN through OPTIONS");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_NEQ(shutdown_request_calls_left, 0, "  powered down explicitly");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_OPTIONS_MENU,
-		"  options: cancel");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_OPTIONS_MENU,
-		"  options: power off");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep from power off");
-
-	/* Power Off NOGOOD through OPTIONS menu */
-	ResetMocksForManualRecovery();
-	mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter options
-	mock_keypress[1] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keypress[2] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Power Off NOGOOD through OPTIONS");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_NEQ(shutdown_request_calls_left, 0, "  powered down explicitly");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_NO_GOOD,
-		"  nogood screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_OPTIONS_MENU,
-		"  options: cancel");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_OPTIONS_MENU,
-		"  options: power off");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep from power off");
-
-	/* Power Off INSERT through TO_DEV menu */
-	ResetMocksForManualRecovery();
-	mock_keyflags[0] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[0] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter to_dev
-	mock_keyflags[1] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[1] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keypress[2] = VB_BUTTON_POWER_SHORT_PRESS;
-	vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Power Off INSERT through TO_DEV");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_NEQ(shutdown_request_calls_left, 0, "  powered down explicitly");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  to_dev: cancel");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  to_dev: power off");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep from power off");
-
-	/* Show Debug Info from BROKEN through OPTIONS menu */
-	ResetMocks();
-	mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter options
-	mock_keypress[1] = VB_BUTTON_VOL_UP_SHORT_PRESS; // show debug info
-	mock_keypress[2] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Show Debug info from BROKEN through OPTIONS");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 1, "  no debug info");
-	TEST_EQ(shutdown_request_calls_left, 0, "  timed out");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_OPTIONS_MENU,
-		"  options: cancel");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_OPTIONS_MENU,
-		"  options: show debug info");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 4, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep from power off");
-
-	/* Show Debug Info on NOGOOD with Tab */
-	ResetMocksForManualRecovery();
-	mock_keypress[0] = '\t';
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Show Debug info on NOGOOD with Tab");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 1, "  no debug info");
-	TEST_EQ(shutdown_request_calls_left, 0, "  timed out");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_NO_GOOD,
-		"  nogood screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 2, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beep from power off");
-
-	/* Navigate to confirm dev mode selection and then cancel */
-	ResetMocksForManualRecovery();
-	vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	i = 0;
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter TO_DEV
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // confirm disabling
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // power off
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"go to TO_DEV screen and cancel");
-	TEST_NEQ(shutdown_request_calls_left, 0, "  powered down explicitly");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode off");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  recovery to_dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  recovery to_dev menu: confirm disabling");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  recovery to_dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_INSERT,
-		"  back to insert screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps");
-
-	/* Navigate to confirm dev mode selection and then confirm */
-	ResetMocksForManualRecovery();
-	vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	i = 0;
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter to_dev
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_REBOOT_EC_TO_RO,
-		"go to TO_DEV screen and confirm");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(virtdev_set, 1, "  virtual dev mode on");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  recovery to_dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  recovery to_dev menu: confirm disabling os verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps");
-
-	/* Untrusted keyboard cannot enter TO_DEV (must be malicious anyway) */
-	ResetMocksForManualRecovery();
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // try to_dev
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // try confirm
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Untrusted keyboard cannot enter TO_DEV");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(shutdown_request_calls_left, 0, "  timed out");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_NO_GOOD,
-		"  nogood screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options menu");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_NO_GOOD,
-		"  nogood screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps");
-
-	/* Untrusted keyboard cannot navigate in TO_DEV menu if already there */
-	ResetMocksForManualRecovery();
-	i = 0;
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter to_dev
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // try to confirm...
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Untrusted keyboard cannot navigate in TO_DEV");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(shutdown_request_calls_left, 0, "  timed out");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_NO_GOOD,
-		"  nogood screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  blank (flash)");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_NO_GOOD,
-		"  nogood screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 2, "  played error beeps");
-	TEST_EQ(beeps_played[0], 400, "    first beep");
-	TEST_EQ(beeps_played[1], 400, "    second beep");
-
-	/* Don't handle TPM error in enabling dev mode */
-	ResetMocksForManualRecovery();
-	i = 0;
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter to_dev
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // confirm enabling
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	virtdev_fail = 1;
-	TEST_ABORT(VbBootRecoveryLegacyMenu(ctx), "todev TPM failure");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_NEQ(shutdown_request_calls_left, 0, "  aborted explicitly");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode still off");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_NO_GOOD,
-		"  nogood screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  recovery to_dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  recovery to_dev menu: confirm disabling os verification");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps");
-
-	/* Cannot enable dev mode if already enabled. */
-	ResetMocksForManualRecovery();
-	sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
-	vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	i = 0;
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter to_dev
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Ctrl+D ignored if already in dev mode");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(shutdown_request_calls_left, 0, "  timed out");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode wasn't enabled again");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  blank (flash)");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 2, "  played error beeps");
-	TEST_EQ(beeps_played[0], 400, "    first beep");
-	TEST_EQ(beeps_played[1], 400, "    second beep");
-
-	/* Removing invalid USB drops back to INSERT from TO_DEV menu. */
-	ResetMocksForManualRecovery();
-	mock_keyflags[0] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[0] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter TO_DEV
-	/* asynchronous transition to INSERT before keypress[50] */
-	mock_keypress[55] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter OPTIONS
-	mock_keypress[56] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keypress[57] = VB_BUTTON_POWER_SHORT_PRESS;
-	vbtlk_retval[0] = VB2_ERROR_MOCK - VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[1] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Drop back to INSERT from TO_DEV when removing invalid USB");
-	TEST_NEQ(shutdown_request_calls_left, 0, "  powered down explicitly");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode off");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_NO_GOOD,
-		"  nogood screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev menu");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_OPTIONS_MENU,
-		"  options menu: cancel");
-	TEST_EQ(screens_displayed[4], VB_SCREEN_OPTIONS_MENU,
-		"  options menu: power off");
-	TEST_EQ(screens_displayed[5], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 6, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps");
-
-	/* Plugging in invalid USB drops back to NOGOOD from LANGUAGE. */
-	ResetMocksForManualRecovery();
-	mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter OPTIONS
-	mock_keypress[1] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keypress[2] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
-	mock_keypress[3] = VB_BUTTON_POWER_SHORT_PRESS;
-	vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[1] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[2] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[3] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[4] = VB2_ERROR_MOCK - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"Drop back to NOGOOD from LANGUAGE when inserting invalid USB");
-	TEST_EQ(shutdown_request_calls_left, 0, "  timed out");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode off");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_OPTIONS_MENU,
-		"  options menu: cancel");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_OPTIONS_MENU,
-		"  options menu: power off");
-	TEST_EQ(screens_displayed[3], VB_SCREEN_OPTIONS_MENU,
-		"  options menu: language");
-	TEST_EQ(screens_displayed[4], VB_SCREEN_LANGUAGES_MENU,
-		"  languages menu");
-	TEST_EQ(screens_displayed[5], VB_SCREEN_RECOVERY_NO_GOOD,
-		"  nogood screen");
-	TEST_EQ(screens_displayed[6], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 7, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps");
-
-	/* Plugging in valid USB boots straight from OPTIONS menu. */
-	ResetMocksForManualRecovery();
-	mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter OPTIONS
-	vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	vbtlk_retval[1] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_SUCCESS,
-		"Boot by plugging in USB straight from OPTIONS menu");
-	TEST_NEQ(shutdown_request_calls_left, 0, "  booted explicitly");
-	TEST_EQ(virtdev_set, 0, "  virtual dev mode off");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[1], VB_SCREEN_OPTIONS_MENU,
-		"  options menu: cancel");
-	TEST_EQ(screens_displayed[2], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, 3, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps");
-
-	VB2_DEBUG("...done.\n");
-}
-
-static void VbTestLanguageMenu(void)
-{
-	int i;
-
-	VB2_DEBUG("Testing VbTestLanguageMenu()...\n");
-
-	/* Navigate to language menu from BROKEN */
-	ResetMocks();
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter OPTIONS
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // languages
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // enter languages
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // select current lang
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // cancel -> BROKEN
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // power off
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"go to language menu from BROKEN");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_NEQ(shutdown_request_calls_left, 0, "  powered down explicitly");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options menu: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
-		"  language menu");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OS_BROKEN,
-		"  broken screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps");
-
-	/* Navigate to all language menus from recovery */
-	ResetMocksForManualRecovery();
-	vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
-		VB_DISK_FLAG_REMOVABLE;
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter OPTIONS
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // languages
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // select current lang
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter TO_DEV
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // confirm disabling
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // select current lang
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"go to language menus from INSERT");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_NEQ(shutdown_request_calls_left, 0, "  powered down explicitly");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_INSERT,
-		"  insert screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options menu: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
-		"  language menu");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  to dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  to dev menu: confirm disabling os verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  to dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  to dev menu: power_off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  to dev menu: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
-		"  language menu");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  to dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  to dev menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps");
-
-	/* Navigate to all language menus from developer menu */
-	ResetMocksForDeveloper();
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // select current lang
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enable OS verif
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // select current lang
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // return to dev_warn
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enable OS verif
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // show debug info
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // developer options
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // select current lang
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		" scroll through all language menus in developer options");
-	TEST_EQ(debug_info_displayed, 0, "  no debug info");
-	TEST_NEQ(shutdown_request_calls_left, 0, "  powered down explicitly");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
-		"  language menu: select current language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen: cancel ");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  to norm screen: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  to norm screen: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  to norm screen: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  to norm screen: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
-		"  language menu: select current language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  to norm screen: confirm enabling os verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  to norm screen: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  warning screen: developer options");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  select developer options");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  developer menu: boot developer image");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  developer menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  developer menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  developer menu: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
-		"  language menu");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  developer menu: boot from disk");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  developer menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  developer menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps");
-
-	VB2_DEBUG("...done.\n");
-}
-
-static void VbNavigationTest(void)
-{
-	int i;
-
-	VB2_DEBUG("Testing long navigation sequences...");
-
-	/*
-	 * NOGOOD, OPTIONS, LANGUAGE, TODEV, LANGUAGE, TODEV,
-	 * LANGUAGE, select, Cancel, OPTIONS, LANGUAGE
-	 */
-	ResetMocksForManualRecovery();
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter OPTIONS
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // (end of menu)
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // (end of menu)
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter TO_DEV
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // confirm enabling
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // (end of menu)
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter TO_DEV
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // select current lang
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // (end of menu)
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // (end of menu)
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // power off
-	mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // cancel
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter OPTIONS
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // show debug info
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // (end of menu)
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
-		"recovery mode long navigation");
-	TEST_EQ(debug_info_displayed, 1, "  showed debug info");
-	TEST_EQ(shutdown_request_calls_left, 0, "  timed out");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_NO_GOOD,
-		"  nogood screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
-		"  languages menu");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: confirm enabling");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: confirm enabling");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
-		"  languages menu");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
-		"  languages menu");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
-		"  todev: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_NO_GOOD,
-		"  nogood screen");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
-		"  options: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
-		"  languages menu");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 0, "  no beeps");
-
-	/* DEVELOPER, Cancel, Show Debug, TO_NORM, Cancel, Boot Legacy */
-	ResetMocksForDeveloper();
-	i = 0;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS verif
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // (end of menu)
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // (end of menu)
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From USB
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot Legacy
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // (end of menu)
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Boot From USB
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Boot From Disk
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Cancel
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS verif
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Enable OS verif
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Cancel
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Power Off
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Language
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // (end of menu)
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // (end of menu)
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Power Off
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Cancel
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS verif
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Cancel
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Power Off
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Language
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Power Off
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Cancel
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From Disk
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From USB
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot Legacy
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // (end of menu)
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // Select altfw menu
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Second altfw
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Cancel
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // (end of menu)
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // Back to dev options
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From Disk
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From USB
-	mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot Legacy
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // Select altfw menu
-	mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Second altfw
-	mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // Select 2nd altfw
-	vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
-	TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
-		"developer mode long navigation");
-	TEST_EQ(debug_info_displayed, 1, "  showed debug info");
-	TEST_EQ(vbexlegacy_called, 1, "  tried legacy");
-	TEST_EQ(altfw_num, 2, "  check altfw_num");
-	TEST_EQ(audio_looping_calls_left, 0, "  audio timeout");
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, "  no recovery");
-	i = 0;
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: developer options");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: developer options");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: developer options");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: disk boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: USB boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: Legacy boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: Legacy boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: USB boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: disk boot");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  to dev menu: confirm enabling");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  to dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  to dev menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  to dev menu: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  to dev menu: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  to dev menu: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  to dev menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
-		"  to dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: enable root verification");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: show debug info");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
-		"  dev warning menu: developer options");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: boot from disk");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: language");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: power off");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: boot from disk");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: boot from USB");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: boot legacy");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: boot legacy");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, "  altfw 1");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, "  altfw 2");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU,
-		"  altfw cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU,
-		"  altfw end");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: cancel");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: boot from disk");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: boot from USB");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
-		"  dev menu: boot legacy");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, "  altfw");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, "  altfw");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, "  blank (flash)");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, "  altfw");
-	TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK,"  final blank screen");
-	TEST_EQ(screens_count, i, "  no extra screens");
-	TEST_EQ(beeps_count, 1, "  error beep: legacy BIOS not found");
-	TEST_EQ(beeps_played[0], 200, "    low-frequency error beep");
-}
-
-int main(void)
-{
-	VbBootDevTest();
-	VbBootRecTest();
-	VbTestLanguageMenu();
-	VbNavigationTest();
-
-	return gTestSuccess ? 0 : 255;
-}
diff --git a/tests/vboot_ui_legacy_tests.c b/tests/vboot_ui_legacy_tests.c
deleted file mode 100644
index 04da02e..0000000
--- a/tests/vboot_ui_legacy_tests.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Tests for firmware display library.
- */
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2struct.h"
-#include "2sysincludes.h"
-#include "host_common.h"
-#include "test_common.h"
-#include "vboot_kernel.h"
-#include "vboot_ui_legacy.h"
-
-/* Mock data */
-static char debug_info[4096];
-static struct vb2_context *ctx;
-static struct vb2_shared_data *sd;
-static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
-	__attribute__((aligned(VB2_WORKBUF_ALIGN)));
-static uint32_t mock_localization_count;
-static uint32_t mock_altfw_mask;
-
-/* Reset mock data (for use before each test) */
-static void ResetMocks(void)
-{
-	mock_localization_count = 3;
-	mock_altfw_mask = 3 << 1;	/* This mask selects 1 and 2 */
-
-	TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
-		  "vb2api_init failed");
-	vb2_nv_init(ctx);
-
-	sd = vb2_get_sd(ctx);
-
-	*debug_info = 0;
-}
-
-/* Mocks */
-uint32_t vb2ex_get_locale_count(void) {
-
-	return mock_localization_count;
-}
-
-uint32_t VbExGetAltFwIdxMask() {
-	return mock_altfw_mask;
-}
-
-vb2_error_t VbExDisplayDebugInfo(const char *info_str, int full_info)
-{
-	strncpy(debug_info, info_str, sizeof(debug_info));
-	debug_info[sizeof(debug_info) - 1] = '\0';
-	return VB2_SUCCESS;
-}
-
-vb2_error_t vb2ex_commit_data(struct vb2_context *c)
-{
-	return VB2_SUCCESS;
-}
-
-/* Test displaying debug info */
-static void DebugInfoTest(void)
-{
-	/* Display debug info */
-	ResetMocks();
-	TEST_SUCC(VbDisplayDebugInfo(ctx),
-		  "Display debug info");
-	TEST_NEQ(*debug_info, '\0', "  Some debug info was displayed");
-}
-
-/* Test display key checking */
-static void DisplayKeyTest(void)
-{
-	ResetMocks();
-	VbCheckDisplayKey(ctx, 'q', 0, NULL);
-	TEST_EQ(*debug_info, '\0', "DisplayKey q = does nothing");
-
-	ResetMocks();
-	VbCheckDisplayKey(ctx, '\t', 0, NULL);
-	TEST_NEQ(*debug_info, '\0', "DisplayKey tab = display");
-
-	/* Toggle localization */
-	ResetMocks();
-	vb2_nv_set(ctx, VB2_NV_LOCALIZATION_INDEX, 0);
-	VbCheckDisplayKey(ctx, VB_KEY_DOWN, 0, NULL);
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX), 2,
-		"DisplayKey up");
-	VbCheckDisplayKey(ctx, VB_KEY_LEFT, 0, NULL);
-	vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX);
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX), 1,
-		"DisplayKey left");
-	VbCheckDisplayKey(ctx, VB_KEY_RIGHT, 0, NULL);
-	vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX);
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX), 2,
-		"DisplayKey right");
-	VbCheckDisplayKey(ctx, VB_KEY_UP, 0, NULL);
-	vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX);
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX), 0,
-		"DisplayKey up");
-
-	/* Reset localization if localization count is invalid */
-	ResetMocks();
-	vb2_nv_set(ctx, VB2_NV_LOCALIZATION_INDEX, 1);
-	mock_localization_count = 0;
-	VbCheckDisplayKey(ctx, VB_KEY_UP, 0, NULL);
-	TEST_EQ(vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX), 0,
-		"DisplayKey invalid");
-}
-
-int main(void)
-{
-	DebugInfoTest();
-	DisplayKeyTest();
-
-	return gTestSuccess ? 0 : 255;
-}
