diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index 5eebec9736d4719050900a71fd571097e742ed45..c099a18c380ed4567b8cb2974ccdea26e5b17370 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -292,7 +292,6 @@
 #define SD_FINISHED_STEPPERRELEASE true  //if sd support and the file is finished: disable steppers?
 #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place.
 
-//#define SDCARD_SORT_ALPHA // Sort SD file listings in ASCII order. Find additional options in cardreader.h
 #define SDCARD_RATHERRECENTFIRST  //reverse file order of sd card menu display. Its sorted practically after the file system block order.
 // if a file is deleted, it frees a block. hence, the order is not purely chronological. To still have auto0.g accessible, there is again the option to do that.
 // using:
diff --git a/Marlin/SdFatConfig.h b/Marlin/SdFatConfig.h
index 7492c541506ff2e10a6350465d7cf1ac2c9c6fc7..24caf6f3eb6d1549b8748ccb4b4c6e13012d19e4 100644
--- a/Marlin/SdFatConfig.h
+++ b/Marlin/SdFatConfig.h
@@ -111,14 +111,12 @@ uint8_t const SOFT_SPI_SCK_PIN = 13;
 /**
  * Defines for long (vfat) filenames
  */
-/** Number of UTF-16 characters per entry */
-#define FILENAME_LENGTH 13
 /** Number of VFAT entries used. Every entry has 13 UTF-16 characters */
 #define MAX_VFAT_ENTRIES (2)
 /** Number of UTF-16 characters per entry */
 #define FILENAME_LENGTH 13
 /** Total size of the buffer used to store the long filenames */
-#define LONG_FILENAME_LENGTH (FILENAME_LENGTH*MAX_VFAT_ENTRIES+1)
+#define LONG_FILENAME_LENGTH (13*MAX_VFAT_ENTRIES+1)
 #endif  // SdFatConfig_h
 
 
diff --git a/Marlin/cardreader.cpp b/Marlin/cardreader.cpp
index 673e9d55a7bc17ce21b8f7c92379abbfd8800ad3..e22f3436b66e0119778a1646eef984c249ef0acd 100644
--- a/Marlin/cardreader.cpp
+++ b/Marlin/cardreader.cpp
@@ -11,9 +11,6 @@
 
 CardReader::CardReader()
 {
-  #ifdef SDCARD_SORT_ALPHA
-   sort_count = 0;
-  #endif
    filesize = 0;
    sdpos = 0;
    sdprinting = false;
@@ -36,15 +33,19 @@ CardReader::CardReader()
   autostart_atmillis=millis()+5000;
 }
 
-char *createFilename(char *buffer, const dir_t &p) //buffer>12characters
+char *createFilename(char *buffer,const dir_t &p) //buffer>12characters
 {
   char *pos=buffer;
-  for (uint8_t i = 0; i < 11; i++) {
-    if (p.name[i] == ' ') continue;
-    if (i == 8) *pos++ = '.';
-    *pos++ = p.name[i];
+  for (uint8_t i = 0; i < 11; i++) 
+  {
+    if (p.name[i] == ' ')continue;
+    if (i == 8) 
+    {
+      *pos++='.';
+    }
+    *pos++=p.name[i];
   }
-  *pos++ = 0;
+  *pos++=0;
   return buffer;
 }
 
@@ -52,15 +53,15 @@ char *createFilename(char *buffer, const dir_t &p) //buffer>12characters
 void CardReader::lsDive(const char *prepend, SdFile parent, const char * const match/*=NULL*/)
 {
   dir_t p;
-  uint8_t cnt=0;
+ uint8_t cnt=0;
  
   while (parent.readDir(p, longFilename) > 0)
   {
     if( DIR_IS_SUBDIR(&p) && lsAction!=LS_Count && lsAction!=LS_GetFilename) // hence LS_SerialPrint
     {
 
-      char path[FILENAME_LENGTH*2];
-      char lfilename[FILENAME_LENGTH];
+      char path[13*2];
+      char lfilename[13];
       createFilename(lfilename,p);
       
       path[0]=0;
@@ -86,6 +87,8 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m
       }
       lsDive(path,dir);
       //close done automatically by destructor of SdFile
+
+      
     }
     else
     {
@@ -97,7 +100,8 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m
 
       if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue;
       filenameIsDir=DIR_IS_SUBDIR(&p);
-
+      
+      
       if(!filenameIsDir)
       {
         if(p.name[8]!='G') continue;
@@ -121,6 +125,7 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m
         }
         else if (cnt == nrFiles) return;
         cnt++;
+        
       }
     }
   }
@@ -129,6 +134,9 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m
 void CardReader::ls() 
 {
   lsAction=LS_SerialPrint;
+  if(lsAction==LS_Count)
+  nrFiles=0;
+
   root.rewind();
   lsDive("",root);
 }
@@ -175,9 +183,6 @@ void CardReader::initsd()
   }
   workDir=root;
   curDir=&root;
-  #ifdef SDCARD_SORT_ALPHA
-    presort();
-  #endif
   /*
   if(!workDir.openRoot(&volume))
   {
@@ -194,10 +199,8 @@ void CardReader::setroot()
     SERIAL_ECHOLNPGM(MSG_SD_WORKDIR_FAIL);
   }*/
   workDir=root;
+  
   curDir=&workDir;
-  #ifdef SDCARD_SORT_ALPHA
-    presort();
-  #endif
 }
 void CardReader::release()
 {
@@ -210,9 +213,6 @@ void CardReader::startFileprint()
   if(cardOK)
   {
     sdprinting = true;
-    #ifdef SDCARD_SORT_ALPHA
-      flush_presort();
-    #endif
   }
 }
 
@@ -241,7 +241,7 @@ void CardReader::getAbsFilename(char *t)
     while(*t!=0 && cnt< MAXPATHNAMELENGTH) 
     {t++;cnt++;}  //crawl counter forward.
   }
-  if(cnt<MAXPATHNAMELENGTH-FILENAME_LENGTH)
+  if(cnt<MAXPATHNAMELENGTH-13)
     file.getFilename(t);
   else
     t[0]=0;
@@ -311,7 +311,7 @@ void CardReader::openFile(char* name,bool read, bool replace_current/*=true*/)
       //SERIAL_ECHO("end  :");SERIAL_ECHOLN((int)(dirname_end-name));
       if(dirname_end>0 && dirname_end>dirname_start)
       {
-        char subdirname[FILENAME_LENGTH];
+        char subdirname[13];
         strncpy(subdirname, dirname_start, dirname_end-dirname_start);
         subdirname[dirname_end-dirname_start]=0;
         SERIAL_ECHOLN(subdirname);
@@ -408,7 +408,7 @@ void CardReader::removeFile(char* name)
       //SERIAL_ECHO("end  :");SERIAL_ECHOLN((int)(dirname_end-name));
       if(dirname_end>0 && dirname_end>dirname_start)
       {
-        char subdirname[FILENAME_LENGTH];
+        char subdirname[13];
         strncpy(subdirname, dirname_start, dirname_end-dirname_start);
         subdirname[dirname_end-dirname_start]=0;
         SERIAL_ECHOLN(subdirname);
@@ -446,9 +446,6 @@ void CardReader::removeFile(char* name)
       SERIAL_PROTOCOLPGM("File deleted:");
       SERIAL_PROTOCOLLN(fname);
       sdpos = 0;
-      #ifdef SDCARD_SORT_ALPHA
-        presort();
-      #endif
     }
     else
     {
@@ -564,14 +561,6 @@ void CardReader::closefile(bool store_location)
 
 void CardReader::getfilename(uint16_t nr, const char * const match/*=NULL*/)
 {
-  #if defined(SDCARD_SORT_ALPHA) && SORT_USES_RAM && SORT_USES_MORE_RAM
-    if (nr < sort_count) {
-      strcpy(filename, sortshort[nr]);
-      strcpy(longFilename, sortnames[nr]);
-      filenameIsDir = isDir[nr];
-      return;
-    }
-  #endif
   curDir=&workDir;
   lsAction=LS_GetFilename;
   nrFiles=nr;
@@ -595,7 +584,7 @@ void CardReader::chdir(const char * relpath)
 {
   SdFile newfile;
   SdFile *parent=&root;
-
+  
   if(workDir.isOpen())
     parent=&workDir;
   
@@ -613,164 +602,21 @@ void CardReader::chdir(const char * relpath)
       workDirParents[0]=*parent;
     }
     workDir=newfile;
-    #ifdef SDCARD_SORT_ALPHA
-      presort();
-    #endif
   }
 }
 
 void CardReader::updir()
 {
-  if (workDirDepth > 0)
+  if(workDirDepth > 0)
   {
     --workDirDepth;
     workDir = workDirParents[0];
+    int d;
     for (int d = 0; d < workDirDepth; d++)
       workDirParents[d] = workDirParents[d+1];
-    #ifdef SDCARD_SORT_ALPHA
-      presort();
-    #endif
-  }
-}
-
-#ifdef SDCARD_SORT_ALPHA
-
-/**
- * Get the name of a file in the current directory by sort-index
- */
-void CardReader::getfilename_sorted(const uint16_t nr) {
-  getfilename(nr < sort_count ? sort_order[nr] : nr);
-}
-
-/**
- * Read all the files and produce a sort key
- *
- * We can do this in 3 ways...
- *  - Minimal RAM: Read two filenames at a time sorting along...
- *  - Some RAM: Buffer the directory and return filenames from RAM
- *  - Some RAM: Buffer the directory just for this sort
- */
-void CardReader::presort()
-{
-  flush_presort();
-
-  uint16_t fileCnt = getnrfilenames();
-  if (fileCnt > 0) {
-
-    if (fileCnt > SORT_LIMIT) fileCnt = SORT_LIMIT;
-
-    #if SORT_USES_RAM
-      #if SORT_USES_MORE_RAM
-        sortshort = (char**)calloc(fileCnt, sizeof(char*));
-        sortnames = (char**)calloc(fileCnt, sizeof(char*));
-      #else
-        char *sortnames[fileCnt];
-      #endif
-    #else
-      char name1[LONG_FILENAME_LENGTH+1];
-    #endif
-
-    #if FOLDER_SORTING != 0
-      #if SORT_USES_RAM && SORT_USES_MORE_RAM
-        isDir = (uint8_t*)calloc(fileCnt, sizeof(uint8_t));
-      #else
-        uint8_t isDir[fileCnt];
-      #endif
-    #endif
-
-    sort_order = new uint8_t[fileCnt];
-
-    if (fileCnt > 1) {
-
-      // Init sort order. If using RAM then read all filenames now.
-      for (uint16_t i=0; i<fileCnt; i++) {
-        sort_order[i] = i;
-        #if SORT_USES_RAM
-          getfilename(i);
-          sortnames[i] = strdup(longFilename[0] ? longFilename : filename);
-          #if SORT_USES_MORE_RAM
-            sortshort[i] = strdup(filename);
-          #endif
-          // char out[30];
-          // sprintf_P(out, PSTR("---- %i %s %s"), i, filenameIsDir ? "D" : " ", sortnames[i]);
-          // SERIAL_ECHOLN(out);
-          #if FOLDER_SORTING != 0
-            isDir[i] = filenameIsDir;
-          #endif
-        #endif
-      }
-
-      // Bubble Sort
-      for (uint16_t i=fileCnt; --i;) {
-        bool cmp, didSwap = false;
-        for (uint16_t j=0; j<i; ++j) {
-          uint16_t s1 = j, s2 = j+1, o1 = sort_order[s1], o2 = sort_order[s2];
-          #if SORT_USES_RAM
-            #if FOLDER_SORTING != 0
-              cmp = (isDir[o1] == isDir[o2]) ? (strcasecmp(sortnames[o1], sortnames[o2]) > 0) : isDir[FOLDER_SORTING > 0 ? o1 : o2];
-            #else
-              cmp = strcasecmp(sortnames[o1], sortnames[o2]) > 0;
-            #endif
-          #else
-            getfilename(o1);
-            strcpy(name1, longFilename[0] ? longFilename : filename);
-            #if FOLDER_SORTING != 0
-              bool dir1 = filenameIsDir;
-            #endif
-            getfilename(o2);
-            char *name2 = longFilename[0] ? longFilename : filename;
-            #if FOLDER_SORTING != 0
-              cmp = (dir1 == filenameIsDir) ? (strcasecmp(name1, name2) > 0) : (FOLDER_SORTING > 0 ? dir1 : !dir1);
-            #else
-              cmp = strcasecmp(name1, name2) > 0;
-            #endif
-          #endif
-          if (cmp) {
-            sort_order[s1] = o2;
-            sort_order[s2] = o1;
-            didSwap = true;
-          }
-        }
-        if (!didSwap) break;
-      }
-
-      #if SORT_USES_RAM && !SORT_USES_MORE_RAM
-        for (uint16_t i=0; i<fileCnt; ++i) free(sortnames[i]);
-      #endif
-    }
-    else {
-      sort_order[0] = 0;
-      #if SORT_USES_RAM && SORT_USES_MORE_RAM
-        sortnames = (char**)malloc(sizeof(char*));
-        sortshort = (char**)malloc(sizeof(char*));
-        isDir = (uint8_t*)malloc(sizeof(uint8_t));
-        getfilename(0);
-        sortnames[0] = strdup(longFilename[0] ? longFilename : filename);
-        sortshort[0] = strdup(filename);
-        isDir[0] = filenameIsDir;
-      #endif
-    }
-
-    sort_count = fileCnt;
-  }
-}
-
-void CardReader::flush_presort() {
-  if (sort_count > 0) {
-    #if SORT_USES_RAM && SORT_USES_MORE_RAM
-      for (uint8_t i=0; i<sort_count; ++i) {
-        free(sortshort[i]);
-        free(sortnames[i]);
-      }
-      free(sortshort);
-      free(sortnames);
-    #endif
-    delete sort_order;
-    sort_count = 0;
   }
 }
 
-#endif // SDCARD_SORT_ALPHA
 
 void CardReader::printingHasFinished()
 {
@@ -794,9 +640,6 @@ void CardReader::printingHasFinished()
           enquecommand_P(PSTR(SD_FINISHED_RELEASECOMMAND));
       }
       autotempShutdown();
-      #ifdef SDCARD_SORT_ALPHA
-        presort();
-      #endif
     }
 }
 #endif //SDSUPPORT
diff --git a/Marlin/cardreader.h b/Marlin/cardreader.h
index 0ebcd50c839fc3b324fc2866214bb05dc41ea893..e513dc064f8ba6e07db526be314802d70f9a49db 100644
--- a/Marlin/cardreader.h
+++ b/Marlin/cardreader.h
@@ -3,14 +3,7 @@
 
 #ifdef SDSUPPORT
 
-#define MAX_DIR_DEPTH 10          // Maximum folder depth
-
-#ifdef SDCARD_SORT_ALPHA
-  #define SORT_USES_RAM false      // Buffer while sorting, else re-read from SD
-  #define SORT_USES_MORE_RAM false // Always keep the directory in RAM
-  #define SORT_LIMIT 256           // Maximum number of sorted items
-  #define FOLDER_SORTING -1        // -1=above  0=none  1=below
-#endif
+#define MAX_DIR_DEPTH 10
 
 #include "SdFile.h"
 enum LsAction {LS_SerialPrint,LS_Count,LS_GetFilename};
@@ -46,12 +39,6 @@ public:
   void updir();
   void setroot();
 
-#ifdef SDCARD_SORT_ALPHA
-  void presort();
-  void flush_presort();
-  void getfilename_sorted(const uint16_t nr);
-#endif
-
 
   FORCE_INLINE bool isFileOpen() { return file.isOpen(); }
   FORCE_INLINE bool eof() { return sdpos>=filesize ;};
@@ -63,29 +50,20 @@ public:
 public:
   bool saving;
   bool logging;
-  bool sdprinting;
-  bool cardOK;
-  char filename[FILENAME_LENGTH];
+  bool sdprinting ;  
+  bool cardOK ;
+  char filename[13];
   char longFilename[LONG_FILENAME_LENGTH];
   bool filenameIsDir;
   int lastnr; //last number of the autostart;
 private:
   SdFile root,*curDir,workDir,workDirParents[MAX_DIR_DEPTH];
   uint16_t workDirDepth;
-#ifdef SDCARD_SORT_ALPHA
-  uint16_t sort_count;
-  uint8_t *sort_order;
-  #if SORT_USES_MORE_RAM
-    char **sortshort;
-    char **sortnames;
-    uint8_t *isDir;
-  #endif
-#endif
   Sd2Card card;
   SdVolume volume;
   SdFile file;
   #define SD_PROCEDURE_DEPTH 1
-  #define MAXPATHNAMELENGTH (FILENAME_LENGTH*MAX_DIR_DEPTH+MAX_DIR_DEPTH+1)
+  #define MAXPATHNAMELENGTH (13*MAX_DIR_DEPTH+MAX_DIR_DEPTH+1)
   uint8_t file_subcall_ctr;
   uint32_t filespos[SD_PROCEDURE_DEPTH];
   char filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH];
@@ -97,7 +75,7 @@ private:
   bool autostart_stilltocheck; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware.
   
   LsAction lsAction; //stored for recursion.
-  uint16_t nrFiles; //counter for the files in the current directory and recycled as position counter for getting the nrFiles'th name in the directory.
+  int16_t nrFiles; //counter for the files in the current directory and recycled as position counter for getting the nrFiles'th name in the directory.
   char* diveDirName;
   void lsDive(const char *prepend, SdFile parent, const char * const match=NULL);
 };
diff --git a/Marlin/example_configurations/SCARA/Configuration_adv.h b/Marlin/example_configurations/SCARA/Configuration_adv.h
index 840a1b2881f16806a4488c446265d00a61ed8b5a..afdff030b468ad87245d52835471404a3f6a158c 100644
--- a/Marlin/example_configurations/SCARA/Configuration_adv.h
+++ b/Marlin/example_configurations/SCARA/Configuration_adv.h
@@ -295,7 +295,6 @@
 #define SD_FINISHED_STEPPERRELEASE true  //if sd support and the file is finished: disable steppers?
 #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place.
 
-//#define SDCARD_SORT_ALPHA // Sort SD file listings in ASCII order. Find additional options in cardreader.h
 #define SDCARD_RATHERRECENTFIRST  //reverse file order of sd card menu display. Its sorted practically after the file system block order.
 // if a file is deleted, it frees a block. hence, the order is not purely chronological. To still have auto0.g accessible, there is again the option to do that.
 // using:
diff --git a/Marlin/example_configurations/delta/Configuration_adv.h b/Marlin/example_configurations/delta/Configuration_adv.h
index edc6580478fb6557519582f87f750390434d7e28..3df4fd7ba30034e68e60d4bf1ad16e90be1b6182 100644
--- a/Marlin/example_configurations/delta/Configuration_adv.h
+++ b/Marlin/example_configurations/delta/Configuration_adv.h
@@ -287,7 +287,6 @@
 #define SD_FINISHED_STEPPERRELEASE true  //if sd support and the file is finished: disable steppers?
 #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place.
 
-//#define SDCARD_SORT_ALPHA // Sort SD file listings in ASCII order. Find additional options in cardreader.h
 #define SDCARD_RATHERRECENTFIRST  //reverse file order of sd card menu display. Its sorted practically after the filesystem block order. 
 // if a file is deleted, it frees a block. hence, the order is not purely cronological. To still have auto0.g accessible, there is again the option to do that.
 // using:
diff --git a/Marlin/example_configurations/makibox/Configuration_adv.h b/Marlin/example_configurations/makibox/Configuration_adv.h
index 21dbd46d736fa52eccaccf13748f091f74333c6e..19f870736565dcf08c0de0ac4b0297c1ed1c2fbf 100644
--- a/Marlin/example_configurations/makibox/Configuration_adv.h
+++ b/Marlin/example_configurations/makibox/Configuration_adv.h
@@ -291,7 +291,6 @@
 #define SD_FINISHED_STEPPERRELEASE true  //if sd support and the file is finished: disable steppers?
 #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place.
 
-//#define SDCARD_SORT_ALPHA // Sort SD file listings in ASCII order. Find additional options in cardreader.h
 #define SDCARD_RATHERRECENTFIRST  //reverse file order of sd card menu display. Its sorted practically after the file system block order.
 // if a file is deleted, it frees a block. hence, the order is not purely chronological. To still have auto0.g accessible, there is again the option to do that.
 // using:
diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp
index c0bcc8f3aa4b93f18d9ced73e06c3662b3f0a679..fe12761f125cf355386445914bd49428a71feb0f 100644
--- a/Marlin/ultralcd.cpp
+++ b/Marlin/ultralcd.cpp
@@ -886,9 +886,9 @@ void lcd_sdcard_menu()
     card.getWorkDirName();
     if(card.filename[0]=='/')
     {
-      #if SDCARDDETECT == -1
+#if SDCARDDETECT == -1
         MENU_ITEM(function, LCD_STR_REFRESH MSG_REFRESH, lcd_sd_refresh);
-      #endif
+#endif
     }else{
         MENU_ITEM(function, LCD_STR_FOLDER "..", lcd_sd_updir);
     }
@@ -897,23 +897,16 @@ void lcd_sdcard_menu()
     {
         if (_menuItemNr == _lineNr)
         {
-            #if defined(SDCARD_RATHERRECENTFIRST) && !defined(SDCARD_SORT_ALPHA)
-              int nr = fileCnt-1-i;
+            #ifndef SDCARD_RATHERRECENTFIRST
+              card.getfilename(i);
             #else
-              int nr = i;
+              card.getfilename(fileCnt-1-i);
             #endif
-
-            #ifdef SDCARD_SORT_ALPHA
-              card.getfilename_sorted(nr);
-            #else
-              card.getfilename(nr);
-            #endif
-
-            if (card.filenameIsDir) {
-              MENU_ITEM(sddirectory, MSG_CARD_MENU, card.filename, card.longFilename);
-            }
-            else {
-              MENU_ITEM(sdfile, MSG_CARD_MENU, card.filename, card.longFilename);
+            if (card.filenameIsDir)
+            {
+                MENU_ITEM(sddirectory, MSG_CARD_MENU, card.filename, card.longFilename);
+            }else{
+                MENU_ITEM(sdfile, MSG_CARD_MENU, card.filename, card.longFilename);
             }
         }else{
             MENU_ITEM_DUMMY();
@@ -1090,7 +1083,7 @@ void lcd_init()
   #endif // SR_LCD_2W_NL
 #endif//!NEWPANEL
 
-#if defined(SDSUPPORT) && defined(SDCARDDETECT) && (SDCARDDETECT > 0)
+#if defined (SDSUPPORT) && defined(SDCARDDETECT) && (SDCARDDETECT > 0)
     pinMode(SDCARDDETECT,INPUT);
     WRITE(SDCARDDETECT, HIGH);
     lcd_oldcardstatus = IS_SD_INSERTED;