diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp
index baaac021009..331ceeb61db 100644
--- a/Marlin/src/gcode/temp/M104_M109.cpp
+++ b/Marlin/src/gcode/temp/M104_M109.cpp
@@ -126,7 +126,7 @@ void GcodeSuite::M104_M109(const bool isM109) {
     #endif
 
     if (thermalManager.isHeatingHotend(target_extruder) || !no_wait_for_cooling)
-      thermalManager.set_heating_message(target_extruder);
+      thermalManager.set_heating_message(target_extruder, !isM109 && got_temp);
   }
 
   TERN_(AUTOTEMP, planner.autotemp_M104_M109());
diff --git a/Marlin/src/gcode/temp/M140_M190.cpp b/Marlin/src/gcode/temp/M140_M190.cpp
index d6992ba938e..c5e3c000290 100644
--- a/Marlin/src/gcode/temp/M140_M190.cpp
+++ b/Marlin/src/gcode/temp/M140_M190.cpp
@@ -89,6 +89,11 @@ void GcodeSuite::M140_M190(const bool isM190) {
 
   if (isM190)
     thermalManager.wait_for_bed(no_wait_for_cooling);
+  else
+    ui.set_status_reset_fn([]{
+      const celsius_t c = thermalManager.degTargetBed();
+      return c < 30 || thermalManager.degBedNear(c);
+    });
 }
 
 #endif // HAS_HEATED_BED
diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp
index dc7ecf2246e..8906b01e5e5 100644
--- a/Marlin/src/lcd/marlinui.cpp
+++ b/Marlin/src/lcd/marlinui.cpp
@@ -73,6 +73,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
   #endif
   char MarlinUI::status_message[MAX_MESSAGE_LENGTH + 1];
   uint8_t MarlinUI::alert_level; // = 0
+  statusResetFunc_t MarlinUI::status_reset_callback; // = nullptr
 #endif
 
 #if ENABLED(LCD_SET_PROGRESS_MANUALLY)
@@ -627,6 +628,9 @@ void MarlinUI::init() {
 
     #endif // BASIC_PROGRESS_BAR
 
+    if (status_reset_callback && (*status_reset_callback)())
+      reset_status();
+
     #if HAS_MARLINUI_MENU
       if (use_click()) {
         #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT)
@@ -1515,6 +1519,8 @@ void MarlinUI::init() {
 
     UNUSED(persist);
 
+    set_status_reset_fn();
+
     #if HAS_WIRED_LCD
 
       #if BASIC_PROGRESS_BAR || BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT)
diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h
index b9e2e9b692f..17852a5039a 100644
--- a/Marlin/src/lcd/marlinui.h
+++ b/Marlin/src/lcd/marlinui.h
@@ -59,6 +59,8 @@
 
 #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U)
 
+typedef bool (*statusResetFunc_t)();
+
 #if HAS_WIRED_LCD
 
   enum LCDViewAction : uint8_t {
@@ -352,11 +354,15 @@ public:
     static void reset_status(const bool no_welcome=false);
     static void set_alert_status(FSTR_P const fstr);
     static void reset_alert_level() { alert_level = 0; }
+
+    static statusResetFunc_t status_reset_callback;
+    static void set_status_reset_fn(const statusResetFunc_t fn=nullptr) { status_reset_callback = fn; }
   #else
     static constexpr bool has_status() { return false; }
     static void reset_status(const bool=false) {}
     static void set_alert_status(FSTR_P const) {}
     static void reset_alert_level() {}
+    static void set_status_reset_fn(const statusResetFunc_t=nullptr) {}
   #endif
 
   static void set_status(const char * const cstr, const bool persist=false);
diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp
index 38cc3663d2c..6660d9a8f81 100644
--- a/Marlin/src/module/temperature.cpp
+++ b/Marlin/src/module/temperature.cpp
@@ -3631,7 +3631,7 @@ void Temperature::isr() {
   #endif
 
   #if HAS_HOTEND && HAS_STATUS_MESSAGE
-    void Temperature::set_heating_message(const uint8_t e) {
+    void Temperature::set_heating_message(const uint8_t e, const bool isM104/*=false*/) {
       const bool heating = isHeatingHotend(e);
       ui.status_printf(0,
         #if HAS_MULTI_HOTEND
@@ -3641,6 +3641,14 @@ void Temperature::isr() {
         #endif
         , heating ? GET_TEXT(MSG_HEATING) : GET_TEXT(MSG_COOLING)
       );
+
+      if (isM104) {
+        static uint8_t wait_e; wait_e = e;
+        ui.set_status_reset_fn([]{
+          const celsius_t c = degTargetHotend(wait_e);
+          return c < 30 || degHotendNear(wait_e, c);
+        });
+      }
     }
   #endif
 
diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h
index cb84f7e395d..a4681ba02ba 100644
--- a/Marlin/src/module/temperature.h
+++ b/Marlin/src/module/temperature.h
@@ -961,9 +961,9 @@ class Temperature {
     #endif
 
     #if HAS_HOTEND && HAS_STATUS_MESSAGE
-      static void set_heating_message(const uint8_t e);
+      static void set_heating_message(const uint8_t e, const bool isM104=false);
     #else
-      static void set_heating_message(const uint8_t) {}
+      static void set_heating_message(const uint8_t, const bool=false) {}
     #endif
 
     #if HAS_MARLINUI_MENU && HAS_TEMPERATURE