diff --git a/Android.mk b/Android.mk
index a34c265..0484065 100644
--- a/Android.mk
+++ b/Android.mk
@@ -72,6 +72,7 @@
     libminui \
     libpng \
     libfs_mgr \
+    libbase \
     libcutils \
     liblog \
     libselinux \
diff --git a/device.cpp b/device.cpp
index 024fc34..fd1a987 100644
--- a/device.cpp
+++ b/device.cpp
@@ -16,20 +16,6 @@
 
 #include "device.h"
 
-static const char* REGULAR_HEADERS[] = {
-    "Volume up/down move highlight.",
-    "Power button activates.",
-    "",
-    NULL
-};
-
-static const char* LONG_PRESS_HEADERS[] = {
-    "Any button cycles highlight.",
-    "Long-press activates.",
-    "",
-    NULL
-};
-
 static const char* MENU_ITEMS[] = {
     "Reboot system now",
     "Reboot to bootloader",
@@ -43,10 +29,6 @@
     NULL
 };
 
-const char* const* Device::GetMenuHeaders() {
-  return ui_->HasThreeButtons() ? REGULAR_HEADERS : LONG_PRESS_HEADERS;
-}
-
 const char* const* Device::GetMenuItems() {
   return MENU_ITEMS;
 }
diff --git a/device.h b/device.h
index 1507183..dad8ccd 100644
--- a/device.h
+++ b/device.h
@@ -70,12 +70,6 @@
         MOUNT_SYSTEM = 10,
     };
 
-    // Return the headers (an array of strings, one per line,
-    // NULL-terminated) for the main menu.  Typically these tell users
-    // what to push to move the selection and invoke the selected
-    // item.
-    virtual const char* const* GetMenuHeaders();
-
     // Return the list of menu items (an array of strings,
     // NULL-terminated).  The menu_position passed to InvokeMenuItem
     // will correspond to the indexes into this array.
diff --git a/minui/graphics.cpp b/minui/graphics.cpp
index d7d6e8d..f240f4b 100644
--- a/minui/graphics.cpp
+++ b/minui/graphics.cpp
@@ -103,7 +103,7 @@
     }
 }
 
-void gr_text(int x, int y, const char *s, int bold)
+void gr_text(int x, int y, const char *s, bool bold)
 {
     GRFont* font = gr_font;
 
diff --git a/minui/minui.h b/minui/minui.h
index eca3a50..936f7ee 100644
--- a/minui/minui.h
+++ b/minui/minui.h
@@ -48,7 +48,7 @@
 void gr_clear();  // clear entire surface to current color
 void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a);
 void gr_fill(int x1, int y1, int x2, int y2);
-void gr_text(int x, int y, const char *s, int bold);
+void gr_text(int x, int y, const char *s, bool bold);
 void gr_texticon(int x, int y, gr_surface icon);
 int gr_measure(const char *s);
 void gr_font_size(int *x, int *y);
diff --git a/recovery.cpp b/recovery.cpp
index f7ae5e7..4dd8279 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -629,7 +629,7 @@
     z_size += d_size;
     zips[z_size] = NULL;
 
-    const char* headers[] = { "Choose a package to install:", path, "", NULL };
+    const char* headers[] = { "Choose a package to install:", path, NULL };
 
     char* result;
     int chosen_item = 0;
@@ -668,7 +668,7 @@
 }
 
 static bool yes_no(Device* device, const char* question1, const char* question2) {
-    const char* headers[] = { question1, question2, "", NULL };
+    const char* headers[] = { question1, question2, NULL };
     const char* items[] = { " No", " Yes", NULL };
 
     int chosen_item = get_menu_selection(headers, items, 1, 0, device);
@@ -743,7 +743,7 @@
         entries[n++] = filename;
     }
 
-    const char* headers[] = { "Select file to view", "", NULL };
+    const char* headers[] = { "Select file to view", NULL };
 
     while (true) {
         int chosen_item = get_menu_selection(headers, entries, 1, 0, device);
@@ -791,8 +791,6 @@
 // on if the --shutdown_after flag was passed to recovery.
 static Device::BuiltinAction
 prompt_and_wait(Device* device, int status) {
-    const char* const* headers = device->GetMenuHeaders();
-
     for (;;) {
         finish_recovery(NULL);
         switch (status) {
@@ -808,7 +806,7 @@
         }
         ui->SetProgressType(RecoveryUI::EMPTY);
 
-        int chosen_item = get_menu_selection(headers, device->GetMenuItems(), 0, 0, device);
+        int chosen_item = get_menu_selection(nullptr, device->GetMenuItems(), 0, 0, device);
 
         // device-specific code may take some action here.  It may
         // return one of the core actions handled in the switch
@@ -1038,10 +1036,6 @@
     property_list(print_property, NULL);
     printf("\n");
 
-    char recovery_build[PROPERTY_VALUE_MAX];
-    property_get("ro.build.display.id", recovery_build, "");
-
-    ui->Print("%s\n", recovery_build);
     ui->Print("Supported API: %d\n", RECOVERY_API_VERSION);
 
     int status = INSTALL_SUCCESS;
diff --git a/screen_ui.cpp b/screen_ui.cpp
index 7679335..52f22c2 100644
--- a/screen_ui.cpp
+++ b/screen_ui.cpp
@@ -30,6 +30,8 @@
 
 #include <vector>
 
+#include "base/strings.h"
+#include "cutils/properties.h"
 #include "common.h"
 #include "device.h"
 #include "minui/minui.h"
@@ -66,7 +68,6 @@
     show_text_ever(false),
     menu(nullptr),
     show_menu(false),
-    menu_top(0),
     menu_items(0),
     menu_sel(0),
     animation_fps(20),
@@ -174,6 +175,9 @@
 
 void ScreenRecoveryUI::SetColor(UIElement e) {
     switch (e) {
+        case INFO:
+            gr_color(249, 194, 0, 255);
+            break;
         case HEADER:
             gr_color(247, 0, 6, 255);
             break;
@@ -188,7 +192,7 @@
             gr_color(255, 255, 255, 255);
             break;
         case LOG:
-            gr_color(249, 194, 0, 255);
+            gr_color(196, 196, 196, 255);
             break;
         case TEXT_FILL:
             gr_color(0, 0, 0, 160);
@@ -203,9 +207,31 @@
     SetColor(MENU);
     *y += 4;
     gr_fill(0, *y, gr_fb_width(), *y + 2);
-    *y += 8;
+    *y += 4;
 }
 
+void ScreenRecoveryUI::DrawTextLine(int* y, const char* line, bool bold) {
+    gr_text(4, *y, line, bold);
+    *y += char_height + 4;
+}
+
+void ScreenRecoveryUI::DrawTextLines(int* y, const char* const* lines) {
+    for (size_t i = 0; lines != nullptr && lines[i] != nullptr; ++i) {
+        DrawTextLine(y, lines[i], false);
+    }
+}
+
+static const char* REGULAR_HELP[] = {
+    "Use volume up/down and power.",
+    NULL
+};
+
+static const char* LONG_PRESS_HELP[] = {
+    "Any button cycles highlight.",
+    "Long-press activates.",
+    NULL
+};
+
 // Redraw everything on the screen.  Does not flip pages.
 // Should only be called with updateMutex locked.
 void ScreenRecoveryUI::draw_screen_locked() {
@@ -218,39 +244,49 @@
 
         int y = 0;
         if (show_menu) {
+            char recovery_fingerprint[PROPERTY_VALUE_MAX];
+            property_get("ro.bootimage.build.fingerprint", recovery_fingerprint, "");
+
+            SetColor(INFO);
+            DrawTextLine(&y, "Android Recovery", true);
+            for (auto& chunk : android::base::Split(recovery_fingerprint, ":")) {
+                DrawTextLine(&y, chunk.c_str(), false);
+            }
+            DrawTextLines(&y, HasThreeButtons() ? REGULAR_HELP : LONG_PRESS_HELP);
+
             SetColor(HEADER);
+            DrawTextLines(&y, menu_headers);
 
-            for (int i = 0; i < menu_top + menu_items; ++i) {
-                if (i == menu_top) DrawHorizontalRule(&y);
-
-                if (i == menu_top + menu_sel) {
-                    // draw the highlight bar
+            SetColor(MENU);
+            DrawHorizontalRule(&y);
+            y += 4;
+            for (int i = 0; i < menu_items; ++i) {
+                if (i == menu_sel) {
+                    // Draw the highlight bar.
                     SetColor(IsLongPress() ? MENU_SEL_BG_ACTIVE : MENU_SEL_BG);
-                    gr_fill(0, y-2, gr_fb_width(), y+char_height+2);
-                    // white text of selected item
+                    gr_fill(0, y - 2, gr_fb_width(), y + char_height + 2);
+                    // Bold white text for the selected item.
                     SetColor(MENU_SEL_FG);
-                    if (menu[i][0]) gr_text(4, y, menu[i], 1);
+                    gr_text(4, y, menu[i], true);
                     SetColor(MENU);
                 } else {
-                    if (menu[i][0]) gr_text(4, y, menu[i], i < menu_top);
+                    gr_text(4, y, menu[i], false);
                 }
-                y += char_height+4;
+                y += char_height + 4;
             }
-
             DrawHorizontalRule(&y);
         }
 
-        SetColor(LOG);
-
         // display from the bottom up, until we hit the top of the
         // screen, the bottom of the menu, or we've displayed the
         // entire text buffer.
+        SetColor(LOG);
         int row = (text_top+text_rows-1) % text_rows;
         size_t count = 0;
         for (int ty = gr_fb_height() - char_height;
              ty >= y && count < text_rows;
              ty -= char_height, ++count) {
-            gr_text(0, ty, text[row], 0);
+            gr_text(0, ty, text[row], false);
             --row;
             if (row < 0) row = text_rows-1;
         }
@@ -580,19 +616,13 @@
                                  int initial_selection) {
     pthread_mutex_lock(&updateMutex);
     if (text_rows > 0 && text_cols > 0) {
-        size_t i;
-        for (i = 0; i < text_rows; ++i) {
-            if (headers[i] == nullptr) break;
-            strncpy(menu[i], headers[i], text_cols-1);
+        menu_headers = headers;
+        size_t i = 0;
+        for (; i < text_rows && items[i] != nullptr; ++i) {
+            strncpy(menu[i], items[i], text_cols-1);
             menu[i][text_cols-1] = '\0';
         }
-        menu_top = i;
-        for (; i < text_rows; ++i) {
-            if (items[i-menu_top] == nullptr) break;
-            strncpy(menu[i], items[i-menu_top], text_cols-1);
-            menu[i][text_cols-1] = '\0';
-        }
-        menu_items = i - menu_top;
+        menu_items = i;
         show_menu = true;
         menu_sel = initial_selection;
         update_screen_locked();
diff --git a/screen_ui.h b/screen_ui.h
index 50a4564..d473b8e 100644
--- a/screen_ui.h
+++ b/screen_ui.h
@@ -61,7 +61,9 @@
 
     void Redraw();
 
-    enum UIElement { HEADER, MENU, MENU_SEL_BG, MENU_SEL_BG_ACTIVE, MENU_SEL_FG, LOG, TEXT_FILL };
+    enum UIElement {
+        HEADER, MENU, MENU_SEL_BG, MENU_SEL_BG_ACTIVE, MENU_SEL_FG, LOG, TEXT_FILL, INFO
+    };
     void SetColor(UIElement e);
 
   private:
@@ -95,8 +97,9 @@
     bool show_text_ever;   // has show_text ever been true?
 
     char** menu;
+    const char* const* menu_headers;
     bool show_menu;
-    int menu_top, menu_items, menu_sel;
+    int menu_items, menu_sel;
 
     pthread_t progress_thread_;
 
@@ -121,6 +124,8 @@
     void ClearText();
 
     void DrawHorizontalRule(int* y);
+    void DrawTextLine(int* y, const char* line, bool bold);
+    void DrawTextLines(int* y, const char* const* lines);
 
     void LoadBitmap(const char* filename, gr_surface* surface);
     void LoadBitmapArray(const char* filename, int* frames, gr_surface** surface);
