diff --git a/Marlin/cardreader.cpp b/Marlin/cardreader.cpp
index 40a5d5d4277..c1b42e8913b 100644
--- a/Marlin/cardreader.cpp
+++ b/Marlin/cardreader.cpp
@@ -626,13 +626,14 @@ void CardReader::chdir(const char * relpath) {
   }
 }
 
-void CardReader::updir() {
-  if (workDirDepth > 0) {                                           // At least 1 dir has been saved
-    workDir = --workDirDepth ? workDirParents[workDirDepth] : root; // Use parent, or root if none
+int8_t CardReader::updir() {
+  if (workDirDepth > 0) {                                               // At least 1 dir has been saved
+    workDir = --workDirDepth ? workDirParents[workDirDepth - 1] : root; // Use parent, or root if none
     #if ENABLED(SDCARD_SORT_ALPHA)
       presort();
     #endif
   }
+  return workDirDepth;
 }
 
 #if ENABLED(SDCARD_SORT_ALPHA)
diff --git a/Marlin/cardreader.h b/Marlin/cardreader.h
index 5bdfa7f471e..5bcdd2b6b04 100644
--- a/Marlin/cardreader.h
+++ b/Marlin/cardreader.h
@@ -67,7 +67,7 @@ public:
 
   void ls();
   void chdir(const char *relpath);
-  void updir();
+  int8_t updir();
   void setroot();
 
   uint16_t get_num_Files();
diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp
index d3aafc96165..187e4bb24f1 100644
--- a/Marlin/ultralcd.cpp
+++ b/Marlin/ultralcd.cpp
@@ -3758,7 +3758,7 @@ void kill_screen(const char* lcd_msg) {
     #endif
 
     void lcd_sd_updir() {
-      card.updir();
+      encoderPosition = card.updir() ? ENCODER_STEPS_PER_MENU_ITEM : 0;
       encoderTopLine = 0;
       screen_changed = true;
       lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW;
@@ -4457,7 +4457,8 @@ void kill_screen(const char* lcd_msg) {
     void menu_action_sddirectory(const char* filename, char* longFilename) {
       UNUSED(longFilename);
       card.chdir(filename);
-      encoderPosition = 0;
+      encoderTopLine = 0;
+      encoderPosition = 2 * ENCODER_STEPS_PER_MENU_ITEM;
       screen_changed = true;
       lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW;
     }