diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h
index fe63dba46a2..fa6a6cc302e 100644
--- a/Marlin/Marlin.h
+++ b/Marlin/Marlin.h
@@ -116,6 +116,8 @@ FORCE_INLINE void serialprintPGM(const char *str) {
 
 void get_command();
 
+void idle(); // the standard idle routine calls manage_inactivity(false)
+
 void manage_inactivity(bool ignore_stepper_queue=false);
 
 #if defined(DUAL_X_CARRIAGE) && HAS_X_ENABLE && HAS_X2_ENABLE
diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp
index 2a8d954bc69..6e659a71d40 100644
--- a/Marlin/Marlin_main.cpp
+++ b/Marlin/Marlin_main.cpp
@@ -726,11 +726,8 @@ void loop() {
     commands_in_queue--;
     cmd_queue_index_r = (cmd_queue_index_r + 1) % BUFSIZE;
   }
-  // Check heater every n milliseconds
-  manage_heater();
-  manage_inactivity();
   checkHitEndstops();
-  lcd_update();
+  idle();
 }
 
 void gcode_line_error(const char *err, bool doFlush=true) {
@@ -1998,11 +1995,7 @@ inline void gcode_G4() {
 
   if (!lcd_hasstatus()) LCD_MESSAGEPGM(MSG_DWELL);
 
-  while (millis() < codenum) {
-    manage_heater();
-    manage_inactivity();
-    lcd_update();
-  }
+  while (millis() < codenum) idle();
 }
 
 #ifdef FWRETRACT
@@ -2682,9 +2675,7 @@ inline void gcode_G28() {
 
           probePointCounter++;
 
-          manage_heater();
-          manage_inactivity();
-          lcd_update();
+          idle();
 
         } //xProbe
       } //yProbe
@@ -2885,21 +2876,13 @@ inline void gcode_G92() {
     st_synchronize();
     refresh_cmd_timeout();
     if (codenum > 0) {
-      codenum += previous_cmd_ms;  // keep track of when we started waiting
-      while(millis() < codenum && !lcd_clicked()) {
-        manage_heater();
-        manage_inactivity();
-        lcd_update();
-      }
+      codenum += previous_cmd_ms;  // wait until this time for a click
+      while (millis() < codenum && !lcd_clicked()) idle();
       lcd_ignore_click(false);
     }
     else {
       if (!lcd_detected()) return;
-      while (!lcd_clicked()) {
-        manage_heater();
-        manage_inactivity();
-        lcd_update();
-      }
+      while (!lcd_clicked()) idle();
     }
     if (IS_SD_PRINTING)
       LCD_MESSAGEPGM(MSG_RESUMING);
@@ -3525,9 +3508,9 @@ inline void gcode_M109() {
         #endif
         temp_ms = millis();
       }
-      manage_heater();
-      manage_inactivity();
-      lcd_update();
+
+      idle();
+
       #ifdef TEMP_RESIDENCY_TIME
         // start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time
         // or when current temp falls outside the hysteresis after target temp was reached
@@ -3575,9 +3558,7 @@ inline void gcode_M109() {
         SERIAL_PROTOCOL_F(degBed(), 1);
         SERIAL_EOL;
       }
-      manage_heater();
-      manage_inactivity();
-      lcd_update();
+      idle();
     }
     LCD_MESSAGEPGM(MSG_BED_DONE);
     refresh_cmd_timeout();
@@ -4262,11 +4243,7 @@ inline void gcode_M226() {
             break;
         }
 
-        while(digitalRead(pin_number) != target) {
-          manage_heater();
-          manage_inactivity();
-          lcd_update();
-        }
+        while (digitalRead(pin_number) != target) idle();
 
       } // pin_number > -1
     } // pin_state -1 0 1
@@ -6253,6 +6230,15 @@ void disable_all_steppers() {
   disable_e3();
 }
 
+/**
+ * Standard idle routine keeps the machine alive
+ */
+void idle() {
+  manage_heater();
+  manage_inactivity();
+  lcd_update();
+}
+
 /**
  * Manage several activities:
  *  - Check for Filament Runout
diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp
index 3cd9894ca5d..02bde48772c 100644
--- a/Marlin/planner.cpp
+++ b/Marlin/planner.cpp
@@ -478,11 +478,7 @@ float junction_deviation = 0.1;
 
   // If the buffer is full: good! That means we are well ahead of the robot. 
   // Rest here until there is room in the buffer.
-  while(block_buffer_tail == next_buffer_head) {
-    manage_heater(); 
-    manage_inactivity(); 
-    lcd_update();
-  }
+  while (block_buffer_tail == next_buffer_head) idle();
 
   #ifdef MESH_BED_LEVELING
     if (mbl.active) z += mbl.get_z(x, y);
diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp
index 438120c212f..792649f5499 100644
--- a/Marlin/stepper.cpp
+++ b/Marlin/stepper.cpp
@@ -1046,14 +1046,10 @@ void st_init() {
 }
 
 
-// Block until all buffered steps are executed
-void st_synchronize() {
-  while (blocks_queued()) {
-    manage_heater();
-    manage_inactivity();
-    lcd_update();
-  }
-}
+/**
+ * Block until all buffered steps are executed
+ */
+void st_synchronize() { while (blocks_queued()) idle(); }
 
 void st_set_position(const long &x, const long &y, const long &z, const long &e) {
   CRITICAL_SECTION_START;