diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp
index a44b26ae56ec78d4a2102ddd35d006c28fc83675..f824e1bd2bafe45d4be11bcc3e109863cf6add1c 100644
--- a/Marlin/src/lcd/ultralcd.cpp
+++ b/Marlin/src/lcd/ultralcd.cpp
@@ -3745,24 +3745,36 @@ void kill_screen(const char* lcd_msg) {
      * "Print from SD" submenu
      *
      */
+
     #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE)
-      uint32_t saved_encoderPosition = 0;
-      static millis_t assume_print_finished = 0;
+      uint32_t last_sdfile_encoderPosition = 0xFFFF;
+
+      void lcd_reselect_last_file() {
+        if (last_sdfile_encoderPosition == 0xFFFF) return;
+        #if ENABLED(DOGLCD)
+          // Some of this is a hack to force the screen update to work.
+          // TODO: Fix the real issue that causes this!
+          lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT;
+          _lcd_synchronize();
+          safe_delay(50);
+          _lcd_synchronize();
+          lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT;
+          drawing_screen = screen_changed = true;
+        #endif
+
+        lcd_goto_screen(lcd_sdcard_menu, last_sdfile_encoderPosition);
+        defer_return_to_status = true;
+        last_sdfile_encoderPosition == 0xFFFF;
+
+        #if ENABLED(DOGLCD)
+          lcd_update();
+        #endif
+      }
     #endif
 
     void lcd_sdcard_menu() {
       ENCODER_DIRECTION_MENUS();
 
-      #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE)
-        if (ELAPSED(millis(), assume_print_finished)) { // if the printer has been busy printing, lcd_sdcard_menu() should not
-          lcdDrawUpdate = LCDVIEW_REDRAW_NOW;           // have been active for 5 seconds.  In this case, restore the previous
-          encoderPosition = saved_encoderPosition;      // encoderPosition to the last selected item.
-          assume_print_finished = millis() + 5000;
-        }
-        saved_encoderPosition = encoderPosition;
-        defer_return_to_status = true;
-      #endif
-
       const uint16_t fileCnt = card.getnrfilenames();
       START_MENU();
       MENU_BACK(MSG_MAIN);
@@ -4414,7 +4426,7 @@ void kill_screen(const char* lcd_msg) {
 
     void menu_action_sdfile(const char* filename, char* longFilename) {
       #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE)
-        saved_encoderPosition = encoderPosition;  // Save which file was selected for later use
+        last_sdfile_encoderPosition = encoderPosition;  // Save which file was selected for later use
       #endif
       UNUSED(longFilename);
       card.openAndPrintFile(filename);
@@ -4723,15 +4735,12 @@ void lcd_update() {
     uint16_t bbr2 = planner.block_buffer_runtime() >> 1;
 
     #if ENABLED(DOGLCD)
-      if ((lcdDrawUpdate || drawing_screen) && (!bbr2 || (bbr2 > max_display_update_time)
-      #if ENABLED(SDSUPPORT)
-        || (currentScreen == lcd_sdcard_menu)
-      #endif
-      ))
+      #define IS_DRAWING drawing_screen
     #else
-      if (lcdDrawUpdate && (!bbr2 || (bbr2 > max_display_update_time)))
+      #define IS_DRAWING false
     #endif
-    {
+
+    if ((lcdDrawUpdate || IS_DRAWING) && (!bbr2 || bbr2 > max_display_update_time)) {
       #if ENABLED(DOGLCD)
         if (!drawing_screen)
       #endif
@@ -4781,12 +4790,7 @@ void lcd_update() {
 
       // Return to Status Screen after a timeout
       if (currentScreen == lcd_status_screen || defer_return_to_status)
-        #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE)
-          if (currentScreen != lcd_sdcard_menu)                // lcd_sdcard_menu() does not time out if ENABLED(SD_REPRINT_LAST_SELECTED_FILE)
-            return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS;  // When the printer finishes a file, it will wait with the file selected for
-        #else                                                  // a re-print.
         return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS;
-        #endif
       else if (ELAPSED(ms, return_to_status_ms))
         lcd_return_to_status();
 
diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h
index ef9bc7c2b75db7fe9ea72955c75bbdfa8851f7b7..9d2474d1707e65e9e8fc989f05b14d8630412888 100644
--- a/Marlin/src/lcd/ultralcd.h
+++ b/Marlin/src/lcd/ultralcd.h
@@ -223,4 +223,8 @@ void lcd_reset_status();
   #define BUZZ(d,f) lcd_buzz(d, f)
 #endif
 
+#if ENABLED(SD_REPRINT_LAST_SELECTED_FILE)
+  void lcd_reselect_last_file();
+#endif
+
 #endif // ULTRALCD_H
diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp
index 3afb050b25289fa19b1ad8e682241021ff8bdce1..a8e518e3e54474af813e453538c960c2c8a17eef 100644
--- a/Marlin/src/sd/cardreader.cpp
+++ b/Marlin/src/sd/cardreader.cpp
@@ -892,15 +892,6 @@ uint16_t CardReader::get_num_Files() {
   ;
 }
 
-#if ENABLED(SD_REPRINT_LAST_SELECTED_FILE)
-  typedef void (*screenFunc_t)();
-  extern void lcd_sdcard_menu();
-  extern void lcd_goto_screen(screenFunc_t screen, const uint32_t encoder = 0);
-  extern uint32_t saved_encoderPosition;
-  extern bool screen_changed, drawing_screen, defer_return_to_status;
-  void _lcd_synchronize();  // Not declared in any LCD header file.  Probably, that should be changed.
-#endif
-
 void CardReader::printingHasFinished() {
   stepper.synchronize();
   file.close();
@@ -922,15 +913,7 @@ void CardReader::printingHasFinished() {
     #endif
 
     #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE)
-      lcdDrawUpdate  = LCDVIEW_CALL_REDRAW_NEXT;
-      _lcd_synchronize();
-      safe_delay(50);
-      _lcd_synchronize();
-      lcdDrawUpdate  = LCDVIEW_CALL_REDRAW_NEXT;
-      drawing_screen = screen_changed = true;
-      lcd_goto_screen(lcd_sdcard_menu, saved_encoderPosition);
-      defer_return_to_status = true;
-      lcd_update();
+      lcd_reselect_last_file();
     #endif
   }
 }