diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/screen_types.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/screen_types.h
index 44204b33565e049334517736f0d2e7d782955712..e42ff41d67183e676a54b5dc093904b12ec6139b 100644
--- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/screen_types.h
+++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/screen_types.h
@@ -199,6 +199,9 @@ class CachedScreen {
 
   public:
     static void onRefresh() {
+      #if ENABLED(TOUCH_UI_DEBUG)
+        const uint32_t start_time = millis();
+      #endif
       using namespace FTDI;
       DLCache dlcache(DL_SLOT);
       CommandProcessor cmd;
@@ -220,5 +223,8 @@ class CachedScreen {
       cmd.cmd(DL::DL_DISPLAY);
       cmd.cmd(CMD_SWAP);
       cmd.execute();
+      #if ENABLED(TOUCH_UI_DEBUG)
+        SERIAL_ECHOLNPAIR("Time to draw screen (ms): ", millis() - start_time);
+      #endif
     }
 };
diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_en.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_en.h
index 5731e4984bde283c85602ec6da9ac0907e910fba..4182277cbba2feb04a8ae1651692efbbd8117566 100644
--- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_en.h
+++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/language/language_en.h
@@ -197,7 +197,7 @@
 #else
   #define LULZBOT_BIOPRINTER_STRINGS ,\
     MAIN_MENU, \
-    UNLOCK_XY_AXIS, \
+    RELEASE_XY_AXIS, \
     LOAD_SYRINGE, \
     BED_TEMPERATURE, \
     LOADING_WARNING, \
@@ -302,7 +302,11 @@ namespace Language_en {
   PROGMEM Language_Str PLEASE_RESET             = u8"Please reset";
 
   PROGMEM Language_Str COLOR_TOUCH_PANEL        = u8"Color Touch Panel";
-  PROGMEM Language_Str ABOUT_ALEPH_OBJECTS      = u8"(C) 2019 Aleph Objects, Inc.\n\nwww.lulzbot.com";
+  #if ENABLED(TOUCH_UI_UTF8_COPYRIGHT)
+    PROGMEM Language_Str ABOUT_ALEPH_OBJECTS    = u8"© 2019 Aleph Objects, Inc.\n\nwww.lulzbot.com";
+  #else
+    PROGMEM Language_Str ABOUT_ALEPH_OBJECTS    = u8"(C) 2019 Aleph Objects, Inc.\n\nwww.lulzbot.com";
+  #endif
 
   PROGMEM Language_Str FIRMWARE_FOR_TOOLHEAD    = u8"Firmware for toolhead:\n%s\n\n";
 
@@ -327,10 +331,14 @@ namespace Language_en {
   PROGMEM Language_Str UNITS_MILLIAMP           = u8"mA";
   PROGMEM Language_Str UNITS_MM                 = u8"mm";
   PROGMEM Language_Str UNITS_MM_S               = u8"mm/s";
-  PROGMEM Language_Str UNITS_MM_S2              = u8"mm/s^2";
+  #if ENABLED(TOUCH_UI_UTF8_WESTERN_CHARSET)
+    PROGMEM Language_Str UNITS_MM_S2            = u8"mm/s²";
+  #else
+    PROGMEM Language_Str UNITS_MM_S2            = u8"mm/s^2";
+  #endif
   PROGMEM Language_Str UNITS_STEP_MM            = u8"st/mm";
   PROGMEM Language_Str UNITS_PERCENT            = u8"%";
-  #if defined(TOUCH_UI_USE_UTF8) && defined(TOUCH_UI_UTF8_WESTERN_CHARSET)
+  #if ENABLED(TOUCH_UI_UTF8_WESTERN_CHARSET)
     PROGMEM Language_Str UNITS_C                = u8"°C";
   #else
     PROGMEM Language_Str UNITS_C                = u8" C";
@@ -399,10 +407,10 @@ namespace Language_en {
 
   #ifdef LULZBOT_USE_BIOPRINTER_UI
     PROGMEM Language_Str MAIN_MENU              = u8"Main Menu";
-    PROGMEM Language_Str UNLOCK_XY_AXIS         = u8"Unlock XY Axis";
+    PROGMEM Language_Str RELEASE_XY_AXIS        = u8"Release XY Axis";
     PROGMEM Language_Str LOAD_SYRINGE           = u8"Load Syringe";
     PROGMEM Language_Str BED_TEMPERATURE        = u8"Bed Temperature";
-    PROGMEM Language_Str LOADING_WARNING        = u8"About to home to loading position.\nEnsure the top and the bed of the printer are clear.\n\nContinue?";
+    PROGMEM Language_Str LOADING_WARNING        = u8"About to home to loading position. Ensure the top and the bed of the printer are clear.\n\nContinue?";
     PROGMEM Language_Str HOMING_WARNING         = u8"About to re-home plunger and auto-level. Remove syringe prior to proceeding.\n\nContinue?";
   #endif
 
diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/base_numeric_adjustment_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/base_numeric_adjustment_screen.cpp
index 9c8cca68e639e8485c431ed83c5045cb3e405f5d..480315620cf38633d6c533a29ec0d326abe62318 100644
--- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/base_numeric_adjustment_screen.cpp
+++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/base_numeric_adjustment_screen.cpp
@@ -33,34 +33,84 @@ using namespace Theme;
 #ifdef TOUCH_UI_PORTRAIT
   #define GRID_COLS 13
   #define GRID_ROWS 10
+  #define LAYOUT_FONT font_small
 #else
   #define GRID_COLS 18
   #define GRID_ROWS  7
+  #define LAYOUT_FONT font_medium
 #endif
 
 BaseNumericAdjustmentScreen::widgets_t::widgets_t(draw_mode_t what) : _what(what) {
+  CommandProcessor cmd;
+
   if (what & BACKGROUND) {
-    CommandProcessor cmd;
     cmd.cmd(CLEAR_COLOR_RGB(bg_color))
-       .cmd(CLEAR(true,true,true));
+       .cmd(CLEAR(true,true,true))
+       .colors(normal_btn)
+       .cmd(COLOR_RGB(bg_text_enabled));
   }
 
-  if (what & FOREGROUND) {
-    CommandProcessor cmd;
-    cmd.font(font_medium)
-       .colors(action_btn)
+  cmd.font(font_medium);
+  _button(cmd, 1,
     #ifdef TOUCH_UI_PORTRAIT
-       .tag(1).button( BTN_POS(1,10), BTN_SIZE(13,1), GET_TEXTF(BACK))
+      BTN_POS(1,10), BTN_SIZE(13,1),
     #else
-       .tag(1).button( BTN_POS(15,7), BTN_SIZE(4,1),  GET_TEXTF(BACK))
+      BTN_POS(15,7), BTN_SIZE(4,1),
     #endif
-       .colors(normal_btn);
-  }
+    GET_TEXTF(BACK), true, true
+  );
 
   _line = 1;
   _units = F("");
 }
 
+/**
+ * Speed optimization for changing button style.
+ */
+void BaseNumericAdjustmentScreen::widgets_t::_button_style(CommandProcessor &cmd, BaseNumericAdjustmentScreen::widgets_t::style_t style) {
+  if (_style != style) {
+    const btn_colors *old_colors = &normal_btn;
+    const btn_colors *new_colors = &normal_btn;
+
+    switch(_style) {
+      case BTN_ACTION:   old_colors = &action_btn;   break;
+      case BTN_TOGGLE:   old_colors = &ui_toggle;    break;
+      case BTN_DISABLED: old_colors = &disabled_btn; break;
+      default: break;
+    }
+    switch(style) {
+      case BTN_ACTION:   new_colors = &action_btn;   break;
+      case BTN_TOGGLE:   new_colors = &ui_toggle;    break;
+      case BTN_DISABLED: new_colors = &disabled_btn; break;
+      default: break;
+    }
+
+    const bool rgb_changed  =  old_colors->rgb  != new_colors->rgb;
+    const bool grad_changed =  old_colors->grad != new_colors->grad;
+    const bool fg_changed   = (old_colors->fg   != new_colors->fg) || (_style == TEXT_AREA);
+    const bool bg_changed   =  old_colors->bg   != new_colors->bg;
+
+    if (rgb_changed)  cmd.cmd(COLOR_RGB(new_colors->rgb));
+    if (grad_changed) cmd.gradcolor(new_colors->grad);
+    if (fg_changed)   cmd.fgcolor(new_colors->fg);
+    if (bg_changed)   cmd.bgcolor(new_colors->bg);
+
+    _style = style;
+  }
+}
+
+/**
+ * Speed optimization for drawing buttons. Draw all unpressed buttons in the
+ * background layer and draw only the pressed button in the foreground layer.
+ */
+void BaseNumericAdjustmentScreen::widgets_t::_button(CommandProcessor &cmd, uint8_t tag, int16_t x, int16_t y, int16_t w, int16_t h, progmem_str text, bool enabled, bool highlight) {
+  if (_what & BACKGROUND) enabled = true;
+  if ((_what & BACKGROUND) || buttonIsPressed(tag) || highlight || !enabled) {
+    _button_style(cmd, (!enabled) ? BTN_DISABLED : (highlight ? BTN_ACTION : BTN_NORMAL));
+    cmd.tag(enabled ? tag : 0).button(x, y, w, h, text);
+  }
+}
+
 BaseNumericAdjustmentScreen::widgets_t &BaseNumericAdjustmentScreen::widgets_t::precision(uint8_t decimals, precision_default_t initial) {
   _decimals = decimals;
   if (screen_data.BaseNumericAdjustmentScreen.increment == 0) {
@@ -70,14 +120,17 @@ BaseNumericAdjustmentScreen::widgets_t &BaseNumericAdjustmentScreen::widgets_t::
 }
 
 void BaseNumericAdjustmentScreen::widgets_t::heading(progmem_str label) {
-  CommandProcessor cmd;
-  cmd.font(font_medium).cmd(COLOR_RGB(bg_text_enabled));
   if (_what & BACKGROUND) {
-    #ifdef TOUCH_UI_PORTRAIT
-      cmd.tag(0).fgcolor(bg_color).button( BTN_POS(1, _line), BTN_SIZE(12,1), label, OPT_FLAT);
-    #else
-      cmd.tag(0).fgcolor(bg_color).button( BTN_POS(5, _line), BTN_SIZE(8,1),  label, OPT_FLAT);
-    #endif
+    CommandProcessor cmd;
+    cmd.font(font_medium)
+       .text(
+         #ifdef TOUCH_UI_PORTRAIT
+           BTN_POS(1, _line), BTN_SIZE(12,1),
+         #else
+           BTN_POS(5, _line), BTN_SIZE(8,1),
+         #endif
+         label
+       );
   }
 
   _line++;
@@ -93,8 +146,7 @@ void BaseNumericAdjustmentScreen::widgets_t::heading(progmem_str label) {
   #endif
 #endif
 
-void BaseNumericAdjustmentScreen::widgets_t::_draw_increment_btn(uint8_t, const uint8_t tag) {
-  CommandProcessor  cmd;
+void BaseNumericAdjustmentScreen::widgets_t::_draw_increment_btn(CommandProcessor &cmd, uint8_t, const uint8_t tag) {
   const char        *label = PSTR("?");
   uint8_t            pos;
   uint8_t &          increment = screen_data.BaseNumericAdjustmentScreen.increment;
@@ -112,48 +164,43 @@ void BaseNumericAdjustmentScreen::widgets_t::_draw_increment_btn(uint8_t, const
     default:  label = PSTR("100"    ); pos = _decimals + 2; break;
   }
 
-  cmd.tag(tag)
-     .colors(increment == tag ? action_btn : normal_btn)
-  #ifdef TOUCH_UI_PORTRAIT
-     .font(font_small);
-  #else
-     .font(font_medium);
-  #endif
+  const bool highlight = (_what & FOREGROUND) && (increment == tag);
+
   switch (pos) {
     #ifdef TOUCH_UI_PORTRAIT
-      case 0: cmd.button( BTN_POS(5,_line), BTN_SIZE(2,1), progmem_str(label)); break;
-      case 1: cmd.button( BTN_POS(7,_line), BTN_SIZE(2,1), progmem_str(label)); break;
-      case 2: cmd.button( BTN_POS(9,_line), BTN_SIZE(2,1), progmem_str(label)); break;
+      case 0: _button(cmd, tag, BTN_POS(5,_line), BTN_SIZE(2,1), progmem_str(label), true, highlight); break;
+      case 1: _button(cmd, tag, BTN_POS(7,_line), BTN_SIZE(2,1), progmem_str(label), true, highlight); break;
+      case 2: _button(cmd, tag, BTN_POS(9,_line), BTN_SIZE(2,1), progmem_str(label), true, highlight); break;
     #else
-      case 0: cmd.button( BTN_POS(15,2),    BTN_SIZE(4,1), progmem_str(label)); break;
-      case 1: cmd.button( BTN_POS(15,3),    BTN_SIZE(4,1), progmem_str(label)); break;
-      case 2: cmd.button( BTN_POS(15,4),    BTN_SIZE(4,1), progmem_str(label)); break;
+      case 0: _button(cmd, tag, BTN_POS(15,2),    BTN_SIZE(4,1), progmem_str(label), true, highlight); break;
+      case 1: _button(cmd, tag, BTN_POS(15,3),    BTN_SIZE(4,1), progmem_str(label), true, highlight); break;
+      case 2: _button(cmd, tag, BTN_POS(15,4),    BTN_SIZE(4,1), progmem_str(label), true, highlight); break;
     #endif
   }
-  cmd.colors(normal_btn);
 }
 
-
 void BaseNumericAdjustmentScreen::widgets_t::increments() {
+  CommandProcessor cmd;
+
+  cmd.font(LAYOUT_FONT);
+
   if (_what & BACKGROUND) {
-    CommandProcessor cmd;
-    cmd.fgcolor(bg_color)
-       .tag(0)
-    #ifdef TOUCH_UI_PORTRAIT
-       .font(font_small).button( BTN_POS(1, _line),  BTN_SIZE(4,1), GET_TEXTF(INCREMENT), OPT_FLAT);
-    #else
-       .font(font_medium).button( BTN_POS(15,1),     BTN_SIZE(4,1), GET_TEXTF(INCREMENT), OPT_FLAT);
-    #endif
+    cmd.text(
+      #ifdef TOUCH_UI_PORTRAIT
+        BTN_POS(1, _line), BTN_SIZE(4,1),
+      #else
+        BTN_POS(15,    1), BTN_SIZE(4,1),
+      #endif
+      GET_TEXTF(INCREMENT)
+    );
   }
 
-  if (_what & FOREGROUND) {
-      _draw_increment_btn(_line+1, 245 - _decimals);
-      _draw_increment_btn(_line+1, 244 - _decimals);
-      _draw_increment_btn(_line+1, 243 - _decimals);
-  }
+  _draw_increment_btn(cmd, _line+1, 245 - _decimals);
+  _draw_increment_btn(cmd, _line+1, 244 - _decimals);
+  _draw_increment_btn(cmd, _line+1, 243 - _decimals);
 
   #ifdef TOUCH_UI_PORTRAIT
-  _line++;
+    _line++;
   #endif
 }
 
@@ -161,19 +208,22 @@ void BaseNumericAdjustmentScreen::widgets_t::adjuster_sram_val(uint8_t tag, prog
   CommandProcessor cmd;
 
   if (_what & BACKGROUND) {
-    cmd.enabled(1)
+    _button_style(cmd, TEXT_AREA);
+    cmd.tag(0)
        .font(font_small)
-       .fgcolor(_color)            .tag(0).button( BTN_POS(5,_line), BTN_SIZE(5,1), F(""),               OPT_FLAT)
-       .cmd(COLOR_RGB(bg_text_enabled))
-       .fgcolor(bg_color) .tag(0).button( BTN_POS(1,_line), BTN_SIZE(4,1), (progmem_str) label, OPT_FLAT);
+       .text( BTN_POS(1,_line), BTN_SIZE(4,1), label)
+       .fgcolor(_color).button( BTN_POS(5,_line), BTN_SIZE(5,1), F(""), OPT_FLAT);
   }
 
-  if (_what & FOREGROUND) {
-    cmd.colors(normal_btn)
-       .font(font_medium)
-       .tag(is_enabled ? tag   : 0).enabled(is_enabled).button( BTN_POS(10,_line), BTN_SIZE(2,1),  F("-"))
-       .tag(is_enabled ? tag+1 : 0).enabled(is_enabled).button( BTN_POS(12,_line), BTN_SIZE(2,1),  F("+"))
-       .tag(0).font(font_small)                        .text  ( BTN_POS(5,_line),  BTN_SIZE(5,1),  is_enabled ? value : "-");
+  cmd.font(font_medium);
+  _button(cmd, tag,     BTN_POS(10,_line), BTN_SIZE(2,1),  F("-"), is_enabled);
+  _button(cmd, tag + 1, BTN_POS(12,_line), BTN_SIZE(2,1),  F("+"), is_enabled);
+
+  if ((_what & FOREGROUND) && is_enabled) {
+    _button_style(cmd, BTN_NORMAL);
+    cmd.tag(0)
+       .font(font_small)
+       .text(BTN_POS(5,_line), BTN_SIZE(5,1), value);
   }
 
   _line++;
@@ -206,18 +256,9 @@ void BaseNumericAdjustmentScreen::widgets_t::adjuster(uint8_t tag, progmem_str l
 }
 
 void BaseNumericAdjustmentScreen::widgets_t::button(uint8_t tag, progmem_str label, bool is_enabled) {
-  if (_what & FOREGROUND) {
-    CommandProcessor cmd;
-    cmd.colors(normal_btn)
-       .tag(is_enabled ? tag   : 0)
-       .enabled(is_enabled)
-    #ifdef TOUCH_UI_PORTRAIT
-       .font(font_small)
-    #else
-       .font(font_medium)
-    #endif
-    .button(BTN_POS(5,_line), BTN_SIZE(9,1), label);
-  }
+  CommandProcessor cmd;
+  cmd.font(LAYOUT_FONT);
+  _button(cmd, tag, BTN_POS(5,_line), BTN_SIZE(9,1), label, is_enabled);
 
   _line++;
 }
@@ -226,89 +267,78 @@ void BaseNumericAdjustmentScreen::widgets_t::text_field(uint8_t tag, progmem_str
   CommandProcessor cmd;
 
   if (_what & BACKGROUND) {
+    _button_style(cmd, TEXT_AREA);
     cmd.enabled(1)
+       .tag(0)
        .font(font_small)
-       .cmd(COLOR_RGB(bg_text_enabled))
-       .fgcolor(_color).tag(0).button( BTN_POS(5,_line), BTN_SIZE(9,1), F(""),               OPT_FLAT)
-       .fgcolor(bg_color) .tag(0).button( BTN_POS(1,_line), BTN_SIZE(4,1), label, OPT_FLAT);
+       .text(   BTN_POS(1,_line), BTN_SIZE(4,1), label)
+       .fgcolor(_color)
+       .tag(tag)
+       .button( BTN_POS(5,_line), BTN_SIZE(9,1), F(""), OPT_FLAT);
   }
 
   if (_what & FOREGROUND) {
-    cmd.colors(normal_btn)
-       .font(font_medium)
-       .tag(tag).font(font_small).text ( BTN_POS(5,_line), BTN_SIZE(9,1), is_enabled ? value : "-");
+    cmd.font(font_small).text( BTN_POS(5,_line), BTN_SIZE(9,1), is_enabled ? value : "-");
   }
 
   _line++;
 }
 
 void BaseNumericAdjustmentScreen::widgets_t::two_buttons(uint8_t tag1, progmem_str label1, uint8_t tag2, progmem_str label2, bool is_enabled) {
-  if (_what & FOREGROUND) {
-    CommandProcessor cmd;
-    cmd.enabled(is_enabled)
-    #ifdef TOUCH_UI_PORTRAIT
-       .font(font_small)
-    #else
-       .font(font_medium)
-    #endif
-    .tag(is_enabled ? tag1: 0).button(BTN_POS(5,_line),   BTN_SIZE(4.5,1), label1)
-    .tag(is_enabled ? tag2: 0).button(BTN_POS(9.5,_line), BTN_SIZE(4.5,1), label2);
-  }
+  CommandProcessor cmd;
+  cmd.font(LAYOUT_FONT);
+  _button(cmd, tag1, BTN_POS(5,_line),   BTN_SIZE(4.5,1), label1, is_enabled);
+  _button(cmd, tag2, BTN_POS(9.5,_line), BTN_SIZE(4.5,1), label2, is_enabled);
 
   _line++;
 }
 
 void BaseNumericAdjustmentScreen::widgets_t::toggle(uint8_t tag, progmem_str label, bool value, bool is_enabled) {
+  CommandProcessor cmd;
+
   if (_what & BACKGROUND) {
-    CommandProcessor cmd;
-    cmd.fgcolor(bg_color)
-       .tag(0)
-       .font(font_small)
-    #ifdef TOUCH_UI_PORTRAIT
-       .button( BTN_POS(1, _line), BTN_SIZE( 8,1), label, OPT_FLAT);
-    #else
-       .button( BTN_POS(1, _line), BTN_SIZE(10,1), label, OPT_FLAT);
-    #endif
+    cmd.font(font_small)
+       .text(
+         #ifdef TOUCH_UI_PORTRAIT
+           BTN_POS(1, _line), BTN_SIZE( 8,1),
+         #else
+           BTN_POS(1, _line), BTN_SIZE(10,1),
+         #endif
+         label
+       );
   }
 
   if (_what & FOREGROUND) {
-    CommandProcessor cmd;
+    _button_style(cmd, BTN_TOGGLE);
     cmd.tag(is_enabled ? tag   : 0)
        .enabled(is_enabled)
        .font(font_small)
-       .colors(ui_toggle)
-    #ifdef TOUCH_UI_PORTRAIT
-      .toggle2(BTN_POS( 9,_line), BTN_SIZE(5,1), GET_TEXTF(NO), GET_TEXTF(YES), value);
-    #else
-      .toggle2(BTN_POS(10,_line), BTN_SIZE(4,1), GET_TEXTF(NO), GET_TEXTF(YES), value);
-    #endif
+       .toggle2(
+         #ifdef TOUCH_UI_PORTRAIT
+           BTN_POS( 9,_line), BTN_SIZE(5,1),
+         #else
+           BTN_POS(10,_line), BTN_SIZE(4,1),
+         #endif
+         GET_TEXTF(NO), GET_TEXTF(YES), value
+       );
   }
 
   _line++;
 }
 
 void BaseNumericAdjustmentScreen::widgets_t::home_buttons(uint8_t tag) {
+  CommandProcessor cmd;
+
   if (_what & BACKGROUND) {
-    CommandProcessor cmd;
-    cmd.fgcolor(bg_color)
-       .tag(0)
-       .font(font_small)
-       .button( BTN_POS(1, _line),  BTN_SIZE(4,1), GET_TEXTF(HOME), OPT_FLAT);
+    cmd.font(font_small)
+       .text(BTN_POS(1, _line), BTN_SIZE(4,1), GET_TEXTF(HOME));
   }
 
-  if (_what & FOREGROUND) {
-    CommandProcessor cmd;
-    cmd
-    #ifdef TOUCH_UI_PORTRAIT
-       .font(font_small)
-    #else
-       .font(font_medium)
-    #endif
-       .tag(tag+0).button(BTN_POS(5,_line),  BTN_SIZE(2,1), GET_TEXTF(AXIS_X))
-       .tag(tag+1).button(BTN_POS(7,_line),  BTN_SIZE(2,1), GET_TEXTF(AXIS_Y))
-       .tag(tag+2).button(BTN_POS(9,_line),  BTN_SIZE(2,1), GET_TEXTF(AXIS_Z))
-       .tag(tag+3).button(BTN_POS(11,_line), BTN_SIZE(3,1), GET_TEXTF(AXIS_ALL));
-  }
+  cmd.font(LAYOUT_FONT);
+ _button(cmd, tag+0, BTN_POS(5,_line),  BTN_SIZE(2,1), GET_TEXTF(AXIS_X));
+ _button(cmd, tag+1, BTN_POS(7,_line),  BTN_SIZE(2,1), GET_TEXTF(AXIS_Y));
+ _button(cmd, tag+2, BTN_POS(9,_line),  BTN_SIZE(2,1), GET_TEXTF(AXIS_Z));
+ _button(cmd, tag+3, BTN_POS(11,_line), BTN_SIZE(3,1), GET_TEXTF(AXIS_ALL));
 
   _line++;
 }
@@ -316,11 +346,13 @@ void BaseNumericAdjustmentScreen::widgets_t::home_buttons(uint8_t tag) {
 void BaseNumericAdjustmentScreen::onEntry() {
   screen_data.BaseNumericAdjustmentScreen.increment = 0; // This will force the increment to be picked while drawing.
   BaseScreen::onEntry();
+  CommandProcessor cmd;
+  cmd.set_button_style_callback(nullptr);
 }
 
 bool BaseNumericAdjustmentScreen::onTouchEnd(uint8_t tag) {
   switch (tag) {
-    case 1:           GOTO_PREVIOUS();                            return true;
+    case 1:           GOTO_PREVIOUS(); return true;
     case 240 ... 245: screen_data.BaseNumericAdjustmentScreen.increment = tag; break;
     default:          return current_screen.onTouchHeld(tag);
   }
diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/base_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/base_screen.cpp
index 662a55439a37f0ceaf553946086c0a610125c66f..c0c7212a227845db834e0ab31490b25d0f551183 100644
--- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/base_screen.cpp
+++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/base_screen.cpp
@@ -36,6 +36,10 @@ void BaseScreen::onEntry() {
   UIScreen::onEntry();
 }
 
+bool BaseScreen::buttonIsPressed(uint8_t tag) {
+  return tag != 0 && EventLoop::get_pressed_tag() == tag;
+}
+
 bool BaseScreen::buttonStyleCallback(CommandProcessor &cmd, uint8_t tag, uint8_t &style, uint16_t &options, bool post) {
   if (post) {
     cmd.colors(normal_btn);
@@ -48,7 +52,7 @@ bool BaseScreen::buttonStyleCallback(CommandProcessor &cmd, uint8_t tag, uint8_t
     }
   #endif
 
-  if (tag != 0 && EventLoop::get_pressed_tag() == tag) {
+  if (buttonIsPressed(tag)) {
     options = OPT_FLAT;
   }
 
@@ -65,7 +69,7 @@ void BaseScreen::onIdle() {
   #ifdef LCD_TIMEOUT_TO_STATUS
     if ((millis() - last_interaction) > LCD_TIMEOUT_TO_STATUS) {
       reset_menu_timeout();
-      #ifdef UI_FRAMEWORK_DEBUG
+      #if ENABLED(TOUCH_UI_DEBUG)
         SERIAL_ECHO_MSG("Returning to status due to menu timeout");
       #endif
       GOTO_SCREEN(StatusScreen);
diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_main_menu.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_main_menu.cpp
index a42cb547aaaecf459e6228136a52d6d7f008c722..403376a18022ebcbd242b325792e01188801ea52 100644
--- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_main_menu.cpp
+++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_main_menu.cpp
@@ -46,7 +46,7 @@ void MainMenu::onRedraw(draw_mode_t what) {
        .colors(normal_btn)
        .font(font_medium)
        .tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXTF(LOAD_SYRINGE))
-       .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXTF(UNLOCK_XY_AXIS))
+       .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXTF(RELEASE_XY_AXIS))
        .tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXTF(BED_TEMPERATURE))
        .tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXTF(INTERFACE_SETTINGS))
        .tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXTF(ADVANCED_SETTINGS))
diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_status_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_status_screen.cpp
index 3f8b3d611ae4dd6b71bb29cab970609b6c3933a0..bd32d3a8fff7f28ba294209e7e88b6b951b091a5 100644
--- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_status_screen.cpp
+++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_status_screen.cpp
@@ -37,9 +37,10 @@
 #define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0]))
 
 const uint8_t shadow_depth = 5;
-const float   max_speed = 0.30;
-const float   min_speed = 0.05;
-const uint8_t num_speeds = 10;
+const float   max_speed  = 1.00;
+const float   min_speed  = 0.02;
+const float   emax_speed = 2.00;
+const float   emin_speed = 0.70;
 
 using namespace FTDI;
 using namespace Theme;
@@ -251,7 +252,7 @@ void StatusScreen::onRedraw(draw_mode_t what) {
 }
 
 bool StatusScreen::onTouchStart(uint8_t) {
-  increment = min_speed;
+  increment = 0;
   return true;
 }
 
@@ -288,7 +289,7 @@ bool StatusScreen::onTouchEnd(uint8_t tag) {
 
 bool StatusScreen::onTouchHeld(uint8_t tag) {
   if (tag >= 1 && tag <= 4 && !jog_xy) return false;
-  const float s = fine_motion ? min_speed : increment;
+  const float s  = min_speed  + (fine_motion ? 0 : (max_speed  - min_speed)  * sq(increment));
   switch (tag) {
     case 1: jog(-s,  0,  0); break;
     case 2: jog( s,  0,  0); break;
@@ -297,22 +298,20 @@ bool StatusScreen::onTouchHeld(uint8_t tag) {
     case 5: jog( 0,  0, -s); break;
     case 6: jog( 0,  0,  s); break;
     case 7:
-      if (ExtUI::isMoving()) return false;
-      MoveAxisScreen::setManualFeedrate(E0, 1);
-      UI_INCREMENT(AxisPosition_mm, E0);
-      current_screen.onRefresh();
-      break;
     case 8:
+    {
       if (ExtUI::isMoving()) return false;
-      MoveAxisScreen::setManualFeedrate(E0, 1);
-      UI_DECREMENT(AxisPosition_mm, E0);
+      const float feedrate  =  emin_speed + (fine_motion ? 0 : (emax_speed - emin_speed) * sq(increment));
+      const float increment = 0.25 * feedrate * (tag == 7 ? -1 : 1);
+      MoveAxisScreen::setManualFeedrate(E0, feedrate);
+      UI_INCREMENT(AxisPosition_mm, E0);
       current_screen.onRefresh();
       break;
+    }
     default:
       return false;
   }
-  if (increment < max_speed)
-    increment += (max_speed - min_speed) / num_speeds;
+  increment = min(1.0f, increment + 0.1f);
   return false;
 }
 
@@ -325,11 +324,11 @@ void StatusScreen::setStatusMessage(const char * const str) {
 }
 
 void StatusScreen::onIdle() {
-  if (isPrintingFromMedia())
-    BioPrintingDialogBox::show();
-
   if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) {
-    onRefresh();
+    if (!EventLoop::is_touch_held())
+      onRefresh();
+    if (isPrintingFromMedia())
+      BioPrintingDialogBox::show();
     refresh_timer.start();
   }
 }
diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_tune_menu.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_tune_menu.cpp
index ab6f2dda892bd390e6ffbdec2db65a40bb1516ae..2b22876970a388acbb17151112ba5472318e9252 100644
--- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_tune_menu.cpp
+++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/bio_tune_menu.cpp
@@ -56,7 +56,7 @@ void TuneMenu::onRedraw(draw_mode_t what) {
         #endif
                               .tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXTF(NUDGE_NOZZLE))
        .enabled(!isPrinting()).tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXTF(LOAD_SYRINGE))
-       .enabled(!isPrinting()).tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXTF(UNLOCK_XY_AXIS))
+       .enabled(!isPrinting()).tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXTF(RELEASE_XY_AXIS))
        .colors(action_btn)    .tag(1).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXTF(BACK));
   }
   #undef GRID_COLS
diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/move_axis_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/move_axis_screen.cpp
index a2edde8b3bd5487333395199d2003dfe95b532ae..73f21bc8f569eff72e2e6522551461107193d29c 100644
--- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/move_axis_screen.cpp
+++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/move_axis_screen.cpp
@@ -46,30 +46,31 @@ void MoveAxisScreen::onRedraw(draw_mode_t what) {
   widgets_t w(what);
   w.precision(1);
   w.units(GET_TEXTF(UNITS_MM));
-  w.heading(                                GET_TEXTF(MOVE_AXIS));
+  w.heading(                           GET_TEXTF(MOVE_AXIS));
   w.home_buttons(20);
-  w.color(Theme::x_axis  )   .adjuster(  2, GET_TEXTF(AXIS_X),  getAxisPosition_mm(X), canMove(X));
-  w.color(Theme::y_axis  )   .adjuster(  4, GET_TEXTF(AXIS_Y),  getAxisPosition_mm(Y), canMove(Y));
-  w.color(Theme::z_axis  )   .adjuster(  6, GET_TEXTF(AXIS_Z),  getAxisPosition_mm(Z), canMove(Z));
+  w.color(Theme::x_axis).adjuster(  2, GET_TEXTF(AXIS_X),  getAxisPosition_mm(X), canMove(X));
+  w.color(Theme::y_axis).adjuster(  4, GET_TEXTF(AXIS_Y),  getAxisPosition_mm(Y), canMove(Y));
+  w.color(Theme::z_axis).adjuster(  6, GET_TEXTF(AXIS_Z),  getAxisPosition_mm(Z), canMove(Z));
 
+  w.color(Theme::e_axis);
   #if EXTRUDERS == 1
-    w.color(Theme::e_axis)   .adjuster(  8, GET_TEXTF(AXIS_E),  screen_data.MoveAxisScreen.e_rel[0], canMove(E0));
+    w.adjuster(  8, GET_TEXTF(AXIS_E),  screen_data.MoveAxisScreen.e_rel[0], canMove(E0));
   #elif EXTRUDERS > 1
-    w.color(Theme::e_axis)   .adjuster(  8, GET_TEXTF(AXIS_E1), screen_data.MoveAxisScreen.e_rel[0], canMove(E0));
-    w.color(Theme::e_axis)   .adjuster( 10, GET_TEXTF(AXIS_E2), screen_data.MoveAxisScreen.e_rel[1], canMove(E1));
+    w.adjuster(  8, GET_TEXTF(AXIS_E1), screen_data.MoveAxisScreen.e_rel[0], canMove(E0));
+    w.adjuster( 10, GET_TEXTF(AXIS_E2), screen_data.MoveAxisScreen.e_rel[1], canMove(E1));
     #if EXTRUDERS > 2
-      w.color(Theme::e_axis) .adjuster( 12, GET_TEXTF(AXIS_E3), screen_data.MoveAxisScreen.e_rel[2], canMove(E2));
+      w.adjuster( 12, GET_TEXTF(AXIS_E3), screen_data.MoveAxisScreen.e_rel[2], canMove(E2));
     #endif
     #if EXTRUDERS > 3
-      w.color(Theme::e_axis) .adjuster( 14, GET_TEXTF(AXIS_E4), screen_data.MoveAxisScreen.e_rel[3], canMove(E3));
+      w.adjuster( 14, GET_TEXTF(AXIS_E4), screen_data.MoveAxisScreen.e_rel[3], canMove(E3));
     #endif
   #endif
   w.increments();
 }
 
 bool MoveAxisScreen::onTouchHeld(uint8_t tag) {
-  #define UI_INCREMENT_AXIS(axis) setManualFeedrate(axis, increment); UI_INCREMENT(AxisPosition_mm, axis);
-  #define UI_DECREMENT_AXIS(axis) setManualFeedrate(axis, increment); UI_DECREMENT(AxisPosition_mm, axis);
+  #define UI_INCREMENT_AXIS(axis) UI_INCREMENT(AxisPosition_mm, axis);
+  #define UI_DECREMENT_AXIS(axis) UI_DECREMENT(AxisPosition_mm, axis);
   const float increment = getIncrement();
   switch (tag) {
     case  2: UI_DECREMENT_AXIS(X); break;
@@ -93,10 +94,10 @@ bool MoveAxisScreen::onTouchHeld(uint8_t tag) {
     case 14: UI_DECREMENT_AXIS(E3); screen_data.MoveAxisScreen.e_rel[3] -= increment; break;
     case 15: UI_INCREMENT_AXIS(E3); screen_data.MoveAxisScreen.e_rel[3] += increment; break;
     #endif
-    case 20: injectCommands_P(PSTR("G28 X")); break;
-    case 21: injectCommands_P(PSTR("G28 Y")); break;
-    case 22: injectCommands_P(PSTR("G28 Z")); break;
-    case 23: injectCommands_P(PSTR("G28"));   break;
+    case 20: SpinnerDialogBox::enqueueAndWait_P(F("G28 X")); break;
+    case 21: SpinnerDialogBox::enqueueAndWait_P(F("G28 Y")); break;
+    case 22: SpinnerDialogBox::enqueueAndWait_P(F("G28 Z")); break;
+    case 23: SpinnerDialogBox::enqueueAndWait_P(F("G28"));   break;
     default:
       return false;
   }
@@ -109,9 +110,9 @@ float MoveAxisScreen::getManualFeedrate(uint8_t axis, float increment_mm) {
   // Compute feedrate so that the tool lags the adjuster when it is
   // being held down, this allows enough margin for the planner to
   // connect segments and even out the motion.
-  constexpr float max_manual_feedrate[XYZE] = MAX_MANUAL_FEEDRATE;
-  return min(max_manual_feedrate[axis]/60, abs(increment_mm * TOUCH_REPEATS_PER_SECOND * 0.80));
-  return min(max_manual_feedrate[axis] / 60, abs(increment_mm * TOUCH_REPEATS_PER_SECOND * 0.80));
+  constexpr float manual_feedrate[XYZE] = MANUAL_FEEDRATE;
+  return min(manual_feedrate[axis] / 60, abs(increment_mm * TOUCH_REPEATS_PER_SECOND * 0.80));
+  return min(manual_feedrate[axis] / 60, abs(increment_mm * TOUCH_REPEATS_PER_SECOND * 0.80));
 }
 
 void MoveAxisScreen::setManualFeedrate(ExtUI::axis_t axis, float increment_mm) {
diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screens.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screens.h
index 7ab8f0790e251df1d79b248c1622f82827be5a16..c9850c0d81320103e02e29424d803d28f5245cac 100644
--- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screens.h
+++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/screens.h
@@ -97,6 +97,8 @@ class BaseScreen : public UIScreen {
       static uint32_t last_interaction;
     #endif
 
+    static bool buttonIsPressed(uint8_t tag);
+
   public:
     static bool buttonStyleCallback(CommandProcessor &, uint8_t, uint8_t &, uint16_t &, bool);
 
@@ -353,10 +355,18 @@ class BaseNumericAdjustmentScreen : public BaseScreen {
         uint32_t    _color;
         uint8_t     _decimals;
         progmem_str _units;
+        enum style_t {
+          BTN_NORMAL,
+          BTN_ACTION,
+          BTN_TOGGLE,
+          BTN_DISABLED,
+          TEXT_AREA
+        } _style;
 
       protected:
-        void _draw_increment_btn(uint8_t line, const uint8_t tag);
-
+        void _draw_increment_btn(CommandProcessor &, uint8_t line, const uint8_t tag);
+        void _button(CommandProcessor &, uint8_t tag, int16_t x, int16_t y, int16_t w, int16_t h, progmem_str, bool enabled = true, bool highlight = false);
+        void _button_style(CommandProcessor &cmd, style_t style);
       public:
         widgets_t(draw_mode_t);