diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp
index ed5c4cbde44b678613ec05a96aafeacb6bbf075b..1a251017077eb1b4c45b4732a0a6ad8cb3b41d04 100644
--- a/Marlin/src/Marlin.cpp
+++ b/Marlin/src/Marlin.cpp
@@ -181,6 +181,11 @@
   #include "libs/L6470/L6470_Marlin.h"
 #endif
 
+const char G28_STR[] PROGMEM = "G28",
+           M21_STR[] PROGMEM = "M21",
+           M23_STR[] PROGMEM = "M23 %s",
+           M24_STR[] PROGMEM = "M24";
+
 bool Running = true;
 
 // For M109 and M190, this flag may be cleared (by M108) to exit the wait loop
@@ -509,7 +514,7 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) {
       if (ELAPSED(ms, next_home_key_ms)) {
         next_home_key_ms = ms + HOME_DEBOUNCE_DELAY;
         LCD_MESSAGEPGM(MSG_AUTO_HOME);
-        queue.enqueue_now_P(PSTR("G28"));
+        queue.enqueue_now_P(G28_STR);
       }
     }
   #endif
diff --git a/Marlin/src/Marlin.h b/Marlin/src/Marlin.h
index f720c870a15058001ebfcc5526767f94651a0fe7..657e0660a8b3d570f31eb14800b35051d3902bcb 100644
--- a/Marlin/src/Marlin.h
+++ b/Marlin/src/Marlin.h
@@ -376,3 +376,5 @@ void protected_pin_err();
   void event_probe_recover();
   void event_probe_failure();
 #endif
+
+extern const char G28_STR[], M21_STR[], M23_STR[], M24_STR[];
diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp
index 8c09faeaa38bfc41c68a1bcc2741e3bd1d0ddfae..4c36b76c7b90af68b79bbe3d034643d4ecff475d 100644
--- a/Marlin/src/feature/host_actions.cpp
+++ b/Marlin/src/feature/host_actions.cpp
@@ -151,7 +151,8 @@ void host_action(const char * const pstr, const bool eol) {
       case PROMPT_PAUSE_RESUME:
         msg = PSTR("LCD_PAUSE_RESUME");
         #if ENABLED(ADVANCED_PAUSE_FEATURE)
-          queue.inject_P(PSTR("M24"));
+          extern const char M24_STR[];
+          queue.inject_P(M24_STR);
         #endif
         break;
       case PROMPT_INFO:
diff --git a/Marlin/src/feature/power_loss_recovery.cpp b/Marlin/src/feature/power_loss_recovery.cpp
index 1cea125dfe46db7589f676ac460f29588e4999cb..52671b0ecbcf55458ec8bd25508d175c461d93a9 100644
--- a/Marlin/src/feature/power_loss_recovery.cpp
+++ b/Marlin/src/feature/power_loss_recovery.cpp
@@ -188,8 +188,8 @@ void PrintJobRecovery::save(const bool force/*=false*/, const bool save_queue/*=
       #if EXTRUDERS > 1
         for (int8_t e = 0; e < EXTRUDERS; e++) info.filament_size[e] = planner.filament_size[e];
       #else
-        if (parser.volumetric_enabled) info.filament_size = planner.filament_size[active_extruder]; 
-      #endif    
+        if (parser.volumetric_enabled) info.filament_size = planner.filament_size[active_extruder];
+      #endif
     #endif
 
     #if EXTRUDERS
@@ -301,7 +301,7 @@ void PrintJobRecovery::resume() {
   #endif
 
   // Recover volumetric extrusion state
-  #if DISABLED(NO_VOLUMETRICS)    
+  #if DISABLED(NO_VOLUMETRICS)
     #if EXTRUDERS > 1
       for (int8_t e = 0; e < EXTRUDERS; e++) {
         dtostrf(info.filament_size[e], 1, 3, str_1);
@@ -437,7 +437,8 @@ void PrintJobRecovery::resume() {
 
   // Resume the SD file from the last position
   char *fn = info.sd_filename;
-  sprintf_P(cmd, PSTR("M23 %s"), fn);
+  extern const char M23_STR[];
+  sprintf_P(cmd, M23_STR, fn);
   gcode.process_subcommands_now(cmd);
   sprintf_P(cmd, PSTR("M24 S%ld T%ld"), resume_sdpos, info.print_job_elapsed);
   gcode.process_subcommands_now(cmd);
diff --git a/Marlin/src/gcode/feature/L6470/M906.cpp b/Marlin/src/gcode/feature/L6470/M906.cpp
index 143a6fea8dff994267b87475b9df60d88ad2e507..72de90fc50bfea2999b1ef6ba05fd28d996cc7a2 100644
--- a/Marlin/src/gcode/feature/L6470/M906.cpp
+++ b/Marlin/src/gcode/feature/L6470/M906.cpp
@@ -108,7 +108,7 @@ void L6470_report_current(L6470 &motor, const uint8_t axis) {
   SERIAL_ECHO(temp_buf);
 
   SERIAL_ECHOPGM("   Motor Status: ");
-  const char * const stat_str;
+  const char *stat_str;
   switch (motor_status) {
     default:
     case 0: stat_str = PSTR("stopped"); break;
@@ -124,7 +124,7 @@ void L6470_report_current(L6470 &motor, const uint8_t axis) {
   SERIAL_ECHOPGM("   Vs_compensation: ");
   serialprintPGM((motor.GetParam(L6470_CONFIG) & CONFIG_EN_VSCOMP) ? PSTR("ENABLED ") : PSTR("DISABLED"));
 
-  SERIAL_ECHOLNPGM("   Compensation coefficient: ", dtostrf(comp_coef * 0.01f, 7, 2, numstr));
+  SERIAL_ECHOLNPAIR("   Compensation coefficient: ", dtostrf(comp_coef * 0.01f, 7, 2, numstr));
   SERIAL_ECHOPAIR("...KVAL_HOLD: ", motor.GetParam(L6470_KVAL_HOLD));
   SERIAL_ECHOPAIR("   KVAL_RUN : ", motor.GetParam(L6470_KVAL_RUN));
   SERIAL_ECHOPAIR("   KVAL_ACC: ", motor.GetParam(L6470_KVAL_ACC));
diff --git a/Marlin/src/gcode/feature/L6470/M916-918.cpp b/Marlin/src/gcode/feature/L6470/M916-918.cpp
index 2077e937b9955bf1b7823b500940864f976b2e36..96a27f3330eb07f5e2d3b24fd0502a9c6dc570ad 100644
--- a/Marlin/src/gcode/feature/L6470/M916-918.cpp
+++ b/Marlin/src/gcode/feature/L6470/M916-918.cpp
@@ -36,11 +36,11 @@ static void jiggle_axis(const char axis_char, const float &min, const float &max
   char gcode_string[30], str1[11], str2[11];
 
   // Turn the motor(s) both directions
-  sprintf_P(gcode_string, PSTR("G0 %c%s F%s"), axis_char, dtostrf(min, 1, 3, str1), dtostrf(rate, 1, 3, str2));
-  process_subcommands_now(gcode_string);
+  sprintf_P(gcode_string, PSTR("G0 %c%s F%s"), axis_char, dtostrf(min, 1, 3, str1), dtostrf(fr_mm_m, 1, 3, str2));
+  gcode.process_subcommands_now(gcode_string);
 
   sprintf_P(gcode_string, PSTR("G0 %c%s F%s"), axis_char, dtostrf(max, 1, 3, str1), str2);
-  process_subcommands_now(gcode_string);
+  gcode.process_subcommands_now(gcode_string);
 
   planner.synchronize();
 }
diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h
index 1b4bb8ced364921c9e0fac6f36d2e3e9380b43ef..8ec414404bcab543efa3df3e41a7023fffdfddfe 100644
--- a/Marlin/src/gcode/gcode.h
+++ b/Marlin/src/gcode/gcode.h
@@ -340,7 +340,10 @@ public:
   static void process_subcommands_now_P(PGM_P pgcode);
   static void process_subcommands_now(char * gcode);
 
-  static inline void home_all_axes() { process_subcommands_now_P(PSTR("G28")); }
+  static inline void home_all_axes() {
+    extern const char G28_STR[];
+    process_subcommands_now_P(G28_STR);
+  }
 
   #if ENABLED(HOST_KEEPALIVE_FEATURE)
     /**
diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/stress_test_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/stress_test_screen.cpp
index 76d9fb2a9cf6ba8e9dedac3705c04b39625bbcec..7005b27b86d2c4586309b2b62fc5581c13de1213 100644
--- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/stress_test_screen.cpp
+++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/stress_test_screen.cpp
@@ -121,7 +121,7 @@ void StressTestScreen::onIdle() {
 
   if (!commandsInQueue()) {
       if (!isPositionKnown()) {
-        injectCommands_P(PSTR("G28"));
+        injectCommands_P(G28_STR);
       } else {
         injectCommands_P(PSTR(
           "G0 X100 Y100 Z100 F6000\n"
diff --git a/Marlin/src/lcd/extui_malyan_lcd.cpp b/Marlin/src/lcd/extui_malyan_lcd.cpp
index 0376ee8333a57c7a37232f5e1c454553a7c3f778..a578c2c1e05ac75024cec004d62bee4cf36a0617 100644
--- a/Marlin/src/lcd/extui_malyan_lcd.cpp
+++ b/Marlin/src/lcd/extui_malyan_lcd.cpp
@@ -248,7 +248,7 @@ void process_lcd_p_command(const char* command) {
         ExtUI::stopPrint();
         write_to_lcd_P(PSTR("{SYS:STARTED}"));
         break;
-    case 'H': queue.enqueue_now_P(PSTR("G28")); break; // Home all axes
+    case 'H': queue.enqueue_now_P(G28_STR); break; // Home all axes
     default: {
       #if ENABLED(SDSUPPORT)
         // Print file 000 - a three digit number indicating which
diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp
index ac2a68fb362a381b8ad09469dddc42af2e1c223c..b2eae427ae8b9415a9b1edd229e1391fbbd1395e 100644
--- a/Marlin/src/lcd/menu/menu_bed_corners.cpp
+++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp
@@ -118,7 +118,7 @@ void _lcd_level_bed_corners() {
   ui.defer_status_screen();
   if (!all_axes_known()) {
     set_all_unhomed();
-    queue.inject_P(PSTR("G28"));
+    queue.inject_P(G28_STR);
   }
 
   // Disable leveling so the planner won't mess with us
diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp
index bd5a96663eca2c9221cd8639be2dd5ecf4250eaa..f53c10f331626e05d531f4c162204bf45908f7b0 100644
--- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp
+++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp
@@ -195,7 +195,7 @@
     ui.defer_status_screen();
     set_all_unhomed();
     ui.goto_screen(_lcd_level_bed_homing);
-    queue.inject_P(PSTR("G28"));
+    queue.inject_P(G28_STR);
   }
 
 #endif // PROBE_MANUALLY || MESH_BED_LEVELING
@@ -241,7 +241,7 @@ void menu_bed_leveling() {
 
   // Auto Home if not using manual probing
   #if NONE(PROBE_MANUALLY, MESH_BED_LEVELING)
-    if (!is_homed) GCODES_ITEM(MSG_AUTO_HOME, PSTR("G28"));
+    if (!is_homed) GCODES_ITEM(MSG_AUTO_HOME, G28_STR);
   #endif
 
   // Level Bed
diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp
index e6488c9237e2564bc00d0c1734a0054bd99c08f1..8ed707421e7ebd115dc59b4d13c740813ba5e698 100644
--- a/Marlin/src/lcd/menu/menu_configuration.cpp
+++ b/Marlin/src/lcd/menu/menu_configuration.cpp
@@ -130,7 +130,7 @@ void menu_advanced_settings();
 
     auto _recalc_offsets = []{
       if (active_extruder && all_axes_known()) {  // For the 2nd extruder re-home so the next tool-change gets the new offsets.
-        queue.inject_P(PSTR("G28")); // In future, we can babystep the 2nd extruder (if active), making homing unnecessary.
+        queue.inject_P(G28_STR); // In future, we can babystep the 2nd extruder (if active), making homing unnecessary.
         active_extruder = 0;
       }
     };
diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp
index 38e94c09081c35e173c7c8ec3b8bac818d4fbfe2..5c742ef4f1cf9b9152389d7b566adb2190ef5629 100644
--- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp
+++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp
@@ -79,7 +79,7 @@ void _man_probe_pt(const xy_pos_t &xy) {
   }
 
   void _lcd_delta_calibrate_home() {
-    queue.inject_P(PSTR("G28"));
+    queue.inject_P(G28_STR);
     ui.goto_screen(_lcd_calibrate_homing);
   }
 
diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp
index 3df5fb358d6f7d6db351badbfd6a779547dd2181..d68995b19455e8b095151352a6892f310171446f 100644
--- a/Marlin/src/lcd/menu/menu_main.cpp
+++ b/Marlin/src/lcd/menu/menu_main.cpp
@@ -95,6 +95,8 @@ void menu_configuration();
   #endif
 #endif
 
+extern const char M21_STR[];
+
 void menu_main() {
   START_MENU();
   BACK_ITEM(MSG_WATCH);
@@ -129,7 +131,7 @@ void menu_main() {
           SUBMENU(MSG_MEDIA_MENU, menu_media);
           MENU_ITEM(gcode,
             #if PIN_EXISTS(SD_DETECT)
-              MSG_CHANGE_MEDIA, PSTR("M21")
+              MSG_CHANGE_MEDIA, M21_STR
             #else
               MSG_RELEASE_MEDIA, PSTR("M22")
             #endif
@@ -140,7 +142,7 @@ void menu_main() {
         #if PIN_EXISTS(SD_DETECT)
           ACTION_ITEM(MSG_NO_MEDIA, nullptr);
         #else
-          GCODES_ITEM(MSG_INIT_MEDIA, PSTR("M21"));
+          GCODES_ITEM(MSG_INIT_MEDIA, M21_STR);
           ACTION_ITEM(MSG_MEDIA_RELEASED, nullptr);
         #endif
       }
@@ -218,7 +220,7 @@ void menu_main() {
       if (!card_open) {
         MENU_ITEM(gcode,
           #if PIN_EXISTS(SD_DETECT)
-            MSG_CHANGE_MEDIA, PSTR("M21")
+            MSG_CHANGE_MEDIA, M21_STR
           #else
             MSG_RELEASE_MEDIA, PSTR("M22")
           #endif
@@ -230,7 +232,7 @@ void menu_main() {
       #if PIN_EXISTS(SD_DETECT)
         ACTION_ITEM(MSG_NO_MEDIA, nullptr);
       #else
-        GCODES_ITEM(MSG_INIT_MEDIA, PSTR("M21"));
+        GCODES_ITEM(MSG_INIT_MEDIA, M21_STR);
         ACTION_ITEM(MSG_MEDIA_RELEASED, nullptr);
       #endif
     }
diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp
index ee0ed15052df7ad7fc740f6fc1f1090874f476bd..87b5a680da09f8c908975877fd4e7553c917a3cb 100644
--- a/Marlin/src/lcd/menu/menu_motion.cpp
+++ b/Marlin/src/lcd/menu/menu_motion.cpp
@@ -303,7 +303,7 @@ void menu_move() {
     SUBMENU(MSG_MOVE_Z, []{ _menu_move_distance(Z_AXIS, lcd_move_z); });
   }
   else
-    GCODES_ITEM(MSG_AUTO_HOME, PSTR("G28"));
+    GCODES_ITEM(MSG_AUTO_HOME, G28_STR);
 
   #if ANY(SWITCHING_EXTRUDER, SWITCHING_NOZZLE, MAGNETIC_SWITCHING_TOOLHEAD)
 
@@ -409,7 +409,7 @@ void menu_motion() {
   //
   // Auto Home
   //
-  GCODES_ITEM(MSG_AUTO_HOME, PSTR("G28"));
+  GCODES_ITEM(MSG_AUTO_HOME, G28_STR);
   #if ENABLED(INDIVIDUAL_AXIS_HOMING_MENU)
     GCODES_ITEM(MSG_AUTO_HOME_X, PSTR("G28 X"));
     GCODES_ITEM(MSG_AUTO_HOME_Y, PSTR("G28 Y"));
diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp
index dc585c93db17880446bf66320a024b6c98949f64..a24683f9922a110e5ef6dfb7cee3fa663530a68e 100644
--- a/Marlin/src/lcd/menu/menu_ubl.cpp
+++ b/Marlin/src/lcd/menu/menu_ubl.cpp
@@ -107,7 +107,7 @@ void lcd_z_offset_edit_setup(const float &initial) {
  */
 void _lcd_ubl_build_custom_mesh() {
   char ubl_lcd_gcode[20];
-  queue.inject_P(PSTR("G28"));
+  queue.inject_P(G28_STR);
   #if HAS_HEATED_BED
     sprintf_P(ubl_lcd_gcode, PSTR("M190 S%i"), custom_bed_temp);
     lcd_enqueue_one_now(ubl_lcd_gcode);
@@ -195,7 +195,7 @@ void _lcd_ubl_validate_custom_mesh() {
     #endif
   ;
   sprintf_P(ubl_lcd_gcode, PSTR("G26 C B%i H%i P"), temp, custom_hotend_temp);
-  lcd_enqueue_one_now_P(PSTR("G28"));
+  lcd_enqueue_one_now_P(G28_STR);
   lcd_enqueue_one_now(ubl_lcd_gcode);
 }
 
@@ -519,7 +519,7 @@ void _lcd_ubl_output_map_lcd() {
 void _lcd_ubl_output_map_lcd_cmd() {
   if (!all_axes_known()) {
     set_all_unhomed();
-    queue.inject_P(PSTR("G28"));
+    queue.inject_P(G28_STR);
   }
   ui.goto_screen(_lcd_ubl_map_homing);
 }
diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp
index 54d13c29c14d67a2cceb7ea5aea86d51458842cf..9f7b19817f0954e5c1000f8e4913cbbd1cd168bb 100644
--- a/Marlin/src/lcd/ultralcd.cpp
+++ b/Marlin/src/lcd/ultralcd.cpp
@@ -464,7 +464,7 @@ bool MarlinUI::get_blink() {
 
         #endif // HAS_LCD_MENU
 
-        if (!homed && RRK(EN_KEYPAD_F1)) queue.inject_P(PSTR("G28"));
+        if (!homed && RRK(EN_KEYPAD_F1)) queue.inject_P(G28_STR);
         return true;
       }
 
@@ -1530,7 +1530,7 @@ void MarlinUI::update() {
     #if ENABLED(PARK_HEAD_ON_PAUSE)
       wait_for_heatup = wait_for_user = false;
     #endif
-    if (IS_SD_PAUSED()) queue.inject_P(PSTR("M24"));
+    if (IS_SD_PAUSED()) queue.inject_P(M24_STR);
     #ifdef ACTION_ON_RESUME
       host_action_resume();
     #endif
diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp
index 69d63dff1cc62a2ab2a63d9e6961cbd2ddf53b45..a0cb19b95d8a720db6857989d1cc422d481c2501 100644
--- a/Marlin/src/sd/cardreader.cpp
+++ b/Marlin/src/sd/cardreader.cpp
@@ -385,10 +385,11 @@ void CardReader::release() {
 
 void CardReader::openAndPrintFile(const char *name) {
   char cmd[4 + strlen(name) + 1]; // Room for "M23 ", filename, and null
-  sprintf_P(cmd, PSTR("M23 %s"), name);
+  extern const char M23_STR[];
+  sprintf_P(cmd, M23_STR, name);
   for (char *c = &cmd[4]; *c; c++) *c = tolower(*c);
   queue.enqueue_one_now(cmd);
-  queue.enqueue_now_P(PSTR("M24"));
+  queue.enqueue_now_P(M24_STR);
 }
 
 void CardReader::startFileprint() {