diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp
index f824e1bd2bafe45d4be11bcc3e109863cf6add1c..1bac1ac79265e39a09e0651e1da3416c9baaca77 100644
--- a/Marlin/src/lcd/ultralcd.cpp
+++ b/Marlin/src/lcd/ultralcd.cpp
@@ -3775,7 +3775,9 @@ void kill_screen(const char* lcd_msg) {
     void lcd_sdcard_menu() {
       ENCODER_DIRECTION_MENUS();
 
-      const uint16_t fileCnt = card.getnrfilenames();
+      const uint16_t fileCnt = card.get_num_Files();  // Only access SD card if sort not active
+                                                      // This minimizes garbage on RepRap Discount Full Graphics Smart Controller
+                                                      // when using the Re-ARM card.
       START_MENU();
       MENU_BACK(MSG_MAIN);
       card.getWorkDirName();
diff --git a/Marlin/src/pins/pins_AZSMZ_MINI.h b/Marlin/src/pins/pins_AZSMZ_MINI.h
index ef421bed3e995e2dd5cc27fa41ee89f77f62b0f0..df830b02f12a99bdbe9c3198edca4a308ccc1526 100644
--- a/Marlin/src/pins/pins_AZSMZ_MINI.h
+++ b/Marlin/src/pins/pins_AZSMZ_MINI.h
@@ -112,6 +112,25 @@
 #define ENET_TXD0          P1_0
 #define ENET_TXD1          P1_1
 
+
+#if (ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && !defined(SDCARD_SORT_ALPHA)) // needed because of shared SPI
+  #define SDCARD_SORT_ALPHA         // Using SORT feature to keep one directory level in RAM
+                                    // When going up/down directory levels the SD card is
+                                    // accessed but the garbage/lines are removed when the
+                                    // LCD updates
+
+  #define SDSORT_LIMIT       256    // Maximum number of sorted items (10-256). Costs 27 bytes each.
+  #define FOLDER_SORTING     -1     // -1=above  0=none  1=below
+  #define SDSORT_GCODE       false  // Allow turning sorting on/off with LCD and M34 g-code.
+  #define SDSORT_USES_RAM    true   // Pre-allocate a static array for faster pre-sorting.
+  #define SDSORT_USES_STACK  false  // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.)
+  #define SDSORT_CACHE_NAMES true   // Keep sorted items in RAM longer for speedy performance. Most expensive option.
+  #define SDSORT_DYNAMIC_RAM false  // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use!
+  #define SDSORT_CACHE_VFATS 2      // Maximum number of 13-byte VFAT entries to use for sorting.
+                                    // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM.
+  #define MAX_VFAT_ENTRIES SDSORT_CACHE_VFATS
+#endif
+
 /**
  *  PWMs
  *
diff --git a/Marlin/src/pins/pins_MKS_SBASE.h b/Marlin/src/pins/pins_MKS_SBASE.h
index 5da1bf2ac097c189a2b2c3f7494a02caa59f534d..771f1a958688669a797a76fbf58c097296bf11f6 100644
--- a/Marlin/src/pins/pins_MKS_SBASE.h
+++ b/Marlin/src/pins/pins_MKS_SBASE.h
@@ -174,6 +174,25 @@
 #define ENET_TXD0          P1_0   // J12-11
 #define ENET_TXD1          P1_1   // J12-12
 
+
+#if (ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && !defined(SDCARD_SORT_ALPHA)) // needed because of shared SPI
+  #define SDCARD_SORT_ALPHA         // Using SORT feature to keep one directory level in RAM
+                                    // When going up/down directory levels the SD card is
+                                    // accessed but the garbage/lines are removed when the
+                                    // LCD updates
+
+  #define SDSORT_LIMIT       256    // Maximum number of sorted items (10-256). Costs 27 bytes each.
+  #define FOLDER_SORTING     -1     // -1=above  0=none  1=below
+  #define SDSORT_GCODE       false  // Allow turning sorting on/off with LCD and M34 g-code.
+  #define SDSORT_USES_RAM    true   // Pre-allocate a static array for faster pre-sorting.
+  #define SDSORT_USES_STACK  false  // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.)
+  #define SDSORT_CACHE_NAMES true   // Keep sorted items in RAM longer for speedy performance. Most expensive option.
+  #define SDSORT_DYNAMIC_RAM false  // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use!
+  #define SDSORT_CACHE_VFATS 2      // Maximum number of 13-byte VFAT entries to use for sorting.
+                                    // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM.
+  #define MAX_VFAT_ENTRIES SDSORT_CACHE_VFATS
+#endif
+
 /**
  *  PWMs
  *
diff --git a/Marlin/src/pins/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/pins_RAMPS_RE_ARM.h
index 992f9b387985fa360d95bdee204d0c60bd7d48ac..c220e2ad50a0ac5aa5b4e0de2958c940c18c782e 100644
--- a/Marlin/src/pins/pins_RAMPS_RE_ARM.h
+++ b/Marlin/src/pins/pins_RAMPS_RE_ARM.h
@@ -259,6 +259,24 @@
     //#define SHIFT_EN            P1_22  // J5-4 & AUX-4
   #endif
 
+  #if (ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && !defined(SDCARD_SORT_ALPHA)) // needed because of shared SPI
+    #define SDCARD_SORT_ALPHA         // Using SORT feature to keep one directory level in RAM
+                                      // When going up/down directory levels the SD card is
+                                      // accessed but the garbage/lines are removed when the
+                                      // LCD updates
+
+    #define SDSORT_LIMIT       256    // Maximum number of sorted items (10-256). Costs 27 bytes each.
+    #define FOLDER_SORTING     -1     // -1=above  0=none  1=below
+    #define SDSORT_GCODE       false  // Allow turning sorting on/off with LCD and M34 g-code.
+    #define SDSORT_USES_RAM    true   // Pre-allocate a static array for faster pre-sorting.
+    #define SDSORT_USES_STACK  false  // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.)
+    #define SDSORT_CACHE_NAMES true   // Keep sorted items in RAM longer for speedy performance. Most expensive option.
+    #define SDSORT_DYNAMIC_RAM false  // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use!
+    #define SDSORT_CACHE_VFATS 2      // Maximum number of 13-byte VFAT entries to use for sorting.
+                                      // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM.
+    #define MAX_VFAT_ENTRIES SDSORT_CACHE_VFATS
+  #endif
+
   #if ENABLED(VIKI2) || ENABLED(miniVIKI)
     // #define LCD_SCREEN_ROT_180
 
diff --git a/Marlin/src/sd/SdFatConfig.h b/Marlin/src/sd/SdFatConfig.h
index e4e81255d13f67adf9929fe1f6dbfcadc2273814..7044920ffc9ac18adeaac2da16680a55ae71975e 100644
--- a/Marlin/src/sd/SdFatConfig.h
+++ b/Marlin/src/sd/SdFatConfig.h
@@ -134,6 +134,9 @@
 #define FILENAME_LENGTH 13 // Number of UTF-16 characters per entry
 
 // Number of VFAT entries used. Each entry has 13 UTF-16 characters
+#ifdef MAX_VFAT_ENTRIES
+  #undef MAX_VFAT_ENTRIES
+#endif  
 #if ENABLED(SCROLL_LONG_FILENAMES)
   #define MAX_VFAT_ENTRIES (5)
 #else
diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp
index a8e518e3e54474af813e453538c960c2c8a17eef..88d215ed8f8fd28a942e7b923cab0e38dbeb76b3 100644
--- a/Marlin/src/sd/cardreader.cpp
+++ b/Marlin/src/sd/cardreader.cpp
@@ -747,7 +747,7 @@ void CardReader::updir() {
                 strncpy(sortnames[i], LONGEST_FILENAME, SORTED_LONGNAME_MAXLEN);
                 sortnames[i][SORTED_LONGNAME_MAXLEN - 1] = '\0';
               #else
-                strcpy(sortnames[i], SORTED_LONGNAME_MAXLEN);
+                strncpy(sortnames[i], LONGEST_FILENAME, SORTED_LONGNAME_MAXLEN);
               #endif
               #if ENABLED(SDSORT_CACHE_NAMES)
                 strcpy(sortshort[i], filename);
@@ -849,7 +849,7 @@ void CardReader::updir() {
               strncpy(sortnames[0], LONGEST_FILENAME, SORTED_LONGNAME_MAXLEN);
               sortnames[0][SORTED_LONGNAME_MAXLEN - 1] = '\0';
             #else
-              strcpy(sortnames[0], SORTED_LONGNAME_MAXLEN);
+              strncpy(sortnames[0], LONGEST_FILENAME, SORTED_LONGNAME_MAXLEN);
             #endif
             #if ENABLED(SDSORT_CACHE_NAMES)
               strcpy(sortshort[0], filename);