diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 9067655033..126fdc0893 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -1513,7 +1513,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/default/Configuration.h b/Marlin/src/config/default/Configuration.h
index 9067655033..126fdc0893 100644
--- a/Marlin/src/config/default/Configuration.h
+++ b/Marlin/src/config/default/Configuration.h
@@ -1513,7 +1513,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h b/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h
index 629a2373ab..56ae68867c 100644
--- a/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h
+++ b/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h
@@ -1513,7 +1513,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/Anet/A6/Configuration.h b/Marlin/src/config/examples/Anet/A6/Configuration.h
index 2a4365b245..e1c3ac694e 100644
--- a/Marlin/src/config/examples/Anet/A6/Configuration.h
+++ b/Marlin/src/config/examples/Anet/A6/Configuration.h
@@ -1661,9 +1661,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
-// Note: Details on connecting to the Anet V1.0 controller are in the file pins_ANET_10.h
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
 //
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/Anet/A8/Configuration.h b/Marlin/src/config/examples/Anet/A8/Configuration.h
index 21f94a4ae2..b303b158f5 100644
--- a/Marlin/src/config/examples/Anet/A8/Configuration.h
+++ b/Marlin/src/config/examples/Anet/A8/Configuration.h
@@ -1516,6 +1516,7 @@
 //
 //#define G3D_PANEL
 
+
 //
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
@@ -1524,6 +1525,18 @@
 //
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
 
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
+
 //
 // MakerLab Mini Panel with graphic
 // controller and SD support - http://reprap.org/wiki/Mini_panel
diff --git a/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h
index b8712d93e6..0df6282363 100644
--- a/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h
+++ b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h
@@ -1513,7 +1513,18 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h
index 0c3da39401..ca6c4ca7ca 100644
--- a/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h
+++ b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h
@@ -1513,7 +1513,18 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h
index 35f1f85855..2848e71fe1 100644
--- a/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h
+++ b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h
@@ -1519,7 +1519,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h b/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h
index 555e22fe13..77bd20aa60 100644
--- a/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h
+++ b/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h
@@ -1517,7 +1517,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/JGAurora/A5/Configuration.h b/Marlin/src/config/examples/JGAurora/A5/Configuration.h
index 077733ca92..ce0d3e69b7 100644
--- a/Marlin/src/config/examples/JGAurora/A5/Configuration.h
+++ b/Marlin/src/config/examples/JGAurora/A5/Configuration.h
@@ -1524,7 +1524,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/RigidBot/Configuration.h b/Marlin/src/config/examples/RigidBot/Configuration.h
index 376c949770..09d4837c51 100644
--- a/Marlin/src/config/examples/RigidBot/Configuration.h
+++ b/Marlin/src/config/examples/RigidBot/Configuration.h
@@ -1515,6 +1515,18 @@
 //
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
 
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
+
 //
 // MakerLab Mini Panel with graphic
 // controller and SD support - http://reprap.org/wiki/Mini_panel
diff --git a/Marlin/src/config/examples/STM32F10/Configuration.h b/Marlin/src/config/examples/STM32F10/Configuration.h
index affc796675..04282211bb 100644
--- a/Marlin/src/config/examples/STM32F10/Configuration.h
+++ b/Marlin/src/config/examples/STM32F10/Configuration.h
@@ -1516,7 +1516,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/Sanguinololu/Configuration.h b/Marlin/src/config/examples/Sanguinololu/Configuration.h
index 239cf8d654..40d6d4c9f7 100644
--- a/Marlin/src/config/examples/Sanguinololu/Configuration.h
+++ b/Marlin/src/config/examples/Sanguinololu/Configuration.h
@@ -1544,7 +1544,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/Tronxy/X1/Configuration.h b/Marlin/src/config/examples/Tronxy/X1/Configuration.h
index e74543b69a..3e65542997 100644
--- a/Marlin/src/config/examples/Tronxy/X1/Configuration.h
+++ b/Marlin/src/config/examples/Tronxy/X1/Configuration.h
@@ -1498,7 +1498,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/Tronxy/X5S/Configuration.h b/Marlin/src/config/examples/Tronxy/X5S/Configuration.h
index 38a6a31d10..aa562a5a55 100644
--- a/Marlin/src/config/examples/Tronxy/X5S/Configuration.h
+++ b/Marlin/src/config/examples/Tronxy/X5S/Configuration.h
@@ -1513,7 +1513,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/Velleman/K8200/Configuration.h b/Marlin/src/config/examples/Velleman/K8200/Configuration.h
index ecc36d7175..108ee285e5 100644
--- a/Marlin/src/config/examples/Velleman/K8200/Configuration.h
+++ b/Marlin/src/config/examples/Velleman/K8200/Configuration.h
@@ -1546,7 +1546,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/Velleman/K8400/Configuration.h b/Marlin/src/config/examples/Velleman/K8400/Configuration.h
index 5e6092b26a..7d5038c78d 100644
--- a/Marlin/src/config/examples/Velleman/K8400/Configuration.h
+++ b/Marlin/src/config/examples/Velleman/K8400/Configuration.h
@@ -1513,7 +1513,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h b/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h
index 2e0c436c23..662b1ba1cc 100644
--- a/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h
+++ b/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h
@@ -1507,7 +1507,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/delta/kossel_mini/Configuration.h b/Marlin/src/config/examples/delta/kossel_mini/Configuration.h
index 6ebfebf86c..976a2bac4e 100644
--- a/Marlin/src/config/examples/delta/kossel_mini/Configuration.h
+++ b/Marlin/src/config/examples/delta/kossel_mini/Configuration.h
@@ -1637,7 +1637,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h
index 9053afb07c..d52ab8a2f8 100644
--- a/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h
+++ b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h
@@ -1527,7 +1527,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/config/examples/makibox/Configuration.h b/Marlin/src/config/examples/makibox/Configuration.h
index d063628ea2..6ec77ec43c 100644
--- a/Marlin/src/config/examples/makibox/Configuration.h
+++ b/Marlin/src/config/examples/makibox/Configuration.h
@@ -1516,7 +1516,18 @@
 // RepRapDiscount FULL GRAPHIC Smart Controller
 // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
 //
+// If USE_ST7920_LIGHTWEIGHT_UI is uncommented, then an alternative
+// light-weight status screen will be used that takes advantage of
+// the ST7920 character-generator to conserve MCU resources.
+//
+// Since the lightweight status screen can only show a status
+// message or the position, but not both, set DELAY_TO_SHOW_POSITION
+// to the number of seconds until the position is revealed after a new
+// status message is drawn.
+
 //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+//#define USE_ST7920_LIGHTWEIGHT_UI
+//#define DELAY_TO_SHOW_POSITION 20
 
 //
 // MakerLab Mini Panel with graphic
diff --git a/Marlin/src/lcd/dogm/ultralcd_impl_st7920_lite_status_screen.h b/Marlin/src/lcd/dogm/ultralcd_impl_st7920_lite_status_screen.h
new file mode 100644
index 0000000000..dd3c71a1e3
--- /dev/null
+++ b/Marlin/src/lcd/dogm/ultralcd_impl_st7920_lite_status_screen.h
@@ -0,0 +1,247 @@
+/*
+ * Lightweight Status Screen for the RepRapDiscount Full
+ * Graphics Smart Controller (ST7920-based 128x64 LCD)
+ *
+ * (c) 2017 Aleph Objects, Inc.
+ *
+ * The code in this page is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GNU GPL) as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option)
+ * any later version.  The code is distributed WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.
+ *
+ */
+
+#ifndef ULTRALCD_ST7920_LITE_STATUS_H
+#define ULTRALCD_ST7920_LITE_STATUS_H
+
+class ST7920_Lite_Status_Screen {
+  private:
+    static struct st7920_state_t {
+      uint8_t synced   : 1; // Whether a sync has been sent
+      uint8_t cmd      : 1; // Whether the sync was cmd or data
+      uint8_t extended : 1;
+      uint8_t graphics : 1;
+      uint8_t sa       : 1;
+    } current_bits;
+
+    static void cs();
+    static void ncs();
+    static void sync_cmd();
+    static void sync_dat();
+    static void write_byte(uint8_t w);
+
+    static void cmd(uint8_t cmd);
+    static void begin_data();
+    static void write_word(uint16_t w);
+    static void write_str(const char *str);
+    static void write_str(const char *str, uint8_t len);
+    static void write_str_P(const char *str);
+    static void write_str(progmem_str str);
+    static void write_number(uint8_t value, uint8_t digits=3);
+
+    static void _extended_function_set(bool extended, bool graphics);
+    static void _scroll_or_addr_select(bool sa);
+    static void reset_state_from_unknown();
+
+    static void home();
+    static void display_status(bool display_on, bool cursor_on, bool blink_on);
+    static void extended_function_set(bool extended);
+    static void graphics(bool graphics);
+    static void entry_mode_select(bool ac_increase, bool shift);
+    static void scroll_or_addr_select(bool sa);
+    static void set_ddram_address(uint8_t addr);
+    static void set_cgram_address(uint8_t addr);
+    static void set_gdram_address(uint8_t x, uint8_t y);
+
+    static void clear();
+    static void clear_ddram();
+    static void clear_gdram();
+
+    static void load_cgram_icon(uint16_t addr, const void *data);
+    static void draw_gdram_icon(uint8_t x, uint8_t y, const void *data);
+
+    static uint8_t string_checksum(const char *str);
+
+  protected:
+    static void draw_static_elements();
+    static void draw_progress_bar(uint8_t value);
+    static void draw_fan_icon(bool whichIcon);
+    static void draw_heat_icon(bool whichIcon, bool heating);
+    static void draw_extruder_1_temp(uint8_t temp, uint8_t target);
+    static void draw_extruder_2_temp(uint8_t temp, uint8_t target);
+    static void draw_bed_temp(uint8_t temp, uint8_t target);
+    static void draw_fan_speed(uint8_t value);
+    static void draw_print_time(uint32_t elapsed);
+    static void draw_feedrate_percentage(uint8_t percentage);
+    static void draw_status_message(const char *str);
+    static void draw_position(const float x, const float y, const float z, bool position_known = true);
+
+    static bool indicators_changed();
+    static bool position_changed();
+    static bool blink_changed();
+    static bool status_changed();
+
+    static void update_indicators(bool forceUpdate);
+    static void update_position(bool forceUpdate, bool resetChecksum);
+    static void update_status_or_position(bool forceUpdate);
+    static void update_progress(bool forceUpdate);
+
+  public:
+    static void update(bool forceUpdate);
+    static void on_entry();
+    static void on_exit();
+    static void clear_text_buffer();
+};
+
+/************************** ICON DEFINITIONS *************************************/
+
+#define CGRAM_ICON_1_ADDR 0x00
+#define CGRAM_ICON_2_ADDR 0x10
+#define CGRAM_ICON_3_ADDR 0x20
+#define CGRAM_ICON_4_ADDR 0x30
+
+#define CGRAM_ICON_1_WORD 0x00
+#define CGRAM_ICON_2_WORD 0x02
+#define CGRAM_ICON_3_WORD 0x04
+#define CGRAM_ICON_4_WORD 0x06
+
+PROGMEM const uint16_t nozzle_icon[] = {
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000111111110000,
+  0b0001111111111000,
+  0b0001111111111000,
+  0b0001111111111000,
+  0b0000111111110000,
+  0b0000111111110000,
+  0b0001111111111000,
+  0b0001111111111000,
+  0b0001111111111000,
+  0b0000011111100000,
+  0b0000001111000000,
+  0b0000000110000000,
+  0b0000000000000000,
+  0b0000000000000000
+};
+
+PROGMEM const uint16_t bed_icon[] = {
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0111111111111110,
+  0b0111111111111110,
+  0b0000000000000000,
+  0b0000000000000000
+};
+
+PROGMEM const uint16_t heat1_icon[] = {
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0010001000100000,
+  0b0001000100010000,
+  0b0000100010001000,
+  0b0000100010001000,
+  0b0001000100010000,
+  0b0010001000100000,
+  0b0010001000100000,
+  0b0001000100010000,
+  0b0000100010001000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000
+};
+
+PROGMEM const uint16_t heat2_icon[] = {
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000100010001000,
+  0b0000100010001000,
+  0b0001000100010000,
+  0b0010001000100000,
+  0b0010001000100000,
+  0b0001000100010000,
+  0b0000100010001000,
+  0b0000100010001000,
+  0b0001000100010000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000,
+  0b0000000000000000
+};
+
+PROGMEM const uint16_t fan1_icon[] = {
+  0b0000000000000000,
+  0b0111111111111110,
+  0b0111000000001110,
+  0b0110001111000110,
+  0b0100001111000010,
+  0b0100000110000010,
+  0b0101100000011010,
+  0b0101110110111010,
+  0b0101100000011010,
+  0b0100000110000010,
+  0b0100001111000010,
+  0b0110001111000110,
+  0b0111000000001110,
+  0b0111111111111110,
+  0b0000000000000000,
+  0b0000000000000000
+};
+
+PROGMEM const uint16_t fan2_icon[] = {
+  0b0000000000000000,
+  0b0111111111111110,
+  0b0111000000001110,
+  0b0110010000100110,
+  0b0100111001110010,
+  0b0101111001111010,
+  0b0100110000110010,
+  0b0100000110000010,
+  0b0100110000110010,
+  0b0101111001111010,
+  0b0100111001110010,
+  0b0110010000100110,
+  0b0111000000001110,
+  0b0111111111111110,
+  0b0000000000000000,
+  0b0000000000000000
+};
+
+PROGMEM const uint16_t feedrate_icon[] = {
+  0b0000000000000000,
+  0b0111111000000000,
+  0b0100000000000000,
+  0b0100000000000000,
+  0b0100000000000000,
+  0b0111111011111000,
+  0b0100000010000100,
+  0b0100000010000100,
+  0b0100000010000100,
+  0b0100000011111000,
+  0b0000000010001000,
+  0b0000000010000100,
+  0b0000000010000100,
+  0b0000000010000010,
+  0b0000000000000000,
+  0b0000000000000000
+};
+
+static void lcd_implementation_status_screen();
+static void lcd_in_status(bool inStatus);
+
+#endif // ULTRALCD_ST7920_LITE_STATUS_H
\ No newline at end of file
diff --git a/Marlin/src/lcd/dogm/ultralcd_impl_st7920_lite_status_screen_impl.h b/Marlin/src/lcd/dogm/ultralcd_impl_st7920_lite_status_screen_impl.h
new file mode 100644
index 0000000000..db66fc12fc
--- /dev/null
+++ b/Marlin/src/lcd/dogm/ultralcd_impl_st7920_lite_status_screen_impl.h
@@ -0,0 +1,757 @@
+/*
+ * Lightweight Status Screen for the RepRapDiscount Full
+ * Graphics Smart Controller (ST7920-based 128x64 LCD)
+ *
+ * (c) 2017 Aleph Objects, Inc.
+ *
+ * The code in this page is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GNU GPL) as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option)
+ * any later version.  The code is distributed WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.
+ *
+ */
+
+ /* This is an implementation of a status screen for the RepRapDiscount
+  * Full Graphics Smart Controller using native ST7920 commands rather
+  * than using U8Glib.
+  *
+  * This alternative status screen makes use of the built-in character
+  * generation capabilities of the ST7920 to update the status screen
+  * with less SPI traffic and CPU use. In particular:
+  *
+  *    - The fan and bed animations are handled using custom characters
+  *      that are stored in CGRAM. This allows for the animation to be
+  *      updated by writing a single character to the text-buffer (DDRAM).
+  *
+  *    - All the information in the status screen is text that is written
+  *      to DDRAM, so the work of generating the bitmaps is offloaded to
+  *      the ST7920 rather than being render by U8Glib on the MCU.
+  *
+  *    - The graphics buffer (GDRAM) is only used for static graphics
+  *      elements (nozzle and feedrate bitmaps) and for the progress
+  *      bar, so updates are sporadic.
+  */
+
+#include "../../libs/duration_t.h"
+
+typedef const __FlashStringHelper *progmem_str;
+
+#include "ultralcd_impl_st7920_lite_status_screen.h"
+
+#define BUFFER_WIDTH   256
+#define BUFFER_HEIGHT  32
+
+#define DDRAM_LINE_1   0x00
+#define DDRAM_LINE_2   0x10
+#define DDRAM_LINE_3   0x08
+#define DDRAM_LINE_4   0x18
+
+ST7920_Lite_Status_Screen::st7920_state_t ST7920_Lite_Status_Screen::current_bits;
+
+void ST7920_Lite_Status_Screen::cmd(uint8_t cmd) {
+  if(!current_bits.synced || !current_bits.cmd) {
+    current_bits.synced = true;
+    current_bits.cmd    = true;
+    sync_cmd();
+  }
+  write_byte(cmd);
+}
+
+void ST7920_Lite_Status_Screen::begin_data() {
+  extended_function_set(false);
+  if(!current_bits.synced || current_bits.cmd) {
+    current_bits.synced = true;
+    current_bits.cmd    = false;
+    sync_dat();
+  }
+}
+
+void ST7920_Lite_Status_Screen::write_word(uint16_t w) {
+  write_byte((w >> 8) & 0xFF);
+  write_byte((w >> 0) & 0xFF);
+}
+
+void ST7920_Lite_Status_Screen::write_str(const char *str) {
+  while(*str) {
+     write_byte(*str++);
+  }
+}
+
+void ST7920_Lite_Status_Screen::write_str(const char *str, uint8_t len) {
+  while(*str && len--) {
+     write_byte(*str++);
+  }
+}
+
+void ST7920_Lite_Status_Screen::write_str_P(const char *str) {
+  const char *p_str = (const char *)str;
+  char c = pgm_read_byte_near(p_str++);
+  while(c) {
+     write_byte(c);
+     c = pgm_read_byte_near(p_str++);
+  }
+}
+
+void ST7920_Lite_Status_Screen::write_str(progmem_str str) {
+  write_str_P((const char*)str);
+}
+
+void ST7920_Lite_Status_Screen::write_number(uint8_t value, uint8_t digits) {
+  char  str[7];
+  const char *fmt;
+  switch(digits) {
+    case 6: fmt = PSTR("%6d"); break;
+    case 5: fmt = PSTR("%5d"); break;
+    case 4: fmt = PSTR("%4d"); break;
+    case 3: fmt = PSTR("%3d"); break;
+    case 2: fmt = PSTR("%2d"); break;
+    case 1: fmt = PSTR("%1d"); break;
+  }
+  sprintf_P(str,fmt,value);
+  write_str(str);
+}
+
+void ST7920_Lite_Status_Screen::display_status(bool display_on, bool cursor_on, bool blink_on) {
+  extended_function_set(false);
+  cmd(0b00001000 |
+    (display_on ? 0b0100 : 0) |
+    (cursor_on  ? 0b0010 : 0) |
+    (blink_on   ? 0b0001 : 0)
+  );
+}
+
+// Sets the extended and graphics bits simultaneously, regardless of
+// the current state. This is a helper function for extended_function_set()
+// and graphics()
+void ST7920_Lite_Status_Screen::_extended_function_set(bool extended, bool graphics) {
+  cmd(  0b00100000 |
+    (extended   ? 0b00000100 : 0) |
+    (graphics   ? 0b00000010 : 0)
+  );
+  current_bits.extended = extended;
+  current_bits.graphics = graphics;
+}
+
+void ST7920_Lite_Status_Screen::extended_function_set(bool extended) {
+  if(extended != current_bits.extended) {
+    _extended_function_set(extended, current_bits.graphics);
+  }
+}
+
+void ST7920_Lite_Status_Screen::graphics(bool graphics) {
+  if(graphics != current_bits.graphics) {
+    _extended_function_set(current_bits.extended, graphics);
+  }
+}
+
+void ST7920_Lite_Status_Screen::entry_mode_select(bool ac_increase, bool shift) {
+  extended_function_set(false);
+  cmd(0b00000100 |
+    (ac_increase ? 0b00000010 : 0) |
+    (shift       ? 0b00000001 : 0)
+  );
+}
+
+// Sets the sa bit regardless of the current state. This is a helper
+// function for scroll_or_addr_select()
+void ST7920_Lite_Status_Screen::_scroll_or_addr_select(bool sa) {
+  extended_function_set(true);
+  cmd(0b00100010 |
+    (sa   ? 0b000001 : 0)
+  );
+  current_bits.sa = sa;
+}
+
+void ST7920_Lite_Status_Screen::scroll_or_addr_select(bool sa) {
+  if(sa != current_bits.sa) {
+    _scroll_or_addr_select(sa);
+  }
+}
+
+void ST7920_Lite_Status_Screen::set_ddram_address(uint8_t addr) {
+  extended_function_set(false);
+  cmd(0b10000000 | (addr & 0b00111111));
+}
+
+void ST7920_Lite_Status_Screen::set_cgram_address(uint8_t addr) {
+  extended_function_set(false);
+  cmd(0b01000000 | (addr & 0b00111111));
+}
+
+void ST7920_Lite_Status_Screen::set_gdram_address(uint8_t x, uint8_t y) {
+  extended_function_set(true);
+  cmd(0b10000000 | (y & 0b01111111));
+  cmd(0b10000000 | (x & 0b00001111));
+}
+
+void ST7920_Lite_Status_Screen::clear() {
+  extended_function_set(false);
+  cmd(0x00000001);
+  delay(15);                 //delay for CGRAM clear
+}
+
+void ST7920_Lite_Status_Screen::home() {
+  extended_function_set(false);
+  cmd(0x00000010);
+}
+
+/* This fills the entire text buffer with spaces */
+void ST7920_Lite_Status_Screen::clear_ddram()
+{
+  set_ddram_address(DDRAM_LINE_1);
+  begin_data();
+  for(int i=0; i < 64;i++) {
+    write_byte(' ');
+  }
+}
+
+/* This fills the entire graphics buffer with zeros */
+void ST7920_Lite_Status_Screen::clear_gdram()
+{
+  for(int y = 0; y < BUFFER_HEIGHT; y++) {
+    set_gdram_address(0,y);
+    begin_data();
+    for(int i = 0; i < (BUFFER_WIDTH / 16); i++) {
+      write_byte(0);
+      write_byte(0);
+    }
+  }
+}
+
+void ST7920_Lite_Status_Screen::load_cgram_icon(uint16_t addr, const void *data) {
+  const uint16_t *p_word = (const uint16_t *)data;
+  set_cgram_address(addr);
+  begin_data();
+  for(int i = 0; i < 16; i++) {
+    uint16_t word = pgm_read_word_near(p_word++);
+    write_byte((word & 0xFF00) >> 8);
+    write_byte((word & 0x00FF) >> 0);
+  }
+}
+
+/* Draws an icon in GDRAM. The position is specified in
+   as if they were DDRAM coordinates, i.e. the x position
+   is [1-8], while the y position is [1-4] */
+void ST7920_Lite_Status_Screen::draw_gdram_icon(uint8_t x, uint8_t y, const void *data) {
+  const uint16_t *p_word = (const uint16_t *)data;
+  if(y > 2) {
+    // Handle display folding
+    y -= 2;
+    x += 8;
+  }
+  x -= 1;
+  y -= 1;
+  for(int i = 0; i < 16; i++) {
+    uint16_t word = pgm_read_word_near(p_word++);
+    set_gdram_address(x,i+y*16);
+    begin_data();
+    write_byte((word & 0xFF00) >> 8);
+    write_byte((word & 0x00FF) >> 0);
+  }
+}
+
+/************************** MAIN SCREEN *************************************/
+
+void ST7920_Lite_Status_Screen::draw_static_elements() {
+  scroll_or_addr_select(0);
+
+  // Load the animated bed and fan icons
+  load_cgram_icon(CGRAM_ICON_1_ADDR, heat1_icon);
+  load_cgram_icon(CGRAM_ICON_2_ADDR, heat2_icon);
+  load_cgram_icon(CGRAM_ICON_3_ADDR, fan1_icon);
+  load_cgram_icon(CGRAM_ICON_4_ADDR, fan2_icon);
+
+  // Draw the static icons in GDRAM
+  draw_gdram_icon(1,1,nozzle_icon);
+  #if EXTRUDERS == 2
+  draw_gdram_icon(1,2,nozzle_icon);
+  #endif
+  draw_gdram_icon(6,2,feedrate_icon);
+  draw_gdram_icon(1,2,bed_icon);
+
+  // Draw the initial fan icon
+  draw_fan_icon(false);
+}
+
+/* Although this is undocumented, the ST7920 allows the character
+ * data buffer (DDRAM) to be used in conjunction with the graphics
+ * bitmap buffer (CGRAM). The contents of the graphics buffer is
+ * XORed with the data from the character generator. This allows
+ * us to make the progess bar out of graphical data (the bar) and
+ * text data (the percentage).
+ */
+void ST7920_Lite_Status_Screen::draw_progress_bar(uint8_t value) {
+  #if EXTRUDERS == 1
+    // If we have only one extruder, draw a long progress bar on the third line
+    const int top        = 1;         // Top in pixels
+    const int bottom     = 13;        // Bottom in pixels
+    const int left       = 8;         // Left edge, in 16-bit words
+    const int width      = 5;         // Width of progress bar, in 16-bit words
+  #else
+    const int top        = 16 + 1;    // Top in pixels
+    const int bottom     = 16 + 13;   // Bottom in pixels
+    const int left       = 5;         // Left edge, in 16-bit words
+    const int width      = 3;         // Width of progress bar, in 16-bit words
+  #endif
+  const int char_pcnt  = 100/width; // How many percent does each 16-bit word represent?
+
+  // Draw the progress bar as a bitmap in CGRAM
+
+  for(int y = top; y <= bottom; y++) {
+    set_gdram_address(left,y);
+    begin_data();
+    for(int x = 0; x < width; x++) {
+      uint16_t gfx_word = 0x0000;
+      if((x+1)*char_pcnt <= value) {
+        // Draw completely filled bytes
+        gfx_word = 0xFFFF;
+      } else if((x*char_pcnt) < value) {
+        // Draw partially filled bytes
+        gfx_word = int(0x8000) >> (value % char_pcnt)*16/char_pcnt;
+      }
+      // Draw the frame around the progress bar
+      if(y == top || y == bottom) {
+        // Draw top/bottom border
+        gfx_word = 0xFFFF;
+      } else if (x == (width-1)) {
+        // Draw right border
+        gfx_word |= 0x0001;
+      } else if (x == 0) {
+        // Draw left border
+        gfx_word |= 0x8000;
+      }
+      write_word(gfx_word);
+    }
+  }
+
+  // Draw the percentage as text in DDRAM
+
+  #if EXTRUDERS == 1
+    set_ddram_address(DDRAM_LINE_3 + 1);
+  #else
+    set_ddram_address(DDRAM_LINE_2 + left);
+  #endif
+
+  begin_data();
+  if(value > 9) {
+    write_number(value,4);
+    write_str(F("% "));
+  } else {
+    write_number(value,3);
+    write_str(F("%  "));
+  }
+}
+
+void ST7920_Lite_Status_Screen::draw_fan_icon(bool whichIcon) {
+  set_ddram_address(DDRAM_LINE_1+5);
+  begin_data();
+  write_word(whichIcon ? CGRAM_ICON_3_WORD : CGRAM_ICON_4_WORD);
+}
+
+void ST7920_Lite_Status_Screen::draw_heat_icon(bool whichIcon, bool heating) {
+  #if EXTRUDERS == 1
+    set_ddram_address(DDRAM_LINE_2);
+  #else
+    set_ddram_address(DDRAM_LINE_3);
+  #endif
+  begin_data();
+  if(heating) {
+    write_word(whichIcon ? CGRAM_ICON_1_WORD : CGRAM_ICON_2_WORD);
+  } else {
+    write_byte(' ');
+    write_byte(' ');
+  }
+}
+
+#define FAR(a,b) (((a > b) ? (a-b) : (b-a)) > 1)
+
+void ST7920_Lite_Status_Screen::draw_extruder_1_temp(uint8_t temp, uint8_t target) {
+  set_ddram_address(DDRAM_LINE_1+1);
+  begin_data();
+  write_number(temp);
+  if(target && FAR(temp, target)) {
+    write_str(F("\x1A"));
+    write_number(target);
+  } else {
+    write_str(F("    "));
+  }
+}
+
+void ST7920_Lite_Status_Screen::draw_extruder_2_temp(uint8_t temp, uint8_t target) {
+  set_ddram_address(DDRAM_LINE_2+1);
+  begin_data();
+  write_number(temp);
+  if(target && FAR(temp, target)) {
+    write_str(F("\x1A"));
+    write_number(target);
+  } else {
+    write_str(F("    "));
+  }
+}
+
+void ST7920_Lite_Status_Screen::draw_bed_temp(uint8_t temp, uint8_t target) {
+  #if EXTRUDERS == 1
+  set_ddram_address(DDRAM_LINE_2+1);
+  #else
+  set_ddram_address(DDRAM_LINE_3+1);
+  #endif
+  begin_data();
+  write_number(temp);
+  if(target && FAR(temp, target)) {
+    write_str(F("\x1A"));
+    write_number(target);
+  } else {
+    write_str(F("    "));
+  }
+}
+
+void ST7920_Lite_Status_Screen::draw_fan_speed(uint8_t value) {
+  set_ddram_address(DDRAM_LINE_1+6);
+  begin_data();
+  write_number(value,4);
+}
+
+void ST7920_Lite_Status_Screen::draw_print_time(uint32_t elapsed) {
+  const uint8_t hrs = elapsed/3600;
+  const uint8_t min = (elapsed/60)%60;
+  char  str[7];
+  sprintf_P(str,hrs > 99 ? PSTR("%03d:%02d") : PSTR(" %02d:%02d"),hrs,min);
+
+  set_ddram_address(DDRAM_LINE_3+5);
+  begin_data();
+  write_str(str);
+}
+
+void ST7920_Lite_Status_Screen::draw_feedrate_percentage(uint8_t percentage) {
+  // We only have enough room for the feedrate when
+  // we have one extruder
+  #if EXTRUDERS == 1
+    set_ddram_address(DDRAM_LINE_2+6);
+    begin_data();
+    write_number(percentage,4);
+  #endif
+}
+
+void ST7920_Lite_Status_Screen::draw_status_message(const char *str) {
+  set_ddram_address(DDRAM_LINE_4);
+  begin_data();
+  #if ENABLED(STATUS_MESSAGE_SCROLLING)
+    const uint8_t lcd_len = 16;
+    const uint8_t padding = 2;
+    uint8_t str_len = strlen(str);
+
+    // Trim whitespace at the end of the str, as for some reason
+    // messages like "Card Inserted" are padded with many spaces
+    while(str_len > 0 && str[str_len-1] == ' ') {
+      str_len--;
+    }
+
+    if(str_len <= lcd_len) {
+      // It all fits on the LCD without scrolling
+      write_str(str);
+    } else {
+      // Print the message repeatedly until covering the LCD
+      uint8_t c = status_scroll_pos;
+      for(uint8_t n = 0; n < lcd_len; n++) {
+        write_byte(c < str_len ? str[c] : ' ');
+        c++;
+        c %= str_len + padding; // Wrap around
+      }
+
+      // Scroll the message
+      if(status_scroll_pos == str_len + padding) {
+        status_scroll_pos = 0;
+      } else {
+        status_scroll_pos++;
+      }
+    }
+  #else
+    write_str(str, 16);
+  #endif
+}
+
+void ST7920_Lite_Status_Screen::draw_position(const float x, const float y, const float z, bool position_known) {
+  char str[7];
+  set_ddram_address(DDRAM_LINE_4);
+  begin_data();
+
+  // If position is unknown, flash the labels.
+  const unsigned char alt_label = position_known ? 0 : (lcd_blink() ? ' ' : 0);
+
+  dtostrf(x, -4, 0, str);
+  write_byte(alt_label ? alt_label : 'X');
+  write_str(str, 4);
+
+  dtostrf(y, -4, 0, str);
+  write_byte(alt_label ? alt_label : 'Y');
+  write_str(str, 4);
+
+  dtostrf(z, -5, 1, str);
+  write_byte(alt_label ? alt_label : 'Z');
+  write_str(str, 5);
+}
+
+bool ST7920_Lite_Status_Screen::indicators_changed() {
+  // We only add the target temperatures to the checksum
+  // because the actual temps fluctuate so by updating
+  // them only during blinks we gain a bit of stability.
+  const bool       blink             = lcd_blink();
+  const uint8_t    feedrate_perc     = feedrate_percentage;
+  const uint8_t    fan_speed         = ((fanSpeeds[0] + 1) * 100) / 256;
+  const float      extruder_1_target = thermalManager.degTargetHotend(0);
+  #if EXTRUDERS == 2
+  const float      extruder_2_target = thermalManager.degTargetHotend(1);
+  #endif
+  const float      bed_target        = thermalManager.degTargetBed();
+
+  static uint8_t last_checksum = 0;
+
+  const  uint8_t checksum =
+    uint8_t(blink) ^
+    uint8_t(feedrate_perc) ^
+    uint8_t(fan_speed) ^
+    uint8_t(extruder_1_target) ^
+#if EXTRUDERS == 2
+    uint8_t(extruder_2_target) ^
+#endif
+    uint8_t(bed_target);
+
+  if(last_checksum == checksum) {
+    return false;
+  } else {
+    last_checksum = checksum;
+    return true;
+  }
+}
+
+void ST7920_Lite_Status_Screen::update_indicators(bool forceUpdate) {
+  if(forceUpdate || indicators_changed()) {
+    const bool       blink             = lcd_blink();
+    const duration_t elapsed           = print_job_timer.duration();
+    const uint32_t   seconds_elapsed   = elapsed.value;
+    const uint8_t    feedrate_perc     = feedrate_percentage;
+    const uint8_t    fan_speed         = ((fanSpeeds[0] + 1) * 100) / 256;
+    const float      extruder_1_temp   = thermalManager.degHotend(0);
+    const float      extruder_1_target = thermalManager.degTargetHotend(0);
+    #if EXTRUDERS == 2
+    const float      extruder_2_temp   = thermalManager.degHotend(1);
+    const float      extruder_2_target = thermalManager.degTargetHotend(1);
+    #endif
+    const float      bed_temp          = thermalManager.degBed();
+    const float      bed_target        = thermalManager.degTargetBed();
+
+    draw_extruder_1_temp(extruder_1_temp, extruder_1_target);
+    #if EXTRUDERS == 2
+    draw_extruder_2_temp(extruder_2_temp, extruder_2_target);
+    #endif
+    draw_bed_temp(bed_temp, bed_target);
+    draw_fan_speed(fan_speed);
+    draw_print_time(seconds_elapsed);
+    draw_feedrate_percentage(feedrate_perc);
+
+    // Update the fan and bed animations
+    if(fan_speed > 0) {
+      draw_fan_icon(blink);
+    }
+    if(bed_target > 0) {
+      draw_heat_icon(blink, true);
+    } else {
+      draw_heat_icon(false, false);
+    }
+  }
+}
+
+bool ST7920_Lite_Status_Screen::position_changed() {
+  const float x_pos = current_position[X_AXIS];
+  const float y_pos = current_position[Y_AXIS];
+  const float z_pos = current_position[Z_AXIS];
+  const uint8_t checksum = uint8_t(x_pos) ^ uint8_t(y_pos) ^ uint8_t(z_pos);
+
+  static uint8_t last_checksum = 0;
+  if(last_checksum == checksum) {
+    return false;
+  } else {
+    last_checksum = checksum;
+    return true;
+  }
+}
+
+bool ST7920_Lite_Status_Screen::status_changed() {
+  uint8_t checksum = 0;
+  for(const char *p = lcd_status_message; *p; p++) {
+    checksum ^= *p;
+  }
+
+  static uint8_t last_checksum = 0;
+  if(last_checksum == checksum) {
+    return false;
+  } else {
+    last_checksum = checksum;
+    return true;
+  }
+}
+
+bool ST7920_Lite_Status_Screen::blink_changed() {
+  static uint8_t last_blink = 0;
+
+  const bool blink = lcd_blink();
+  if(last_blink == blink) {
+    return false;
+  } else {
+    last_blink = blink;
+    return true;
+  }
+}
+
+void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) {
+  static uint8_t countdown = 0;
+
+  /* There is only enough room in the display for either the
+   * status message or the position, not both, so we choose
+   * one or another. Whenever the status message changes,
+   * we show it for a number of consecutive seconds, but
+   * then go back to showing the position as soon as the
+   * head moves, i.e:
+   *
+   *    countdown > 1    -- Show status
+   *    countdown = 1    -- Show status, until movement
+   *    countdown = 0    -- Show position
+   */
+  if( forceUpdate || status_changed() ) {
+    #if ENABLED(STATUS_MESSAGE_SCROLLING)
+      status_scroll_pos = 0;
+    #endif
+    if(lcd_strlen(lcd_status_message)) {
+      countdown = DELAY_TO_SHOW_POSITION;
+    } else {
+      countdown = 0;
+    }
+    draw_status_message(lcd_status_message);
+    blink_changed(); // Clear changed flag
+  }
+  else if(countdown > 1 && blink_changed() ) {
+    countdown--;
+    #if ENABLED(STATUS_MESSAGE_SCROLLING)
+    draw_status_message(lcd_status_message);
+    #endif
+  }
+  else if(countdown > 0 && blink_changed() ) {
+    if(position_changed()) {
+      countdown--;
+      forceUpdate = true;
+    }
+    #if ENABLED(STATUS_MESSAGE_SCROLLING)
+    draw_status_message(lcd_status_message);
+    #endif
+  }
+  if(countdown == 0 && (forceUpdate || position_changed() ||
+    #if DISABLED(DISABLE_REDUCED_ACCURACY_WARNING)
+    blink_changed()
+    #endif
+  )) {
+    draw_position(
+      current_position[X_AXIS],
+      current_position[Y_AXIS],
+      current_position[Z_AXIS],
+      #if ENABLED(DISABLE_REDUCED_ACCURACY_WARNING)
+        true
+      #else
+        axis_known_position[X_AXIS] &&
+        axis_known_position[Y_AXIS] &&
+        axis_known_position[Z_AXIS]
+      #endif
+    );
+  }
+}
+
+void ST7920_Lite_Status_Screen::update_progress(bool forceUpdate) {
+  #if ENABLED(SDSUPPORT)
+    const uint8_t percent_done = card.percentDone();
+  #else
+    const uint8_t percent_done = 0;
+  #endif
+
+  // Since the progress bar involves writing
+  // quite a few bytes to GDRAM, only do this
+  // when an update is actually necessary.
+
+  static uint8_t last_progress = 0;
+  if(!forceUpdate && last_progress == percent_done)
+    return;
+  last_progress = percent_done;
+
+  draw_progress_bar(percent_done);
+}
+
+void ST7920_Lite_Status_Screen::update(bool forceUpdate) {
+  cs();
+  update_indicators(forceUpdate);
+  update_status_or_position(forceUpdate);
+  update_progress(forceUpdate);
+  ncs();
+}
+
+void ST7920_Lite_Status_Screen::reset_state_from_unknown() {
+  _extended_function_set(true, true); // Do it twice as only one bit
+  _extended_function_set(true, true); // get set at a time.
+  _scroll_or_addr_select(false);
+}
+
+void ST7920_Lite_Status_Screen::on_entry() {
+  cs();
+  reset_state_from_unknown();
+  clear();
+  clear_gdram();
+  draw_static_elements();
+  update(true);
+  ncs();
+}
+
+void ST7920_Lite_Status_Screen::on_exit() {
+  cs();
+  clear();
+  _extended_function_set(true, true); // Restore state to what u8g expects.
+  ncs();
+}
+
+// This is called prior to the KILL screen to
+// clear the screen so we don't end up with a
+// garbled display.
+void ST7920_Lite_Status_Screen::clear_text_buffer() {
+  cs();
+  reset_state_from_unknown();
+  clear();
+  _extended_function_set(true, true); // Restore state to what u8g expects.
+  ncs();
+}
+
+static void lcd_implementation_status_screen() {
+  ST7920_Lite_Status_Screen::update(false);
+}
+
+/* In order to properly update the lite status screen,
+ * we must know when we have entered and left the
+ * status screen. Since the ultralcd code is not
+ * set up for doing this, we call this function before
+ * each update indicating whether the current screen
+ * is the status screen.
+ *
+ * This function keeps track of whether we have left or
+ * entered the status screen and calls the on_entry()
+ * and on_exit() methods for cleanup.
+ */
+
+static void lcd_in_status(bool inStatus) {
+  static bool lastInStatus = false;
+  if(!lastInStatus && inStatus) {
+    ST7920_Lite_Status_Screen::on_entry();
+    lastInStatus = true;
+  }
+  if(lastInStatus && !inStatus) {
+    ST7920_Lite_Status_Screen::on_exit();
+    lastInStatus = false;
+  }
+}
\ No newline at end of file
diff --git a/Marlin/src/lcd/dogm/ultralcd_impl_st7920_lite_status_screen_impl_spi.h b/Marlin/src/lcd/dogm/ultralcd_impl_st7920_lite_status_screen_impl_spi.h
new file mode 100644
index 0000000000..1a0a33be4a
--- /dev/null
+++ b/Marlin/src/lcd/dogm/ultralcd_impl_st7920_lite_status_screen_impl_spi.h
@@ -0,0 +1,39 @@
+/*
+ * Lightweight Status Screen for the RepRapDiscount Full
+ * Graphics Smart Controller (ST7920-based 128x64 LCD)
+ *
+ * (c) 2017 Aleph Objects, Inc.
+ *
+ * The code in this page is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GNU GPL) as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option)
+ * any later version.  The code is distributed WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.
+ *
+ */
+
+#include "ultralcd_impl_st7920_lite_status_screen.h"
+
+void ST7920_Lite_Status_Screen::cs() {
+  ST7920_CS();
+  current_bits.synced = false;
+}
+
+void ST7920_Lite_Status_Screen::ncs() {
+  ST7920_NCS();
+  current_bits.synced = false;
+}
+
+void ST7920_Lite_Status_Screen::sync_cmd() {
+  ST7920_SET_CMD();
+}
+
+void ST7920_Lite_Status_Screen::sync_dat() {
+  ST7920_SET_DAT();
+}
+
+void ST7920_Lite_Status_Screen::write_byte(uint8_t data) {
+  ST7920_WRITE_NIBBLES(data);
+}
\ No newline at end of file
diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp
index bc1e8bc16e..39a3cc17a1 100644
--- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp
+++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp
@@ -124,10 +124,12 @@ uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo
       ST7920_CS();
       u8g_Delay(120);                 //initial delay for boot up
       ST7920_SET_CMD();
+      ST7920_WRITE_BYTE(0x20);       //non-extended mode
       ST7920_WRITE_BYTE(0x08);       //display off, cursor+blink off
-      ST7920_WRITE_BYTE(0x01);       //clear CGRAM ram
-      u8g_Delay(15);                 //delay for CGRAM clear
-      ST7920_WRITE_BYTE(0x3E);       //extended mode + GDRAM active
+      ST7920_WRITE_BYTE(0x01);       //clear DDRAM ram
+      u8g_Delay(15);                    //delay for DDRAM clear
+      ST7920_WRITE_BYTE(0x24);       //extended mode
+      ST7920_WRITE_BYTE(0x26);       //extended mode + GDRAM active
       for (y = 0; y < (LCD_PIXEL_HEIGHT) / 2; y++) { //clear GDRAM
         ST7920_WRITE_BYTE(0x80 | y); //set y
         ST7920_WRITE_BYTE(0x80);     //set x = 0
@@ -181,6 +183,14 @@ uint8_t   u8g_dev_st7920_128x64_rrd_buf[(LCD_PIXEL_WIDTH) * (PAGE_HEIGHT) / 8] U
 u8g_pb_t  u8g_dev_st7920_128x64_rrd_pb = {{PAGE_HEIGHT, LCD_PIXEL_HEIGHT, 0, 0, 0}, LCD_PIXEL_WIDTH, u8g_dev_st7920_128x64_rrd_buf};
 u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = {u8g_dev_rrd_st7920_128x64_fn, &u8g_dev_st7920_128x64_rrd_pb, &u8g_com_null_fn};
 
+#if ENABLED(USE_ST7920_LIGHTWEIGHT_UI)
+  typedef const __FlashStringHelper *progmem_str;
+
+  // We have to include the code for the lightweight UI here
+  // as it relies on macros that are only defined in this file.
+  #include "ultralcd_impl_st7920_lite_status_screen_impl_spi.h"
+#endif
+
 #pragma GCC reset_options
 
 #endif // U8G_HAL_LINKS
diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp
index c4b6756d0e..b7a66e894c 100644
--- a/Marlin/src/lcd/ultralcd.cpp
+++ b/Marlin/src/lcd/ultralcd.cpp
@@ -5116,20 +5116,38 @@ void lcd_update() {
       #endif
 
       #if ENABLED(DOGLCD)
-        if (!drawing_screen) {                        // If not already drawing pages
-          u8g.firstPage();                            // Start the first page
-          drawing_screen = 1;                         // Flag as drawing pages
-        }
-        lcd_setFont(FONT_MENU);                       // Setup font for every page draw
-        u8g.setColorIndex(1);                         // And reset the color
-        CURRENTSCREEN();                              // Draw and process the current screen
+        #if defined(USE_ST7920_LIGHTWEIGHT_UI)
+          #if ENABLED(ULTIPANEL)
+            bool do_U8G_loop = true;
+            lcd_in_status(currentScreen == lcd_status_screen);
+            if(currentScreen == lcd_status_screen) {
+              lcd_status_screen();
+              do_U8G_loop = false;
+            }
+          #else
+            const bool do_U8G_loop = false;
+            lcd_in_status(true);
+            lcd_status_screen();
+          #endif
+        #else
+          const bool do_U8G_loop = true;
+        #endif
+        if(do_U8G_loop) {
+          if (!drawing_screen) {                        // If not already drawing pages
+            u8g.firstPage();                            // Start the first page
+            drawing_screen = 1;                         // Flag as drawing pages
+          }
+          lcd_setFont(FONT_MENU);                       // Setup font for every page draw
+          u8g.setColorIndex(1);                         // And reset the color
+          CURRENTSCREEN();                              // Draw and process the current screen
 
-        // The screen handler can clear drawing_screen for an action that changes the screen.
-        // If still drawing and there's another page, update max-time and return now.
-        // The nextPage will already be set up on the next call.
-        if (drawing_screen && (drawing_screen = u8g.nextPage())) {
-          NOLESS(max_display_update_time, millis() - ms);
-          return;
+          // The screen handler can clear drawing_screen for an action that changes the screen.
+          // If still drawing and there's another page, update max-time and return now.
+          // The nextPage will already be set up on the next call.
+          if (drawing_screen && (drawing_screen = u8g.nextPage())) {
+            NOLESS(max_display_update_time, millis() - ms);
+            return;
+          }
         }
       #else
         CURRENTSCREEN();
diff --git a/Marlin/src/lcd/ultralcd_impl_DOGM.h b/Marlin/src/lcd/ultralcd_impl_DOGM.h
index 0b7b4badf6..2ec7432c5d 100644
--- a/Marlin/src/lcd/ultralcd_impl_DOGM.h
+++ b/Marlin/src/lcd/ultralcd_impl_DOGM.h
@@ -54,6 +54,11 @@
 
 #include "dogm/dogm_bitmaps.h"
 
+#if ENABLED(USE_ST7920_LIGHTWEIGHT_UI)
+  typedef const __FlashStringHelper *progmem_str;
+  #include "dogm/ultralcd_impl_st7920_lite_status_screen_impl.h"
+#endif
+
 #if ENABLED(SDSUPPORT)
   #include "../libs/duration_t.h"
 #endif
@@ -373,6 +378,9 @@ static void lcd_implementation_init() {
 
 // The kill screen is displayed for unrecoverable conditions
 void lcd_kill_screen() {
+  #if ENABLED(USE_ST7920_LIGHTWEIGHT_UI)
+    ST7920_Lite_Status_Screen::clear_text_buffer();
+  #endif
   const uint8_t h4 = u8g.getHeight() / 4;
   u8g.firstPage();
   do {
@@ -498,6 +506,7 @@ inline void lcd_implementation_status_message(const bool blink) {
   #endif
 }
 
+#if !ENABLED(USE_ST7920_LIGHTWEIGHT_UI)
 static void lcd_implementation_status_screen() {
 
   const bool blink = lcd_blink();
@@ -801,6 +810,7 @@ static void lcd_implementation_status_screen() {
     #endif
   }
 }
+#endif
 
 #if ENABLED(ULTIPANEL)