diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp
index 029a11c410..6e063896ee 100644
--- a/Marlin/src/feature/fwretract.cpp
+++ b/Marlin/src/feature/fwretract.cpp
@@ -30,13 +30,22 @@
 
 #include "fwretract.h"
 
-FWRetract fwretract; // Single instance
+FWRetract fwretract; // Single instance - this calls the constructor
 
 #include "../module/motion.h"
 #include "../module/planner.h"
+#include "../module/stepper.h"
+
+// private:
+
+#if EXTRUDERS > 1
+  bool FWRetract::retracted_swap[EXTRUDERS];         // Which extruders are swap-retracted
+#endif
+
+// public:
 
 bool FWRetract::autoretract_enabled,                 // M209 S - Autoretract switch
-     FWRetract::retracted[EXTRUDERS] = { false };    // Which extruders are currently retracted
+     FWRetract::retracted[EXTRUDERS];                // Which extruders are currently retracted
 float FWRetract::retract_length,                     // M207 S - G10 Retract length
       FWRetract::retract_feedrate_mm_s,              // M207 F - G10 Retract feedrate
       FWRetract::retract_zlift,                      // M207 Z - G10 Retract hop size
@@ -45,9 +54,6 @@ float FWRetract::retract_length,                     // M207 S - G10 Retract len
       FWRetract::swap_retract_length,                // M207 W - G10 Swap Retract length
       FWRetract::swap_retract_recover_length,        // M208 W - G11 Swap Recover length
       FWRetract::swap_retract_recover_feedrate_mm_s; // M208 R - G11 Swap Recover feedrate
-#if EXTRUDERS > 1
-  bool FWRetract::retracted_swap[EXTRUDERS] = { false }; // Which extruders are swap-retracted
-#endif
 
 void FWRetract::reset() {
   autoretract_enabled = false;
@@ -59,6 +65,13 @@ void FWRetract::reset() {
   swap_retract_length = RETRACT_LENGTH_SWAP;
   swap_retract_recover_length = RETRACT_RECOVER_LENGTH_SWAP;
   swap_retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE_SWAP;
+
+  for (uint8_t i = 0; i < EXTRUDERS; ++i) {
+    retracted[i] = false;
+    #if EXTRUDERS > 1
+      retracted_swap[i] = false;
+    #endif
+  }
 }
 
 /**
@@ -87,10 +100,11 @@ void FWRetract::retract(const bool retracting
   // Simply never allow two retracts or recovers in a row
   if (retracted[active_extruder] == retracting) return;
 
-  #if EXTRUDERS < 2
-    bool swapping = false;
+  #if EXTRUDERS > 1
+    if (!retracting) swapping = retracted_swap[active_extruder];
+  #else
+    const bool swapping = false;
   #endif
-  if (!retracting) swapping = retracted_swap[active_extruder];
 
   /* // debugging
     SERIAL_ECHOLNPAIR("retracting ", retracting);
@@ -117,6 +131,8 @@ void FWRetract::retract(const bool retracting
   // The current position will be the destination for E and Z moves
   set_destination_to_current();
 
+  stepper.synchronize();  // Wait for buffered moves to complete
+
   if (retracting) {
     // Remember the Z height since G-code may include its own Z-hop
     // For best results turn off Z hop if G-code already includes it
diff --git a/Marlin/src/feature/fwretract.h b/Marlin/src/feature/fwretract.h
index ed6b50d062..00e4da6350 100644
--- a/Marlin/src/feature/fwretract.h
+++ b/Marlin/src/feature/fwretract.h
@@ -30,6 +30,11 @@
 #include "../inc/MarlinConfig.h"
 
 class FWRetract {
+private:
+  #if EXTRUDERS > 1
+    static bool retracted_swap[EXTRUDERS];         // Which extruders are swap-retracted
+  #endif
+
 public:
   static bool autoretract_enabled,                 // M209 S - Autoretract switch
               retracted[EXTRUDERS];                // Which extruders are currently retracted
@@ -42,22 +47,24 @@ public:
                swap_retract_recover_length,        // M208 W - G11 Swap Recover length
                swap_retract_recover_feedrate_mm_s; // M208 R - G11 Swap Recover feedrate
 
-  #if EXTRUDERS > 1
-    static bool retracted_swap[EXTRUDERS];         // Which extruders are swap-retracted
-  #else
-    static bool constexpr retracted_swap[1] = { false };
-  #endif
-
-  FWRetract() {}
+  FWRetract() { reset(); }
 
   static void reset();
 
+  static void refresh_autoretract() {
+    for (uint8_t i = 0; i < EXTRUDERS; i++) retracted[i] = false;
+  }
+
+  static void enable_autoretract(const bool enable) {
+    autoretract_enabled = enable;
+    refresh_autoretract();
+  }
+
   static void retract(const bool retracting
     #if EXTRUDERS > 1
       , bool swapping = false
     #endif
   );
-
 };
 
 extern FWRetract fwretract;
diff --git a/Marlin/src/gcode/feature/fwretract/G10_G11.cpp b/Marlin/src/gcode/feature/fwretract/G10_G11.cpp
index 86c1037a75..9231386d35 100644
--- a/Marlin/src/gcode/feature/fwretract/G10_G11.cpp
+++ b/Marlin/src/gcode/feature/fwretract/G10_G11.cpp
@@ -34,7 +34,6 @@
 void GcodeSuite::G10() {
   #if EXTRUDERS > 1
     const bool rs = parser.boolval('S');
-    fwretract.retracted_swap[active_extruder] = rs; // Use 'S' for swap, default to false
   #endif
   fwretract.retract(true
     #if EXTRUDERS > 1
diff --git a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp
index f319cec9c4..827f03ebb0 100644
--- a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp
+++ b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp
@@ -65,8 +65,7 @@ void GcodeSuite::M208() {
 void GcodeSuite::M209() {
   if (MIN_AUTORETRACT <= MAX_AUTORETRACT) {
     if (parser.seen('S')) {
-      fwretract.autoretract_enabled = parser.value_bool();
-      for (uint8_t i = 0; i < EXTRUDERS; i++) fwretract.retracted[i] = false;
+      fwretract.enable_autoretract(parser.value_bool());
     }
   }
 }
diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp
index 7c83a977a8..01365993ff 100644
--- a/Marlin/src/lcd/ultralcd.cpp
+++ b/Marlin/src/lcd/ultralcd.cpp
@@ -3557,7 +3557,7 @@ void kill_screen(const char* lcd_msg) {
     void lcd_control_retract_menu() {
       START_MENU();
       MENU_BACK(MSG_CONTROL);
-      MENU_ITEM_EDIT(bool, MSG_AUTORETRACT, &fwretract.autoretract_enabled);
+      MENU_ITEM_EDIT_CALLBACK(bool, MSG_AUTORETRACT, &fwretract.autoretract_enabled, fwretract.refresh_autoretract);
       MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT, &fwretract.retract_length, 0, 100);
       #if EXTRUDERS > 1
         MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT_SWAP, &fwretract.swap_retract_length, 0, 100);
diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp
index 36043f2fed..7fbcbf0e79 100644
--- a/Marlin/src/module/configuration_store.cpp
+++ b/Marlin/src/module/configuration_store.cpp
@@ -247,6 +247,10 @@ void MarlinSettings::postprocess() {
   #if HAS_MOTOR_CURRENT_PWM
     stepper.refresh_motor_power();
   #endif
+
+  #if ENABLED(FWRETRACT)
+    fwretract.refresh_autoretract();
+  #endif
 }
 
 #if ENABLED(EEPROM_SETTINGS)