diff --git a/Marlin/Conditionals_LCD.h b/Marlin/Conditionals_LCD.h
index 2ec73eb7c4..3c39512a93 100644
--- a/Marlin/Conditionals_LCD.h
+++ b/Marlin/Conditionals_LCD.h
@@ -241,14 +241,14 @@
     #define LCD_STR_FILAM_MUL   "\xa4"
   #else
     /* Custom characters defined in the first 8 characters of the LCD */
-    #define LCD_STR_BEDTEMP     "\x00"  // Print only as a char. This will have 'unexpected' results when used in a string!
-    #define LCD_STR_DEGREE      "\x01"
-    #define LCD_STR_THERMOMETER "\x02"
-    #define LCD_STR_UPLEVEL     "\x03"
-    #define LCD_STR_REFRESH     "\x04"
+    #define LCD_BEDTEMP_CHAR     0x00  // Print only as a char. This will have 'unexpected' results when used in a string!
+    #define LCD_DEGREE_CHAR      0x01
+    #define LCD_STR_THERMOMETER "\x02" // Too many places use preprocessor string concatination to change this to a char right now.
+    #define LCD_UPLEVEL_CHAR     0x03
+    #define LCD_REFRESH_CHAR     0x04
     #define LCD_STR_FOLDER      "\x05"
-    #define LCD_STR_FEEDRATE    "\x06"
-    #define LCD_STR_CLOCK       "\x07"
+    #define LCD_FEEDRATE_CHAR    0x06
+    #define LCD_CLOCK_CHAR       0x07
     #define LCD_STR_ARROW_RIGHT ">"  /* from the default character set */
   #endif
 
diff --git a/Marlin/example_configurations/FolgerTech-i3-2020/Configuration.h b/Marlin/example_configurations/FolgerTech-i3-2020/Configuration.h
index 46c7660013..ee45fa7bd5 100644
--- a/Marlin/example_configurations/FolgerTech-i3-2020/Configuration.h
+++ b/Marlin/example_configurations/FolgerTech-i3-2020/Configuration.h
@@ -649,7 +649,7 @@
  */
 #define X_PROBE_OFFSET_FROM_EXTRUDER 38     // X offset: -left  +right  [of the nozzle]
 #define Y_PROBE_OFFSET_FROM_EXTRUDER -7     // Y offset: -front +behind [the nozzle]
-#define Z_PROBE_OFFSET_FROM_EXTRUDER -10.1  // Z offset: -below +above  [the nozzle]
+#define Z_PROBE_OFFSET_FROM_EXTRUDER -10.4  // Z offset: -below +above  [the nozzle]
 
 // X and Y axis travel speed (mm/m) between probes
 #define XY_PROBE_SPEED 7500
diff --git a/Marlin/example_configurations/FolgerTech-i3-2020/Configuration_adv.h b/Marlin/example_configurations/FolgerTech-i3-2020/Configuration_adv.h
index 803fd44bae..e1579fcb5e 100644
--- a/Marlin/example_configurations/FolgerTech-i3-2020/Configuration_adv.h
+++ b/Marlin/example_configurations/FolgerTech-i3-2020/Configuration_adv.h
@@ -509,7 +509,7 @@
   #endif
 
   // Show a progress bar on HD44780 LCDs for SD printing
-  //#define LCD_PROGRESS_BAR
+  #define LCD_PROGRESS_BAR
 
   #if ENABLED(LCD_PROGRESS_BAR)
     // Amount of time (ms) to show the bar
@@ -1228,7 +1228,7 @@
  *  - M206 and M428 are disabled.
  *  - G92 will revert to its behavior from Marlin 1.0.
  */
-//#define NO_WORKSPACE_OFFSETS
+#define NO_WORKSPACE_OFFSETS
 
 /**
  * Set the number of proportional font spaces required to fill up a typical character space.
diff --git a/Marlin/ultralcd_impl_HD44780.h b/Marlin/ultralcd_impl_HD44780.h
index 866bfd62b7..d1ddd3ba1b 100644
--- a/Marlin/ultralcd_impl_HD44780.h
+++ b/Marlin/ultralcd_impl_HD44780.h
@@ -193,12 +193,18 @@ extern volatile uint8_t buttons;  //an extended version of the last checked butt
   static void lcd_implementation_update_indicators();
 #endif
 
-static void lcd_set_custom_characters(
-  #if ENABLED(LCD_PROGRESS_BAR)
-    const bool info_screen_charset = true
-  #endif
-) {
-  static byte bedTemp[8] = {
+
+static void createChar_P(char c, PROGMEM byte *ptr) {
+  byte temp[8];
+  int8_t i;
+
+  for(i=0; i<8; i++)  {
+    temp[i] = pgm_read_byte(&ptr[i]);
+  }
+  lcd.createChar(c, temp);
+}
+
+const static PROGMEM byte bedTemp[8] = {
     B00000,
     B11111,
     B10101,
@@ -207,8 +213,9 @@ static void lcd_set_custom_characters(
     B11111,
     B00000,
     B00000
-  }; //thanks Sonny Mounicou
-  static byte degree[8] = {
+};
+
+const static PROGMEM byte degree[8] = {
     B01100,
     B10010,
     B10010,
@@ -218,7 +225,8 @@ static void lcd_set_custom_characters(
     B00000,
     B00000
   };
-  static byte thermometer[8] = {
+
+const static PROGMEM byte thermometer[8] = {
     B00100,
     B01010,
     B01010,
@@ -228,7 +236,8 @@ static void lcd_set_custom_characters(
     B10001,
     B01110
   };
-  static byte uplevel[8] = {
+
+const static PROGMEM byte uplevel[8] = {
     B00100,
     B01110,
     B11111,
@@ -237,8 +246,9 @@ static void lcd_set_custom_characters(
     B00000,
     B00000,
     B00000
-  }; //thanks joris
-  static byte feedrate[8] = {
+};
+
+const static PROGMEM byte feedrate[8] = {
     B11100,
     B10000,
     B11000,
@@ -247,8 +257,9 @@ static void lcd_set_custom_characters(
     B00110,
     B00101,
     B00000
-  }; //thanks Sonny Mounicou
-  static byte clock[8] = {
+};
+
+const static PROGMEM byte clock[8] = {
     B00000,
     B01110,
     B10011,
@@ -257,16 +268,10 @@ static void lcd_set_custom_characters(
     B01110,
     B00000,
     B00000
-  }; //thanks Sonny Mounicou
+};
 
-  lcd.createChar(LCD_STR_BEDTEMP[0], bedTemp);
-  lcd.createChar(LCD_STR_DEGREE[0], degree);
-  lcd.createChar(LCD_STR_THERMOMETER[0], thermometer);
-  lcd.createChar(LCD_STR_FEEDRATE[0], feedrate);
-  lcd.createChar(LCD_STR_CLOCK[0], clock);
-
-  #if ENABLED(SDSUPPORT)
-    static byte refresh[8] = {
+#if ENABLED(SDSUPPORT)
+  const static PROGMEM byte refresh[8] = {
       B00000,
       B00110,
       B11001,
@@ -275,8 +280,8 @@ static void lcd_set_custom_characters(
       B10011,
       B01100,
       B00000,
-    }; //thanks joris
-    static byte folder[8] = {
+  };
+  const static PROGMEM byte folder[8] = {
       B00000,
       B11100,
       B11111,
@@ -285,10 +290,10 @@ static void lcd_set_custom_characters(
       B11111,
       B00000,
       B00000
-    }; //thanks joris
+  };
 
-    #if ENABLED(LCD_PROGRESS_BAR)
-      static byte progress[3][8] = { {
+  #if ENABLED(LCD_PROGRESS_BAR)
+    const static PROGMEM byte progress[3][8] = { {
         B00000,
         B10000,
         B10000,
@@ -316,26 +321,43 @@ static void lcd_set_custom_characters(
         B10101,
         B00000
       } };
+  #endif
+#endif
+
+static void lcd_set_custom_characters(
+  #if ENABLED(LCD_PROGRESS_BAR)
+    const bool info_screen_charset = true
+  #endif
+) {
+
+  createChar_P(LCD_BEDTEMP_CHAR, bedTemp);
+  createChar_P(LCD_DEGREE_CHAR, degree);
+  createChar_P(LCD_STR_THERMOMETER[0], thermometer);
+  createChar_P(LCD_FEEDRATE_CHAR, feedrate);
+  createChar_P(LCD_CLOCK_CHAR, clock);
+
+  #if ENABLED(SDSUPPORT)
+    #if ENABLED(LCD_PROGRESS_BAR)
       static bool char_mode = false;
       if (info_screen_charset != char_mode) {
         char_mode = info_screen_charset;
         if (info_screen_charset) { // Progress bar characters for info screen
-          for (int i = 3; i--;) lcd.createChar(LCD_STR_PROGRESS[i], progress[i]);
+          for (int i = 3; i--;) createChar_P(LCD_STR_PROGRESS[i], progress[i]);
         }
         else { // Custom characters for submenus
-          lcd.createChar(LCD_STR_UPLEVEL[0], uplevel);
-          lcd.createChar(LCD_STR_REFRESH[0], refresh);
-          lcd.createChar(LCD_STR_FOLDER[0], folder);
+          createChar_P(LCD_UPLEVEL_CHAR, uplevel);
+          createChar_P(LCD_REFRESH_CHAR, refresh);
+          createChar_P(LCD_STR_FOLDER[0], folder);
         }
       }
     #else
-      lcd.createChar(LCD_STR_UPLEVEL[0], uplevel);
-      lcd.createChar(LCD_STR_REFRESH[0], refresh);
-      lcd.createChar(LCD_STR_FOLDER[0], folder);
+      createChar_P(LCD_UPLEVEL_CHAR, uplevel);
+      createChar_P(LCD_REFRESH_CHAR, refresh);
+      createChar_P(LCD_STR_FOLDER[0], folder);
     #endif
 
   #else
-    lcd.createChar(LCD_STR_UPLEVEL[0], uplevel);
+    createChar_P(LCD_UPLEVEL_CHAR, uplevel);
   #endif
 }
 
@@ -607,7 +629,8 @@ FORCE_INLINE void _draw_heater_status(const int8_t heater, const char prefix, co
       lcd.print(itostr3left(t2 + 0.5));
 
   if (prefix >= 0) {
-    lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
+    lcd.print((char)LCD_DEGREE_CHAR);
+    lcd.print(' ');
     if (t2 < 10) lcd.print(' ');
   }
 }
@@ -677,10 +700,10 @@ static void lcd_implementation_status_screen() {
 
       lcd.setCursor(8, 0);
       #if HOTENDS > 1
-        lcd.print(LCD_STR_THERMOMETER[0]);
+        lcd.print((CHAR)LCD_STR_THERMOMETER[0]);
         _draw_heater_status(1, -1, blink);
       #else
-        lcd.print(LCD_STR_BEDTEMP[0]);
+        lcd.print((CHAR)LCD_BEDTEMP_CHAR);
         _draw_heater_status(-1, -1, blink);
       #endif
 
@@ -701,7 +724,7 @@ static void lcd_implementation_status_screen() {
       #if HOTENDS > 1
         _draw_heater_status(1, LCD_STR_THERMOMETER[0], blink);
       #else
-        _draw_heater_status(-1, LCD_STR_BEDTEMP[0], blink);
+        _draw_heater_status(-1, LCD_BEDTEMP_CHAR, blink);
       #endif
 
     #endif // HOTENDS > 1 || TEMP_SENSOR_BED != 0
@@ -735,7 +758,7 @@ static void lcd_implementation_status_screen() {
         // If we both have a 2nd extruder and a heated bed,
         // show the heated bed temp on the left,
         // since the first line is filled with extruder temps
-      _draw_heater_status(-1, LCD_STR_BEDTEMP[0], blink);
+      _draw_heater_status(-1, LCD_BEDTEMP_CHAR, blink);
 
       #else
         // Before homing the axis letters are blinking 'X' <-> '?'.
@@ -767,7 +790,7 @@ static void lcd_implementation_status_screen() {
   #if LCD_HEIGHT > 3
 
     lcd.setCursor(0, 2);
-    lcd.print(LCD_STR_FEEDRATE[0]);
+    lcd.print((char)LCD_FEEDRATE_CHAR);
     lcd.print(itostr3(feedrate_percentage));
     lcd.print('%');
 
@@ -788,7 +811,7 @@ static void lcd_implementation_status_screen() {
     uint8_t len = elapsed.toDigital(buffer);
 
     lcd.setCursor(LCD_WIDTH - len - 1, 2);
-    lcd.print(LCD_STR_CLOCK[0]);
+    lcd.print((char)LCD_CLOCK_CHAR);
     lcd_print(buffer);
 
   #endif // LCD_HEIGHT > 3
@@ -980,7 +1003,7 @@ static void lcd_implementation_status_screen() {
 
   #endif // SDSUPPORT
 
-  #define lcd_implementation_drawmenu_back(sel, row, pstr, dummy) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0])
+  #define lcd_implementation_drawmenu_back(sel, row, pstr, dummy) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_UPLEVEL_CHAR,LCD_UPLEVEL_CHAR)
   #define lcd_implementation_drawmenu_submenu(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0])
   #define lcd_implementation_drawmenu_gcode(sel, row, pstr, gcode) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')
   #define lcd_implementation_drawmenu_function(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')