diff --git a/Marlin/src/core/debug_out.h b/Marlin/src/core/debug_out.h
index 5b8e4b253b0abeeed3bcc27299184d047d509dd0..e92c5c5416de68e31815de8a5ea3372921e169ea 100644
--- a/Marlin/src/core/debug_out.h
+++ b/Marlin/src/core/debug_out.h
@@ -47,6 +47,7 @@
 #undef DEBUG_DELAY
 
 #if DEBUG_OUT
+  #define DEBUG_PRINT_P(P)        serialprintPGM(P)
   #define DEBUG_ECHO_START        SERIAL_ECHO_START
   #define DEBUG_ERROR_START       SERIAL_ERROR_START
   #define DEBUG_CHAR              SERIAL_CHAR
@@ -66,6 +67,7 @@
   #define DEBUG_XYZ               SERIAL_XYZ
   #define DEBUG_DELAY(ms)         serial_delay(ms)
 #else
+  #define DEBUG_PRINT_P(P)        NOOP
   #define DEBUG_ECHO_START()      NOOP
   #define DEBUG_ERROR_START()     NOOP
   #define DEBUG_CHAR(...)         NOOP
diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp
index 1831c88b621b33bee701ed5db5affe8bcd09018c..aae0d63698dfdbcd1a22a170fa7c5ac9606a71c9 100644
--- a/Marlin/src/core/serial.cpp
+++ b/Marlin/src/core/serial.cpp
@@ -50,8 +50,14 @@ void serial_echopair_PGM(PGM_P const s_P, unsigned long v) { serialprintPGM(s_P)
 
 void serial_spaces(uint8_t count) { count *= (PROPORTIONAL_FONT_RATIO); while (count--) SERIAL_CHAR(' '); }
 
+void serial_ternary(const bool onoff, PGM_P const pre, PGM_P const on, PGM_P const off, PGM_P const post/*=NULL*/) {
+  if (pre) serialprintPGM(pre);
+  serialprintPGM(onoff ? on : off);
+  if (post) serialprintPGM(post);
+}
 void serialprint_onoff(const bool onoff) { serialprintPGM(onoff ? PSTR(MSG_ON) : PSTR(MSG_OFF)); }
 void serialprintln_onoff(const bool onoff) { serialprint_onoff(onoff); SERIAL_EOL(); }
+void serialprint_truefalse(const bool tf) { serialprintPGM(tf ? PSTR("true") : PSTR("false")); }
 
 void print_bin(const uint16_t val) {
   uint16_t mask = 0x8000;
diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h
index 79890dc2556253008c8acb91b4bddb2a3ee1f6b9..f79856178c8ec2f73f0d912e132ddd584ae70d9f 100644
--- a/Marlin/src/core/serial.h
+++ b/Marlin/src/core/serial.h
@@ -174,8 +174,10 @@ inline void serial_echopair_PGM(PGM_P const s_P, void *v)   { serial_echopair_PG
 void serialprintPGM(PGM_P str);
 void serial_echo_start();
 void serial_error_start();
+void serial_ternary(const bool onoff, PGM_P const pre, PGM_P const on, PGM_P const off, PGM_P const post=NULL);
 void serialprint_onoff(const bool onoff);
 void serialprintln_onoff(const bool onoff);
+void serialprint_truefalse(const bool tf);
 void serial_spaces(uint8_t count);
 
 void print_bin(const uint16_t val);
diff --git a/Marlin/src/feature/I2CPositionEncoder.cpp b/Marlin/src/feature/I2CPositionEncoder.cpp
index 6e25d6f7da944894c53d68324d84f30c339ef8a4..7707d624ba1fa7b48e6baf7b1e0105977d2e9cf1 100644
--- a/Marlin/src/feature/I2CPositionEncoder.cpp
+++ b/Marlin/src/feature/I2CPositionEncoder.cpp
@@ -227,13 +227,11 @@ bool I2CPositionEncoder::passes_test(const bool report) {
   if (report) {
     if (H != I2CPE_MAG_SIG_GOOD) SERIAL_ECHOPGM("Warning. ");
     SERIAL_ECHO(axis_codes[encoderAxis]);
-    SERIAL_ECHOPGM(" axis ");
-    serialprintPGM(H == I2CPE_MAG_SIG_BAD ? PSTR("magnetic strip ") : PSTR("encoder "));
+    serial_ternary(H == I2CPE_MAG_SIG_BAD, PSTR(" axis "), PSTR("magnetic strip "), PSTR("encoder "));
     switch (H) {
       case I2CPE_MAG_SIG_GOOD:
       case I2CPE_MAG_SIG_MID:
-        SERIAL_ECHOLNPGM("passes test; field strength ");
-        serialprintPGM(H == I2CPE_MAG_SIG_GOOD ? PSTR("good.\n") : PSTR("fair.\n"));
+        serial_ternary(H == I2CPE_MAG_SIG_GOOD, PSTR("passes test; field strength "), PSTR("good"), PSTR("fair"), PSTR(".\n"));
         break;
       default:
         SERIAL_ECHOLNPGM("not detected!");
diff --git a/Marlin/src/feature/I2CPositionEncoder.h b/Marlin/src/feature/I2CPositionEncoder.h
index b88ca88cb071c2f32a3f3656a6e737a4a00fc689..592aeb328d56e26f283afb828e03665bbf4f15b8 100644
--- a/Marlin/src/feature/I2CPositionEncoder.h
+++ b/Marlin/src/feature/I2CPositionEncoder.h
@@ -275,9 +275,8 @@ class I2CPositionEncodersMgr {
     static void enable_ec(const int8_t idx, const bool enabled, const AxisEnum axis) {
       CHECK_IDX();
       encoders[idx].set_ec_enabled(enabled);
-      SERIAL_ECHOPAIR("Error correction on ", axis_codes[axis], " axis is ");
-      serialprintPGM(encoders[idx].get_ec_enabled() ? PSTR("en") : PSTR("dis"));
-      SERIAL_ECHOLNPGM("abled.");
+      SERIAL_ECHOPAIR("Error correction on ", axis_codes[axis]);
+      serial_ternary(encoders[idx].get_ec_enabled(), PSTR(" axis is "), PSTR("en"), PSTR("dis"), PSTR("abled.\n"));
     }
 
     static void set_ec_threshold(const int8_t idx, const float newThreshold, const AxisEnum axis) {
diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp
index e7f2fcbdc56b684c24cd7076202161bd9ce10379..55267b44e045aa912cd53f93e3b2758502a35bcf 100644
--- a/Marlin/src/feature/bedlevel/bedlevel.cpp
+++ b/Marlin/src/feature/bedlevel/bedlevel.cpp
@@ -42,10 +42,6 @@
 #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE)
 #include "../../core/debug_out.h"
 
-#if ENABLED(G26_MESH_VALIDATION)
-  bool g26_debug_flag; // = false
-#endif
-
 bool leveling_is_valid() {
   return
     #if ENABLED(MESH_BED_LEVELING)
diff --git a/Marlin/src/feature/bedlevel/bedlevel.h b/Marlin/src/feature/bedlevel/bedlevel.h
index fe05e7c4ff19015108e5d94620927a7e579e017c..e2e7e182f192e95d7b1b42601df3a9283c13a705 100644
--- a/Marlin/src/feature/bedlevel/bedlevel.h
+++ b/Marlin/src/feature/bedlevel/bedlevel.h
@@ -28,12 +28,6 @@ typedef struct {
   float distance; // When populated, the distance from the search location
 } mesh_index_pair;
 
-#if ENABLED(G26_MESH_VALIDATION)
-  extern bool g26_debug_flag;
-#else
-  constexpr bool g26_debug_flag = false;
-#endif
-
 #if ENABLED(PROBE_MANUALLY)
   extern bool g29_in_progress;
 #else
diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp
index 567fc4877e1d5312e7a1a9ed445634d2eec5ae3c..9e637c7debd80f9308519c5a746bf3652824b769 100644
--- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp
+++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp
@@ -58,54 +58,10 @@
 
   void unified_bed_leveling::report_state() {
     echo_name();
-    SERIAL_ECHOPGM(" System v" UBL_VERSION " ");
-    if (!planner.leveling_active) SERIAL_ECHOPGM("in");
-    SERIAL_ECHOLNPGM("active.");
+    serial_ternary(planner.leveling_active, PSTR(" System v" UBL_VERSION " "), PSTR(""), PSTR("in"), PSTR("active\n"));
     serial_delay(50);
   }
 
-  #if ENABLED(UBL_DEVEL_DEBUGGING)
-
-    static void debug_echo_axis(const AxisEnum axis) {
-      if (current_position[axis] == destination[axis])
-        SERIAL_ECHOPGM("-------------");
-      else
-        SERIAL_ECHO_F(destination[X_AXIS], 6);
-    }
-
-    void debug_current_and_destination(PGM_P title) {
-
-      // if the title message starts with a '!' it is so important, we are going to
-      // ignore the status of the g26_debug_flag
-      if (*title != '!' && !g26_debug_flag) return;
-
-      const float de = destination[E_AXIS] - current_position[E_AXIS];
-
-      if (de == 0.0) return; // Printing moves only
-
-      const float dx = destination[X_AXIS] - current_position[X_AXIS],
-                  dy = destination[Y_AXIS] - current_position[Y_AXIS],
-                  xy_dist = HYPOT(dx, dy);
-
-      if (xy_dist == 0.0) return;
-
-      const float fpmm = de / xy_dist;
-      SERIAL_ECHOPAIR_F("   fpmm=", fpmm, 6);
-      SERIAL_ECHOPAIR_F("    current=( ", current_position[X_AXIS], 6);
-      SERIAL_ECHOPAIR_F(", ", current_position[Y_AXIS], 6);
-      SERIAL_ECHOPAIR_F(", ", current_position[Z_AXIS], 6);
-      SERIAL_ECHOPAIR_F(", ", current_position[E_AXIS], 6);
-      SERIAL_ECHOPGM(" )   destination=( "); debug_echo_axis(X_AXIS);
-      SERIAL_ECHOPGM(", "); debug_echo_axis(Y_AXIS);
-      SERIAL_ECHOPGM(", "); debug_echo_axis(Z_AXIS);
-      SERIAL_ECHOPGM(", "); debug_echo_axis(E_AXIS);
-      SERIAL_ECHOPGM(" )   ");
-      serialprintPGM(title);
-      SERIAL_EOL();
-    }
-
-  #endif // UBL_DEVEL_DEBUGGING
-
   int8_t unified_bed_leveling::storage_slot;
 
   float unified_bed_leveling::z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y];
diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h
index 969fd209dc0102fc1ebe4638ac94870d8df31d91..a7c7f033b300022b171b5a6f9d18c274cc536f41 100644
--- a/Marlin/src/feature/bedlevel/ubl/ubl.h
+++ b/Marlin/src/feature/bedlevel/ubl/ubl.h
@@ -39,14 +39,6 @@
 #define USE_NOZZLE_AS_REFERENCE 0
 #define USE_PROBE_AS_REFERENCE 1
 
-// ubl_motion.cpp
-
-#if ENABLED(UBL_DEVEL_DEBUGGING)
-  void debug_current_and_destination(PGM_P const title);
-#else
-  FORCE_INLINE void debug_current_and_destination(PGM_P const title) { UNUSED(title); }
-#endif
-
 // ubl_G29.cpp
 
 enum MeshPointType : char { INVALID, REAL, SET_IN_BITMAP };
diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
index ff5d3128f9f8c23fb51fadb24a90fd98502b694f..ba9205b9c383c8321fa6879d892efb938ff6c8fa 100644
--- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
+++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
@@ -24,8 +24,6 @@
 
 #if ENABLED(AUTO_BED_LEVELING_UBL)
 
-  //#define UBL_DEVEL_DEBUGGING
-
   #include "ubl.h"
 
   #include "../../../Marlin.h"
diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp
index 4034531a0434e6dc07bede61666766a5ca6d935d..d3cf1ac9247353730c276c08b646a35644720dfd 100644
--- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp
+++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp
@@ -64,17 +64,6 @@
               cell_dest_xi  = get_cell_index_x(end[X_AXIS]),
               cell_dest_yi  = get_cell_index_y(end[Y_AXIS]);
 
-    if (g26_debug_flag) {
-      SERIAL_ECHOLNPAIR(
-        " ubl.line_to_destination_cartesian(xe=", destination[X_AXIS],
-        ", ye=", destination[Y_AXIS],
-        ", ze=", destination[Z_AXIS],
-        ", ee=", destination[E_AXIS],
-        ")"
-      );
-      debug_current_and_destination(PSTR("Start of ubl.line_to_destination_cartesian()"));
-    }
-
     // A move within the same cell needs no splitting
     if (cell_start_xi == cell_dest_xi && cell_start_yi == cell_dest_yi) {
 
@@ -93,9 +82,6 @@
         planner.buffer_segment(end[X_AXIS], end[Y_AXIS], end[Z_AXIS] + z_raise, end[E_AXIS], feed_rate, extruder);
         set_current_from_destination();
 
-        if (g26_debug_flag)
-          debug_current_and_destination(PSTR("out of bounds in ubl.line_to_destination_cartesian()"));
-
         return;
       }
 
@@ -119,9 +105,6 @@
       // Replace NAN corrections with 0.0 to prevent NAN propagation.
       planner.buffer_segment(end[X_AXIS], end[Y_AXIS], end[Z_AXIS] + (isnan(z0) ? 0.0 : z0), end[E_AXIS], feed_rate, extruder);
 
-      if (g26_debug_flag)
-        debug_current_and_destination(PSTR("FINAL_MOVE in ubl.line_to_destination_cartesian()"));
-
       set_current_from_destination();
       return;
     }
@@ -215,9 +198,6 @@
         } //else printf("FIRST MOVE PRUNED  ");
       }
 
-      if (g26_debug_flag)
-        debug_current_and_destination(PSTR("vertical move done in ubl.line_to_destination_cartesian()"));
-
       // At the final destination? Usually not, but when on a Y Mesh Line it's completed.
       if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS])
         goto FINAL_MOVE;
@@ -267,9 +247,6 @@
         } //else printf("FIRST MOVE PRUNED  ");
       }
 
-      if (g26_debug_flag)
-        debug_current_and_destination(PSTR("horizontal move done in ubl.line_to_destination_cartesian()"));
-
       if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS])
         goto FINAL_MOVE;
 
@@ -353,9 +330,6 @@
       if (xi_cnt < 0 || yi_cnt < 0) break; // Too far! Exit the loop and go to FINAL_MOVE
     }
 
-    if (g26_debug_flag)
-      debug_current_and_destination(PSTR("generic move done in ubl.line_to_destination_cartesian()"));
-
     if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS])
       goto FINAL_MOVE;
 
diff --git a/Marlin/src/feature/power_loss_recovery.cpp b/Marlin/src/feature/power_loss_recovery.cpp
index ecdf520a8ac180ac0d3be9ac85912c0674600536..17ba4a101b7e7870121196bfc3eef20815448927 100644
--- a/Marlin/src/feature/power_loss_recovery.cpp
+++ b/Marlin/src/feature/power_loss_recovery.cpp
@@ -50,6 +50,9 @@ job_recovery_info_t PrintJobRecovery::info;
   #include "fwretract.h"
 #endif
 
+#define DEBUG_OUT ENABLED(DEBUG_POWER_LOSS_RECOVERY)
+#include "../core/debug_out.h"
+
 PrintJobRecovery recovery;
 
 /**
@@ -110,9 +113,7 @@ void PrintJobRecovery::load() {
     (void)file.read(&info, sizeof(info));
     close();
   }
-  #if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
-    debug(PSTR("Load"));
-  #endif
+  debug(PSTR("Load"));
 }
 
 /**
@@ -216,20 +217,14 @@ void PrintJobRecovery::save(const bool force/*=false*/, const bool save_queue/*=
  */
 void PrintJobRecovery::write() {
 
-  #if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
-    debug(PSTR("Write"));
-  #endif
+  debug(PSTR("Write"));
 
   open(false);
   file.seekSet(0);
   const int16_t ret = file.write(&info, sizeof(info));
   close();
 
-  #if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
-    if (ret == -1) SERIAL_ECHOLNPGM("Power-loss file write failed.");
-  #else
-    UNUSED(ret);
-  #endif
+  if (ret == -1) DEBUG_ECHOLNPGM("Power-loss file write failed.");
 }
 
 /**
@@ -367,65 +362,65 @@ void PrintJobRecovery::resume() {
 #if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
 
   void PrintJobRecovery::debug(PGM_P const prefix) {
-    serialprintPGM(prefix);
-    SERIAL_ECHOLNPAIR(" Job Recovery Info...\nvalid_head:", int(info.valid_head), " valid_foot:", int(info.valid_foot));
+    DEBUG_PRINT_P(prefix);
+    DEBUG_ECHOLNPAIR(" Job Recovery Info...\nvalid_head:", int(info.valid_head), " valid_foot:", int(info.valid_foot));
     if (info.valid_head) {
       if (info.valid_head == info.valid_foot) {
-        SERIAL_ECHOPGM("current_position: ");
+        DEBUG_ECHOPGM("current_position: ");
         LOOP_XYZE(i) {
-          if (i) SERIAL_CHAR(',');
-          SERIAL_ECHO(info.current_position[i]);
+          if (i) DEBUG_CHAR(',');
+          DEBUG_ECHO(info.current_position[i]);
         }
-        SERIAL_EOL();
-        SERIAL_ECHOLNPAIR("feedrate: ", info.feedrate);
+        DEBUG_EOL();
+        DEBUG_ECHOLNPAIR("feedrate: ", info.feedrate);
 
         #if HOTENDS > 1
-          SERIAL_ECHOLNPAIR("active_hotend: ", int(info.active_hotend));
+          DEBUG_ECHOLNPAIR("active_hotend: ", int(info.active_hotend));
         #endif
 
-        SERIAL_ECHOPGM("target_temperature: ");
+        DEBUG_ECHOPGM("target_temperature: ");
         HOTEND_LOOP() {
-          SERIAL_ECHO(info.target_temperature[e]);
-          if (e < HOTENDS - 1) SERIAL_CHAR(',');
+          DEBUG_ECHO(info.target_temperature[e]);
+          if (e < HOTENDS - 1) DEBUG_CHAR(',');
         }
-        SERIAL_EOL();
+        DEBUG_EOL();
 
         #if HAS_HEATED_BED
-          SERIAL_ECHOLNPAIR("target_temperature_bed: ", info.target_temperature_bed);
+          DEBUG_ECHOLNPAIR("target_temperature_bed: ", info.target_temperature_bed);
         #endif
 
         #if FAN_COUNT
-          SERIAL_ECHOPGM("fan_speed: ");
+          DEBUG_ECHOPGM("fan_speed: ");
           FANS_LOOP(i) {
-            SERIAL_ECHO(int(info.fan_speed[i]));
-            if (i < FAN_COUNT - 1) SERIAL_CHAR(',');
+            DEBUG_ECHO(int(info.fan_speed[i]));
+            if (i < FAN_COUNT - 1) DEBUG_CHAR(',');
           }
-          SERIAL_EOL();
+          DEBUG_EOL();
         #endif
 
         #if HAS_LEVELING
-          SERIAL_ECHOLNPAIR("leveling: ", int(info.leveling), "\n fade: ", int(info.fade));
+          DEBUG_ECHOLNPAIR("leveling: ", int(info.leveling), "\n fade: ", int(info.fade));
         #endif
         #if ENABLED(FWRETRACT)
-          SERIAL_ECHOPGM("retract: ");
+          DEBUG_ECHOPGM("retract: ");
           for (int8_t e = 0; e < EXTRUDERS; e++) {
-            SERIAL_ECHO(info.retract[e]);
-            if (e < EXTRUDERS - 1) SERIAL_CHAR(',');
+            DEBUG_ECHO(info.retract[e]);
+            if (e < EXTRUDERS - 1) DEBUG_CHAR(',');
           }
-          SERIAL_EOL();
-          SERIAL_ECHOLNPAIR("retract_hop: ", info.retract_hop);
+          DEBUG_EOL();
+          DEBUG_ECHOLNPAIR("retract_hop: ", info.retract_hop);
         #endif
-        SERIAL_ECHOLNPAIR("cmd_queue_index_r: ", int(info.cmd_queue_index_r));
-        SERIAL_ECHOLNPAIR("commands_in_queue: ", int(info.commands_in_queue));
-        for (uint8_t i = 0; i < info.commands_in_queue; i++) SERIAL_ECHOLNPAIR("> ", info.command_queue[i]);
-        SERIAL_ECHOLNPAIR("sd_filename: ", info.sd_filename);
-        SERIAL_ECHOLNPAIR("sdpos: ", info.sdpos);
-        SERIAL_ECHOLNPAIR("print_job_elapsed: ", info.print_job_elapsed);
+        DEBUG_ECHOLNPAIR("cmd_queue_index_r: ", int(info.cmd_queue_index_r));
+        DEBUG_ECHOLNPAIR("commands_in_queue: ", int(info.commands_in_queue));
+        for (uint8_t i = 0; i < info.commands_in_queue; i++) DEBUG_ECHOLNPAIR("> ", info.command_queue[i]);
+        DEBUG_ECHOLNPAIR("sd_filename: ", info.sd_filename);
+        DEBUG_ECHOLNPAIR("sdpos: ", info.sdpos);
+        DEBUG_ECHOLNPAIR("print_job_elapsed: ", info.print_job_elapsed);
       }
       else
-        SERIAL_ECHOLNPGM("INVALID DATA");
+        DEBUG_ECHOLNPGM("INVALID DATA");
     }
-    SERIAL_ECHOLNPGM("---");
+    DEBUG_ECHOLNPGM("---");
   }
 
 #endif // DEBUG_POWER_LOSS_RECOVERY
diff --git a/Marlin/src/feature/power_loss_recovery.h b/Marlin/src/feature/power_loss_recovery.h
index c2f8687711bcd85c06ef9b4be612d3def139f762..fc4037726ba207deb53840c703ce87a4ba2ff9e3 100644
--- a/Marlin/src/feature/power_loss_recovery.h
+++ b/Marlin/src/feature/power_loss_recovery.h
@@ -125,9 +125,11 @@ class PrintJobRecovery {
 
   static inline bool valid() { return info.valid_head && info.valid_head == info.valid_foot; }
 
-    #if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
-      static void debug(PGM_P const prefix);
-    #endif
+  #if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
+    static void debug(PGM_P const prefix);
+  #else
+    static inline void debug(PGM_P const prefix) {}
+  #endif
 
   private:
     static void write();
diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp
index ee28f70633af11d875da0ef59edb4c46828e9788..ff477818fe7ba833a3a2eeda0520d75bbb85490b 100644
--- a/Marlin/src/feature/tmc_util.cpp
+++ b/Marlin/src/feature/tmc_util.cpp
@@ -474,7 +474,7 @@
       switch (i) {
         case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break;
         case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break;
-        case TMC_STEALTHCHOP: serialprintPGM(st.en_pwm_mode() ? PSTR("true") : PSTR("false")); break;
+        case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break;
         default: break;
       }
     }
@@ -497,7 +497,7 @@
       switch (i) {
         case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break;
         case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break;
-        case TMC_STEALTHCHOP: serialprintPGM(st.en_pwm_mode() ? PSTR("true") : PSTR("false")); break;
+        case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break;
         case TMC_GLOBAL_SCALER:
           {
             uint16_t value = st.GLOBAL_SCALER();
@@ -514,7 +514,7 @@
     static void tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) {
       switch (i) {
         case TMC_PWM_SCALE: SERIAL_PRINT(st.pwm_scale_sum(), DEC); break;
-        case TMC_STEALTHCHOP: serialprintPGM(st.stealth() ? PSTR("true") : PSTR("false")); break;
+        case TMC_STEALTHCHOP: serialprint_truefalse(st.stealth()); break;
         case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('X'); break;
         case TMC_S2VSB: if (st.s2vsb()) SERIAL_CHAR('X'); break;
         default: break;
@@ -541,7 +541,7 @@
     SERIAL_CHAR('\t');
     switch (i) {
       case TMC_CODES: st.printLabel(); break;
-      case TMC_ENABLED: serialprintPGM(st.isEnabled() ? PSTR("true") : PSTR("false")); break;
+      case TMC_ENABLED: serialprint_truefalse(st.isEnabled()); break;
       case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break;
       case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break;
       case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break;
@@ -578,9 +578,9 @@
             SERIAL_CHAR('-');
         }
         break;
-      case TMC_OTPW: serialprintPGM(st.otpw() ? PSTR("true") : PSTR("false")); break;
+      case TMC_OTPW: serialprint_truefalse(st.otpw()); break;
       #if ENABLED(MONITOR_DRIVER_STATUS)
-        case TMC_OTPW_TRIGGERED: serialprintPGM(st.getOTPW() ? PSTR("true") : PSTR("false")); break;
+        case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break;
       #endif
       case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break;
       case TMC_TBL: SERIAL_PRINT(st.blank_time(), DEC); break;
@@ -596,7 +596,7 @@
       SERIAL_CHAR('\t');
       switch (i) {
         case TMC_CODES: st.printLabel(); break;
-        case TMC_ENABLED: serialprintPGM(st.isEnabled() ? PSTR("true") : PSTR("false")); break;
+        case TMC_ENABLED: serialprint_truefalse(st.isEnabled()); break;
         case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break;
         case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break;
         case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break;
@@ -606,8 +606,8 @@
           break;
         case TMC_VSENSE: serialprintPGM(st.vsense() ? PSTR("1=.165") : PSTR("0=.310")); break;
         case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break;
-        //case TMC_OTPW: serialprintPGM(st.otpw() ? PSTR("true") : PSTR("false")); break;
-        //case TMC_OTPW_TRIGGERED: serialprintPGM(st.getOTPW() ? PSTR("true") : PSTR("false")); break;
+        //case TMC_OTPW: serialprint_truefalse(st.otpw()); break;
+        //case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break;
         case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break;
         case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break;
         case TMC_TBL: SERIAL_PRINT(st.blank_time(), DEC); break;
diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h
index 81ef2e06a5d6ef119f7ed74f8af22016fa34079b..132efbb79e9e63427baee73ba627463ed68bc47f 100644
--- a/Marlin/src/feature/tmc_util.h
+++ b/Marlin/src/feature/tmc_util.h
@@ -227,7 +227,7 @@ void tmc_set_current(TMC &st, const int mA) {
   void tmc_report_otpw(TMC &st) {
     st.printLabel();
     SERIAL_ECHOPGM(" temperature prewarn triggered: ");
-    serialprintPGM(st.getOTPW() ? PSTR("true") : PSTR("false"));
+    serialprint_truefalse(st.getOTPW());
     SERIAL_EOL();
   }
   template<typename TMC>
diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp
index 60979aad005e755fd11d0e9583b0f92749f3d84a..cdc2b7478eab247a164a511e19a7546d3252796a 100644
--- a/Marlin/src/gcode/bedlevel/G26.cpp
+++ b/Marlin/src/gcode/bedlevel/G26.cpp
@@ -246,8 +246,6 @@ void move_to(const float &rx, const float &ry, const float &z, const float &e_de
   // Yes: a 'normal' movement. No: a retract() or recover()
   feed_value = has_xy_component ? G26_XY_FEEDRATE : planner.settings.max_feedrate_mm_s[E_AXIS] / 1.5;
 
-  if (g26_debug_flag) SERIAL_ECHOLNPAIR("in move_to() feed_value for XY:", feed_value);
-
   destination[X_AXIS] = rx;
   destination[Y_AXIS] = ry;
   destination[E_AXIS] += e_delta;
@@ -327,19 +325,15 @@ inline bool look_for_lines_to_connect() {
     for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++) {
 
       #if HAS_LCD_MENU
-        if (user_canceled()) return true;     // Check if the user wants to stop the Mesh Validation
+        if (user_canceled()) return true;
       #endif
 
-      if (i < GRID_MAX_POINTS_X) { // We can't connect to anything to the right than GRID_MAX_POINTS_X.
-                                   // This is already a half circle because we are at the edge of the bed.
+      if (i < GRID_MAX_POINTS_X) { // Can't connect to anything to the right than GRID_MAX_POINTS_X.
+                                   // Already a half circle at the edge of the bed.
 
         if (is_bitmap_set(circle_flags, i, j) && is_bitmap_set(circle_flags, i + 1, j)) { // check if we can do a line to the left
           if (!is_bitmap_set(horizontal_mesh_line_flags, i, j)) {
-
-            //
-            // We found two circles that need a horizontal line to connect them
-            // Print it!
-            //
+            // Two circles need a horizontal line to connect them
             sx = _GET_MESH_X(  i  ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // right edge
             ex = _GET_MESH_X(i + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // left edge
 
@@ -347,27 +341,19 @@ inline bool look_for_lines_to_connect() {
             sy = ey = constrain(_GET_MESH_Y(j), Y_MIN_POS + 1, Y_MAX_POS - 1);
             ex = constrain(ex, X_MIN_POS + 1, X_MAX_POS - 1);
 
-            if (position_is_reachable(sx, sy) && position_is_reachable(ex, ey)) {
-
-              if (g26_debug_flag) {
-                SERIAL_ECHOLNPAIR(" Connecting with horizontal line (sx=", sx, ", sy=", sy, ") -> (ex=", ex, ", ey=", ey, ")");
-                //debug_current_and_destination(PSTR("Connecting horizontal line."));
-              }
+            if (position_is_reachable(sx, sy) && position_is_reachable(ex, ey))
               print_line_from_here_to_there(sx, sy, g26_layer_height, ex, ey, g26_layer_height);
-            }
-            bitmap_set(horizontal_mesh_line_flags, i, j);   // Mark it as done so we don't do it again, even if we skipped it
+
+            bitmap_set(horizontal_mesh_line_flags, i, j); // Mark done, even if skipped
           }
         }
 
-        if (j < GRID_MAX_POINTS_Y) { // We can't connect to anything further back than GRID_MAX_POINTS_Y.
-                                         // This is already a half circle because we are at the edge  of the bed.
+        if (j < GRID_MAX_POINTS_Y) {  // Can't connect to anything further back than GRID_MAX_POINTS_Y.
+                                      // Already a half circle at the edge of the bed.
 
           if (is_bitmap_set(circle_flags, i, j) && is_bitmap_set(circle_flags, i, j + 1)) { // check if we can do a line straight down
             if (!is_bitmap_set( vertical_mesh_line_flags, i, j)) {
-              //
-              // We found two circles that need a vertical line to connect them
-              // Print it!
-              //
+              // Two circles that need a vertical line to connect them
               sy = _GET_MESH_Y(  j  ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // top edge
               ey = _GET_MESH_Y(j + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // bottom edge
 
@@ -375,23 +361,10 @@ inline bool look_for_lines_to_connect() {
               sy = constrain(sy, Y_MIN_POS + 1, Y_MAX_POS - 1);
               ey = constrain(ey, Y_MIN_POS + 1, Y_MAX_POS - 1);
 
-              if (position_is_reachable(sx, sy) && position_is_reachable(ex, ey)) {
-
-                if (g26_debug_flag) {
-                  SERIAL_ECHOPAIR(" Connecting with vertical line (sx=", sx);
-                  SERIAL_ECHOPAIR(", sy=", sy);
-                  SERIAL_ECHOPAIR(") -> (ex=", ex);
-                  SERIAL_ECHOPAIR(", ey=", ey);
-                  SERIAL_CHAR(')');
-                  SERIAL_EOL();
-
-                  #if ENABLED(AUTO_BED_LEVELING_UBL)
-                    debug_current_and_destination(PSTR("Connecting vertical line."));
-                  #endif
-                }
+              if (position_is_reachable(sx, sy) && position_is_reachable(ex, ey))
                 print_line_from_here_to_there(sx, sy, g26_layer_height, ex, ey, g26_layer_height);
-              }
-              bitmap_set(vertical_mesh_line_flags, i, j);   // Mark it as done so we don't do it again, even if skipped
+
+              bitmap_set(vertical_mesh_line_flags, i, j); // Mark done, even if skipped
             }
           }
         }
@@ -725,8 +698,6 @@ void GcodeSuite::G26() {
     ui.capture();
   #endif
 
-  //debug_current_and_destination(PSTR("Starting G26 Mesh Validation Pattern."));
-
   #if DISABLED(ARC_SUPPORT)
 
     /**
@@ -819,18 +790,6 @@ void GcodeSuite::G26() {
         const float save_feedrate = feedrate_mm_s;
         feedrate_mm_s = PLANNER_XY_FEEDRATE() / 10.0;
 
-        if (g26_debug_flag) {
-          SERIAL_ECHOPAIR(" plan_arc(ex=", endpoint[X_AXIS]);
-          SERIAL_ECHOPAIR(", ey=", endpoint[Y_AXIS]);
-          SERIAL_ECHOPAIR(", ez=", endpoint[Z_AXIS]);
-          SERIAL_ECHOPAIR(", len=", arc_length);
-          SERIAL_ECHOPAIR(") -> (ex=", current_position[X_AXIS]);
-          SERIAL_ECHOPAIR(", ey=", current_position[Y_AXIS]);
-          SERIAL_ECHOPAIR(", ez=", current_position[Z_AXIS]);
-          SERIAL_CHAR(')');
-          SERIAL_EOL();
-        }
-
         plan_arc(endpoint, arc_offset, false);  // Draw a counter-clockwise arc
         feedrate_mm_s = save_feedrate;
         set_destination_from_current();
@@ -898,16 +857,13 @@ void GcodeSuite::G26() {
   retract_filament(destination);
   destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES;
 
-  //debug_current_and_destination(PSTR("ready to do Z-Raise."));
   move_to(destination, 0); // Raise the nozzle
-  //debug_current_and_destination(PSTR("done doing Z-Raise."));
 
   destination[X_AXIS] = g26_x_pos;                            // Move back to the starting position
   destination[Y_AXIS] = g26_y_pos;
   //destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES;         // Keep the nozzle where it is
 
   move_to(destination, 0);                                    // Move back to the starting position
-  //debug_current_and_destination(PSTR("done doing X/Y move."));
 
   #if DISABLED(NO_VOLUMETRICS)
     parser.volumetric_enabled = volumetric_was_enabled;
diff --git a/Marlin/src/gcode/bedlevel/ubl/M49.cpp b/Marlin/src/gcode/bedlevel/ubl/M49.cpp
deleted file mode 100644
index 5c1f096a7216d83c043c97841c0930261641ee74..0000000000000000000000000000000000000000
--- a/Marlin/src/gcode/bedlevel/ubl/M49.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- *
- * Based on Sprinter and grbl.
- * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-/**
- * M49.cpp - Toggle the G26 debug flag
- */
-
-#include "../../../inc/MarlinConfig.h"
-
-#if ENABLED(G26_MESH_VALIDATION)
-
-#include "../../gcode.h"
-#include "../../../feature/bedlevel/bedlevel.h"
-
-void GcodeSuite::M49() {
-  g26_debug_flag ^= true;
-  SERIAL_ECHOPGM("G26 Debug: ");
-  serialprintPGM(g26_debug_flag ? PSTR("On\n") : PSTR("Off\n"));
-}
-
-#endif // G26_MESH_VALIDATION
diff --git a/Marlin/src/gcode/feature/powerloss/M1000.cpp b/Marlin/src/gcode/feature/powerloss/M1000.cpp
index 06a31968690907f33fdf182d7cc7063b2ccfc41a..dfa55fc759fd8b9c5d9af2c1806081e0635d296f 100644
--- a/Marlin/src/gcode/feature/powerloss/M1000.cpp
+++ b/Marlin/src/gcode/feature/powerloss/M1000.cpp
@@ -29,17 +29,20 @@
 #include "../../../module/motion.h"
 #include "../../../lcd/ultralcd.h"
 
-void menu_job_recovery();
+#define DEBUG_OUT ENABLED(DEBUG_POWER_LOSS_RECOVERY)
+#include "../../../core/debug_out.h"
 
-#if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
+void menu_job_recovery();
 
-  inline void plr_error(PGM_P const prefix) {
-    SERIAL_ECHO_START();
+inline void plr_error(PGM_P const prefix) {
+  #if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
+    DEBUG_ECHO_START();
     serialprintPGM(prefix);
-    SERIAL_ECHOLNPGM(" Power-Loss Recovery Data");
-  }
-
-#endif
+    DEBUG_ECHOLNPGM(" Power-Loss Recovery Data");
+  #else
+    UNUSED(prefix);
+  #endif
+}
 
 /**
  * M1000: Resume from power-loss (undocumented)
@@ -54,11 +57,8 @@ void GcodeSuite::M1000() {
     else
       recovery.resume();
   }
-  else {
-    #if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
-      plr_error(recovery.info.valid_head ? PSTR("No") : PSTR("Invalid"));
-    #endif
-  }
+  else
+    plr_error(recovery.info.valid_head ? PSTR("No") : PSTR("Invalid"));
 
 }
 
diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp
index c8d81317709f3fc1a3c0f1b1dd553314b3b4e704..0837e1d0fa9e78c6633f41d12be57c8de52b22d4 100644
--- a/Marlin/src/gcode/gcode.cpp
+++ b/Marlin/src/gcode/gcode.cpp
@@ -348,10 +348,6 @@ void GcodeSuite::process_parsed_command(
         case 48: M48(); break;                                    // M48: Z probe repeatability test
       #endif
 
-      #if ENABLED(G26_MESH_VALIDATION)
-        case 49: M49(); break;                                    // M49: Turn on or off G26 debug flag for verbose output
-      #endif
-
       #if ENABLED(LCD_SET_PROGRESS_MANUALLY)
         case 73: M73(); break;                                    // M73: Set progress percentage (for display on LCD)
       #endif
diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h
index dcd015c2bb0dabc96ea72c06c9450d0b152e527b..af99e4fbed1b9b7b71ad781038c1612e25df42b7 100644
--- a/Marlin/src/gcode/gcode.h
+++ b/Marlin/src/gcode/gcode.h
@@ -495,10 +495,6 @@ private:
     static void M48();
   #endif
 
-  #if ENABLED(G26_MESH_VALIDATION)
-    static void M49();
-  #endif
-
   #if ENABLED(LCD_SET_PROGRESS_MANUALLY)
     static void M73();
   #endif