diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp
index 3c9fbc66678df98698fc5ea695e9a67e6b92822d..dde04cca07ade6c2ec32f08864c67cebf4f347ea 100644
--- a/Marlin/src/Marlin.cpp
+++ b/Marlin/src/Marlin.cpp
@@ -945,7 +945,7 @@ void loop() {
 
     if (commands_in_queue < BUFSIZE) get_available_commands();
     advance_command_queue();
-    endstops.report_state();
+    endstops.event_handler();
     idle();
   }
 }
diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp
index 5e9940a090ae68b9ded9804dafdf710be9d15b72..cecd3035313483059c4e6dc81c5e3288e98ecfd5 100644
--- a/Marlin/src/module/endstops.cpp
+++ b/Marlin/src/module/endstops.cpp
@@ -216,7 +216,7 @@ void Endstops::init() {
 
 } // Endstops::init
 
-// Called from ISR: Poll endstop state if required
+// Called at ~1KHz from Temperature ISR: Poll endstop state if required
 void Endstops::poll() {
 
   #if ENABLED(PINS_DEBUGGING)
@@ -258,8 +258,8 @@ void Endstops::not_homing() {
 
 // If the last move failed to trigger an endstop, call kill
 void Endstops::validate_homing_move() {
-  if (!trigger_state()) kill(PSTR(MSG_ERR_HOMING_FAILED));
-  hit_on_purpose();
+  if (trigger_state()) hit_on_purpose();
+  else kill(PSTR(MSG_ERR_HOMING_FAILED));
 }
 
 // Enable / disable endstop z-probe checking
@@ -283,8 +283,9 @@ void Endstops::validate_homing_move() {
   }
 #endif
 
-void Endstops::report_state() {
-  if (hit_state) {
+void Endstops::event_handler() {
+  static uint8_t prev_hit_state; // = 0
+  if (hit_state && hit_state != prev_hit_state) {
     #if ENABLED(ULTRA_LCD)
       char chrX = ' ', chrY = ' ', chrZ = ' ', chrP = ' ';
       #define _SET_STOP_CHAR(A,C) (chr## A = C)
@@ -320,8 +321,6 @@ void Endstops::report_state() {
       lcd_status_printf_P(0, PSTR(MSG_LCD_ENDSTOPS " %c %c %c %c"), chrX, chrY, chrZ, chrP);
     #endif
 
-    hit_on_purpose();
-
     #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) && ENABLED(SDSUPPORT)
       if (planner.abort_on_endstop_hit) {
         card.sdprinting = false;
@@ -331,6 +330,7 @@ void Endstops::report_state() {
       }
     #endif
   }
+  prev_hit_state = hit_state;
 } // Endstops::report_state
 
 void Endstops::M119() {
@@ -392,7 +392,7 @@ void Endstops::M119() {
 #define _ENDSTOP_PIN(AXIS, MINMAX) AXIS ##_## MINMAX ##_PIN
 #define _ENDSTOP_INVERTING(AXIS, MINMAX) AXIS ##_## MINMAX ##_ENDSTOP_INVERTING
 
-// Check endstops - Could be called from ISR!
+// Check endstops - Could be called from Temperature ISR!
 void Endstops::update() {
 
   #if DISABLED(ENDSTOP_NOISE_FILTER)
@@ -567,7 +567,7 @@ void Endstops::update() {
     if (dual_hit) { \
       _ENDSTOP_HIT(AXIS1, MINMAX); \
       /* if not performing home or if both endstops were trigged during homing... */ \
-      if (!stepper.homing_dual_axis || dual_hit == 0x3) \
+      if (!stepper.homing_dual_axis || dual_hit == 0b11) \
         planner.endstop_triggered(_AXIS(AXIS1)); \
     } \
   }while(0)
diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h
index cf8d29f1f1a063ff5fb2fc728c397ad73dcbb44a..a72c9cfd9c81a5a14adf7522456b81c38ed21f5b 100644
--- a/Marlin/src/module/endstops.h
+++ b/Marlin/src/module/endstops.h
@@ -128,7 +128,7 @@ class Endstops {
     /**
      * Report endstop hits to serial. Called from loop().
      */
-    static void report_state();
+    static void event_handler();
 
     /**
      * Report endstop positions in response to M119