diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp
index 1cf7be2c..c8d74006 100755
--- a/Firmware/Marlin_main.cpp
+++ b/Firmware/Marlin_main.cpp
@@ -9928,6 +9928,18 @@ if(0)
   #endif
   check_axes_activity();
   mmu_loop();
+
+  // handle longpress
+  if(lcd_longpress_trigger)
+  {
+      // long press is not possible in modal mode, wait until ready
+      if (lcd_longpress_func && lcd_update_enabled)
+      {
+          lcd_longpress_func();
+          lcd_longpress_trigger = 0;
+      }
+  }
+
 #if defined(AUTO_REPORT)
   host_autoreport();
 #endif //AUTO_REPORT
diff --git a/Firmware/lcd.cpp b/Firmware/lcd.cpp
index c3f2921d..37b70f1a 100644
--- a/Firmware/lcd.cpp
+++ b/Firmware/lcd.cpp
@@ -728,6 +728,10 @@ void lcd_update_enable(uint8_t enabled)
 	}
 }
 
+bool lcd_longpress_trigger = 0;
+
+// WARNING: this function is called from the temperature ISR.
+//          Only update flags, but do not perform any menu/lcd operation!
 void lcd_buttons_update(void)
 {
     static uint8_t lcd_long_press_active = 0;
@@ -749,9 +753,7 @@ void lcd_buttons_update(void)
             else if (longPressTimer.expired(LONG_PRESS_TIME))
             {
                 lcd_long_press_active = 1;
-                //long press is not possible in modal mode
-                if (lcd_longpress_func && lcd_update_enabled)
-                    lcd_longpress_func();
+                lcd_longpress_trigger = 1;
             }
         }
     }
diff --git a/Firmware/lcd.h b/Firmware/lcd.h
index 12b162e7..65bb9dc9 100644
--- a/Firmware/lcd.h
+++ b/Firmware/lcd.h
@@ -110,6 +110,7 @@ extern uint32_t lcd_next_update_millis;
 extern uint8_t lcd_status_update_delay;
 
 extern lcd_longpress_func_t lcd_longpress_func;
+extern bool lcd_longpress_trigger;
 
 extern lcd_charsetup_func_t lcd_charsetup_func;