diff --git a/Marlin/src/feature/solenoid.cpp b/Marlin/src/feature/solenoid.cpp
index 97a74c6d197..623f223caa1 100644
--- a/Marlin/src/feature/solenoid.cpp
+++ b/Marlin/src/feature/solenoid.cpp
@@ -58,6 +58,11 @@ static void set_solenoid(const uint8_t num, const bool active) {
     #endif
     default: SERIAL_ECHO_MSG(STR_INVALID_SOLENOID); break;
   }
+
+  #if ENABLED(PARKING_EXTRUDER)
+    if (!active && active_extruder == num) // If active extruder's solenoid is disabled, carriage is considered parked
+      parking_extruder_set_parked(true);
+  #endif
 }
 
 void enable_solenoid(const uint8_t num) { set_solenoid(num, true); }
diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp
index 6a6d7bf9eb1..99853f24df1 100644
--- a/Marlin/src/module/motion.cpp
+++ b/Marlin/src/module/motion.cpp
@@ -595,16 +595,17 @@ void restore_feedrate_and_scaling() {
       // Software endstops are relative to the tool 0 workspace, so
       // the movement limits must be shifted by the tool offset to
       // retain the same physical limit when other tools are selected.
-      if (old_tool_index != new_tool_index) {
-        const float offs = hotend_offset[new_tool_index][axis] - hotend_offset[old_tool_index][axis];
-        soft_endstop.min[axis] += offs;
-        soft_endstop.max[axis] += offs;
-      }
-      else {
-        const float offs = hotend_offset[active_extruder][axis];
+
+      if (new_tool_index == old_tool_index || axis == Z_AXIS) { // The Z axis is "special" and shouldn't be modified
+        const float offs = (axis == Z_AXIS) ? 0 : hotend_offset[active_extruder][axis];
         soft_endstop.min[axis] = base_min_pos(axis) + offs;
         soft_endstop.max[axis] = base_max_pos(axis) + offs;
       }
+      else {
+        const float diff = hotend_offset[new_tool_index][axis] - hotend_offset[old_tool_index][axis];
+        soft_endstop.min[axis] += diff;
+        soft_endstop.max[axis] += diff;
+      }
 
     #else
 
diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp
index f3f3ee0595a..7f581131d8a 100644
--- a/Marlin/src/module/tool_change.cpp
+++ b/Marlin/src/module/tool_change.cpp
@@ -292,8 +292,6 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a
     return true;
   }
 
-  void parking_extruder_set_parked() { extruder_parked = true; }
-
   inline void parking_extruder_tool_change(const uint8_t new_tool, bool no_move) {
     if (!no_move) {
 
@@ -378,7 +376,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a
       planner.synchronize(); // Always sync the final move
 
       DEBUG_POS("PE Tool-Change done.", current_position);
-      extruder_parked = false;
+      parking_extruder_set_parked(false);
     }
     else if (do_solenoid_activation) { // && nomove == true
       // Deactivate current extruder solenoid
diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h
index d908b496ae7..6b739604f00 100644
--- a/Marlin/src/module/tool_change.h
+++ b/Marlin/src/module/tool_change.h
@@ -93,8 +93,9 @@
 
   void pe_solenoid_init();
 
+  extern bool extruder_parked;
+  inline void parking_extruder_set_parked(const bool parked) { extruder_parked = parked; }
   bool parking_extruder_unpark_after_homing(const uint8_t final_tool, bool homed_towards_final_tool);
-  void parking_extruder_set_parked();
 
 #elif ENABLED(MAGNETIC_PARKING_EXTRUDER)