diff --git a/screen_ui.cpp b/screen_ui.cpp
index 378a451..d9574d8 100644
--- a/screen_ui.cpp
+++ b/screen_ui.cpp
@@ -177,9 +177,8 @@
   }
 }
 
-// Draws the animation and progress bar (if any) on the screen.
-// Does not flip pages.
-// Should only be called with updateMutex locked.
+// Draws the animation and progress bar (if any) on the screen. Does not flip pages. Should only be
+// called with updateMutex locked.
 void ScreenRecoveryUI::draw_foreground_locked() {
   if (currentIcon != NONE) {
     GRSurface* frame = GetCurrentFrame();
@@ -257,26 +256,26 @@
   }
 }
 
-void ScreenRecoveryUI::DrawHorizontalRule(int* y) const {
-  SetColor(MENU);
-  *y += 4;
-  gr_fill(0, *y, gr_fb_width(), *y + 2);
-  *y += 4;
+int ScreenRecoveryUI::DrawHorizontalRule(int y) const {
+  gr_fill(0, y + 4, gr_fb_width(), y + 6);
+  return 8;
 }
 
 void ScreenRecoveryUI::DrawHighlightBar(int x, int y, int width, int height) const {
   gr_fill(x, y, x + width, y + height);
 }
 
-void ScreenRecoveryUI::DrawTextLine(int x, int* y, const char* line, bool bold) const {
-  gr_text(gr_sys_font(), x, *y, line, bold);
-  *y += char_height_ + 4;
+int ScreenRecoveryUI::DrawTextLine(int x, int y, const char* line, bool bold) const {
+  gr_text(gr_sys_font(), x, y, line, bold);
+  return char_height_ + 4;
 }
 
-void ScreenRecoveryUI::DrawTextLines(int x, int* y, const char* const* lines) const {
+int ScreenRecoveryUI::DrawTextLines(int x, int y, const char* const* lines) const {
+  int offset = 0;
   for (size_t i = 0; lines != nullptr && lines[i] != nullptr; ++i) {
-    DrawTextLine(x, y, lines[i], false);
+    offset += DrawTextLine(x, y + offset, lines[i], false);
   }
+  return offset;
 }
 
 static const char* REGULAR_HELP[] = {
@@ -310,18 +309,17 @@
         android::base::GetProperty("ro.bootimage.build.fingerprint", "");
 
     SetColor(INFO);
-    DrawTextLine(x, &y, "Android Recovery", true);
+    y += DrawTextLine(x, y, "Android Recovery", true);
     for (const auto& chunk : android::base::Split(recovery_fingerprint, ":")) {
-      DrawTextLine(x, &y, chunk.c_str(), false);
+      y += DrawTextLine(x, y, chunk.c_str(), false);
     }
-    DrawTextLines(x, &y, HasThreeButtons() ? REGULAR_HELP : LONG_PRESS_HELP);
+    y += DrawTextLines(x, y, HasThreeButtons() ? REGULAR_HELP : LONG_PRESS_HELP);
 
     SetColor(HEADER);
-    DrawTextLines(x, &y, menu_headers_);
+    y += DrawTextLines(x, y, menu_headers_);
 
     SetColor(MENU);
-    DrawHorizontalRule(&y);
-    y += 4;
+    y += DrawHorizontalRule(y) + 4;
     for (int i = 0; i < menu_items; ++i) {
       if (i == menu_sel) {
         // Draw the highlight bar.
@@ -329,13 +327,13 @@
         DrawHighlightBar(0, y - 2, gr_fb_width(), char_height_ + 4);
         // Bold white text for the selected item.
         SetColor(MENU_SEL_FG);
-        DrawTextLine(x, &y, menu_[i], true);
+        y += DrawTextLine(x, y, menu_[i], true);
         SetColor(MENU);
       } else {
-        DrawTextLine(x, &y, menu_[i], false);
+        y += DrawTextLine(x, y, menu_[i], false);
       }
     }
-    DrawHorizontalRule(&y);
+    y += DrawHorizontalRule(y);
   }
 
   // Display from the bottom up, until we hit the top of the screen, the bottom of the menu, or
@@ -345,8 +343,7 @@
   size_t count = 0;
   for (int ty = gr_fb_height() - kMarginHeight - char_height_; ty >= y && count < text_rows_;
        ty -= char_height_, ++count) {
-    int temp_y = ty;
-    DrawTextLine(x, &temp_y, text_[row], false);
+    DrawTextLine(x, ty, text_[row], false);
     --row;
     if (row < 0) row = text_rows_ - 1;
   }
diff --git a/screen_ui.h b/screen_ui.h
index e8d3c32..8402fac 100644
--- a/screen_ui.h
+++ b/screen_ui.h
@@ -179,10 +179,14 @@
   virtual int GetProgressBaseline() const;
   virtual int GetTextBaseline() const;
 
-  virtual void DrawHorizontalRule(int* y) const;
+  // Draws a highlight bar at (x, y) - (x + width, y + height).
   virtual void DrawHighlightBar(int x, int y, int width, int height) const;
-  virtual void DrawTextLine(int x, int* y, const char* line, bool bold) const;
-  void DrawTextLines(int x, int* y, const char* const* lines) const;
+  // Draws a horizontal rule at Y. Returns the offset it should be moving along Y-axis.
+  virtual int DrawHorizontalRule(int y) const;
+  // Draws a line of text. Returns the offset it should be moving along Y-axis.
+  virtual int DrawTextLine(int x, int y, const char* line, bool bold) const;
+  // Draws multiple text lines. Returns the offset it should be moving along Y-axis.
+  int DrawTextLines(int x, int y, const char* const* lines) const;
 };
 
 #endif  // RECOVERY_UI_H
diff --git a/vr_ui.cpp b/vr_ui.cpp
index 8b8261e..1251672 100644
--- a/vr_ui.cpp
+++ b/vr_ui.cpp
@@ -27,9 +27,9 @@
   return true;
 }
 
-void VrRecoveryUI::DrawTextLine(int x, int* y, const char* line, bool bold) const {
+int VrRecoveryUI::DrawTextLine(int x, int y, const char* line, bool bold) const {
   int mid_divide = gr_fb_width() / 2;
-  gr_text(gr_sys_font(), x + kStereoOffset, *y, line, bold);
-  gr_text(gr_sys_font(), x - kStereoOffset + mid_divide, *y, line, bold);
-  *y += char_height_ + 4;
+  gr_text(gr_sys_font(), x + kStereoOffset, y, line, bold);
+  gr_text(gr_sys_font(), x - kStereoOffset + mid_divide, y, line, bold);
+  return char_height_ + 4;
 }
diff --git a/vr_ui.h b/vr_ui.h
index da21634..d996c14 100644
--- a/vr_ui.h
+++ b/vr_ui.h
@@ -30,7 +30,7 @@
 
   bool InitTextParams() override;
 
-  void DrawTextLine(int x, int* y, const char* line, bool bold) const override;
+  int DrawTextLine(int x, int y, const char* line, bool bold) const override;
 };
 
 #endif  // RECOVERY_VR_UI_H
diff --git a/wear_ui.cpp b/wear_ui.cpp
index a29746c..18c30d3 100644
--- a/wear_ui.cpp
+++ b/wear_ui.cpp
@@ -95,7 +95,7 @@
   }
 }
 
-static const char* HEADERS[] = {
+static const char* SWIPE_HELP[] = {
   "Swipe up/down to move.",
   "Swipe left/right to select.",
   "",
@@ -119,15 +119,15 @@
       std::string recovery_fingerprint =
           android::base::GetProperty("ro.bootimage.build.fingerprint", "");
       SetColor(HEADER);
-      DrawTextLine(x + 4, &y, "Android Recovery", true);
+      y += DrawTextLine(x + 4, y, "Android Recovery", true);
       for (auto& chunk : android::base::Split(recovery_fingerprint, ":")) {
-        DrawTextLine(x + 4, &y, chunk.c_str(), false);
+        y += DrawTextLine(x + 4, y, chunk.c_str(), false);
       }
 
       // This is actually the help strings.
-      DrawTextLines(x + 4, &y, HEADERS);
+      y += DrawTextLines(x + 4, y, SWIPE_HELP);
       SetColor(HEADER);
-      DrawTextLines(x + 4, &y, menu_headers_);
+      y += DrawTextLines(x + 4, y, menu_headers_);
 
       // Show the current menu item number in relation to total number if
       // items don't fit on the screen.
