diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index de59e34a76..ba2fedde1b 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/Max7219_Debug_LEDs.cpp b/Marlin/Max7219_Debug_LEDs.cpp
index d6110053f3..2eb8773fde 100644
--- a/Marlin/Max7219_Debug_LEDs.cpp
+++ b/Marlin/Max7219_Debug_LEDs.cpp
@@ -39,12 +39,14 @@
  * void Max7219_init();
  * void Max7219_PutByte(uint8_t data);
  * void Max7219(uint8_t reg, uint8_t data);
- * void Max7219_LED_On(uint8_t row, uint8_t col);
- * void Max7219_LED_Off(uint8_t row, uint8_t col);
- * void Max7219_LED_Toggle(uint8_t row, uint8_t col);
+ * void Max7219_LED_On(uint8_t col, uint8_t row);
+ * void Max7219_LED_Off(uint8_t col, uint8_t row);
+ * void Max7219_LED_Toggle(uint8_t col, uint8_t row);
  * void Max7219_Clear_Row(uint8_t row);
  * void Max7219_Clear_Column(uint8_t col);
  * void Max7219_Set_Row(uint8_t row, uint8_t val);
+ * void Max7219_Set_2_Rows(uint8_t row, uint16_t val);
+ * void Max7219_Set_4_Rows(uint8_t row, uint32_t val);
  * void Max7219_Set_Column(uint8_t col, uint8_t val);
  * void Max7219_idle_tasks();
  */
@@ -53,184 +55,340 @@
 
 #if ENABLED(MAX7219_DEBUG)
 
-  #include "Marlin.h"
-  #include "planner.h"
-  #include "stepper.h"
-  #include "Max7219_Debug_LEDs.h"
+#include "Max7219_Debug_LEDs.h"
 
-  static uint8_t LEDs[8] = { 0 };
+#include "planner.h"
+#include "stepper.h"
+#include "Marlin.h"
 
-  void Max7219_PutByte(uint8_t data) {
-    for (uint8_t i = 8; i--;) {
+static uint8_t LEDs[8] = { 0 };
+
+void Max7219_PutByte(uint8_t data) {
+  CRITICAL_SECTION_START
+  for (uint8_t i = 8; i--;) {
+    #ifdef CPU_32_BIT                    // The 32-bit processors are so fast, a small delay in the code is needed
+      delayMicroseconds(5);              // to let the signal wires stabilize.
+      WRITE(MAX7219_CLK_PIN, LOW);       // tick
+      delayMicroseconds(5);
+      WRITE(MAX7219_DIN_PIN, (data & 0x80) ? HIGH : LOW);  // send 1 or 0 based on data bit
+      delayMicroseconds(5);
+      WRITE(MAX7219_CLK_PIN, HIGH);      // tock
+      delayMicroseconds(5);
+    #else
       WRITE(MAX7219_CLK_PIN, LOW);       // tick
       WRITE(MAX7219_DIN_PIN, (data & 0x80) ? HIGH : LOW);  // send 1 or 0 based on data bit
       WRITE(MAX7219_CLK_PIN, HIGH);      // tock
-      data <<= 1;
-    }
-  }
+    #endif
 
-  void Max7219(const uint8_t reg, const uint8_t data) {
-    WRITE(MAX7219_LOAD_PIN, LOW);  // begin
-    Max7219_PutByte(reg);          // specify register
-    Max7219_PutByte(data);         // put data
-    WRITE(MAX7219_LOAD_PIN, LOW);  // and tell the chip to load the data
-    WRITE(MAX7219_LOAD_PIN, HIGH);
+    data <<= 1;
   }
+  CRITICAL_SECTION_END
+}
 
-  void Max7219_LED_Set(const uint8_t row, const uint8_t col, const bool on) {
-    if (row > 7 || col > 7) return;
-    if (TEST(LEDs[row], col) == on) return; // if LED is already on/off, leave alone
-    if (on) SBI(LEDs[row], col); else CBI(LEDs[row], col);
-    Max7219(8 - row, LEDs[row]);
+void Max7219(const uint8_t reg, const uint8_t data) {
+  #ifdef CPU_32_BIT
+    delayMicroseconds(5);
+  #endif
+  CRITICAL_SECTION_START
+  WRITE(MAX7219_LOAD_PIN, LOW);  // begin
+  #ifdef CPU_32_BIT              // The 32-bit processors are so fast, a small delay in the code is needed
+    delayMicroseconds(5);        // to let the signal wires stabilize.
+  #endif
+  Max7219_PutByte(reg);          // specify register
+  #ifdef CPU_32_BIT
+    delayMicroseconds(5);
+  #endif
+  Max7219_PutByte(data);         // put data
+  #ifdef CPU_32_BIT
+    delayMicroseconds(5);
+  #endif
+  WRITE(MAX7219_LOAD_PIN, LOW);  // and tell the chip to load the data
+  #ifdef CPU_32_BIT
+    delayMicroseconds(5);
+  #endif
+  WRITE(MAX7219_LOAD_PIN, HIGH);
+  CRITICAL_SECTION_END
+  #ifdef CPU_32_BIT
+    delayMicroseconds(5);
+  #endif
+}
+
+void Max7219_LED_Set(const uint8_t row, const uint8_t col, const bool on) {
+  if (row > 7 || col > 7) {
+    int r,c;
+    r = row;
+    c = col;
+    SERIAL_ECHOPAIR("??? Max7219_LED_Set(",r);
+    SERIAL_ECHOPAIR(",",c);
+    SERIAL_ECHO(")\n");
+    return;
   }
+  if (TEST(LEDs[row], col) == on) return; // if LED is already on/off, leave alone
+  if (on) SBI(LEDs[row], col); else CBI(LEDs[row], col);
+  Max7219(8 - row, LEDs[row]);
+}
 
-  void Max7219_LED_On(const uint8_t row, const uint8_t col) {
-    Max7219_LED_Set(row, col, true);
+void Max7219_LED_On(const uint8_t col, const uint8_t row) {
+  if (row > 7 || col > 7) {
+    int r,c;
+    r = row;
+    c = col;
+    SERIAL_ECHOPAIR("??? Max7219_LED_On(",c);
+    SERIAL_ECHOPAIR(",",r);
+    SERIAL_ECHO(")\n");
+    return;
   }
+  Max7219_LED_Set(col, row, true);
+}
 
-  void Max7219_LED_Off(const uint8_t row, const uint8_t col) {
-    Max7219_LED_Set(row, col, false);
+void Max7219_LED_Off(const uint8_t col, const uint8_t row) {
+  if (row > 7 || col > 7) {
+    int r,c;
+    r = row;
+    c = col;
+    SERIAL_ECHOPAIR("??? Max7219_LED_Off(",r);
+    SERIAL_ECHOPAIR(",",c);
+    SERIAL_ECHO(")\n");
+    return;
   }
+  Max7219_LED_Set(col, row, false);
+}
 
-  void Max7219_LED_Toggle(const uint8_t row, const uint8_t col) {
-    if (row > 7 || col > 7) return;
-    if (TEST(LEDs[row], col))
-      Max7219_LED_Off(row, col);
+void Max7219_LED_Toggle(const uint8_t col, const uint8_t row) {
+  if (row > 7 || col > 7) {
+    int r,c;
+    r = row;
+    c = col;
+    SERIAL_ECHOPAIR("??? Max7219_LED_Toggle(",r);
+    SERIAL_ECHOPAIR(",",c);
+    SERIAL_ECHO(")\n");
+    return;
+  }
+  if (TEST(LEDs[row], col))
+    Max7219_LED_Off(col, row);
+  else
+    Max7219_LED_On(col, row);
+}
+
+void Max7219_Clear_Column(const uint8_t col) {
+  if (col > 7) {
+    int c;
+    c = col;
+    SERIAL_ECHOPAIR("??? Max7219_Clear_Column(",c);
+    SERIAL_ECHO(")\n");
+    return;
+  }
+  LEDs[col] = 0;
+  Max7219(8 - col, LEDs[col]);
+}
+
+void Max7219_Clear_Row(const uint8_t row) {
+  if (row > 7) {
+    int r;
+    r = row;
+    SERIAL_ECHOPAIR("??? Max7219_Clear_Row(",r);
+    SERIAL_ECHO(")\n");
+    return;
+  }
+  for (uint8_t c = 0; c <= 7; c++)
+    Max7219_LED_Off(c, row);
+}
+
+void Max7219_Set_Row(const uint8_t row, const uint8_t val) {
+  if (row > 7 || val>255) {
+    int r, v;
+    r = row;
+    v = val;
+    SERIAL_ECHOPAIR("??? Max7219_Set_Row(",r);
+    SERIAL_ECHOPAIR(",",v);
+    SERIAL_ECHO(")\n");
+    return;
+  }
+  for (uint8_t b = 0; b <= 7; b++)
+    if (TEST(val, b))
+      Max7219_LED_On(7 - b, row);
     else
-      Max7219_LED_On(row, col);
+      Max7219_LED_Off(7 - b, row);
+}
+
+void Max7219_Set_2_Rows(const uint8_t row, const uint16_t val) {
+  if (row > 6 || val>65535) {
+    int r, v;
+    r = row;
+    v = val;
+    SERIAL_ECHOPAIR("??? Max7219_Set_2_Rows(",r);
+    SERIAL_ECHOPAIR(",",v);
+    SERIAL_ECHO(")\n");
+    return;
+  }
+  Max7219_Set_Row(row+1, (val & 0xff00) >> 8 );
+  Max7219_Set_Row(row+0, (val & 0xff));
+}
+
+void Max7219_Set_4_Rows(const uint8_t row, const uint32_t val) {
+  if (row > 4 ) {
+    int r;
+    long v;
+    r = row;
+    v = val;
+    SERIAL_ECHOPAIR("??? Max7219_Set_4_Rows(",r);
+    SERIAL_ECHOPAIR(",",v);
+    SERIAL_ECHO(")\n");
+    return;
+  }
+  Max7219_Set_Row(row+3, (val & 0xff000000) >> 24);
+  Max7219_Set_Row(row+2, (val & 0xff0000) >> 16);
+  Max7219_Set_Row(row+1, (val & 0xff00) >> 8);
+  Max7219_Set_Row(row+0, (val & 0xff));
+}
+
+void Max7219_Set_Column(const uint8_t col, const uint8_t val) {
+  if (val > 255 || col > 7) {
+    int v,c;
+    v = val;
+    c = col;
+    SERIAL_ECHOPAIR("??? Max7219_Column(",c);
+    SERIAL_ECHOPAIR(",",v);
+    SERIAL_ECHO(")\n");
+    return;
+  }
+  LEDs[col] = val;
+  Max7219(8 - col, LEDs[col]);
+}
+
+void Max7219_init() {
+  uint8_t i, x, y;
+
+  SET_OUTPUT(MAX7219_DIN_PIN);
+  SET_OUTPUT(MAX7219_CLK_PIN);
+
+  OUT_WRITE(MAX7219_LOAD_PIN, HIGH);
+  delay(1);
+
+  //initiation of the max 7219
+  Max7219(max7219_reg_scanLimit, 0x07);
+  Max7219(max7219_reg_decodeMode, 0x00);  // using an led matrix (not digits)
+  Max7219(max7219_reg_shutdown, 0x01);    // not in shutdown mode
+  Max7219(max7219_reg_displayTest, 0x00); // no display test
+  Max7219(max7219_reg_intensity, 0x01 & 0x0F); // the first 0x0F is the value you can set
+                                               // range: 0x00 to 0x0F
+  for (i = 0; i <= 7; i++) {      // empty registers, turn all LEDs off
+    LEDs[i] = 0x00;
+    Max7219(i + 1, 0);
   }
 
-  void Max7219_Clear_Column(const uint8_t col) {
-    if (col > 7) return;
-    LEDs[col] = 0;
-    Max7219(8 - col, LEDs[col]);
-  }
-
-  void Max7219_Clear_Row(const uint8_t row) {
-    if (row > 7) return;
-    for (uint8_t c = 0; c <= 7; c++)
-      Max7219_LED_Off(c, row);
-  }
-
-  void Max7219_Set_Row(const uint8_t row, const uint8_t val) {
-    if (row > 7) return;
-    for (uint8_t b = 0; b <= 7; b++)
-      if (TEST(val, b))
-        Max7219_LED_On(7 - b, row);
-      else
-        Max7219_LED_Off(7 - b, row);
-  }
-
-  void Max7219_Set_Column(const uint8_t col, const uint8_t val) {
-    if (col > 7) return;
-    LEDs[col] = val;
-    Max7219(8 - col, LEDs[col]);
-  }
-
-  void Max7219_init() {
-    uint8_t i, x, y;
-
-    SET_OUTPUT(MAX7219_DIN_PIN);
-    SET_OUTPUT(MAX7219_CLK_PIN);
-
-    OUT_WRITE(MAX7219_LOAD_PIN, HIGH);
-
-    //initiation of the max 7219
-    Max7219(max7219_reg_scanLimit, 0x07);
-    Max7219(max7219_reg_decodeMode, 0x00);  // using an led matrix (not digits)
-    Max7219(max7219_reg_shutdown, 0x01);    // not in shutdown mode
-    Max7219(max7219_reg_displayTest, 0x00); // no display test
-    Max7219(max7219_reg_intensity, 0x01 & 0x0F); // the first 0x0F is the value you can set
-                                                 // range: 0x00 to 0x0F
-    for (i = 0; i <= 7; i++) {      // empty registers, turn all LEDs off
-      LEDs[i] = 0x00;
-      Max7219(i + 1, 0);
+  for (x = 0; x <= 7; x++)        // Do an aesthetically pleasing pattern to fully test
+    for (y = 0; y <= 7; y++) {    // the Max7219 module and LEDs. First, turn them
+      Max7219_LED_On(x, y);       // all on.
+      delay(3);
     }
 
-    for (x = 0; x <= 7; x++)        // Do an aesthetically pleasing pattern to fully test
-      for (y = 0; y <= 7; y++) {    // the Max7219 module and LEDs. First, turn them
-        Max7219_LED_On(x, y);       // all on.
-        delay(3);
-      }
+  for (x = 0; x <= 7; x++)        // Now, turn them all off.
+    for (y = 0; y <= 7; y++) {
+      Max7219_LED_Off(x, y);
+      delay(3);                   // delay() is OK here. Max7219_init() is only called from
+    }                             // setup() and nothing is running yet.
 
-    for (x = 0; x <= 7; x++)        // Now, turn them all off.
-      for (y = 0; y <= 7; y++) {
-        Max7219_LED_Off(x, y);
-        delay(3);                   // delay() is OK here. Max7219_init() is only called from
-      }                             // setup() and nothing is running yet.
+  delay(150);
 
-    delay(150);
+  for (x = 8; x--;)               // Now, do the same thing from the opposite direction
+    for (y = 0; y <= 7; y++) {
+      Max7219_LED_On(x, y);
+      delay(2);
+    }
 
-    for (x = 8; x--;)               // Now, do the same thing from the opposite direction
-      for (y = 0; y <= 7; y++) {
-        Max7219_LED_On(x, y);
-        delay(2);
-      }
-
-    for (x = 8; x--;)
-      for (y = 0; y <= 7; y++) {
-        Max7219_LED_Off(x, y);
-        delay(2);
-      }
-  }
+  for (x = 8; x--;)
+    for (y = 0; y <= 7; y++) {
+      Max7219_LED_Off(x, y);
+      delay(2);
+    }
+}
 
 /**
- * These are sample debug features to demonstrate the usage of the 8x8 LED Matrix for debug purposes.
- * There is very little CPU burden added to the system by displaying information within the idle()
- * task.
- *
- * But with that said, if your debugging can be facilitated by making calls into the library from
- * other places in the code, feel free to do it.  The CPU burden for a few calls to toggle an LED
- * or clear a row is not very significant.
- */
-  void Max7219_idle_tasks() {
-    #if ENABLED(MAX7219_DEBUG_PRINTER_ALIVE)
-      static int debug_cnt = 0;
-      if (debug_cnt++ > 100) {
+* These are sample debug features to demonstrate the usage of the 8x8 LED Matrix for debug purposes.
+* There is very little CPU burden added to the system by displaying information within the idle()
+* task.
+*
+* But with that said, if your debugging can be facilitated by making calls into the library from
+* other places in the code, feel free to do it.  The CPU burden for a few calls to toggle an LED
+* or clear a row is not very significant.
+*/
+void Max7219_idle_tasks() {
+#if MAX7219_DEBUG_STEPPER_HEAD || MAX7219_DEBUG_STEPPER_TAIL || MAX7219_DEBUG_STEPPER_QUEUE
+  CRITICAL_SECTION_START
+  #if MAX7219_DEBUG_STEPPER_HEAD || MAX7219_DEBUG_STEPPER_QUEUE
+    uint8_t head;
+    head = planner.block_buffer_head;
+  #endif
+  #if MAX7219_DEBUG_STEPPER_TAIL || MAX7219_DEBUG_STEPPER_QUEUE
+    uint8_t tail;
+    tail = planner.block_buffer_tail;
+  #endif
+  CRITICAL_SECTION_END
+#endif
+
+  #if ENABLED(MAX7219_DEBUG_PRINTER_ALIVE)
+    static millis_t next_blink = 0;
+
+    if (ELAPSED(millis(), next_blink)) {
         Max7219_LED_Toggle(7, 7);
-        debug_cnt = 0;
-      }
-    #endif
+        next_blink = millis() + 750;
+    }
+  #endif
 
-    #ifdef MAX7219_DEBUG_STEPPER_HEAD
-      Max7219_Clear_Row(MAX7219_DEBUG_STEPPER_HEAD);
-      Max7219_Clear_Row(MAX7219_DEBUG_STEPPER_HEAD + 1);
-      if ( planner.block_buffer_head < 8)
-        Max7219_LED_On( planner.block_buffer_head, MAX7219_DEBUG_STEPPER_HEAD);
+  #ifdef MAX7219_DEBUG_STEPPER_HEAD
+    static int16_t last_head_cnt=0;
+    if (last_head_cnt != head) {
+      if ( last_head_cnt < 8)
+        Max7219_LED_Off( last_head_cnt, MAX7219_DEBUG_STEPPER_HEAD);
       else
-        Max7219_LED_On( planner.block_buffer_head-8, MAX7219_DEBUG_STEPPER_HEAD+1);
-    #endif
+        Max7219_LED_Off( last_head_cnt-8, MAX7219_DEBUG_STEPPER_HEAD+1);
 
-    #ifdef MAX7219_DEBUG_STEPPER_TAIL
-      Max7219_Clear_Row(MAX7219_DEBUG_STEPPER_TAIL);
-      Max7219_Clear_Row(MAX7219_DEBUG_STEPPER_TAIL + 1);
-      if ( planner.block_buffer_tail < 8)
-        Max7219_LED_On( planner.block_buffer_tail, MAX7219_DEBUG_STEPPER_TAIL );
+      last_head_cnt = head;
+      if ( head < 8)
+        Max7219_LED_On(head, MAX7219_DEBUG_STEPPER_HEAD);
       else
-        Max7219_LED_On( planner.block_buffer_tail-8, MAX7219_DEBUG_STEPPER_TAIL+1 );
-    #endif
+        Max7219_LED_On(head-8, MAX7219_DEBUG_STEPPER_HEAD+1);
+    }
+  #endif
 
-    #ifdef MAX7219_DEBUG_STEPPER_QUEUE
-      static int16_t last_depth = 0;
-      int16_t current_depth = planner.block_buffer_head - planner.block_buffer_tail;
-      if (current_depth != last_depth) {  // usually, no update will be needed.
-        if (current_depth < 0) current_depth += BLOCK_BUFFER_SIZE;
-        NOMORE(current_depth, BLOCK_BUFFER_SIZE);
-        NOMORE(current_depth, 16);        // if the BLOCK_BUFFER_SIZE is greater than 16, two lines
-                                          // of LEDs is enough to see if the buffer is draining
+  #ifdef MAX7219_DEBUG_STEPPER_TAIL
+    static int16_t last_tail_cnt=0;
+    if (last_tail_cnt != tail) {
+      if ( last_tail_cnt < 8)
+        Max7219_LED_Off( last_tail_cnt, MAX7219_DEBUG_STEPPER_TAIL);
+      else
+        Max7219_LED_Off( last_tail_cnt-8, MAX7219_DEBUG_STEPPER_TAIL+1);
 
-        const uint8_t st = min(current_depth, last_depth),
-                      en = max(current_depth, last_depth);
-        if (current_depth < last_depth)
-          for (uint8_t i = st; i <= en; i++)   // clear the highest order LEDs
-            Max7219_LED_Off(i >> 1, MAX7219_DEBUG_STEPPER_QUEUE + (i & 1));
-        else
-          for (uint8_t i = st; i <= en; i++)   // set the highest order LEDs
-            Max7219_LED_On(i >> 1, MAX7219_DEBUG_STEPPER_QUEUE + (i & 1));
+      last_tail_cnt = tail;
+      if ( tail < 8)
+        Max7219_LED_On(tail, MAX7219_DEBUG_STEPPER_TAIL);
+      else
+        Max7219_LED_On(tail-8, MAX7219_DEBUG_STEPPER_TAIL+1);
+    }
+  #endif
 
-        last_depth = current_depth;
-      }
-    #endif
-  }
+  #ifdef MAX7219_DEBUG_STEPPER_QUEUE
+    static int16_t last_depth = 0;
+    int16_t current_depth = head - tail;
+    if (current_depth != last_depth) {  // usually, no update will be needed.
+      if (current_depth < 0) current_depth += BLOCK_BUFFER_SIZE;
+      NOMORE(current_depth, BLOCK_BUFFER_SIZE);
+      NOMORE(current_depth, 16);        // if the BLOCK_BUFFER_SIZE is greater than 16, two lines
+                                        // of LEDs is enough to see if the buffer is draining
+
+      const uint8_t st = min(current_depth, last_depth),
+                    en = max(current_depth, last_depth);
+      if (current_depth < last_depth)
+        for (uint8_t i = st; i <= en; i++)   // clear the highest order LEDs
+            Max7219_LED_Off(i/2, MAX7219_DEBUG_STEPPER_QUEUE + (i & 1));
+      else
+          for (uint8_t i = st; i <= en; i++)   // set the LEDs to current depth
+            Max7219_LED_On(i/2, MAX7219_DEBUG_STEPPER_QUEUE + (i & 1));
+
+      last_depth = current_depth;
+    }
+  #endif
+}
 
 #endif // MAX7219_DEBUG
diff --git a/Marlin/Max7219_Debug_LEDs.h b/Marlin/Max7219_Debug_LEDs.h
index 71a5124e39..3beccb0ea8 100644
--- a/Marlin/Max7219_Debug_LEDs.h
+++ b/Marlin/Max7219_Debug_LEDs.h
@@ -40,12 +40,14 @@
  * void Max7219_PutByte(uint8_t data);
  * void Max7219(uint8_t reg, uint8_t data);
  * void Max7219_LED_Set(uint8_t row, uint8_t col, bool on);
- * void Max7219_LED_On(uint8_t row, uint8_t col);
- * void Max7219_LED_Off(uint8_t row, uint8_t col);
+ * void Max7219_LED_On(uint8_t col, uint8_t row);
+ * void Max7219_LED_Off(uint8_t col, uint8_t row);
  * void Max7219_LED_Toggle(uint8_t row, uint8_t col);
  * void Max7219_Clear_Row(uint8_t row);
  * void Max7219_Clear_Column(uint8_t col);
  * void Max7219_Set_Row(uint8_t row, uint8_t val);
+ * void Max7219_Set_2_Rows(uint8_t row, uint16_t val);
+ * void Max7219_Set_4_Rows(uint8_t row, uint32_t val);
  * void Max7219_Set_Column(uint8_t col, uint8_t val);
  * void Max7219_idle_tasks();
  */
@@ -53,36 +55,36 @@
 #ifndef __MAX7219_DEBUG_LEDS_H__
 #define __MAX7219_DEBUG_LEDS_H__
 
-  //
-  // define max7219 registers
-  //
-  #define max7219_reg_noop        0x00
-  #define max7219_reg_digit0      0x01
-  #define max7219_reg_digit1      0x02
-  #define max7219_reg_digit2      0x03
-  #define max7219_reg_digit3      0x04
-  #define max7219_reg_digit4      0x05
-  #define max7219_reg_digit5      0x06
-  #define max7219_reg_digit6      0x07
-  #define max7219_reg_digit7      0x08
+//
+// define max7219 registers
+//
+#define max7219_reg_noop        0x00
+#define max7219_reg_digit0      0x01
+#define max7219_reg_digit1      0x02
+#define max7219_reg_digit2      0x03
+#define max7219_reg_digit3      0x04
+#define max7219_reg_digit4      0x05
+#define max7219_reg_digit5      0x06
+#define max7219_reg_digit6      0x07
+#define max7219_reg_digit7      0x08
 
-  #define max7219_reg_intensity   0x0A
-  #define max7219_reg_displayTest 0x0F
-  #define max7219_reg_decodeMode  0x09
-  #define max7219_reg_scanLimit   0x0B
-  #define max7219_reg_shutdown    0x0C
+#define max7219_reg_intensity   0x0A
+#define max7219_reg_displayTest 0x0F
+#define max7219_reg_decodeMode  0x09
+#define max7219_reg_scanLimit   0x0B
+#define max7219_reg_shutdown    0x0C
 
-  void Max7219_init();
-  void Max7219_PutByte(uint8_t data);
-  void Max7219(const uint8_t reg, const uint8_t data);
-  void Max7219_LED_Set(const uint8_t row, const uint8_t col, const bool on);
-  void Max7219_LED_On(const uint8_t row, const uint8_t col);
-  void Max7219_LED_Off(const uint8_t row, const uint8_t col);
-  void Max7219_LED_Toggle(const uint8_t row, const uint8_t col);
-  void Max7219_Clear_Row(const uint8_t row);
-  void Max7219_Clear_Column(const uint8_t col);
-  void Max7219_Set_Row(const uint8_t row, const uint8_t val);
-  void Max7219_Set_Column(const uint8_t col, const uint8_t val);
-  void Max7219_idle_tasks();
+void Max7219_init();
+void Max7219_PutByte(uint8_t data);
+void Max7219(const uint8_t reg, const uint8_t data);
+void Max7219_LED_Set(const uint8_t row, const uint8_t col, const bool on);
+void Max7219_LED_On(const uint8_t row, const uint8_t col);
+void Max7219_LED_Off(const uint8_t row, const uint8_t col);
+void Max7219_LED_Toggle(const uint8_t row, const uint8_t col);
+void Max7219_Clear_Row(const uint8_t row);
+void Max7219_Clear_Column(const uint8_t col);
+void Max7219_Set_Row(const uint8_t row, const uint8_t val);
+void Max7219_Set_Column(const uint8_t col, const uint8_t val);
+void Max7219_idle_tasks();
 
 #endif // __MAX7219_DEBUG_LEDS_H__
diff --git a/Marlin/cardreader.cpp b/Marlin/cardreader.cpp
index 89147d97b6..7e5f93e36a 100644
--- a/Marlin/cardreader.cpp
+++ b/Marlin/cardreader.cpp
@@ -860,6 +860,15 @@ void CardReader::updir() {
 
 #endif // SDCARD_SORT_ALPHA
 
+#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();
@@ -879,6 +888,18 @@ void CardReader::printingHasFinished() {
     #if ENABLED(SDCARD_SORT_ALPHA)
       presort();
     #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();
+    #endif
   }
 }
 
diff --git a/Marlin/example_configurations/AlephObjects/TAZ4/Configuration_adv.h b/Marlin/example_configurations/AlephObjects/TAZ4/Configuration_adv.h
index 3db33f142b..59034b6cfb 100644
--- a/Marlin/example_configurations/AlephObjects/TAZ4/Configuration_adv.h
+++ b/Marlin/example_configurations/AlephObjects/TAZ4/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/Anet/A6/Configuration_adv.h b/Marlin/example_configurations/Anet/A6/Configuration_adv.h
index e627be39f4..3dce38be09 100644
--- a/Marlin/example_configurations/Anet/A6/Configuration_adv.h
+++ b/Marlin/example_configurations/Anet/A6/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/Anet/A8/Configuration_adv.h b/Marlin/example_configurations/Anet/A8/Configuration_adv.h
index f366e7f3dd..bf2c3f54e0 100644
--- a/Marlin/example_configurations/Anet/A8/Configuration_adv.h
+++ b/Marlin/example_configurations/Anet/A8/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/BQ/Hephestos/Configuration_adv.h b/Marlin/example_configurations/BQ/Hephestos/Configuration_adv.h
index b3bcd8d593..8278540658 100644
--- a/Marlin/example_configurations/BQ/Hephestos/Configuration_adv.h
+++ b/Marlin/example_configurations/BQ/Hephestos/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/BQ/Hephestos_2/Configuration_adv.h b/Marlin/example_configurations/BQ/Hephestos_2/Configuration_adv.h
index af14b5d7b7..9521815140 100644
--- a/Marlin/example_configurations/BQ/Hephestos_2/Configuration_adv.h
+++ b/Marlin/example_configurations/BQ/Hephestos_2/Configuration_adv.h
@@ -545,11 +545,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/BQ/WITBOX/Configuration_adv.h b/Marlin/example_configurations/BQ/WITBOX/Configuration_adv.h
index b3bcd8d593..8278540658 100644
--- a/Marlin/example_configurations/BQ/WITBOX/Configuration_adv.h
+++ b/Marlin/example_configurations/BQ/WITBOX/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/Cartesio/Configuration_adv.h b/Marlin/example_configurations/Cartesio/Configuration_adv.h
index 1350274cc7..318d6d2cc1 100644
--- a/Marlin/example_configurations/Cartesio/Configuration_adv.h
+++ b/Marlin/example_configurations/Cartesio/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/Creality/CR-10/Configuration_adv.h b/Marlin/example_configurations/Creality/CR-10/Configuration_adv.h
index cb8f692051..a28ee2c107 100755
--- a/Marlin/example_configurations/Creality/CR-10/Configuration_adv.h
+++ b/Marlin/example_configurations/Creality/CR-10/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/Felix/Configuration_adv.h b/Marlin/example_configurations/Felix/Configuration_adv.h
index 473d6b31b8..baa0e8f45d 100644
--- a/Marlin/example_configurations/Felix/Configuration_adv.h
+++ b/Marlin/example_configurations/Felix/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/Folger Tech/i3-2020/Configuration.h b/Marlin/example_configurations/FolgerTech/i3-2020/Configuration.h
similarity index 100%
rename from Marlin/example_configurations/Folger Tech/i3-2020/Configuration.h
rename to Marlin/example_configurations/FolgerTech/i3-2020/Configuration.h
diff --git a/Marlin/example_configurations/Folger Tech/i3-2020/Configuration_adv.h b/Marlin/example_configurations/FolgerTech/i3-2020/Configuration_adv.h
similarity index 98%
rename from Marlin/example_configurations/Folger Tech/i3-2020/Configuration_adv.h
rename to Marlin/example_configurations/FolgerTech/i3-2020/Configuration_adv.h
index a86b4b7b5a..aae5f2d0c2 100644
--- a/Marlin/example_configurations/Folger Tech/i3-2020/Configuration_adv.h	
+++ b/Marlin/example_configurations/FolgerTech/i3-2020/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/Infitary/i3-M508/Configuration_adv.h b/Marlin/example_configurations/Infitary/i3-M508/Configuration_adv.h
index c0da4ae3d4..ba1911e48a 100644
--- a/Marlin/example_configurations/Infitary/i3-M508/Configuration_adv.h
+++ b/Marlin/example_configurations/Infitary/i3-M508/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/Malyan/M150/Configuration_adv.h b/Marlin/example_configurations/Malyan/M150/Configuration_adv.h
index 67069d68ea..f6df3eba4e 100644
--- a/Marlin/example_configurations/Malyan/M150/Configuration_adv.h
+++ b/Marlin/example_configurations/Malyan/M150/Configuration_adv.h
@@ -545,11 +545,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/Micromake/C1/enhanced/Configuration_adv.h b/Marlin/example_configurations/Micromake/C1/enhanced/Configuration_adv.h
index f76bb1929b..80b0eac8cd 100644
--- a/Marlin/example_configurations/Micromake/C1/enhanced/Configuration_adv.h
+++ b/Marlin/example_configurations/Micromake/C1/enhanced/Configuration_adv.h
@@ -549,11 +549,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/RigidBot/Configuration_adv.h b/Marlin/example_configurations/RigidBot/Configuration_adv.h
index b9d74506eb..be1a798ae0 100644
--- a/Marlin/example_configurations/RigidBot/Configuration_adv.h
+++ b/Marlin/example_configurations/RigidBot/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/SCARA/Configuration_adv.h b/Marlin/example_configurations/SCARA/Configuration_adv.h
index 29182135e1..4754cd7d96 100644
--- a/Marlin/example_configurations/SCARA/Configuration_adv.h
+++ b/Marlin/example_configurations/SCARA/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/Sanguinololu/Configuration_adv.h b/Marlin/example_configurations/Sanguinololu/Configuration_adv.h
index 972e943b85..9b20855c1b 100644
--- a/Marlin/example_configurations/Sanguinololu/Configuration_adv.h
+++ b/Marlin/example_configurations/Sanguinololu/Configuration_adv.h
@@ -537,11 +537,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/TinyBoy2/Configuration_adv.h b/Marlin/example_configurations/TinyBoy2/Configuration_adv.h
index 3d76835cfe..43692a67ad 100644
--- a/Marlin/example_configurations/TinyBoy2/Configuration_adv.h
+++ b/Marlin/example_configurations/TinyBoy2/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/Velleman/K8200/Configuration_adv.h b/Marlin/example_configurations/Velleman/K8200/Configuration_adv.h
index 8e79c96ff1..35f4146776 100644
--- a/Marlin/example_configurations/Velleman/K8200/Configuration_adv.h
+++ b/Marlin/example_configurations/Velleman/K8200/Configuration_adv.h
@@ -556,11 +556,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/Velleman/K8400/Configuration_adv.h b/Marlin/example_configurations/Velleman/K8400/Configuration_adv.h
index c0aa1dcab4..b09abfcd37 100644
--- a/Marlin/example_configurations/Velleman/K8400/Configuration_adv.h
+++ b/Marlin/example_configurations/Velleman/K8400/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/delta/FLSUN/auto_calibrate/Configuration_adv.h b/Marlin/example_configurations/delta/FLSUN/auto_calibrate/Configuration_adv.h
index df790f7852..4c87c1f7c5 100644
--- a/Marlin/example_configurations/delta/FLSUN/auto_calibrate/Configuration_adv.h
+++ b/Marlin/example_configurations/delta/FLSUN/auto_calibrate/Configuration_adv.h
@@ -550,11 +550,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/delta/FLSUN/kossel_mini/Configuration_adv.h b/Marlin/example_configurations/delta/FLSUN/kossel_mini/Configuration_adv.h
index 7c03d45a41..f3f818de6a 100644
--- a/Marlin/example_configurations/delta/FLSUN/kossel_mini/Configuration_adv.h
+++ b/Marlin/example_configurations/delta/FLSUN/kossel_mini/Configuration_adv.h
@@ -550,11 +550,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/delta/generic/Configuration_adv.h b/Marlin/example_configurations/delta/generic/Configuration_adv.h
index 7c03d45a41..f3f818de6a 100644
--- a/Marlin/example_configurations/delta/generic/Configuration_adv.h
+++ b/Marlin/example_configurations/delta/generic/Configuration_adv.h
@@ -550,11 +550,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h b/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h
index 7c03d45a41..f3f818de6a 100644
--- a/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h
+++ b/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h
@@ -550,11 +550,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h b/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h
index 3c25d3f3de..63bdb6063a 100644
--- a/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h
+++ b/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h
@@ -555,11 +555,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h b/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h
index cfb5017c24..a1fab153c5 100644
--- a/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h
+++ b/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h
@@ -550,11 +550,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/gCreate/gMax1.5+/Configuration_adv.h b/Marlin/example_configurations/gCreate/gMax1.5+/Configuration_adv.h
index 794ea0b22f..ff1b945ddc 100644
--- a/Marlin/example_configurations/gCreate/gMax1.5+/Configuration_adv.h
+++ b/Marlin/example_configurations/gCreate/gMax1.5+/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/makibox/Configuration_adv.h b/Marlin/example_configurations/makibox/Configuration_adv.h
index 102f293390..845e4230b4 100644
--- a/Marlin/example_configurations/makibox/Configuration_adv.h
+++ b/Marlin/example_configurations/makibox/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h b/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h
index a33b57da7a..b4840a7078 100644
--- a/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h
+++ b/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/example_configurations/wt150/Configuration_adv.h b/Marlin/example_configurations/wt150/Configuration_adv.h
index 67fd9dd301..c82c79acc1 100644
--- a/Marlin/example_configurations/wt150/Configuration_adv.h
+++ b/Marlin/example_configurations/wt150/Configuration_adv.h
@@ -548,11 +548,22 @@
   // Enable this option to scroll long filenames in the SD card menu
   //#define SCROLL_LONG_FILENAMES
 
-  // This option allows you to abort SD printing when any endstop is triggered.
-  // This feature must be enabled with "M540 S1" or from the LCD menu.
-  // To have any effect, endstops must be enabled during SD printing.
+  /**
+   * This option allows you to abort SD printing when any endstop is triggered.
+   * This feature must be enabled with "M540 S1" or from the LCD menu.
+   * To have any effect, endstops must be enabled during SD printing.
+   */
   //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
 
+  /**
+   * This option allows you to easily reprint the same SD Card file as
+   * was last printed.  At the end of a print, the LCD Menu will jump
+   * straight to the file previously selected.  A single click of the encoder
+   * wheel will restart the print.  Another file or LCD option can be
+   * selected by using the encoder wheel to navigate through the menu structure.
+   */
+  //#define SD_REPRINT_LAST_SELECTED_FILE
+
 #endif // SDSUPPORT
 
 /**
diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp
index 6653d312d8..eebd522b98 100644
--- a/Marlin/ultralcd.cpp
+++ b/Marlin/ultralcd.cpp
@@ -3752,9 +3752,24 @@ 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;
+    #endif
+
     void lcd_sdcard_menu() {
       ENCODER_DIRECTION_MENUS();
-      if (!lcdDrawUpdate && !lcd_clicked) return; // nothing to do (so don't thrash the SD card)
+  
+      #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);
@@ -4403,6 +4418,9 @@ void kill_screen(const char* lcd_msg) {
   #if ENABLED(SDSUPPORT)
 
     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
+      #endif
       UNUSED(longFilename);
       card.openAndPrintFile(filename);
       lcd_return_to_status();
@@ -4710,7 +4728,11 @@ 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 ((lcdDrawUpdate || drawing_screen) && (!bbr2 || (bbr2 > max_display_update_time)
+      #if ENABLED(SDSUPPORT)
+        || (currentScreen == lcd_sdcard_menu)
+      #endif
+      ))
     #else
       if (lcdDrawUpdate && (!bbr2 || (bbr2 > max_display_update_time)))
     #endif
@@ -4764,7 +4786,12 @@ 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();