From 7f887f2342d2da112ba2058177c53492d3c2903f Mon Sep 17 00:00:00 2001
From: Marcio T <mlt4356-github@yahoo.com>
Date: Thu, 12 Oct 2023 10:14:58 -0600
Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=B8=20Update=20FTDI=20Eve=20/=20CocoaP?=
 =?UTF-8?q?ress=20UI=20(#26233)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../cocoa_press/_bootscreen_landscape.h       | 134 ++++++++
 .../cocoa_press/about_screen.cpp              | 116 +++++++
 .../cocoa_press/about_screen.h                |  33 ++
 .../cocoa_press/cocoa_press_bitmap.h          | 248 ++++++++++++++
 .../cocoa_press/cocoa_press_ui.h              |  84 ++---
 .../cocoa_press/files_screen.cpp              |  16 +-
 .../cocoa_press/leveling_menu.cpp             |  59 ++--
 .../cocoa_press/main_menu.cpp                 |  19 +-
 .../ftdi_eve_touch_ui/cocoa_press/main_menu.h |   1 +
 .../cocoa_press/preheat_menu.cpp              |  58 +---
 .../cocoa_press/preheat_screen.cpp            |  30 +-
 .../ftdi_eve_touch_ui/cocoa_press/screens.h   |   8 +-
 .../cocoa_press/statistics_screen.cpp         |  83 +++++
 .../cocoa_press/statistics_screen.h           |  32 ++
 .../cocoa_press/status_screen.cpp             | 323 ++++++++++--------
 .../cocoa_press/status_screen.h               |  20 +-
 .../cocoa_press/z_offset_screen.cpp           |  59 ++++
 .../cocoa_press/z_offset_screen.h             |  32 ++
 .../cocoa_press/z_offset_wizard.cpp           | 162 +++++++++
 .../cocoa_press/z_offset_wizard.h             |  43 +++
 .../ftdi_eve_lib/basic/commands.cpp           |   8 +
 .../ftdi_eve_lib/basic/commands.h             |   1 +
 .../ftdi_eve_lib/extended/unicode/unicode.cpp |   8 -
 .../ftdi_eve_lib/extended/unicode/unicode.h   |   1 -
 .../ftdi_eve_lib/scripts/svg2cpp.py           | 116 ++++---
 .../generic/bed_mesh_edit_screen.cpp          |   6 +-
 .../generic/bed_mesh_view_screen.cpp          |   7 +-
 .../ftdi_eve_touch_ui/generic/main_menu.cpp   |  36 +-
 .../generic/status_screen.cpp                 |   8 +-
 .../generic/temperature_screen.cpp            |   2 +-
 .../ftdi_eve_touch_ui/language/language_en.h  |   2 -
 .../lcd/extui/ftdi_eve_touch_ui/screen_data.h |   2 +
 .../lcd/extui/ftdi_eve_touch_ui/screens.cpp   |   4 +
 .../extui/ftdi_eve_touch_ui/theme/bitmaps.h   | 263 +++++++-------
 .../extui/ftdi_eve_touch_ui/theme/sounds.cpp  |  41 ++-
 .../pins/stm32f4/pins_FYSETC_CHEETAH_V30.h    |   2 +-
 36 files changed, 1567 insertions(+), 500 deletions(-)
 create mode 100644 Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/_bootscreen_landscape.h
 create mode 100644 Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/about_screen.cpp
 create mode 100644 Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/about_screen.h
 create mode 100644 Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/cocoa_press_bitmap.h
 create mode 100644 Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/statistics_screen.cpp
 create mode 100644 Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/statistics_screen.h
 create mode 100644 Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_screen.cpp
 create mode 100644 Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_screen.h
 create mode 100644 Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_wizard.cpp
 create mode 100644 Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_wizard.h
 mode change 100644 => 100755 Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/svg2cpp.py

diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/_bootscreen_landscape.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/_bootscreen_landscape.h
new file mode 100644
index 00000000000..e7b06f7bd39
--- /dev/null
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/_bootscreen_landscape.h
@@ -0,0 +1,134 @@
+
+/****************************************************************************
+ *   This program is free software: you can redistribute it and/or modify   *
+ *   it under the terms of the GNU General Public License as published by   *
+ *   the Free Software Foundation, either version 3 of the License, or      *
+ *   (at your option) any later version.                                    *
+ *                                                                          *
+ *   This program is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *   GNU General Public License for more details.                           *
+ *                                                                          *
+ *   To view a copy of the GNU General Public License, go to the following  *
+ *   location: <http://www.gnu.org/licenses/>.                              *
+ ****************************************************************************/
+
+/**
+ * This file was auto-generated using "svg2cpp.pl"
+ *
+ * The encoding consists of x,y pairs with the min and max scaled to
+ * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the
+ * start of a new closed path.
+ */
+
+#pragma once
+
+constexpr float x_min = 0.000000;
+
+constexpr float x_max = 480.000000;
+
+constexpr float y_min = 0.000000;
+
+constexpr float y_max = 272.000000;
+
+const PROGMEM uint16_t outline[] = {
+  0x8278, 0xC8E7, 0x7714, 0xC659, 0x6D20, 0xC0EF, 0x64D1, 0xB8D4, 0x5E5F, 0xAE2F,
+  0x5AF5, 0xA493, 0x58F2, 0x99F6, 0x5886, 0x8B4E, 0x590F, 0x7956, 0x5997, 0x69F3,
+  0x5B46, 0x5E96, 0x5E92, 0x5430, 0x6363, 0x4AF8, 0x69A4, 0x4327, 0x6F5B, 0x3E4A,
+  0x7871, 0x3979, 0x82A1, 0x371E, 0x8CBB, 0x3756, 0x95A1, 0x3997, 0x9D90, 0x3D88,
+  0xA50B, 0x43B6, 0xA6BC, 0x46C9, 0xA776, 0x4A42, 0xA669, 0x6D96, 0xA54B, 0x71E5,
+  0xA030, 0x7B45, 0x9ECB, 0x7CC5, 0x9B2C, 0x7E1D, 0x9717, 0x7C80, 0x9521, 0x7B11,
+  0x8FAD, 0x77D6, 0x8A1D, 0x7607, 0x82E0, 0x7609, 0x7CDD, 0x7812, 0x77F3, 0x7C15,
+  0x75EF, 0x7EC5, 0x7830, 0x8278, 0x7D94, 0x8772, 0x847F, 0x8A0B, 0x8B98, 0x89F7,
+  0x9127, 0x8806, 0x96AB, 0x849C, 0x9C6D, 0x81F2, 0x9F8E, 0x82E5, 0xA22C, 0x85FF,
+  0xA63C, 0x8D9E, 0xA78B, 0x931F, 0xA68F, 0xB5E2, 0xA5D0, 0xB944, 0xA430, 0xBC3E,
+  0x9E55, 0xC146, 0x94CA, 0xC660, 0x8A75, 0xC8DB, 0x8278, 0xC8E7, 0x8278, 0xC8E7
+};
+
+const PROGMEM uint16_t shadow[] = {
+  0x8699, 0x52F4, 0x807A, 0x5409, 0x7A89, 0x576A, 0x7583, 0x5D79, 0x7227, 0x6695,
+  0x714B, 0x70C7, 0x71C8, 0x75DB, 0x730A, 0x7A69, 0x7496, 0x7A0E, 0x7601, 0x787F,
+  0x78EF, 0x7565, 0x80E9, 0x7178, 0x8924, 0x7108, 0x914E, 0x7393, 0x9914, 0x789A,
+  0x9B62, 0x792D, 0x9D8A, 0x7823, 0xA0FE, 0x72DA, 0xA34C, 0x6DC9, 0xA3D7, 0x6766,
+  0xA42B, 0x5E98, 0xA3FD, 0x55F8, 0xA279, 0x55CE, 0xA12E, 0x578E, 0x9FE2, 0x59BB,
+  0x9E59, 0x5AD8, 0x9AAC, 0x5AE1, 0x9728, 0x58ED, 0x9019, 0x54A3, 0x8699, 0x52F4,
+  0x8699, 0x52F4, 0xFFFF, 0x5CA3, 0x849F, 0x5B93, 0x8686, 0x5B52, 0x896F, 0x5B3F,
+  0x8FA9, 0x5C60, 0x9D67, 0x6003, 0xA994, 0x6582, 0xB393, 0x6C3B, 0xBAC7, 0x7604,
+  0xC0E2, 0x8047, 0xC3D1, 0x8AB3, 0xC3DC, 0x94FB, 0xC14A, 0x9C85, 0xBD52, 0xA35D,
+  0xB6C2, 0xA41B, 0xABC2, 0xA460, 0xA092, 0xA416, 0x9C7C, 0xA33E, 0x9B91, 0xA20E,
+  0x9C3C, 0x9618, 0xA353, 0x8992, 0xA62E, 0x7CED, 0xA4E9, 0x7097, 0x9FA2, 0x6ADE,
+  0x9B4F, 0x65A4, 0x9557, 0x6117, 0x8DDF, 0x5D63, 0x850D, 0x5CA3, 0x849F, 0x5CA3,
+  0x849F
+};
+
+const PROGMEM uint16_t highlight[] = {
+  0x861C, 0x5348, 0x8243, 0x53C6, 0x7EBF, 0x5693, 0x7C12, 0x5B55, 0x7ABE, 0x61B3,
+  0x7AFC, 0x6656, 0x7C42, 0x6A49, 0x7FB1, 0x7163, 0x862A, 0x7090, 0x8C99, 0x717A,
+  0x92E2, 0x740A, 0x98E8, 0x782A, 0x9AB3, 0x7852, 0x9C22, 0x7665, 0x9E0C, 0x7087,
+  0x9E69, 0x65BE, 0x9C07, 0x5BDE, 0x9319, 0x568D, 0x8E92, 0x544E, 0x89E2, 0x534D,
+  0x861C, 0x5348, 0x861C, 0x5348, 0xFFFF, 0x6B6A, 0x9CA0, 0x69D9, 0x9F11, 0x695E,
+  0xA2AD, 0x6A25, 0xAA51, 0x6DB0, 0xBBAA, 0x785A, 0xC170, 0x8372, 0xC3D0, 0x8E9F,
+  0xC2E2, 0x9987, 0xBEBD, 0x9CAB, 0xBCE9, 0x9EFE, 0xB9D2, 0x9E63, 0xB379, 0x9CE9,
+  0xAD92, 0x98DE, 0xA2B8, 0x8D7F, 0xA5FA, 0x81FE, 0xA636, 0x76A6, 0xA32E, 0x6BC5,
+  0x9CA0, 0x6B6A, 0x9CA0, 0x6B6A, 0x9CA0
+};
+
+const PROGMEM uint16_t stroke[] = {
+  0x8282, 0xC890, 0x7A14, 0xC6FB, 0x7257, 0xC3D9, 0x6B6A, 0xBF38, 0x6569, 0xB928,
+  0x5E84, 0xADEC, 0x5B1E, 0xA460, 0x5926, 0x99F8, 0x58A5, 0x90C0, 0x59B6, 0x6B3D,
+  0x5B4C, 0x5F6C, 0x5EA3, 0x549E, 0x63A2, 0x4B13, 0x6A2E, 0x430B, 0x71D8, 0x3D0C,
+  0x7A7A, 0x3923, 0x83D5, 0x3761, 0x8DAA, 0x37DB, 0x98A8, 0x3B38, 0xA283, 0x4193,
+  0xA638, 0x4620, 0xA741, 0x4B64, 0xA6C5, 0x5D20, 0xA613, 0x6E81, 0xA43A, 0x738A,
+  0xA01F, 0x7AE8, 0x9DE9, 0x7D0E, 0x9B69, 0x7DBD, 0x9629, 0x7B6D, 0x905C, 0x77C9,
+  0x8A94, 0x75BF, 0x8402, 0x7587, 0x7E52, 0x76FE, 0x79CA, 0x79CE, 0x75B1, 0x7EC7,
+  0x780B, 0x82C0, 0x7C5E, 0x8702, 0x8193, 0x89A9, 0x8702, 0x8AA4, 0x8C76, 0x8A18,
+  0x91F2, 0x8803, 0x977B, 0x8464, 0x9C8C, 0x825E, 0x9EAF, 0x82C4, 0xA0FC, 0x84BC,
+  0xA3C6, 0x8965, 0xA6CF, 0x8FEF, 0xA756, 0x9463, 0xA6DA, 0xA612, 0xA5DF, 0xB86B,
+  0xA414, 0xBBE7, 0xA03D, 0xBF7C, 0x9648, 0xC56A, 0x8B45, 0xC86E, 0x8282, 0xC890,
+  0x8282, 0xC890, 0xFFFF, 0x89EE, 0xC221, 0x9395, 0xBFE8, 0x9C6D, 0xBB4F, 0xA047,
+  0xB837, 0xA298, 0xB561, 0xA30A, 0xAA1F, 0xA34B, 0x9D6D, 0xA204, 0x9E54, 0x9820,
+  0xA474, 0x960F, 0xA542, 0x886E, 0xA808, 0x803F, 0xA783, 0x785E, 0xA57C, 0x703C,
+  0xA168, 0x691E, 0x9BB9, 0x623D, 0x92BA, 0x5D27, 0x8795, 0x5C9D, 0x868D, 0x5C4D,
+  0x90BE, 0x5DBC, 0x9E89, 0x6126, 0xA944, 0x6630, 0xB207, 0x6CB0, 0xB914, 0x6E6F,
+  0xBA8C, 0x7080, 0xBC05, 0x78E3, 0xC016, 0x8263, 0xC21E, 0x89EE, 0xC221, 0x89EE,
+  0xC221, 0xFFFF, 0x8CBB, 0xA14B, 0x9726, 0x9E32, 0xA086, 0x9855, 0xA324, 0x95C0,
+  0xA39A, 0x92E9, 0xA121, 0x8DC2, 0x9E86, 0x8984, 0x9C63, 0x88AD, 0x98A6, 0x8A73,
+  0x8FB6, 0x8F97, 0x86EE, 0x90FB, 0x804C, 0x8FBC, 0x7A84, 0x8C98, 0x7476, 0x85CD,
+  0x706D, 0x7C88, 0x6EAA, 0x7064, 0x6EFF, 0x6929, 0x7056, 0x624A, 0x73DB, 0x59D0,
+  0x76F3, 0x5586, 0x7AA5, 0x523E, 0x83F8, 0x4E97, 0x8B83, 0x4EA9, 0x9221, 0x50DF,
+  0x98F7, 0x552D, 0x9C44, 0x56AE, 0x9DAF, 0x5652, 0xA12C, 0x5116, 0xA370, 0x4C6E,
+  0xA381, 0x4A6D, 0xA10D, 0x4772, 0x985F, 0x41B3, 0x8EB8, 0x3E71, 0x8631, 0x3DA9,
+  0x7DFC, 0x3EA4, 0x7645, 0x4159, 0x6F3D, 0x45BB, 0x6952, 0x4B6F, 0x646A, 0x529B,
+  0x60B0, 0x5AA7, 0x5E57, 0x6375, 0x5D39, 0x6ED1, 0x5E1E, 0x7B35, 0x6120, 0x8666,
+  0x6620, 0x9016, 0x6D01, 0x97F7, 0x7747, 0x9E7A, 0x83D9, 0xA18C, 0x8CBB, 0xA14B,
+  0x8CBB, 0xA14B, 0xFFFF, 0x7481, 0x77DA, 0x793F, 0x7317, 0x7EE3, 0x701D, 0x8044,
+  0x6FBD, 0x81B4, 0x6F76, 0x846C, 0x6F18, 0x8E1D, 0x7044, 0x97FF, 0x75D2, 0x9B2B,
+  0x772F, 0x9DAF, 0x75F3, 0xA26D, 0x6D0E, 0xA2E9, 0x62B8, 0xA33C, 0x583A, 0xA31E,
+  0x573E, 0xA252, 0x5871, 0x9FC0, 0x5BDB, 0x9CD5, 0x5D2A, 0x9751, 0x5AEC, 0x914A,
+  0x5720, 0x8B83, 0x5519, 0x83E3, 0x5506, 0x7ECB, 0x56B4, 0x7A0F, 0x59E9, 0x765D,
+  0x5E9D, 0x73CE, 0x64A3, 0x727C, 0x6BCF, 0x7286, 0x72FD, 0x73A3, 0x78D6, 0x7481,
+  0x77DA, 0x7481, 0x77DA
+};
+
+const PROGMEM uint16_t surface[] = {
+   0x8CBB, 0xA14B, 0x9726, 0x9E32, 0xA086, 0x9855, 0xA324, 0x95C0, 0xA39A, 0x92E9,
+   0xA121, 0x8DC2, 0x9E86, 0x8984, 0x9C63, 0x88AD, 0x98A6, 0x8A73, 0x8FB6, 0x8F97,
+   0x86EE, 0x90FB, 0x804C, 0x8FBC, 0x7A84, 0x8C98, 0x7476, 0x85CD, 0x706D, 0x7C88,
+   0x6EAA, 0x7064, 0x6EFF, 0x6929, 0x7056, 0x624A, 0x73DB, 0x59D0, 0x76F3, 0x5586,
+   0x7AA5, 0x523E, 0x83F8, 0x4E97, 0x8B83, 0x4EA9, 0x9221, 0x50DF, 0x98F7, 0x552D,
+   0x9C44, 0x56AE, 0x9DAF, 0x5652, 0xA12C, 0x5116, 0xA370, 0x4C6E, 0xA381, 0x4A6D,
+   0xA10D, 0x4772, 0x985F, 0x41B3, 0x8EB8, 0x3E71, 0x8631, 0x3DA9, 0x7DFC, 0x3EA4,
+   0x7645, 0x4159, 0x6F3D, 0x45BB, 0x6952, 0x4B6F, 0x646A, 0x529B, 0x60B0, 0x5AA7,
+   0x5E57, 0x6375, 0x5D39, 0x6ED1, 0x5E1E, 0x7B35, 0x6120, 0x8666, 0x6620, 0x9016,
+   0x6D01, 0x97F7, 0x7747, 0x9E7A, 0x83D9, 0xA18C, 0x8CBB, 0xA14B, 0x8CBB, 0xA14B
+};
+
+//#define LOGO_BACKGROUND 0xF05A22
+#define LOGO_BACKGROUND 0xFFFFFF
+
+#define LOGO_PAINT_PATHS \
+  LOGO_PAINT_PATH(0xF27121, surface) \
+  LOGO_PAINT_PATH(0x6B2C1B, shadow) \
+  LOGO_PAINT_PATH(0xBC3E26, highlight) \
+  LOGO_PAINT_PATH(0x3C2215, stroke)
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/about_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/about_screen.cpp
new file mode 100644
index 00000000000..1de0fbd4a58
--- /dev/null
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/about_screen.cpp
@@ -0,0 +1,116 @@
+/********************
+ * about_screen.cpp *
+ ********************/
+
+/****************************************************************************
+ *   Written By Mark Pelletier  2017 - Aleph Objects, Inc.                  *
+ *   Written By Marcio Teixeira 2018 - Aleph Objects, Inc.                  *
+ *                                                                          *
+ *   This program is free software: you can redistribute it and/or modify   *
+ *   it under the terms of the GNU General Public License as published by   *
+ *   the Free Software Foundation, either version 3 of the License, or      *
+ *   (at your option) any later version.                                    *
+ *                                                                          *
+ *   This program is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *   GNU General Public License for more details.                           *
+ *                                                                          *
+ *   To view a copy of the GNU General Public License, go to the following  *
+ *   location: <https://www.gnu.org/licenses/>.                             *
+ ****************************************************************************/
+
+#include "../config.h"
+#include "../screens.h"
+
+#ifdef COCOA_ABOUT_SCREEN
+
+#define GRID_COLS 4
+#define GRID_ROWS 8
+
+using namespace FTDI;
+using namespace Theme;
+using namespace ExtUI;
+
+void AboutScreen::onEntry() {
+  BaseScreen::onEntry();
+  sound.play(chimes, PLAY_ASYNCHRONOUS);
+}
+
+void AboutScreen::onRedraw(draw_mode_t) {
+  CommandProcessor cmd;
+  cmd.cmd(CLEAR_COLOR_RGB(bg_color))
+     .cmd(CLEAR(true,true,true))
+     .cmd(COLOR_RGB(bg_text_enabled))
+     .tag(0);
+
+  #define HEADING_POS BTN_POS(1,1), BTN_SIZE(4,2)
+  #define FW_VERS_POS BTN_POS(1,3), BTN_SIZE(4,1)
+  #define FW_INFO_POS BTN_POS(1,4), BTN_SIZE(4,1)
+  #define LICENSE_POS BTN_POS(1,5), BTN_SIZE(4,3)
+  #define STATS_POS   BTN_POS(1,8), BTN_SIZE(2,1)
+  #define BACK_POS    BTN_POS(3,8), BTN_SIZE(2,1)
+
+  char about_str[1
+    + strlen_P(GET_TEXT(MSG_ABOUT_TOUCH_PANEL_2))
+    #ifdef TOOLHEAD_NAME
+      + strlen_P(TOOLHEAD_NAME)
+    #endif
+  ];
+  #ifdef TOOLHEAD_NAME
+    // If MSG_ABOUT_TOUCH_PANEL_2 has %s, substitute in the toolhead name.
+    // But this is optional, so squelch the compiler warning here.
+    #pragma GCC diagnostic push
+    #pragma GCC diagnostic ignored "-Wformat-extra-args"
+    sprintf_P(about_str, GET_TEXT(MSG_ABOUT_TOUCH_PANEL_2), TOOLHEAD_NAME);
+    #pragma GCC diagnostic pop
+  #else
+    strcpy_P(about_str, GET_TEXT(MSG_ABOUT_TOUCH_PANEL_2));
+  #endif
+
+  draw_text_box(cmd, HEADING_POS,
+    #ifdef MACHINE_NAME
+      F(MACHINE_NAME)
+    #else
+      GET_TEXT_F(MSG_ABOUT_TOUCH_PANEL_1)
+    #endif
+    , OPT_CENTER, font_xlarge
+  );
+  #if ALL(TOUCH_UI_DEVELOPER_MENU, FTDI_DEVELOPER_MENU)
+    cmd.tag(3);
+  #endif
+  draw_text_box(cmd, FW_VERS_POS,
+  #ifdef TOUCH_UI_VERSION
+    F(TOUCH_UI_VERSION)
+  #else
+    FPSTR(getFirmwareName_str())
+  #endif
+  , OPT_CENTER, font_medium);
+  cmd.tag(0);
+  draw_text_box(cmd, FW_INFO_POS, about_str, OPT_CENTER, font_medium);
+  draw_text_box(cmd, LICENSE_POS, GET_TEXT_F(MSG_LICENSE), OPT_CENTER, font_tiny);
+
+  cmd.font(font_medium);
+  #if ENABLED(PRINTCOUNTER)
+    cmd.colors(normal_btn)
+       .tag(2).button(STATS_POS, GET_TEXT_F(MSG_INFO_STATS_MENU));
+  #endif
+  cmd.colors(action_btn)
+     .tag(1).button(BACK_POS,  GET_TEXT_F(MSG_BUTTON_DONE));
+}
+
+bool AboutScreen::onTouchEnd(uint8_t tag) {
+  switch (tag) {
+    case 1: GOTO_PREVIOUS(); break;
+    #if ENABLED(PRINTCOUNTER)
+      case 2: GOTO_SCREEN(StatisticsScreen); break;
+    #endif
+    #if ALL(TOUCH_UI_DEVELOPER_MENU, FTDI_DEVELOPER_MENU)
+      case 3: GOTO_SCREEN(DeveloperMenu); break;
+    #endif
+    default: return false;
+  }
+  return true;
+}
+
+#endif // COCOA_ABOUT_SCREEN
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/about_screen.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/about_screen.h
new file mode 100644
index 00000000000..2e9bc1827e1
--- /dev/null
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/about_screen.h
@@ -0,0 +1,33 @@
+/******************
+ * about_screen.h *
+ ******************/
+
+/****************************************************************************
+ *   Written By Mark Pelletier  2017 - Aleph Objects, Inc.                  *
+ *   Written By Marcio Teixeira 2018 - Aleph Objects, Inc.                  *
+ *                                                                          *
+ *   This program is free software: you can redistribute it and/or modify   *
+ *   it under the terms of the GNU General Public License as published by   *
+ *   the Free Software Foundation, either version 3 of the License, or      *
+ *   (at your option) any later version.                                    *
+ *                                                                          *
+ *   This program is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *   GNU General Public License for more details.                           *
+ *                                                                          *
+ *   To view a copy of the GNU General Public License, go to the following  *
+ *   location: <https://www.gnu.org/licenses/>.                             *
+ ****************************************************************************/
+
+#pragma once
+
+#define COCOA_ABOUT_SCREEN
+#define COCOA_ABOUT_SCREEN_CLASS AboutScreen
+
+class AboutScreen : public BaseScreen, public UncachedScreen {
+  public:
+    static void onEntry();
+    static void onRedraw(draw_mode_t);
+    static bool onTouchEnd(uint8_t tag);
+};
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/cocoa_press_bitmap.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/cocoa_press_bitmap.h
new file mode 100644
index 00000000000..18fbed9a525
--- /dev/null
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/cocoa_press_bitmap.h
@@ -0,0 +1,248 @@
+const unsigned char cocoa_press_ui[2941] PROGMEM = {
+  0x78, 0x9C, 0xED, 0xDD, 0x3B, 0x96, 0xA3, 0xC8, 0xB6, 0x00, 0xD0, 0xC9,
+  0x68, 0x28, 0x1A, 0x0A, 0x06, 0x3D, 0x8F, 0x34, 0x24, 0x83, 0x59, 0x94,
+  0x91, 0x8E, 0x0C, 0x30, 0x34, 0x86, 0x32, 0xCA, 0x2A, 0x03, 0x23, 0x99,
+  0x42, 0x8D, 0xE0, 0x62, 0xE8, 0x0A, 0x21, 0x20, 0x22, 0xF8, 0x54, 0xF6,
+  0xBA, 0x6F, 0x3D, 0xA5, 0x52, 0x7B, 0x1B, 0xDD, 0x29, 0x50, 0xA0, 0xA0,
+  0xD7, 0x39, 0xC4, 0x0F, 0xE8, 0xCB, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0,
+  0xFF, 0x48, 0x5B, 0xFF, 0x2E, 0xCB, 0xBA, 0x6E, 0x1F, 0x5D, 0x0F, 0xF8,
+  0x62, 0xDA, 0xF2, 0xB0, 0xDF, 0xEF, 0x06, 0xFB, 0xBC, 0xA8, 0x1F, 0x5D,
+  0x23, 0xF8, 0x2A, 0xCA, 0xEC, 0x96, 0x15, 0xFB, 0x2C, 0x3B, 0x1C, 0xB2,
+  0xAC, 0x4F, 0x94, 0xFD, 0x41, 0x8A, 0xC0, 0xE5, 0x72, 0xDA, 0x77, 0xD9,
+  0xF0, 0xFE, 0xEB, 0xCF, 0xE4, 0xFD, 0xD0, 0x65, 0xCC, 0xBE, 0x7C, 0x74,
+  0xD5, 0xE0, 0xC1, 0xEA, 0x6B, 0x76, 0x64, 0x3F, 0xFF, 0xCC, 0xBD, 0x5F,
+  0x77, 0xE4, 0x8F, 0xAE, 0x1D, 0x3C, 0x54, 0x71, 0xCD, 0x8E, 0x5F, 0x0B,
+  0xD9, 0x71, 0xCF, 0x90, 0xD3, 0xA3, 0xEB, 0x07, 0x0F, 0x94, 0xEF, 0xF6,
+  0xEF, 0x2B, 0xD9, 0xD1, 0x25, 0xC8, 0xEE, 0xB0, 0x5E, 0xB4, 0x29, 0x8F,
+  0x79, 0x96, 0xE5, 0xC7, 0x72, 0x71, 0x9C, 0x52, 0x17, 0xC7, 0xEC, 0x3A,
+  0x9C, 0x29, 0xAA, 0xD5, 0xD9, 0xB0, 0xA6, 0xDA, 0x2C, 0x7F, 0xEA, 0xF7,
+  0xAE, 0x96, 0xAF, 0xCA, 0xAB, 0x8F, 0x8D, 0x53, 0xBB, 0x1D, 0xA5, 0x1C,
+  0x54, 0xE9, 0xB4, 0x5C, 0x53, 0x0D, 0x7B, 0x66, 0xBB, 0x2E, 0x6D, 0x55,
+  0x06, 0xAA, 0xF4, 0xCC, 0xAE, 0x15, 0xCB, 0x96, 0xAA, 0x5D, 0x75, 0xA7,
+  0x9C, 0x6F, 0x9C, 0x32, 0x4F, 0xE6, 0xB0, 0xDB, 0x4F, 0x8D, 0xC7, 0xAF,
+  0xF7, 0x6E, 0x6C, 0xBE, 0xCF, 0xDE, 0x86, 0xA1, 0xC8, 0xAF, 0xFD, 0xAE,
+  0x58, 0x2B, 0x59, 0x77, 0x41, 0x32, 0xA8, 0xD2, 0xBD, 0x65, 0xB0, 0xF3,
+  0xD8, 0xFC, 0xFB, 0xF2, 0xD5, 0x5F, 0xCB, 0x1F, 0xFB, 0x9D, 0xDB, 0x09,
+  0x72, 0xCE, 0xB2, 0xD5, 0x03, 0x45, 0xBB, 0x92, 0x1A, 0xC4, 0xFB, 0xB2,
+  0xF0, 0x3F, 0xC2, 0x47, 0xBE, 0x56, 0x28, 0x38, 0xE7, 0x42, 0x86, 0x7C,
+  0x0B, 0x45, 0x90, 0x1E, 0xEF, 0xD3, 0xF4, 0x6E, 0x37, 0x5C, 0xEF, 0xB6,
+  0x5F, 0xB7, 0xAC, 0xE5, 0xC7, 0x31, 0x8E, 0xA0, 0x3C, 0x0A, 0xBD, 0x3A,
+  0x89, 0xAF, 0x85, 0x4E, 0xDA, 0x66, 0xF9, 0x8F, 0x8D, 0xF8, 0xBC, 0x6B,
+  0xD7, 0x77, 0x05, 0x4E, 0xC9, 0x81, 0x82, 0x80, 0x4E, 0xEB, 0x18, 0x1E,
+  0xA8, 0x4D, 0xF6, 0x05, 0x8D, 0x68, 0xB5, 0x5A, 0x28, 0x3E, 0xA3, 0xC5,
+  0x9C, 0xE6, 0xB9, 0x7C, 0xEC, 0xA7, 0xF4, 0xD8, 0xDF, 0xE6, 0x77, 0x7F,
+  0x74, 0xDE, 0xB2, 0xEE, 0x43, 0x76, 0xE8, 0x12, 0x66, 0x79, 0xFC, 0xD1,
+  0x64, 0xA9, 0x70, 0x20, 0x5F, 0xCD, 0xF6, 0x1E, 0x93, 0xF2, 0x6D, 0x3E,
+  0xFB, 0x4A, 0xB0, 0xF7, 0xFC, 0xD7, 0xF2, 0xC1, 0x6F, 0x6C, 0x9E, 0x60,
+  0x91, 0x1E, 0x68, 0xEA, 0x13, 0xA5, 0xF9, 0x11, 0xC6, 0x7A, 0x9A, 0x1F,
+  0xF9, 0x6A, 0xA9, 0xA9, 0x4C, 0x92, 0xF0, 0xDB, 0x79, 0xCB, 0x53, 0xC8,
+  0x77, 0xC3, 0xD8, 0xE3, 0xDA, 0x93, 0x1A, 0xB2, 0xA3, 0xD7, 0xA5, 0xC8,
+  0x75, 0xD3, 0x6E, 0x71, 0x86, 0x37, 0x8D, 0x9F, 0x38, 0x52, 0x66, 0x91,
+  0x37, 0x0F, 0xF0, 0x7F, 0x5D, 0x7E, 0x36, 0x0C, 0x3A, 0xCC, 0x23, 0x7E,
+  0xC1, 0x2C, 0x3F, 0xA6, 0x9F, 0x99, 0xFF, 0xCA, 0x74, 0xA4, 0xF4, 0xFC,
+  0xA6, 0xDA, 0xA7, 0x79, 0xBD, 0x7A, 0xB8, 0x59, 0x8F, 0x91, 0xA7, 0xD3,
+  0xEE, 0xF6, 0x53, 0xEB, 0xB1, 0xCF, 0xB2, 0xB7, 0x1F, 0xA1, 0xB7, 0xEB,
+  0x96, 0x95, 0xFC, 0x38, 0x64, 0x33, 0xD3, 0xF7, 0xE6, 0x6D, 0x4B, 0x27,
+  0x6A, 0x87, 0x8E, 0x5B, 0xFB, 0x97, 0x92, 0x6F, 0x76, 0x3D, 0x6E, 0xD7,
+  0x76, 0xC4, 0xE6, 0xF9, 0x31, 0xC6, 0xED, 0x3C, 0x3F, 0xA6, 0x23, 0xA5,
+  0x55, 0xA8, 0xD7, 0x0A, 0x4D, 0x59, 0x90, 0x9E, 0xD2, 0x56, 0xAD, 0x78,
+  0x0E, 0xC5, 0xD8, 0x7C, 0xBC, 0x77, 0xE9, 0x91, 0xFD, 0x88, 0xBD, 0x75,
+  0xF9, 0xF1, 0x7B, 0xA1, 0xDC, 0xD0, 0xB7, 0xC9, 0x6F, 0x13, 0x35, 0x75,
+  0x11, 0xC7, 0xC3, 0x10, 0x29, 0xC7, 0x2E, 0xAA, 0x9A, 0x71, 0xD0, 0xDA,
+  0xFC, 0x8F, 0xE5, 0xE3, 0x81, 0x78, 0xD0, 0x85, 0xDB, 0x3C, 0xC3, 0x31,
+  0xF0, 0xDB, 0xFB, 0x81, 0xC6, 0xAE, 0x52, 0x3D, 0x96, 0x6E, 0xAB, 0xF4,
+  0x48, 0xED, 0xDA, 0x91, 0x4F, 0x63, 0xBE, 0xB4, 0xE7, 0x3C, 0xFA, 0xC6,
+  0x3D, 0xC5, 0xAE, 0x27, 0xD4, 0x14, 0x99, 0xE6, 0xE3, 0x5B, 0xC8, 0x76,
+  0x51, 0xF3, 0x91, 0xE6, 0xC7, 0x8F, 0x2E, 0x3F, 0x96, 0xBA, 0x2F, 0xF7,
+  0x70, 0x1A, 0x2F, 0xF9, 0x4D, 0x11, 0xCC, 0x0C, 0x0D, 0x97, 0xD8, 0x21,
+  0x42, 0x86, 0xA1, 0x46, 0x31, 0x2B, 0x3F, 0x6E, 0x69, 0x8B, 0xE0, 0x56,
+  0x96, 0x66, 0xA5, 0x7C, 0xDC, 0x43, 0xBB, 0x25, 0x51, 0x35, 0x04, 0xEB,
+  0xAA, 0x22, 0xA8, 0x68, 0x19, 0x07, 0x7D, 0x1D, 0x7C, 0xBC, 0x27, 0xC8,
+  0x38, 0xE9, 0xB4, 0x9A, 0x1F, 0xC7, 0xB0, 0x6A, 0x75, 0x39, 0x9D, 0x75,
+  0x5C, 0xA2, 0x92, 0x1E, 0xDF, 0xC1, 0x7E, 0xEC, 0x5E, 0xDD, 0xD2, 0x23,
+  0xE9, 0x5F, 0xAD, 0xE6, 0x47, 0x35, 0x0B, 0xF8, 0xD0, 0x31, 0x0E, 0xEF,
+  0xCB, 0x98, 0x0E, 0x63, 0xF4, 0x9D, 0x37, 0xCB, 0x17, 0x6B, 0xE5, 0xC3,
+  0x19, 0xA1, 0x3E, 0x1C, 0x3F, 0x8E, 0x1B, 0xC7, 0x09, 0x0E, 0x76, 0x0A,
+  0xCA, 0x8C, 0x87, 0x09, 0xF3, 0x23, 0xD9, 0xF5, 0xB7, 0xFC, 0x58, 0xE8,
+  0x73, 0x36, 0x6B, 0x25, 0x78, 0x5A, 0xF5, 0x2E, 0xBB, 0xA7, 0xC7, 0xCF,
+  0x3E, 0x3F, 0xD2, 0x06, 0xA4, 0xCB, 0x8F, 0x85, 0x89, 0xFC, 0xE3, 0x66,
+  0x2C, 0xCC, 0xAF, 0xF6, 0x75, 0x12, 0xF1, 0xC5, 0x27, 0xCA, 0x87, 0xD3,
+  0x61, 0x69, 0xF9, 0xCB, 0x90, 0xA2, 0xC3, 0xBF, 0xD6, 0x85, 0xF9, 0x71,
+  0x3F, 0xF2, 0x90, 0xF0, 0x61, 0x7E, 0x5C, 0x3E, 0x9B, 0x1F, 0x45, 0x7C,
+  0x8C, 0x49, 0x3B, 0x3F, 0x6D, 0x9E, 0xDC, 0xEF, 0x31, 0x3F, 0xDE, 0xEF,
+  0xF9, 0xD1, 0xFF, 0x73, 0x6C, 0x47, 0xAE, 0xE9, 0xB1, 0x5F, 0x28, 0x97,
+  0xAD, 0x5D, 0x44, 0x3B, 0xF5, 0x42, 0x04, 0x25, 0xED, 0xC5, 0x66, 0xF3,
+  0xF1, 0xB1, 0x50, 0x3E, 0x9F, 0xC5, 0xDE, 0xB1, 0xDF, 0x50, 0xAF, 0x44,
+  0xEB, 0x68, 0x21, 0x3F, 0x86, 0x71, 0x4C, 0x98, 0x1F, 0x51, 0xAE, 0x5C,
+  0x36, 0xF2, 0x63, 0x18, 0xA9, 0x14, 0xB3, 0xE5, 0x8D, 0xFB, 0x0E, 0x03,
+  0x8F, 0xEF, 0xA3, 0x8C, 0xDB, 0x8F, 0xE0, 0xF1, 0x8F, 0xDD, 0x6D, 0xAA,
+  0xB7, 0x9B, 0xE2, 0x5D, 0x88, 0xBD, 0x66, 0xED, 0x1A, 0x7A, 0x53, 0x2D,
+  0x84, 0x56, 0xDC, 0x60, 0xB4, 0x9B, 0xE5, 0xCF, 0x0B, 0xE5, 0xCB, 0xD9,
+  0xB6, 0x21, 0x43, 0xB7, 0x32, 0x6D, 0xFA, 0xE5, 0x53, 0x78, 0xE4, 0xA1,
+  0x41, 0x0C, 0x73, 0xA2, 0x6F, 0x11, 0xA7, 0x36, 0x2B, 0x9E, 0xBF, 0x0A,
+  0x6B, 0x3A, 0x6E, 0x3C, 0x26, 0xF5, 0x9F, 0x26, 0x0C, 0x4A, 0x6B, 0xE7,
+  0xDF, 0xC3, 0x69, 0x9A, 0xDE, 0xDD, 0xED, 0x6E, 0x4B, 0x82, 0xF9, 0xA9,
+  0xAA, 0xEB, 0xDF, 0xE5, 0xF1, 0xB6, 0xF6, 0xD1, 0x6D, 0x59, 0x6A, 0x24,
+  0xD2, 0x8B, 0x6D, 0xAC, 0x4C, 0x42, 0xAD, 0x13, 0xE7, 0x4C, 0x13, 0xC7,
+  0x69, 0x62, 0x29, 0xBF, 0x66, 0xBF, 0x38, 0x0E, 0xCC, 0x8F, 0x5B, 0x55,
+  0xB9, 0x44, 0xF9, 0x31, 0x8C, 0xFB, 0x93, 0x83, 0xD6, 0x75, 0x5D, 0xE5,
+  0xE9, 0xA5, 0x3F, 0xCE, 0x8F, 0xB0, 0xE1, 0x0A, 0x96, 0x2E, 0xF3, 0x38,
+  0x43, 0x82, 0x39, 0x6F, 0x6B, 0x83, 0xDF, 0xC2, 0x69, 0x17, 0xCC, 0x5F,
+  0xC5, 0x0F, 0x7B, 0x34, 0xC5, 0xAD, 0x31, 0x59, 0x5C, 0x3C, 0xDF, 0xCE,
+  0x8F, 0x62, 0x16, 0x52, 0x69, 0x89, 0xED, 0xF2, 0xA7, 0x85, 0xFC, 0x9A,
+  0x95, 0x18, 0xD3, 0xA2, 0x4F, 0x94, 0xF5, 0x7B, 0xB0, 0xFA, 0xDA, 0xE4,
+  0x45, 0x51, 0x0C, 0xB3, 0xC6, 0x63, 0xEC, 0xCE, 0xD7, 0x3F, 0xA6, 0x62,
+  0x71, 0x7E, 0x44, 0x95, 0x09, 0xEF, 0x0D, 0x88, 0xF3, 0x20, 0x5C, 0x3A,
+  0xF4, 0x64, 0xD9, 0x37, 0x50, 0xEC, 0x82, 0xF5, 0x8F, 0xD9, 0x93, 0x1E,
+  0x75, 0x51, 0x2C, 0xC7, 0xDD, 0x67, 0xE2, 0x3B, 0x5E, 0xEE, 0x8E, 0xFB,
+  0x4C, 0xF7, 0xF2, 0x2B, 0xED, 0xC7, 0xBC, 0x2F, 0xB5, 0xF0, 0x8B, 0x63,
+  0x74, 0xF6, 0x8D, 0xC2, 0xFA, 0x3D, 0xF8, 0xF3, 0xF5, 0xC1, 0x71, 0xE0,
+  0x30, 0xCB, 0x8F, 0x20, 0xA6, 0x37, 0xF2, 0x23, 0x2A, 0x17, 0xEF, 0x09,
+  0x7F, 0xCC, 0x30, 0xE4, 0xF9, 0x1D, 0x76, 0xE3, 0x00, 0xE4, 0x4F, 0xB6,
+  0xDB, 0xA7, 0x43, 0xCE, 0xBA, 0xFE, 0xCF, 0x62, 0xB1, 0x8F, 0x24, 0xD0,
+  0x62, 0x4B, 0xFD, 0xA3, 0x38, 0xE6, 0xFF, 0xFD, 0xF8, 0x25, 0xDD, 0x76,
+  0x9E, 0x42, 0x70, 0x33, 0x57, 0x17, 0xF2, 0x63, 0x4A, 0xA5, 0x34, 0x3F,
+  0xCE, 0x41, 0xB1, 0x38, 0x3F, 0xD2, 0xEE, 0x52, 0xB5, 0xB6, 0xAB, 0x09,
+  0x16, 0xD1, 0xDD, 0x9F, 0xF8, 0xF4, 0x8E, 0xBB, 0xA9, 0x01, 0xE9, 0x56,
+  0x08, 0xC3, 0xC1, 0x46, 0x7B, 0xEB, 0x60, 0x2D, 0x3E, 0x3D, 0xD8, 0x6E,
+  0x5E, 0x21, 0xCF, 0x0B, 0xE1, 0xD1, 0x87, 0xCD, 0xD8, 0xA6, 0x6C, 0x96,
+  0xAF, 0x17, 0xCA, 0x17, 0xC9, 0xC5, 0xBA, 0x3F, 0x5E, 0xD1, 0x3D, 0x9A,
+  0xF1, 0x97, 0x60, 0x4C, 0xF3, 0x23, 0xE8, 0xF7, 0x25, 0xF9, 0x11, 0x45,
+  0xFA, 0xFD, 0x14, 0xCB, 0xEA, 0x66, 0x7E, 0xD8, 0x29, 0x43, 0x92, 0x5F,
+  0x6E, 0x8A, 0x85, 0x5F, 0xE2, 0x39, 0xFD, 0xB3, 0xDB, 0x4F, 0x23, 0xF4,
+  0x3F, 0xD7, 0xD6, 0x64, 0x7F, 0xAC, 0xBA, 0x26, 0xA3, 0xAD, 0x4F, 0xDD,
+  0xC3, 0xE7, 0xDD, 0xFD, 0xBB, 0x8B, 0x09, 0x92, 0xC5, 0xE1, 0x1E, 0x1B,
+  0x42, 0x6B, 0x63, 0x53, 0x96, 0x84, 0xFB, 0xD2, 0xD1, 0x4F, 0xF3, 0x4D,
+  0x45, 0xF2, 0x39, 0xB0, 0xFA, 0x98, 0x7C, 0x92, 0x1F, 0xE1, 0x51, 0xD3,
+  0xF6, 0x23, 0xEC, 0xEF, 0xAD, 0xCE, 0xEF, 0x8E, 0x86, 0x0C, 0x99, 0x25,
+  0x4F, 0x3B, 0xFC, 0xE4, 0x46, 0x61, 0x9E, 0x42, 0xDE, 0xDD, 0x9F, 0x3B,
+  0x25, 0xC8, 0xAF, 0x6C, 0xE1, 0xF9, 0x8F, 0xA5, 0x28, 0x5E, 0x5D, 0x24,
+  0xEB, 0x8F, 0x3A, 0x0B, 0x8F, 0xF4, 0xFB, 0xF7, 0xCF, 0xE7, 0x85, 0xC2,
+  0x97, 0x71, 0x1E, 0x28, 0x08, 0xD7, 0xB4, 0xFC, 0xC2, 0xFD, 0xBD, 0x6B,
+  0xA7, 0x18, 0xE6, 0x47, 0xF2, 0x24, 0xE2, 0x30, 0x0C, 0x6A, 0x9B, 0x34,
+  0xFD, 0x3E, 0x93, 0x1F, 0xC3, 0x57, 0x16, 0xA6, 0xAA, 0xFE, 0xD6, 0xA6,
+  0xF1, 0x24, 0xF2, 0xDB, 0x1C, 0xEE, 0x94, 0x20, 0x7F, 0x7E, 0xBD, 0xBF,
+  0x75, 0xCF, 0x0F, 0xEE, 0xB3, 0xC3, 0xCF, 0xF1, 0xAE, 0xF7, 0x85, 0x4B,
+  0xF3, 0x10, 0x9F, 0x53, 0xB8, 0xB5, 0xC5, 0x74, 0x1D, 0xBD, 0x87, 0xC7,
+  0xD4, 0xBF, 0x18, 0xA6, 0x44, 0x67, 0xE5, 0x83, 0xBB, 0x97, 0x4E, 0x53,
+  0xF9, 0x2A, 0x2D, 0x5F, 0xA7, 0xE5, 0xE7, 0x83, 0xEE, 0xD5, 0x60, 0x8C,
+  0xD6, 0x07, 0x17, 0xCF, 0x62, 0xFA, 0xC5, 0x60, 0x36, 0x62, 0x23, 0x3F,
+  0xEA, 0xE1, 0xA7, 0xCA, 0x34, 0x3F, 0xC6, 0xFC, 0x9D, 0x1D, 0x8E, 0xA7,
+  0xF4, 0xCF, 0x6D, 0x55, 0x30, 0x7C, 0xC0, 0x76, 0xE6, 0x7D, 0xB1, 0x01,
+  0x19, 0x66, 0x32, 0x87, 0x88, 0xE8, 0x42, 0x65, 0x0A, 0xF0, 0xE1, 0x72,
+  0x7D, 0x4F, 0x9F, 0x85, 0x9E, 0xC8, 0x21, 0x29, 0xDF, 0x7D, 0xA5, 0x4C,
+  0xCB, 0x1F, 0x56, 0xCB, 0xCF, 0xD3, 0x63, 0xB5, 0x83, 0xF5, 0xA9, 0xFC,
+  0x98, 0xDF, 0x12, 0xB3, 0x9E, 0x1F, 0xE5, 0xF8, 0x94, 0xEE, 0x74, 0x6B,
+  0xF0, 0x58, 0xAB, 0x2A, 0x2C, 0x6C, 0x95, 0xF0, 0xD9, 0x1D, 0x6F, 0x77,
+  0x95, 0x5C, 0xC7, 0xE1, 0x87, 0xB5, 0xF4, 0xF8, 0xB9, 0xDC, 0xC1, 0x1A,
+  0x17, 0xC9, 0x0E, 0x55, 0x5D, 0x9F, 0x8B, 0x24, 0x1E, 0xC6, 0x3B, 0xD2,
+  0x8B, 0x73, 0x5D, 0x97, 0xE3, 0xAA, 0x40, 0x50, 0x7E, 0xEC, 0x20, 0xE5,
+  0x41, 0xF9, 0xB1, 0x09, 0xA8, 0xFE, 0x52, 0xBE, 0x2F, 0x9D, 0xDF, 0xDF,
+  0x9D, 0x90, 0x8E, 0xDD, 0x63, 0x9F, 0xCB, 0x8F, 0x2A, 0x4E, 0xD7, 0x31,
+  0xC4, 0xAF, 0xBF, 0xDF, 0x1B, 0x77, 0xF4, 0x7D, 0xB1, 0xE3, 0xB5, 0xDA,
+  0xE9, 0x6D, 0x94, 0xF7, 0x5F, 0x3A, 0xD7, 0xB3, 0x9B, 0xE5, 0x79, 0x52,
+  0x55, 0x7F, 0xD7, 0xD5, 0x7E, 0x18, 0x6D, 0xCC, 0x1A, 0x8F, 0x6E, 0x0A,
+  0xEB, 0x9F, 0xA5, 0x92, 0x0B, 0x3D, 0x9C, 0x20, 0x08, 0x17, 0x9E, 0x7E,
+  0x5A, 0x9C, 0x90, 0x8A, 0x15, 0xDB, 0xE5, 0xEB, 0xA4, 0xF0, 0x18, 0x98,
+  0x0B, 0x87, 0x4F, 0x7F, 0xE8, 0xAF, 0xCB, 0x9C, 0xFD, 0x9F, 0xD3, 0x8C,
+  0xC3, 0xEC, 0x11, 0xAD, 0x61, 0xC7, 0xEC, 0xC1, 0xB0, 0xE4, 0x6E, 0x95,
+  0xA5, 0xD3, 0xE1, 0x49, 0xB5, 0xF7, 0xBB, 0x12, 0x6F, 0x77, 0x5E, 0xED,
+  0x0F, 0xD1, 0x6B, 0x7E, 0x7E, 0xBE, 0xDF, 0xF2, 0x66, 0xBF, 0x5B, 0x9E,
+  0xA7, 0x9C, 0x3F, 0x3E, 0x1E, 0x06, 0xE1, 0x42, 0x78, 0x27, 0xF3, 0x3C,
+  0x0B, 0x0F, 0x20, 0x16, 0x9B, 0x47, 0x9F, 0xDD, 0xEE, 0x3E, 0x26, 0x44,
+  0x91, 0xEE, 0x0F, 0x7D, 0x32, 0x3F, 0xD2, 0x06, 0x64, 0x96, 0x1F, 0xF5,
+  0xCA, 0xF6, 0xB1, 0xD2, 0xE9, 0x8B, 0x20, 0x0C, 0xCF, 0xBF, 0x81, 0xFD,
+  0x78, 0x5B, 0x7B, 0xD6, 0xBF, 0x71, 0x37, 0xCB, 0xDE, 0x0E, 0xB7, 0x17,
+  0xF0, 0xEE, 0xEE, 0xAF, 0xE3, 0x5D, 0x7D, 0xBF, 0xCF, 0xEC, 0x1A, 0x1F,
+  0xE5, 0xD1, 0x2C, 0xC0, 0x67, 0x73, 0x5D, 0xB3, 0xF2, 0x87, 0xCD, 0xBD,
+  0xF3, 0xF7, 0x8E, 0x8C, 0x9F, 0xFB, 0xD8, 0x5E, 0xE9, 0x60, 0x7D, 0x32,
+  0x3F, 0xD2, 0x29, 0xE7, 0xB5, 0xFC, 0x98, 0xBD, 0x75, 0x65, 0x3C, 0x5A,
+  0xFA, 0xC6, 0x15, 0xEB, 0xE7, 0xDF, 0x40, 0x15, 0x3C, 0xF6, 0xF1, 0x36,
+  0x64, 0xC5, 0x90, 0x1A, 0x37, 0xEB, 0xEF, 0xBF, 0x2A, 0x37, 0xE3, 0x21,
+  0xEE, 0x40, 0x1D, 0x16, 0x2E, 0xA6, 0x49, 0xF9, 0x64, 0x80, 0x1D, 0x5F,
+  0x8E, 0xA3, 0x3B, 0x01, 0xD3, 0x79, 0xA3, 0xCD, 0xB9, 0xD8, 0x72, 0xE9,
+  0xE0, 0xBD, 0x8F, 0x30, 0xC2, 0xD3, 0x06, 0x64, 0x2D, 0x3F, 0xE2, 0x8A,
+  0xE5, 0xC1, 0x18, 0xBC, 0x89, 0xAE, 0x09, 0xDE, 0x5B, 0xFC, 0x2D, 0xDC,
+  0x1B, 0x90, 0xE9, 0x89, 0xF3, 0xBB, 0xFB, 0xD3, 0x51, 0xAB, 0xEF, 0x67,
+  0xE8, 0xB4, 0xC5, 0x56, 0x38, 0x04, 0x7B, 0xD3, 0x3B, 0xC1, 0x07, 0xA7,
+  0x4F, 0x96, 0x3F, 0xC4, 0xB9, 0xD7, 0x5F, 0xF7, 0x83, 0xC8, 0x3C, 0x05,
+  0x71, 0x9E, 0xEA, 0xC7, 0xD3, 0xCB, 0x7D, 0x9D, 0x5B, 0x40, 0x0F, 0xC7,
+  0x3E, 0xC6, 0x5F, 0x5C, 0x6D, 0x27, 0x2E, 0xED, 0x54, 0xED, 0xA4, 0xD6,
+  0xF5, 0x58, 0xC8, 0x8B, 0xEF, 0xBF, 0x89, 0xBA, 0x4F, 0x90, 0xF4, 0xB9,
+  0xDA, 0xF1, 0xF1, 0xC1, 0x6B, 0x7E, 0x6C, 0x75, 0x14, 0x9A, 0xAA, 0x2C,
+  0x8A, 0x53, 0xB5, 0xD2, 0xD5, 0xAE, 0xAF, 0x7B, 0x4F, 0xD5, 0x56, 0xA8,
+  0x6C, 0x97, 0xFF, 0xE8, 0xCB, 0xCF, 0xE7, 0x49, 0x9B, 0x26, 0x2E, 0xD1,
+  0xA6, 0x1B, 0xB6, 0xBE, 0x1C, 0xEF, 0x0A, 0x96, 0x70, 0xE2, 0x2F, 0x36,
+  0x91, 0x85, 0x6A, 0x2F, 0xBE, 0x14, 0xB5, 0xAE, 0x4E, 0xEB, 0xE7, 0xC3,
+  0xF3, 0x29, 0x76, 0x8B, 0x2F, 0x66, 0xF8, 0x64, 0x7E, 0xC0, 0x37, 0xD7,
+  0x27, 0xC8, 0x72, 0x7E, 0xBC, 0xAD, 0xBD, 0xBF, 0x04, 0x5E, 0x45, 0x97,
+  0x20, 0xFB, 0xB5, 0x0E, 0xD6, 0x75, 0xC4, 0xFE, 0xE8, 0xFA, 0xC1, 0x43,
+  0x75, 0xFF, 0x7B, 0x9C, 0xE5, 0x04, 0xC9, 0x36, 0x5E, 0x4F, 0x0D, 0xAF,
+  0xA2, 0xB8, 0xBD, 0x8D, 0x3A, 0x4E, 0x91, 0xB7, 0xFE, 0xFD, 0xBB, 0x46,
+  0x1F, 0x70, 0xE9, 0x9F, 0x36, 0x1F, 0x16, 0x3D, 0xEE, 0x2B, 0x21, 0xFB,
+  0xDC, 0xD8, 0x03, 0x6E, 0x9A, 0x22, 0x0F, 0xFF, 0xF7, 0x1F, 0xBB, 0xFD,
+  0x3F, 0x9A, 0x0E, 0x88, 0xD4, 0x65, 0x51, 0x1C, 0x8B, 0xA2, 0xD8, 0x5C,
+  0xB4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0xBE, 0x8A, 0xB6, 0x69, 0xDA, 0x47, 0xD7, 0x01, 0xBE, 0xA2, 0xB6,
+  0x3A, 0x66, 0x37, 0x87, 0xB2, 0x79, 0x74, 0x5D, 0xE0, 0x6B, 0x69, 0x8B,
+  0x2C, 0x3B, 0x56, 0xF5, 0x55, 0xD5, 0xFD, 0xA5, 0x15, 0x81, 0x49, 0x99,
+  0x65, 0xD5, 0xF4, 0xE9, 0x9C, 0x65, 0xA7, 0xC7, 0xD5, 0x05, 0xBE, 0x98,
+  0x63, 0x56, 0xC6, 0x1B, 0xAA, 0xEC, 0xF8, 0x98, 0x9A, 0xC0, 0x97, 0x73,
+  0xC8, 0xEA, 0x74, 0x53, 0x93, 0xE5, 0xFA, 0x58, 0x70, 0xE9, 0x5A, 0x8F,
+  0x71, 0x40, 0x7E, 0xCE, 0xF3, 0x7B, 0xC3, 0xD1, 0xE6, 0x87, 0x47, 0xD5,
+  0x07, 0xBE, 0x90, 0x32, 0x68, 0x3D, 0xBA, 0xF9, 0xAB, 0xA2, 0xFF, 0xB3,
+  0x19, 0xFE, 0x80, 0x17, 0xD6, 0x04, 0x23, 0xF3, 0xFA, 0x36, 0xBF, 0x7B,
+  0xFF, 0x70, 0x9E, 0xF7, 0xBA, 0xE0, 0xD5, 0x1C, 0xF3, 0xE9, 0xEF, 0xA6,
+  0xCB, 0x8F, 0x71, 0x64, 0x7E, 0xD4, 0xC3, 0xE2, 0xD5, 0x7D, 0x44, 0xAD,
+  0x44, 0x91, 0x05, 0xE3, 0xF2, 0x0F, 0x0D, 0x08, 0xAF, 0xAE, 0xC8, 0xA3,
+  0x8F, 0x4D, 0x98, 0x12, 0x47, 0x23, 0x10, 0x5E, 0x5C, 0xBA, 0xF2, 0x11,
+  0xAA, 0xB2, 0xFF, 0xBF, 0x7A, 0xC0, 0x17, 0xD4, 0x64, 0x1F, 0xD3, 0xDF,
+  0x1F, 0x75, 0x5D, 0x55, 0x55, 0xB8, 0x53, 0x07, 0x8B, 0x97, 0x76, 0x9E,
+  0x9A, 0x88, 0xA6, 0xBF, 0x3D, 0x31, 0x5C, 0x38, 0x0F, 0x6F, 0x3A, 0x81,
+  0xD7, 0x53, 0x4E, 0xC3, 0x8F, 0x2A, 0xCF, 0xBB, 0xFC, 0x08, 0x53, 0xC2,
+  0x00, 0x84, 0xD7, 0x76, 0x0A, 0x9B, 0x8B, 0x8F, 0x2E, 0x3F, 0xC2, 0xDB,
+  0x4A, 0x0A, 0xF9, 0xC1, 0x4B, 0x2B, 0xC2, 0xFC, 0x28, 0xAF, 0xE9, 0x11,
+  0x4D, 0x67, 0xC9, 0x0F, 0x5E, 0x5B, 0x19, 0xE6, 0xC3, 0x61, 0xBA, 0xBB,
+  0xA4, 0xA7, 0x7F, 0xC5, 0x6B, 0x8B, 0xA6, 0x70, 0xBB, 0xF1, 0x47, 0x34,
+  0x63, 0xB5, 0x35, 0xF9, 0x0B, 0xDF, 0x5F, 0x1D, 0x8C, 0x37, 0xEA, 0xB4,
+  0x7B, 0x75, 0x31, 0xBF, 0xCB, 0x8B, 0x0B, 0xE6, 0xAB, 0x8A, 0xE0, 0xE6,
+  0xC4, 0x9B, 0xDA, 0xFA, 0x20, 0x2F, 0xEE, 0x38, 0x0D, 0xD0, 0xBB, 0xEE,
+  0x55, 0x79, 0x39, 0x4F, 0x0B, 0x86, 0x85, 0x87, 0x08, 0x79, 0x71, 0xE7,
+  0xB1, 0x83, 0xD5, 0x76, 0xB3, 0xBB, 0xCD, 0x25, 0x9B, 0x1A, 0x0D, 0xCB,
+  0x83, 0xBC, 0xBC, 0x71, 0xC6, 0xAA, 0x1F, 0x7E, 0x04, 0x8F, 0xA2, 0x9F,
+  0x74, 0xAF, 0x78, 0x79, 0xE7, 0xE1, 0xE9, 0xDA, 0x6E, 0xF5, 0xE3, 0x50,
+  0x4C, 0x23, 0xF4, 0x56, 0xF3, 0x01, 0x97, 0xC3, 0x3D, 0x23, 0xAA, 0xDB,
+  0xED, 0x57, 0xF9, 0x6C, 0x3B, 0xBC, 0xB2, 0x76, 0xB8, 0x25, 0xB1, 0x1B,
+  0x9F, 0x1F, 0xC6, 0xE9, 0xDE, 0x22, 0xF3, 0x1A, 0x45, 0xE8, 0x06, 0x1E,
+  0x7D, 0x82, 0xB4, 0xA7, 0x62, 0x5A, 0xEF, 0x28, 0xAC, 0x7D, 0xC0, 0x4D,
+  0x9D, 0xE5, 0x49, 0x5B, 0xD1, 0x1E, 0xA5, 0x07, 0xDC, 0x35, 0x79, 0xFC,
+  0x42, 0xD1, 0x32, 0xD3, 0xB9, 0x82, 0xC9, 0x75, 0x70, 0x3E, 0x74, 0xAE,
+  0xEA, 0x22, 0x73, 0xDF, 0x15, 0xC4, 0xCA, 0x6C, 0x54, 0x7A, 0xB5, 0x28,
+  0xA4, 0xDA, 0xBA, 0x3A, 0x9D, 0xCA, 0x5A, 0xCF, 0x0A, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x57, 0xF4, 0x5F, 0xC3, 0x54, 0x94,
+  0x5A
+};
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/cocoa_press_ui.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/cocoa_press_ui.h
index 5704371131c..6219f825dbe 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/cocoa_press_ui.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/cocoa_press_ui.h
@@ -1,52 +1,32 @@
-/****************************************************************************
- *   This program is free software: you can redistribute it and/or modify   *
- *   it under the terms of the GNU General Public License as published by   *
- *   the Free Software Foundation, either version 3 of the License, or      *
- *   (at your option) any later version.                                    *
- *                                                                          *
- *   This program is distributed in the hope that it will be useful,        *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- *   GNU General Public License for more details.                           *
- *                                                                          *
- *   To view a copy of the GNU General Public License, go to the following  *
- *   location: <https://www.gnu.org/licenses/>.                             *
- ****************************************************************************/
-
-/**
- * This file was auto-generated using "svg2cpp.py"
- *
- * The encoding consists of x,y pairs with the min and max scaled to
- * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the
- * start of a new closed path.
- */
-#pragma once
-
-constexpr float x_min = 0.000000;
-constexpr float x_max = 480.000000;
-constexpr float y_min = 0.000000;
-constexpr float y_max = 272.000000;
-
-const PROGMEM uint16_t menu_btn[] = {0x0AAA, 0x0E1E, 0x6D54, 0x0E1E, 0x6D54, 0x2F0E, 0x0AAA, 0x2F0E, 0x0AAA, 0x0E1E};
-const PROGMEM uint16_t print_btn[] = {0x47FF, 0xCF0D, 0x7FFF, 0xCF0D, 0x7FFF, 0xEFFE, 0x47FF, 0xEFFE, 0x47FF, 0xCF0D};
-const PROGMEM uint16_t load_chocolate_btn[] = {0x0AAA, 0x3878, 0x6D54, 0x3878, 0x6D54, 0x5968, 0x0AAA, 0x5968, 0x0AAA, 0x3878};
-const PROGMEM uint16_t extrude_btn[] = {0x0AAA, 0x5E1D, 0x6D54, 0x5E1D, 0x6D54, 0x7F0E, 0x0AAA, 0x7F0E, 0x0AAA, 0x5E1D};
-const PROGMEM uint16_t preheat_chocolate_btn[] = {0x0AAA, 0x83C2, 0x6D54, 0x83C2, 0x6D54, 0xA4B3, 0x0AAA, 0xA4B3, 0x0AAA, 0x83C2};
-const PROGMEM uint16_t media_btn[] = {0x0AAA, 0xCF0D, 0x42AA, 0xCF0D, 0x42AA, 0xEFFE, 0x0AAA, 0xEFFE, 0x0AAA, 0xCF0D};
-const PROGMEM uint16_t pause_btn[] = {0x8554, 0xCF0D, 0xBD53, 0xCF0D, 0xBD53, 0xEFFE, 0x8554, 0xEFFE, 0x8554, 0xCF0D};
-const PROGMEM uint16_t print_time_hms[] = {0xC59E, 0xAEA0, 0xF510, 0xAEA0, 0xF510, 0xC52D, 0xC59E, 0xC52D, 0xC59E, 0xAEA0};
-const PROGMEM uint16_t file_name[] = {0x0B0E, 0xAECD, 0xBCEF, 0xAECD, 0xBCEF, 0xC4AB, 0x0B0E, 0xC4AB, 0x0B0E, 0xAECD};
-const PROGMEM uint16_t chocolate_label[] = {0x75C1, 0x1369, 0xF4FE, 0x1369, 0xF4FE, 0x2AB1, 0x75C1, 0x2AB1, 0x75C1, 0x1369};
-const PROGMEM uint16_t h0_label[] = {0x8304, 0x4BEB, 0xB271, 0x4BEB, 0xB271, 0x63B0, 0x8304, 0x63B0, 0x8304, 0x4BEB};
-const PROGMEM uint16_t h0_temp[] = {0x8304, 0x7190, 0xB271, 0x7190, 0xB271, 0x8955, 0x8304, 0x8955, 0x8304, 0x7190};
-const PROGMEM uint16_t h1_label[] = {0xBB04, 0x4BEB, 0xEA71, 0x4BEB, 0xEA71, 0x63B0, 0xBB04, 0x63B0, 0xBB04, 0x4BEB};
-const PROGMEM uint16_t h1_temp[] = {0xBB04, 0x7190, 0xEA71, 0x7190, 0xEA71, 0x8956, 0xBB04, 0x8956, 0xBB04, 0x7190};
-const PROGMEM uint16_t stop_btn[] = {0xC2A9, 0xCF0D, 0xF553, 0xCF0D, 0xF553, 0xEFFE, 0xC2A9, 0xEFFE, 0xC2A9, 0xCF0D};
-const PROGMEM uint16_t load_screen_extrude[] = {0x382C, 0x8B02, 0x4188, 0x8B02, 0x4188, 0xAC4A, 0x4637, 0xAC4A, 0x3CDA, 0xBCEE, 0x337D, 0xAC4A, 0x382C, 0xAC4A, 0x382C, 0x8B02};
-const PROGMEM uint16_t load_screen_retract[] = {0x382C, 0x7A5D, 0x4188, 0x7A5D, 0x4188, 0x5915, 0x4637, 0x5915, 0x3CDA, 0x4871, 0x337E, 0x5915, 0x382C, 0x5915, 0x382C, 0x7A5D};
-const PROGMEM uint16_t load_screen_back_btn[] = {0x1555, 0xCA58, 0xEAA8, 0xCA58, 0xEAA8, 0xEFFE, 0x1555, 0xEFFE, 0x1555, 0xCA58};
-const PROGMEM uint16_t load_screen_unload_btn[] = {0x67FF, 0x70F0, 0xEAA8, 0x70F0, 0xEAA8, 0x9695, 0x67FF, 0x9695, 0x67FF, 0x70F0};
-const PROGMEM uint16_t load_screen_start_stop_btn[] = {0x67FF, 0x9B4A, 0xEAA8, 0x9B4A, 0xEAA8, 0xC0EF, 0x67FF, 0xC0EF, 0x67FF, 0x9B4A};
-const PROGMEM uint16_t load_screen_load_btn[] = {0x67FF, 0x4696, 0xEAA8, 0x4696, 0xEAA8, 0x6C3B, 0x67FF, 0x6C3B, 0x67FF, 0x4696};
-const PROGMEM uint16_t load_screen_continuous[] = {0x67FF, 0x1787, 0xEAA8, 0x1787, 0xEAA8, 0x3D2C, 0x67FF, 0x3D2C, 0x67FF, 0x1787};
-const PROGMEM uint16_t load_screen_increment[] = {0x1555, 0x1787, 0x62A9, 0x1787, 0x62A9, 0x3D2C, 0x1555, 0x3D2C, 0x1555, 0x1787};
+const PROGMEM uint16_t menu_btn[] = {0x0AAC, 0x0DF3, 0x6D54, 0x0DF3, 0x6D54, 0x2E89, 0x0AAC, 0x2E89, 0x0AAC, 0x0DF3};
+const PROGMEM uint16_t print_btn[] = {0x4800, 0xCCCC, 0x7FFF, 0xCCCC, 0x7FFF, 0xED62, 0x4800, 0xED62, 0x4800, 0xCCCC};
+const PROGMEM uint16_t load_chocolate_btn[] = {0x0AAC, 0x37D8, 0x6D54, 0x37D8, 0x6D54, 0x586E, 0x0AAC, 0x586E, 0x0AAC, 0x37D8};
+const PROGMEM uint16_t preheat_chocolate_btn[] = {0x0AAC, 0x5D15, 0x6D54, 0x5D15, 0x6D54, 0x7DAB, 0x0AAC, 0x7DAB, 0x0AAC, 0x5D15};
+const PROGMEM uint16_t extrude_btn[] = {0x0AAC, 0x8252, 0x6D54, 0x8252, 0x6D54, 0xA2E8, 0x0AAC, 0xA2E8, 0x0AAC, 0x8252};
+const PROGMEM uint16_t media_btn[] = {0x0AAC, 0xCCCC, 0x42AA, 0xCCCC, 0x42AA, 0xED62, 0x0AAC, 0xED62, 0x0AAC, 0xCCCC};
+const PROGMEM uint16_t pause_btn[] = {0x8554, 0xCCCC, 0xBD53, 0xCCCC, 0xBD53, 0xED62, 0x8554, 0xED62, 0x8554, 0xCCCC};
+const PROGMEM uint16_t print_time_hms[] = {0xAB02, 0x82EE, 0xE4F8, 0x82EE, 0xE4F8, 0xA24C, 0xAB02, 0xA24C, 0xAB02, 0x82EE};
+const PROGMEM uint16_t print_time_pct[] = {0x7386, 0x82E2, 0xA500, 0x82E2, 0xA500, 0xA258, 0x7386, 0xA258, 0x7386, 0x82E2};
+const PROGMEM uint16_t file_name[] = {0x0B08, 0xA830, 0xF4F5, 0xA830, 0xF4F5, 0xC784, 0x0B08, 0xC784, 0x0B08, 0xA830};
+const PROGMEM uint16_t h0_label[] = {0x85B6, 0x3884, 0xAF9B, 0x3884, 0xAF9B, 0x57C1, 0x85B6, 0x57C1, 0x85B6, 0x3884};
+const PROGMEM uint16_t h0_temp[] = {0x85B6, 0x5DC1, 0xAF9B, 0x5DC1, 0xAF9B, 0x7CFF, 0x85B6, 0x7CFF, 0x85B6, 0x5DC1};
+const PROGMEM uint16_t h1_label[] = {0xBB0B, 0x3884, 0xE4EF, 0x3884, 0xE4EF, 0x57C1, 0xBB0B, 0x57C1, 0xBB0B, 0x3884};
+const PROGMEM uint16_t h1_temp[] = {0xBB0B, 0x5DC1, 0xE4EF, 0x5DC1, 0xE4EF, 0x7CFF, 0xBB0B, 0x7CFF, 0xBB0B, 0x5DC1};
+const PROGMEM uint16_t stop_btn[] = {0xC2A8, 0xCCCC, 0xF551, 0xCCCC, 0xF551, 0xED62, 0xC2A8, 0xED62, 0xC2A8, 0xCCCC};
+const PROGMEM uint16_t z_wizard_heading[] = {0x5332, 0x0FFF, 0xB331, 0x0FFF, 0xB331, 0x2AAA, 0x5332, 0x2AAA, 0x5332, 0x0FFF};
+const PROGMEM uint16_t z_wizard_plus_btn[] = {0x9CCB, 0x3AAA, 0xAFFE, 0x3AAA, 0xAFFE, 0x5554, 0x9CCB, 0x5554, 0x9CCB, 0x3AAA};
+const PROGMEM uint16_t z_wizard_edit_box[] = {0x0CCC, 0x9FFE, 0x5332, 0x9FFE, 0x5332, 0xC553, 0x0CCC, 0xC553, 0x0CCC, 0x9FFE};
+const PROGMEM uint16_t z_wizard_inc1_btn[] = {0x5998, 0xA016, 0x8998, 0xA016, 0x8998, 0xC553, 0x5998, 0xC553, 0x5998, 0xA016};
+const PROGMEM uint16_t z_wizard_inc2_btn[] = {0x8FFE, 0xA016, 0xBFFE, 0xA016, 0xBFFE, 0xC553, 0x8FFE, 0xC553, 0x8FFE, 0xA016};
+const PROGMEM uint16_t z_wizard_inc3_btn[] = {0xC664, 0xA016, 0xF664, 0xA016, 0xF664, 0xC553, 0xC664, 0xC553, 0xC664, 0xA016};
+const PROGMEM uint16_t z_wizard_done_btn[] = {0xBFFE, 0xCFFE, 0xF664, 0xCFFE, 0xF664, 0xF553, 0xBFFE, 0xF553, 0xBFFE, 0xCFFE};
+const PROGMEM uint16_t z_wizard_neg_btn[] = {0x9CCB, 0x5FFF, 0xAFFE, 0x5FFF, 0xAFFE, 0x7AA9, 0x9CCB, 0x7AA9, 0x9CCB, 0x5FFF};
+const PROGMEM uint16_t z_wizard_diagram[] = {0x6D65, 0x4DBE, 0x6D65, 0x6015, 0x7ADB, 0x6015, 0x7F1F, 0x6C6A, 0x8303, 0x6C6A, 0x8747, 0x6015, 0x94BE, 0x6015, 0x94BE, 0x4DBE, 0x6D65, 0x4DBE, 0xFFFF, 0x0D06, 0x8527, 0x0D06, 0x9554, 0xF664, 0x9554, 0xF664, 0x8527, 0x0D06, 0x8527};
+const PROGMEM uint16_t load_screen_extrude[] = {0x382D, 0x897E, 0x4189, 0x897E, 0x4189, 0xAA6A, 0x4638, 0xAA6A, 0x3CDB, 0xBAE0, 0x337F, 0xAA6A, 0x382D, 0xAA6A, 0x382D, 0x897E};
+const PROGMEM uint16_t load_screen_retract[] = {0x382D, 0x7908, 0x4189, 0x7908, 0x4189, 0x581C, 0x4638, 0x581C, 0x3CDB, 0x47A6, 0x337F, 0x581C, 0x382D, 0x581C, 0x382D, 0x7908};
+const PROGMEM uint16_t load_screen_back_btn[] = {0x1556, 0xC825, 0xEAA7, 0xC825, 0xEAA7, 0xED62, 0x1556, 0xED62, 0x1556, 0xC825};
+const PROGMEM uint16_t load_screen_unload_btn[] = {0x67FF, 0x6FB4, 0xEAA7, 0x6FB4, 0xEAA7, 0x94F1, 0x67FF, 0x94F1, 0x67FF, 0x6FB4};
+const PROGMEM uint16_t load_screen_start_stop_btn[] = {0x67FF, 0x9998, 0xEAA7, 0x9998, 0xEAA7, 0xBED6, 0x67FF, 0xBED6, 0x67FF, 0x9998};
+const PROGMEM uint16_t load_screen_load_btn[] = {0x67FF, 0x45CF, 0xEAA7, 0x45CF, 0xEAA7, 0x6B0C, 0x67FF, 0x6B0C, 0x67FF, 0x45CF};
+const PROGMEM uint16_t load_screen_continuous[] = {0x67FF, 0x1743, 0xEAA7, 0x1743, 0xEAA7, 0x3C80, 0x67FF, 0x3C80, 0x67FF, 0x1743};
+const PROGMEM uint16_t load_screen_increment[] = {0x1556, 0x1743, 0x62AA, 0x1743, 0x62AA, 0x3C80, 0x1556, 0x3C80, 0x1556, 0x1743};
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/files_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/files_screen.cpp
index f058b40e035..f7c7035761f 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/files_screen.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/files_screen.cpp
@@ -171,13 +171,10 @@ void FilesScreen::drawFooter() {
   cmd.colors(normal_btn)
      .font(font_medium)
      .colors(normal_btn)
-     .enabled(!mydata.flags.is_root)
-     .tag(245).button(BTN2_POS, F("Up Dir"))
+     .tag(mydata.flags.is_root ? 240 : 245).button(BTN2_POS, F("Back"))
      .colors(action_btn);
 
-  if (mydata.flags.is_empty)
-    cmd.tag(240).button(BTN1_POS, GET_TEXT_F(MSG_BUTTON_DONE));
-  else if (has_selection && mydata.flags.is_dir)
+  if (has_selection && mydata.flags.is_dir)
     cmd.tag(244).button(BTN1_POS, GET_TEXT_F(MSG_BUTTON_OPEN));
   else
     cmd.tag(241).enabled(has_selection).button(BTN1_POS, F("Select"));
@@ -214,12 +211,9 @@ void FilesScreen::gotoPage(uint8_t page) {
 
 bool FilesScreen::onTouchEnd(uint8_t tag) {
   switch (tag) {
-    case 240: // Done button, always select first file
-      {
-          FileList files;
-          files.seek(0);
-          GOTO_PREVIOUS();
-      }
+    case 240: // Back button
+      card.filename[0] = card.longFilename[0] = '\0'; // Clear file selection
+      GOTO_PREVIOUS();
       return true;
     case 241: // Select highlighted file
       GOTO_PREVIOUS();
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/leveling_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/leveling_menu.cpp
index fa31ce15533..820594acaba 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/leveling_menu.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/leveling_menu.cpp
@@ -25,24 +25,31 @@
 
 #if ENABLED(COCOA_LEVELING_MENU)
 
-#if ALL(HAS_BED_PROBE, BLTOUCH)
-  #include "../../../../feature/bltouch.h"
-#endif
-
 using namespace FTDI;
 using namespace ExtUI;
 using namespace Theme;
 
-#define GRID_COLS 3
-#define GRID_ROWS 5
-#define BED_MESH_TITLE_POS BTN_POS(1,1), BTN_SIZE(3,1)
-#define PROBE_BED_POS      BTN_POS(1,2), BTN_SIZE(1,1)
-#define SHOW_MESH_POS      BTN_POS(2,2), BTN_SIZE(1,1)
-#define EDIT_MESH_POS      BTN_POS(3,2), BTN_SIZE(1,1)
-#define BLTOUCH_TITLE_POS  BTN_POS(1,3), BTN_SIZE(3,1)
-#define BLTOUCH_RESET_POS  BTN_POS(1,4), BTN_SIZE(1,1)
-#define BLTOUCH_TEST_POS   BTN_POS(2,4), BTN_SIZE(1,1)
-#define BACK_POS           BTN_POS(1,5), BTN_SIZE(3,1)
+#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL)
+  #define GRID_COLS 3
+  #define GRID_ROWS 6
+  #define BED_MESH_TITLE_POS BTN_POS(1,1), BTN_SIZE(3,1)
+  #define WARNING_POS        BTN_POS(1,2), BTN_SIZE(3,2)
+  #define PROBE_BED_POS      BTN_POS(1,4), BTN_SIZE(1,1)
+  #define SHOW_MESH_POS      BTN_POS(2,4), BTN_SIZE(1,1)
+  #define EDIT_MESH_POS      BTN_POS(3,4), BTN_SIZE(1,1)
+  #define BACK_POS           BTN_POS(1,6), BTN_SIZE(3,1)
+#else
+  #define GRID_COLS 2
+  #define GRID_ROWS 6
+  #define BED_MESH_TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1)
+  #define WARNING_POS        BTN_POS(1,2), BTN_SIZE(2,2)
+  #define PROBE_BED_POS      BTN_POS(1,4), BTN_SIZE(1,1)
+  #define SHOW_MESH_POS      BTN_POS(2,4), BTN_SIZE(1,1)
+  #define BACK_POS           BTN_POS(1,6), BTN_SIZE(2,1)
+
+  // Hide the editor button if motion to grid point not supported
+  #define EDIT_MESH_POS      BTN_POS(4,7), BTN_SIZE(1,1)
+#endif
 
 void LevelingMenu::onRedraw(draw_mode_t what) {
   if (what & BACKGROUND) {
@@ -57,38 +64,26 @@ void LevelingMenu::onRedraw(draw_mode_t what) {
     cmd.font(font_large)
        .cmd(COLOR_RGB(bg_text_enabled))
        .text(BED_MESH_TITLE_POS, GET_TEXT_F(MSG_BED_LEVELING))
-       #if ENABLED(BLTOUCH)
-       .text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH))
-       #endif
        .font(font_medium).colors(normal_btn)
        .tag(2).button(PROBE_BED_POS, GET_TEXT_F(MSG_PROBE_BED))
               .enabled(ENABLED(HAS_MESH))
        .tag(3).button(SHOW_MESH_POS, GET_TEXT_F(MSG_MESH_VIEW))
               .enabled(ENABLED(HAS_MESH))
        .tag(4).button(EDIT_MESH_POS, GET_TEXT_F(MSG_EDIT_MESH))
-       #undef  GRID_COLS
-       #define GRID_COLS 2
-       #if ENABLED(BLTOUCH)
-       .tag(5).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET))
-       .tag(6).button(BLTOUCH_TEST_POS,  GET_TEXT_F(MSG_BLTOUCH_SELFTEST))
-       #endif
-       #undef  GRID_COLS
-       #define GRID_COLS 3
        .colors(action_btn)
-       .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_DONE));
+       .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BUTTON_DONE))
+       .cmd(COLOR_RGB(bg_text_enabled))
+       .tag(0);
+    draw_text_box(cmd, WARNING_POS, F("Remove chocolate cartridge before probing.  This reduces the possibility of damaging a part."), OPT_CENTER, font_medium);
   }
 }
 
 bool LevelingMenu::onTouchEnd(uint8_t tag) {
   switch (tag) {
     case 1: GOTO_PREVIOUS(); break;
-    case 2: BedMeshViewScreen::doProbe(); break;
+    case 2: SaveSettingsDialogBox::settingsChanged(); injectCommands(F(BED_LEVELING_COMMANDS)); break;
     case 3: BedMeshViewScreen::show(); break;
-    case 4: BedMeshEditScreen::show(); break;
-    #if ENABLED(BLTOUCH)
-    case 5: injectCommands(F("M280 P0 S60")); break;
-    case 6: SpinnerDialogBox::enqueueAndWait(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break;
-    #endif
+    case 4: SaveSettingsDialogBox::settingsChanged(); BedMeshEditScreen::show(); break;
     default: return false;
   }
   return true;
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/main_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/main_menu.cpp
index 2f231278f2d..14dc8c533fa 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/main_menu.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/main_menu.cpp
@@ -23,6 +23,7 @@
 
 #include "../config.h"
 #include "../screens.h"
+#include "../../../../module/stepper.h"
 
 #ifdef COCOA_MAIN_MENU
 
@@ -34,13 +35,13 @@ using namespace Theme;
 
 #define ZPROBE_ZOFFSET_POS    BTN_POS(1,1), BTN_SIZE(1,1)
 #define MOVE_XYZ_POS          BTN_POS(1,2), BTN_SIZE(1,1)
-#define TEMPERATURE_POS       BTN_POS(2,1), BTN_SIZE(1,1)
+#define LEVELING_POS          BTN_POS(2,1), BTN_SIZE(1,1)
 #define MOVE_E_POS            BTN_POS(2,2), BTN_SIZE(1,1)
 #define SPEED_POS             BTN_POS(1,3), BTN_SIZE(1,1)
 #define FLOW_POS              BTN_POS(2,3), BTN_SIZE(1,1)
-#define ADVANCED_SETTINGS_POS BTN_POS(1,4), BTN_SIZE(1,1)
+#define TEMPERATURE_POS       BTN_POS(1,4), BTN_SIZE(1,1)
 #define DISABLE_STEPPERS_POS  BTN_POS(2,4), BTN_SIZE(1,1)
-#define LEVELING_POS          BTN_POS(1,5), BTN_SIZE(1,1)
+#define ADVANCED_SETTINGS_POS BTN_POS(1,5), BTN_SIZE(1,1)
 #define ABOUT_PRINTER_POS     BTN_POS(2,5), BTN_SIZE(1,1)
 #define BACK_POS              BTN_POS(1,6), BTN_SIZE(2,1)
 
@@ -63,6 +64,10 @@ void MainMenu::onRedraw(draw_mode_t what) {
        .tag( 6).button(SPEED_POS,             GET_TEXT_F(MSG_PRINT_SPEED))
        .tag( 7).button(FLOW_POS,              GET_TEXT_F(MSG_FLOW))
        .tag( 8).button(ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS))
+               .enabled(stepper.axis_is_enabled(X_AXIS) ||
+                        stepper.axis_is_enabled(Y_AXIS) ||
+                        stepper.axis_is_enabled(Z_AXIS) ||
+                        stepper.axis_is_enabled(E0_AXIS))
        .tag( 9).button(DISABLE_STEPPERS_POS,  GET_TEXT_F(MSG_DISABLE_STEPPERS))
                .enabled(ENABLED(HAS_LEVELING))
        .tag(10).button(LEVELING_POS,          GET_TEXT_F(MSG_LEVELING))
@@ -97,4 +102,12 @@ bool MainMenu::onTouchEnd(uint8_t tag) {
   return true;
 }
 
+void MainMenu::onIdle() {
+  if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) {
+    if (!EventLoop::is_touch_held())
+      onRefresh();
+    refresh_timer.start();
+  }
+}
+
 #endif // COCOA_MAIN_MENU
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/main_menu.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/main_menu.h
index 460bb4b81a7..85dcbd07e6a 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/main_menu.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/main_menu.h
@@ -30,4 +30,5 @@ class MainMenu : public BaseScreen, public CachedScreen<MENU_SCREEN_CACHE> {
   public:
     static void onRedraw(draw_mode_t);
     static bool onTouchEnd(uint8_t tag);
+    static void onIdle();
 };
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/preheat_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/preheat_menu.cpp
index 2fabb81ee4d..ff11b6e0d9a 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/preheat_menu.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/preheat_menu.cpp
@@ -32,40 +32,24 @@ using namespace Theme;
 #define GRID_ROWS 5
 
 void PreheatMenu::onRedraw(draw_mode_t what) {
-  const int16_t w = TERN0(COCOA_PRESS_EXTRA_HEATER, has_extra_heater()) ? BTN_W(1) : BTN_W(2);
-  const int16_t h = BTN_H(1);
-
   if (what & BACKGROUND) {
     CommandProcessor cmd;
     cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color))
        .cmd(CLEAR(true,true,true))
-       .tag(0)
        .cmd(COLOR_RGB(bg_text_enabled))
        .font(Theme::font_medium)
-       .text( BTN_POS(1,1), w, h, GET_TEXT_F(MSG_SELECT_CHOCOLATE_TYPE));
-    #if ENABLED(COCOA_PRESS_EXTRA_HEATER)
-      if (has_extra_heater()) {
-        cmd.text( BTN_POS(2,1), w, h, GET_TEXT_F(MSG_EXTERNAL));
-      }
-    #endif
+       .tag(0).text(  BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_SELECT_CHOCOLATE_TYPE));
   }
 
   if (what & FOREGROUND) {
     CommandProcessor cmd;
     cmd.font(Theme::font_medium)
        .colors(normal_btn)
-       .tag(2).button(BTN_POS(1,2), w, h, F("Dark Chocolate"))
-       .tag(3).button(BTN_POS(1,3), w, h, F("Milk Chocolate"))
-       .tag(4).button(BTN_POS(1,4), w, h, F("White Chocolate"));
-    #if ENABLED(COCOA_PRESS_EXTRA_HEATER)
-      if (has_extra_heater()) {
-        cmd.tag(5).button(BTN_POS(2,2), w, h, F("Dark Chocolate"))
-           .tag(6).button(BTN_POS(2,3), w, h, F("Milk Chocolate"))
-           .tag(7).button(BTN_POS(2,4), w, h, F("White Chocolate"));
-      }
-    #endif
-    cmd.colors(action_btn)
-       .tag(1) .button(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_DONE));
+       .tag(2).button(BTN_POS(1,2), BTN_SIZE(2,1), F("Dark Chocolate"))
+       .tag(3).button(BTN_POS(1,3), BTN_SIZE(2,1), F("Milk Chocolate"))
+       .tag(4).button(BTN_POS(1,4), BTN_SIZE(2,1), F("White Chocolate"))
+       .colors(action_btn)
+       .tag(1).button(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_DONE));
   }
 }
 
@@ -73,38 +57,20 @@ bool PreheatMenu::onTouchEnd(uint8_t tag) {
   switch (tag) {
     case 1: GOTO_PREVIOUS();                   break;
     case 2:
-      #ifdef COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_INT_SCRIPT
-        injectCommands(F(COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_INT_SCRIPT));
+      #ifdef COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_SCRIPT
+        injectCommands(F(COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_SCRIPT));
       #endif
       GOTO_SCREEN(PreheatTimerScreen);
       break;
     case 3:
-      #ifdef COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_INT_SCRIPT
-        injectCommands(F(COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_INT_SCRIPT));
+      #ifdef COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_SCRIPT
+        injectCommands(F(COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_SCRIPT));
       #endif
       GOTO_SCREEN(PreheatTimerScreen);
       break;
     case 4:
-      #ifdef COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_INT_SCRIPT
-        injectCommands(F(COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_INT_SCRIPT));
-      #endif
-      GOTO_SCREEN(PreheatTimerScreen);
-      break;
-    case 5:
-      #ifdef COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_EXT_SCRIPT
-        injectCommands(F(COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_EXT_SCRIPT));
-      #endif
-      GOTO_SCREEN(PreheatTimerScreen);
-      break;
-    case 6:
-      #ifdef COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_EXT_SCRIPT
-        injectCommands(F(COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_EXT_SCRIPT));
-      #endif
-      GOTO_SCREEN(PreheatTimerScreen);
-      break;
-    case 7:
-      #ifdef COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_EXT_SCRIPT
-        injectCommands(F(COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_EXT_SCRIPT));
+      #ifdef COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_SCRIPT
+        injectCommands(F(COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_SCRIPT));
       #endif
       GOTO_SCREEN(PreheatTimerScreen);
       break;
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/preheat_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/preheat_screen.cpp
index c4e9d971f6a..9641b1f9c6a 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/preheat_screen.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/preheat_screen.cpp
@@ -89,20 +89,20 @@ void PreheatTimerScreen::draw_adjuster(draw_mode_t what, uint8_t tag, FSTR_P lab
     cmd.tag(0)
        .font(font_small);
     if (what & BACKGROUND) {
-        cmd.text(  SUB_POS(1,1), SUB_SIZE(9,1), label)
-           .button(SUB_POS(1,2), SUB_SIZE(5,1), F(""), OPT_FLAT);
+      cmd.text(  SUB_POS(1,1), SUB_SIZE(9,1), label)
+         .button(SUB_POS(1,2), SUB_SIZE(5,1), F(""), OPT_FLAT);
     }
 
     if (what & FOREGROUND) {
-        char str[32];
-        dtostrf(value, 5, 1, str);
-        strcat_P(str, PSTR(" "));
-        strcat_P(str, (const char*) GET_TEXT_F(MSG_UNITS_C));
+      char str[32];
+      dtostrf(value, 5, 1, str);
+      strcat_P(str, PSTR(" "));
+      strcat_P(str, (const char*) GET_TEXT_F(MSG_UNITS_C));
 
-        cmd.text(SUB_POS(1,2), SUB_SIZE(5,1), str)
-           .font(font_medium)
-           .tag(tag  ).button(SUB_POS(6,2), SUB_SIZE(2,1), F("-"))
-           .tag(tag+1).button(SUB_POS(8,2), SUB_SIZE(2,1), F("+"));
+      cmd.text(SUB_POS(1,2), SUB_SIZE(5,1), str)
+         .font(font_medium)
+         .tag(tag  ).button(SUB_POS(6,2), SUB_SIZE(2,1), F("-"))
+         .tag(tag+1).button(SUB_POS(8,2), SUB_SIZE(2,1), F("+"));
     }
 }
 
@@ -116,7 +116,9 @@ void PreheatTimerScreen::onRedraw(draw_mode_t what) {
   draw_interaction_buttons(what);
   draw_adjuster(what, 2, GET_TEXT_F(MSG_NOZZLE),  getTargetTemp_celsius(E0),      NOZZLE_ADJ_POS);
   draw_adjuster(what, 4, GET_TEXT_F(MSG_BODY),    getTargetTemp_celsius(E1),      BODY_ADJ_POS);
-  draw_adjuster(what, 6, GET_TEXT_F(MSG_CHAMBER), getTargetTemp_celsius(CHAMBER), CHAMBER_ADJ_POS);
+  #if HAS_HEATED_CHAMBER
+    draw_adjuster(what, 6, GET_TEXT_F(MSG_CHAMBER), getTargetTemp_celsius(CHAMBER), CHAMBER_ADJ_POS);
+  #endif
 }
 
 bool PreheatTimerScreen::onTouchHeld(uint8_t tag) {
@@ -126,8 +128,10 @@ bool PreheatTimerScreen::onTouchHeld(uint8_t tag) {
     case 3: UI_INCREMENT(TargetTemp_celsius, E0); break;
     case 4: UI_DECREMENT(TargetTemp_celsius, E1); break;
     case 5: UI_INCREMENT(TargetTemp_celsius, E1); break;
-    case 6: UI_DECREMENT(TargetTemp_celsius, CHAMBER); break;
-    case 7: UI_INCREMENT(TargetTemp_celsius, CHAMBER); break;
+    #if HAS_HEATED_CHAMBER
+      case 6: UI_DECREMENT(TargetTemp_celsius, CHAMBER); break;
+      case 7: UI_INCREMENT(TargetTemp_celsius, CHAMBER); break;
+    #endif
     default:
       return false;
   }
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/screens.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/screens.h
index 5276f64f442..3e2b5546e91 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/screens.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/screens.h
@@ -84,7 +84,6 @@ enum {
 #include "../generic/base_numeric_adjustment_screen.h"
 #include "../generic/dialog_box_base_class.h"
 #include "../generic/boot_screen.h"
-#include "../generic/about_screen.h"
 #include "../generic/kill_screen.h"
 #include "../generic/alert_dialog_box.h"
 #include "../generic/spinner_dialog_box.h"
@@ -105,13 +104,10 @@ enum {
 #include "../generic/lock_screen.h"
 #include "../generic/endstop_state_screen.h"
 #include "../generic/display_tuning_screen.h"
-#include "../generic/statistics_screen.h"
 #include "../generic/stepper_current_screen.h"
-#include "../generic/z_offset_screen.h"
 #include "../generic/bed_mesh_base.h"
 #include "../generic/bed_mesh_view_screen.h"
 #include "../generic/bed_mesh_edit_screen.h"
-#include "../generic/case_light_screen.h"
 #include "../generic/linear_advance_screen.h"
 #include "../generic/move_axis_screen.h"
 #include "../generic/flow_percent_screen.h"
@@ -132,3 +128,7 @@ enum {
 #include "move_e_screen.h"
 #include "files_screen.h"
 #include "confirm_start_print_dialog_box.h"
+#include "z_offset_screen.h"
+#include "z_offset_wizard.h"
+#include "about_screen.h"
+#include "statistics_screen.h"
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/statistics_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/statistics_screen.cpp
new file mode 100644
index 00000000000..fd73ca0a4bf
--- /dev/null
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/statistics_screen.cpp
@@ -0,0 +1,83 @@
+/*************************
+ * statistics_screen.cpp *
+ *************************/
+
+/****************************************************************************
+ *   Written By Mark Pelletier  2017 - Aleph Objects, Inc.                  *
+ *   Written By Marcio Teixeira 2018 - Aleph Objects, Inc.                  *
+ *                                                                          *
+ *   This program is free software: you can redistribute it and/or modify   *
+ *   it under the terms of the GNU General Public License as published by   *
+ *   the Free Software Foundation, either version 3 of the License, or      *
+ *   (at your option) any later version.                                    *
+ *                                                                          *
+ *   This program is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *   GNU General Public License for more details.                           *
+ *                                                                          *
+ *   To view a copy of the GNU General Public License, go to the following  *
+ *   location: <https://www.gnu.org/licenses/>.                             *
+ ****************************************************************************/
+
+#include "../config.h"
+#include "../screens.h"
+
+#ifdef COCOA_STATISTICS_SCREEN
+
+using namespace FTDI;
+using namespace ExtUI;
+using namespace Theme;
+
+#define GRID_COLS 4
+#define GRID_ROWS 7
+
+void StatisticsScreen::onRedraw(draw_mode_t what) {
+  CommandProcessor cmd;
+
+  if (what & BACKGROUND) {
+    char buffer[21];
+
+
+    cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color))
+       .cmd(CLEAR(true,true,true))
+       .cmd(COLOR_RGB(bg_text_enabled))
+       .tag(0)
+
+       .font(Theme::font_medium)
+       .text(BTN_POS(1,1), BTN_SIZE(4,1), GET_TEXT_F(MSG_INFO_STATS_MENU))
+       .font(Theme::font_small)
+       .tag(0)
+       .text(BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_COUNT),      OPT_RIGHTX | OPT_CENTERY)
+       .text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_COMPLETED_PRINTS), OPT_RIGHTX | OPT_CENTERY)
+       .text(BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_TIME),       OPT_RIGHTX | OPT_CENTERY)
+       .text(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_LONGEST),    OPT_RIGHTX | OPT_CENTERY)
+       .text(BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_FILAMENT),   OPT_RIGHTX | OPT_CENTERY);
+    // Don't chain the following, it causes strange issues with evaluation ordering!
+    cmd.text(BTN_POS(3,2), BTN_SIZE(2,1), getTotalPrints_str(buffer));
+    cmd.text(BTN_POS(3,3), BTN_SIZE(2,1), getFinishedPrints_str(buffer));
+    cmd.text(BTN_POS(3,4), BTN_SIZE(2,1), getTotalPrintTime_str(buffer));
+    cmd.text(BTN_POS(3,5), BTN_SIZE(2,1), getLongestPrint_str(buffer));
+
+    // Express in grams of chocolate rather than mm
+    const printStatistics stats = print_job_timer.getStats();
+    const long gramsChocolate = stats.filamentUsed * 0.53; // 1mm of extrusion is 0.53g
+    sprintf_P(buffer, PSTR("%ldg"), gramsChocolate);
+    cmd.text(BTN_POS(3,6), BTN_SIZE(2,1), buffer);
+  }
+
+  if (what & FOREGROUND) {
+    cmd.font(Theme::font_medium)
+       .colors(action_btn)
+       .tag(1).button(BTN_POS(1,7), BTN_SIZE(4,1), GET_TEXT_F(MSG_BUTTON_DONE));
+  }
+}
+
+bool StatisticsScreen::onTouchEnd(uint8_t tag) {
+  switch (tag) {
+    case 1:        GOTO_PREVIOUS();              return true;
+    default:                                     return false;
+  }
+}
+
+#endif // COCOA_STATISTICS_SCREEN
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/statistics_screen.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/statistics_screen.h
new file mode 100644
index 00000000000..9e533570318
--- /dev/null
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/statistics_screen.h
@@ -0,0 +1,32 @@
+/***********************
+ * statistics_screen.h *
+ ***********************/
+
+/****************************************************************************
+ *   Written By Mark Pelletier  2017 - Aleph Objects, Inc.                  *
+ *   Written By Marcio Teixeira 2018 - Aleph Objects, Inc.                  *
+ *                                                                          *
+ *   This program is free software: you can redistribute it and/or modify   *
+ *   it under the terms of the GNU General Public License as published by   *
+ *   the Free Software Foundation, either version 3 of the License, or      *
+ *   (at your option) any later version.                                    *
+ *                                                                          *
+ *   This program is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *   GNU General Public License for more details.                           *
+ *                                                                          *
+ *   To view a copy of the GNU General Public License, go to the following  *
+ *   location: <https://www.gnu.org/licenses/>.                             *
+ ****************************************************************************/
+
+#pragma once
+
+#define COCOA_STATISTICS_SCREEN
+#define COCOA_STATISTICS_SCREEN_CLASS StatisticsScreen
+
+class StatisticsScreen : public BaseScreen, public UncachedScreen {
+  public:
+    static void onRedraw(draw_mode_t);
+    static bool onTouchEnd(uint8_t tag);
+};
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.cpp
index 1312d022c35..421d90bf7ff 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.cpp
@@ -23,22 +23,30 @@
 
 #include "../config.h"
 #include "../screens.h"
+#include "../screen_data.h"
 
 #ifdef COCOA_STATUS_SCREEN
 
 #include "cocoa_press_ui.h"
+#include "cocoa_press_bitmap.h"
 
 #define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0]))
 #define ICON_POS(x,y,w,h) x,     y,     h, h
 #define TEXT_POS(x,y,w,h) x + h, y, w - h, h
 
-const uint8_t shadow_depth = 5;
-
 using namespace FTDI;
 using namespace Theme;
 using namespace ExtUI;
 
-float StatusScreen::increment;
+const uint8_t shadow_depth = 5;
+
+constexpr static StatusScreenData &mydata = screen_data.StatusScreen;
+
+// Format for background image
+
+constexpr uint8_t  format   = RGB332;
+constexpr uint16_t bitmap_w = 800;
+constexpr uint16_t bitmap_h = 480;
 
 void StatusScreen::_format_time(char *outstr, uint32_t time) {
   const uint8_t hrs = time / 3600,
@@ -69,6 +77,64 @@ void StatusScreen::loadBitmaps() {
   #endif
 }
 
+void StatusScreen::draw_bkgnd(draw_mode_t what) {
+  if (what & BACKGROUND) {
+    constexpr float scale_w = float(FTDI::display_width)/bitmap_w;
+    constexpr float scale_h = float(FTDI::display_height)/bitmap_h;
+    uint16_t linestride;
+    uint32_t color;
+    switch (format) {
+      case RGB565: linestride = bitmap_w * 2; color = 0xFFFFFF; break;
+      case RGB332: linestride = bitmap_w    ; color = 0xFFFFFF; break;
+      case L1:     linestride = bitmap_w/8  ; color = 0x000000; break;
+      case L2:     linestride = bitmap_w/4  ; color = 0x000000; break;
+      case L4:     linestride = bitmap_w/2  ; color = 0x000000; break;
+      case L8:     linestride = bitmap_w    ; color = 0x000000; break;
+    }
+    CommandProcessor cmd;
+    cmd.cmd(COLOR_RGB(color))
+       .cmd(BITMAP_SOURCE(BACKGROUND_OFFSET))
+       .tag(0)
+       .bitmap_layout(format, linestride, bitmap_h)
+       .bitmap_size(NEAREST, BORDER, BORDER, bitmap_w*scale_w, bitmap_h*scale_h)
+       .cmd(BITMAP_TRANSFORM_A(uint32_t(float(256)/scale_w)))
+       .cmd(BITMAP_TRANSFORM_E(uint32_t(float(256)/scale_h)))
+       .cmd(BEGIN(BITMAPS))
+       .cmd(VERTEX2II(0, 0, 0, 0))
+       .cmd(BITMAP_TRANSFORM_A(256))
+       .cmd(BITMAP_TRANSFORM_E(256))
+       .cmd(COLOR_RGB(bg_text_enabled));
+  }
+}
+
+void StatusScreen::send_buffer(CommandProcessor &cmd, const void *data, uint16_t len) {
+  const char *ptr = (const char*) data;
+  constexpr uint16_t block_size = 512;
+  char               block[block_size];
+  for (;len > 0;) {
+    const uint16_t nBytes = min(len, block_size);
+    memcpy_P(block, ptr, nBytes);
+    cmd.write((const void*)block, nBytes);
+    cmd.execute();
+    if(cmd.has_fault()) {
+      SERIAL_ECHOLNPGM("Recovering from fault: ");
+      cmd.reset();
+      delay(1000);
+      return;
+    }
+    ptr += nBytes;
+    len -= nBytes;
+  }
+}
+
+void StatusScreen::load_background(const void *data, uint16_t len) {
+  CommandProcessor cmd;
+  cmd.inflate(BACKGROUND_OFFSET)
+     .execute();
+  send_buffer(cmd, data, len);
+  cmd.wait();
+}
+
 void StatusScreen::draw_time(draw_mode_t what) {
   CommandProcessor cmd;
   PolyUI ui(cmd, what);
@@ -96,23 +162,27 @@ void StatusScreen::draw_time(draw_mode_t what) {
   }
 }
 
-
-void StatusScreen::draw_progress(draw_mode_t what) {
+void StatusScreen::draw_percent(draw_mode_t what) {
   CommandProcessor cmd;
   PolyUI ui(cmd, what);
 
   int16_t x, y, w, h;
-
-  cmd.cmd(COLOR_RGB(accent_color_1));
-  cmd.font(font_medium);
+  ui.bounds(POLY(print_time_pct), x, y, w, h);
 
   if (what & FOREGROUND) {
-    // Draw progress bar
-    ui.bounds(POLY(file_name), x, y, w, h);
-    const uint16_t bar_width = w * getProgress_percent() / 100;
-    cmd.tag(8)
-       .cmd(COLOR_RGB(accent_color_5))
-       .rectangle(x, y, bar_width, h);
+    const uint16_t current_progress = TERN(HAS_PRINT_PROGRESS_PERMYRIAD, getProgress_permyriad(), getProgress_percent() * 100);
+    char progress_str[10];
+    sprintf_P(progress_str,
+      #if ENABLED(PRINT_PROGRESS_SHOW_DECIMALS)
+        PSTR("%3d.%02d%%"), uint8_t(current_progress / 100), current_progress % 100
+      #else
+        PSTR("%3d%%"), uint8_t(current_progress / 100)
+      #endif
+    );
+
+    cmd.font(font_medium)
+       .cmd(COLOR_RGB(bg_text_enabled))
+       .text(TEXT_POS(x, y, w, h), progress_str);
   }
 }
 
@@ -123,17 +193,8 @@ void StatusScreen::draw_temperature(draw_mode_t what) {
   int16_t x, y, w, h;
 
   if (what & BACKGROUND) {
-    cmd.cmd(COLOR_RGB(fluid_rgb));
-    cmd.font(font_medium).tag(10);
-
-    /*ui.bounds(POLY(temp_lbl), x, y, w, h);
-    cmd.text(x, y, w, h, F("Temp"));
-
-    ui.bounds(POLY(set_lbl), x, y, w, h);
-    cmd.text(x, y, w, h, F("Set"));*/
-
-    ui.bounds(POLY(chocolate_label), x, y, w, h);
-    cmd.text(x, y, w, h, F("Cocoa Press"));
+    cmd.cmd(COLOR_RGB(bg_text_enabled));
+    cmd.font(font_medium).tag(0);
 
     ui.bounds(POLY(h0_label), x, y, w, h);
     cmd.text(x, y, w, h, GET_TEXT_F(MSG_NOZZLE));
@@ -141,18 +202,6 @@ void StatusScreen::draw_temperature(draw_mode_t what) {
     ui.bounds(POLY(h1_label), x, y, w, h);
     cmd.text(x, y, w, h, GET_TEXT_F(MSG_BODY));
 
-    #if ENABLED(COCOA_PRESS_EXTRA_HEATER)
-      if (has_extra_heater()) {
-        ui.bounds(POLY(h2_label), x, y, w, h);
-        cmd.text(x, y, w, h, GET_TEXT_F(MSG_EXTERNAL));
-      }
-    #endif
-
-    #if ENABLED(COCOA_PRESS_CHAMBER_COOLER)
-      ui.bounds(POLY(h3_label), x, y, w, h);
-      cmd.text(x, y, w, h, GET_TEXT_F(MSG_CHAMBER));
-    #endif
-
     #if ENABLED(TOUCH_UI_USE_UTF8)
       load_utf8_bitmaps(cmd); // Restore font bitmap handles
     #endif
@@ -160,116 +209,80 @@ void StatusScreen::draw_temperature(draw_mode_t what) {
 
   if (what & FOREGROUND) {
     char str[15];
-    cmd.cmd(COLOR_RGB(fluid_rgb));
-
-    cmd.font(font_large).tag(10);
+    cmd.font(font_medium).colors(normal_btn).tag(10);
 
     // Show the actual temperatures
 
     format_temp(str, getActualTemp_celsius(E0));
     ui.bounds(POLY(h0_temp), x, y, w, h);
-    cmd.text(x, y, w, h, str);
+    cmd.button(x, y, w, h, str);
 
     format_temp(str, getActualTemp_celsius(E1));
     ui.bounds(POLY(h1_temp), x, y, w, h);
-    cmd.text(x, y, w, h, str);
-
-    #if ENABLED(COCOA_PRESS_EXTRA_HEATER)
-      if (has_extra_heater()) {
-        format_temp(str, getActualTemp_celsius(E2));
-        ui.bounds(POLY(h2_temp), x, y, w, h);
-        cmd.text(x, y, w, h, str);
-      }
-    #endif
-
-    #if ENABLED(COCOA_PRESS_CHAMBER_COOLER)
-      format_temp(str, getActualTemp_celsius(CHAMBER));
-      ui.bounds(POLY(h3_temp), x, y, w, h);
-      cmd.text(x, y, w, h, str);
-    #endif
-
-    /*// Show the set temperatures
-    format_temp(str, getTargetTemp_celsius(E0));
-    ui.bounds(POLY(h0_set), x, y, w, h);
-    cmd.text(x, y, w, h, str);
-
-    format_temp(str, getTargetTemp_celsius(E1));
-    ui.bounds(POLY(h1_set), x, y, w, h);
-    cmd.text(x, y, w, h, str);
-
-    #if ENABLED(COCOA_PRESS_EXTRA_HEATER)
-      if (has_extra_heater()) {
-        format_temp(str, getTargetTemp_celsius(E2));
-        ui.bounds(POLY(h2_set), x, y, w, h);
-        cmd.text(x, y, w, h, str);
-      }
-    #endif
-
-    #if ENABLED(COCOA_PRESS_CHAMBER_COOLER)
-      format_temp(str, getTargetTemp_celsius(CHAMBER));
-      ui.bounds(POLY(h3_set), x, y, w, h);
-      cmd.text(x, y, w, h, str);
-    #endif*/
+    cmd.button(x, y, w, h, str);
   }
 }
 
 void StatusScreen::draw_buttons(draw_mode_t what) {
-  int16_t x, y, w, h;
+  if (what & FOREGROUND) {
+    int16_t x, y, w, h;
 
-  const bool can_print        = !isPrinting() && isMediaInserted() && isFileSelected();
-  const bool can_select       = !isPrinting() && isMediaInserted();
-  const bool sdOrHostPrinting = ExtUI::isPrinting();
-  const bool sdOrHostPaused   = ExtUI::isPrintingPaused();
+    const bool can_print        = !isPrinting() && isMediaInserted() && isFileSelected();
+    const bool can_select       = !isPrinting() && isMediaInserted();
+    const bool sdOrHostPrinting = ExtUI::isPrinting();
+    const bool sdOrHostPaused   = ExtUI::isPrintingPaused();
 
-  CommandProcessor cmd;
-  PolyUI ui(cmd, what);
+    CommandProcessor cmd;
+    PolyUI ui(cmd, what);
 
-  cmd.font(font_medium).colors(normal_btn);
+    cmd.font(font_medium).colors(normal_btn);
 
-  ui.bounds(POLY(load_chocolate_btn), x, y, w, h);
-  cmd.tag(1).button(x, y, w, h, GET_TEXT_F(MSG_LOAD_UNLOAD));
+    ui.bounds(POLY(load_chocolate_btn), x, y, w, h);
+    cmd.tag(1).button(x, y, w, h, GET_TEXT_F(MSG_LOAD_UNLOAD));
 
-  ui.bounds(POLY(extrude_btn), x, y, w, h);
-  cmd.tag(2).button(x, y, w, h, GET_TEXT_F(MSG_EXTRUDE));
+    ui.bounds(POLY(extrude_btn), x, y, w, h);
+    cmd.tag(2).button(x, y, w, h, GET_TEXT_F(MSG_EXTRUDE));
 
-  ui.bounds(POLY(preheat_chocolate_btn), x, y, w, h);
-  cmd.tag(3).button(x, y, w, h, GET_TEXT_F(MSG_PREHEAT_CHOCOLATE));
+    ui.bounds(POLY(preheat_chocolate_btn), x, y, w, h);
+    cmd.tag(3).button(x, y, w, h, GET_TEXT_F(MSG_PREHEAT_CHOCOLATE));
 
-  ui.bounds(POLY(menu_btn), x, y, w, h);
-  cmd.tag(4).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_MENU));
+    ui.bounds(POLY(menu_btn), x, y, w, h);
+    cmd.tag(4).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_MENU));
 
-  ui.bounds(POLY(media_btn), x, y, w, h);
-  cmd.tag(5).enabled(can_select).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_MEDIA));
+    ui.bounds(POLY(media_btn), x, y, w, h);
+    cmd.tag(5).enabled(can_select).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_MEDIA));
 
-  ui.bounds(POLY(print_btn), x, y, w, h);
-  cmd.tag(6).colors(action_btn).enabled(can_print).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_PRINT));
+    ui.bounds(POLY(print_btn), x, y, w, h);
+    cmd.tag(6).colors(action_btn).enabled(can_print).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_PRINT));
 
-  ui.bounds(POLY(pause_btn), x, y, w, h);
-  cmd.tag(sdOrHostPaused ? 8 : 7).enabled(sdOrHostPrinting).button(x, y, w, h, sdOrHostPaused ? GET_TEXT_F(MSG_BUTTON_RESUME) : GET_TEXT_F(MSG_BUTTON_PAUSE));
+    ui.bounds(POLY(pause_btn), x, y, w, h);
+    cmd.tag(sdOrHostPaused ? 8 : 7).enabled(sdOrHostPrinting).button(x, y, w, h, sdOrHostPaused ? GET_TEXT_F(MSG_BUTTON_RESUME) : GET_TEXT_F(MSG_BUTTON_PAUSE));
 
-  ui.bounds(POLY(stop_btn), x, y, w, h);
-  cmd.tag(9).enabled(sdOrHostPrinting).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_STOP));
+    ui.bounds(POLY(stop_btn), x, y, w, h);
+    cmd.tag(9).enabled(sdOrHostPrinting).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_STOP));
+  }
 }
 
+// When visible, the file name occupies the same space as the status
+// message and must be drawn opaque.
 void StatusScreen::draw_file(draw_mode_t what) {
-  int16_t x, y, w, h;
+  if (mydata.gotMessage) return;
 
-  CommandProcessor cmd;
-  PolyUI ui(cmd, what);
+  if (what & FOREGROUND) {
+    int16_t x, y, w, h;
 
-  ui.bounds(POLY(file_name), x, y, w, h);
+    CommandProcessor cmd;
+    PolyUI ui(cmd, what);
+    ui.bounds(POLY(file_name), x, y, w, h);
 
-  if (what & BACKGROUND) {
     cmd.tag(5)
-       .cmd(COLOR_RGB(bg_text_enabled))
+       .cmd (COLOR_RGB(bg_color))
+       .rectangle(x, y, w, h)
+       .cmd (COLOR_RGB(bg_text_enabled))
        .cmd (BITMAP_SOURCE(File_Icon_Info))
        .cmd (BITMAP_LAYOUT(File_Icon_Info))
        .cmd (BITMAP_SIZE  (File_Icon_Info))
        .icon(ICON_POS(x, y, w, h), File_Icon_Info, icon_scale);
-  }
-
-  if (what & FOREGROUND) {
-    cmd.cmd(COLOR_RGB(bg_text_enabled));
 
     if (!isMediaInserted())
       draw_text_with_ellipsis(cmd, TEXT_POS(x, y, w, h), F("No media present"), OPT_CENTERY, font_small);
@@ -282,6 +295,21 @@ void StatusScreen::draw_file(draw_mode_t what) {
   }
 }
 
+// The message will be drawn on the background and may be obscured by
+// the filename.
+void StatusScreen::draw_message(draw_mode_t what, const char *message) {
+  if (what & BACKGROUND) {
+    int16_t x, y, w, h;
+
+    CommandProcessor cmd;
+    PolyUI ui(cmd, what);
+    ui.bounds(POLY(file_name), x, y, w, h);
+
+    cmd.cmd(COLOR_RGB(bg_text_enabled));
+    draw_text_box(cmd, TEXT_POS(x, y, w, h), message, OPT_CENTERY, font_small);
+  }
+}
+
 bool StatusScreen::isFileSelected() {
   if (!isMediaInserted()) return false;
   FileList list;
@@ -292,23 +320,14 @@ bool StatusScreen::isFileSelected() {
 }
 
 void StatusScreen::onRedraw(draw_mode_t what) {
-  if (what & BACKGROUND) {
-    CommandProcessor cmd;
-    cmd.cmd(CLEAR_COLOR_RGB(bg_color))
-       .cmd(CLEAR(true,true,true))
-       .tag(0);
+  if (what & FOREGROUND) {
+    draw_bkgnd(what);
+    draw_file(what);
+    draw_time(what);
+    draw_percent(what);
+    draw_temperature(what);
+    draw_buttons(what);
   }
-
-  draw_file(what);
-  draw_time(what);
-  draw_progress(what);
-  draw_temperature(what);
-  draw_buttons(what);
-}
-
-bool StatusScreen::onTouchStart(uint8_t) {
-  increment = 0;
-  return true;
 }
 
 bool StatusScreen::onTouchEnd(uint8_t tag) {
@@ -353,17 +372,55 @@ bool StatusScreen::onTouchEnd(uint8_t tag) {
 
 bool StatusScreen::onTouchHeld(uint8_t tag) {
   if (tag == 2 && !ExtUI::isMoving()) {
-    LoadChocolateScreen::setManualFeedrateAndIncrement(1, increment);
+    float increment;
+    LoadChocolateScreen::setManualFeedrateAndIncrement(0.25, increment);
     UI_INCREMENT(AxisPosition_mm, E0);
-    current_screen.onRefresh();
   }
   return false;
 }
 
-void StatusScreen::setStatusMessage(FSTR_P) {
+void StatusScreen::setStatusMessage(FSTR_P message) {
+  char buff[strlen_P((const char * const)message)+1];
+  strcpy_P(buff, (const char * const) message);
+  setStatusMessage((const char *) buff);
 }
 
-void StatusScreen::setStatusMessage(const char * const) {
+void StatusScreen::setStatusMessage(const char * const message) {
+  if (CommandProcessor::is_processing()) {
+    #if ENABLED(TOUCH_UI_DEBUG)
+      SERIAL_ECHO_MSG("Cannot update status message, command processor busy");
+    #endif
+    return;
+  }
+
+  CommandProcessor cmd;
+  cmd.cmd(CMD_DLSTART)
+     .cmd(CLEAR_COLOR_RGB(bg_color))
+     .cmd(CLEAR(true,true,true));
+
+  const draw_mode_t what = BACKGROUND;
+  draw_bkgnd(what);
+  draw_message(what, message);
+  draw_time(what);
+  draw_percent(what);
+  draw_temperature(what);
+  draw_buttons(what);
+
+  storeBackground();
+
+  #if ENABLED(TOUCH_UI_DEBUG)
+    SERIAL_ECHO_MSG("New status message: ", message);
+  #endif
+
+  mydata.gotMessage = true;
+
+  if (AT_SCREEN(StatusScreen))
+    current_screen.onRefresh();
+}
+
+void StatusScreen::onEntry() {
+  mydata.gotMessage = false;
+  load_background(cocoa_press_ui, sizeof(cocoa_press_ui));
 }
 
 void StatusScreen::onIdle() {
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.h
index 05f99e953d6..57cf2308ab4 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/status_screen.h
@@ -26,31 +26,35 @@
 #define COCOA_STATUS_SCREEN
 #define COCOA_STATUS_SCREEN_CLASS StatusScreen
 
-class StatusScreen : public BaseScreen, public CachedScreen<STATUS_SCREEN_CACHE> {
+struct StatusScreenData {
+  bool gotMessage;
+};
+
+class StatusScreen : public BaseScreen, public CachedScreen<STATUS_SCREEN_CACHE, STATUS_SCREEN_DL_SIZE> {
   private:
     static void _format_time(char *outstr, uint32_t time);
 
-    static float increment;
-    static bool  jog_xy;
-    static bool  fine_motion;
-
     static void draw_time(draw_mode_t what);
-    static void draw_progress(draw_mode_t what);
+    static void draw_percent(draw_mode_t what);
     static void draw_temperature(draw_mode_t what);
     static void draw_buttons(draw_mode_t what);
     static void draw_file(draw_mode_t what);
+    static void draw_message(draw_mode_t what, const char *message);
+    static void draw_bkgnd(draw_mode_t what);
+
+    static void send_buffer(CommandProcessor &cmd, const void *data, uint16_t len);
+    static void load_background(const void *data, uint16_t len);
 
     static bool isFileSelected();
   public:
     static void loadBitmaps();
-    static void unlockMotors();
 
     static void setStatusMessage(const char *);
     static void setStatusMessage(FSTR_P);
 
     static void onRedraw(draw_mode_t);
 
-    static bool onTouchStart(uint8_t tag);
+    static void onEntry();
     static bool onTouchHeld(uint8_t tag);
     static bool onTouchEnd(uint8_t tag);
     static void onIdle();
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_screen.cpp
new file mode 100644
index 00000000000..aeff0d95f8f
--- /dev/null
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_screen.cpp
@@ -0,0 +1,59 @@
+/***********************
+ * z_offset_screen.cpp *
+ ***********************/
+
+/****************************************************************************
+ *   Written By Mark Pelletier  2017 - Aleph Objects, Inc.                  *
+ *   Written By Marcio Teixeira 2018 - Aleph Objects, Inc.                  *
+ *                                                                          *
+ *   This program is free software: you can redistribute it and/or modify   *
+ *   it under the terms of the GNU General Public License as published by   *
+ *   the Free Software Foundation, either version 3 of the License, or      *
+ *   (at your option) any later version.                                    *
+ *                                                                          *
+ *   This program is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *   GNU General Public License for more details.                           *
+ *                                                                          *
+ *   To view a copy of the GNU General Public License, go to the following  *
+ *   location: <https://www.gnu.org/licenses/>.                             *
+ ****************************************************************************/
+
+#include "../config.h"
+#include "../screens.h"
+#include "../screen_data.h"
+
+#ifdef COCOA_Z_OFFSET_SCREEN
+
+#include "z_offset_wizard.h"
+
+using namespace FTDI;
+using namespace ExtUI;
+using namespace Theme;
+
+void ZOffsetScreen::onRedraw(draw_mode_t what) {
+  widgets_t w(what);
+  w.precision(2, BaseNumericAdjustmentScreen::DEFAULT_MIDRANGE).units(GET_TEXT_F(MSG_UNITS_MM));
+
+  w.heading(                  GET_TEXT_F(MSG_ZPROBE_ZOFFSET));
+  w.color(z_axis).adjuster(4, GET_TEXT_F(MSG_ZPROBE_ZOFFSET), getZOffset_mm());
+  w.increments();
+  w.button(2, GET_TEXT_F(MSG_PROBE_WIZARD), !isPrinting());
+}
+
+bool ZOffsetScreen::onTouchHeld(uint8_t tag) {
+  const int16_t steps =   TERN(BABYSTEPPING, mmToWholeSteps(getIncrement(), Z), 0);
+  const float increment = TERN(BABYSTEPPING, mmFromWholeSteps(steps, Z), getIncrement());
+  switch (tag) {
+    case 2: ZOffsetWizard::runWizard(); break;
+    case 4: UI_DECREMENT(ZOffset_mm); TERN(BABYSTEPPING, babystepAxis_steps(-steps, Z), UNUSED(steps)); break;
+    case 5: UI_INCREMENT(ZOffset_mm); TERN(BABYSTEPPING, babystepAxis_steps( steps, Z), UNUSED(steps)); break;
+    default:
+      return false;
+  }
+  SaveSettingsDialogBox::settingsChanged();
+  return true;
+}
+
+#endif // COCOA_Z_OFFSET_SCREEN
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_screen.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_screen.h
new file mode 100644
index 00000000000..93a364c109c
--- /dev/null
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_screen.h
@@ -0,0 +1,32 @@
+/***********************
+ * z_offset_screen.h *
+ ***********************/
+
+/****************************************************************************
+ *   Written By Mark Pelletier  2017 - Aleph Objects, Inc.                  *
+ *   Written By Marcio Teixeira 2018 - Aleph Objects, Inc.                  *
+ *                                                                          *
+ *   This program is free software: you can redistribute it and/or modify   *
+ *   it under the terms of the GNU General Public License as published by   *
+ *   the Free Software Foundation, either version 3 of the License, or      *
+ *   (at your option) any later version.                                    *
+ *                                                                          *
+ *   This program is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *   GNU General Public License for more details.                           *
+ *                                                                          *
+ *   To view a copy of the GNU General Public License, go to the following  *
+ *   location: <https://www.gnu.org/licenses/>.                             *
+ ****************************************************************************/
+
+#pragma once
+
+#define COCOA_Z_OFFSET_SCREEN
+#define COCOA_Z_OFFSET_SCREEN_CLASS ZOffsetScreen
+
+class ZOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen<ZOFFSET_SCREEN_CACHE> {
+  public:
+    static void onRedraw(draw_mode_t);
+    static bool onTouchHeld(uint8_t tag);
+};
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_wizard.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_wizard.cpp
new file mode 100644
index 00000000000..9672e048d23
--- /dev/null
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_wizard.cpp
@@ -0,0 +1,162 @@
+/***********************
+ * z_offset_screen.cpp *
+ ***********************/
+
+/****************************************************************************
+ *   Written By Mark Pelletier  2017 - Aleph Objects, Inc.                  *
+ *   Written By Marcio Teixeira 2018 - Aleph Objects, Inc.                  *
+ *                                                                          *
+ *   This program is free software: you can redistribute it and/or modify   *
+ *   it under the terms of the GNU General Public License as published by   *
+ *   the Free Software Foundation, either version 3 of the License, or      *
+ *   (at your option) any later version.                                    *
+ *                                                                          *
+ *   This program is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *   GNU General Public License for more details.                           *
+ *                                                                          *
+ *   To view a copy of the GNU General Public License, go to the following  *
+ *   location: <https://www.gnu.org/licenses/>.                             *
+ ****************************************************************************/
+
+#include "../config.h"
+#include "../screens.h"
+#include "../screen_data.h"
+
+#ifdef COCOA_Z_OFFSET_WIZARD
+
+#include "cocoa_press_ui.h"
+
+using namespace FTDI;
+using namespace ExtUI;
+using namespace Theme;
+
+#define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0]))
+#define SHEET_THICKNESS 0.1
+
+constexpr static ZOffsetWizardData &mydata = screen_data.ZOffsetWizard;
+
+void ZOffsetWizard::onEntry() {
+  mydata.increment = 242;
+  mydata.softEndstopState = getSoftEndstopState();
+  BaseNumericAdjustmentScreen::onEntry();
+  setSoftEndstopState(false);
+}
+
+void ZOffsetWizard::onExit() {
+  setSoftEndstopState(mydata.softEndstopState);
+}
+
+void ZOffsetWizard::onRedraw(draw_mode_t what) {
+  int16_t x, y, w, h;
+
+  CommandProcessor cmd;
+  PolyUI ui(cmd, what);
+
+  cmd.cmd(CLEAR_COLOR_RGB(bg_color))
+     .cmd(CLEAR(true,true,true))
+     .tag(0)
+     .font(font_medium).colors(normal_btn);
+
+  char b[32];
+  dtostrf(getZOffset_mm(), 5, 2, b);
+  strcat_P(b, PSTR(" mm"));
+  ui.bounds(POLY(z_wizard_edit_box), x, y, w, h);
+  cmd.tag(0).fgcolor(z_axis).button(x, y, w, h, b);
+
+  #define PREAMBLE(TAG) cmd.tag(TAG).colors(mydata.increment == TAG ? action_btn : normal_btn)
+  ui.bounds(POLY(z_wizard_inc1_btn), x, y, w, h);
+  PREAMBLE(241).button(x, y, w, h, F("0.01"));
+
+  ui.bounds(POLY(z_wizard_inc2_btn), x, y, w, h);
+  PREAMBLE(242).button(x, y, w, h, F("0.1"));
+
+  ui.bounds(POLY(z_wizard_inc3_btn), x, y, w, h);
+  PREAMBLE(243).button(x, y, w, h, F("1.0"));
+
+  ui.bounds(POLY(z_wizard_neg_btn), x, y, w, h);
+  cmd.tag(4).colors(action_btn).button(x, y, w, h, F(""));
+  drawArrow(x, y, w, h, DOWN);
+
+  ui.bounds(POLY(z_wizard_plus_btn), x, y, w, h);
+  cmd.tag(5).colors(action_btn).button(x, y, w, h, F(""));
+  drawArrow(x, y, w, h, UP);
+
+  ui.bounds(POLY(z_wizard_done_btn), x, y, w, h);
+  cmd.tag(1).colors(action_btn).button(x, y, w, h, GET_TEXT_F(MSG_BUTTON_DONE));
+
+  cmd.tag(0);
+  ui.color(bg_text_enabled);
+  ui.fill(POLY(z_wizard_diagram));
+
+  ui.bounds(POLY(z_wizard_heading), x, y, w, h);
+  cmd.font(font_large)
+     .text(x, y, w, h, F("Z Probe Wizard"));
+}
+
+float ZOffsetWizard::getIncrement() {
+  switch (mydata.increment) {
+    case 241: return 0.01;
+    case 242: return 0.1;
+    case 243: return 1.0;
+    default:  return 0.0;
+  }
+}
+
+void ZOffsetWizard::runWizard() {
+  // Restore the default Z offset
+  constexpr float offset[] = NOZZLE_TO_PROBE_OFFSET;
+  setZOffset_mm(offset[Z_AXIS]);
+  // Move above probe point
+  char cmd[64], str[10];
+  strcpy_P(cmd, PSTR("G28 Z\nG0 F1000 X"));
+  dtostrf(TERN(Z_SAFE_HOMING,Z_SAFE_HOMING_X_POINT,X_CENTER), 3, 1, str);
+  strcat(cmd, str);
+  strcat_P(cmd, PSTR("Y"));
+  dtostrf(TERN(Z_SAFE_HOMING,Z_SAFE_HOMING_Y_POINT,Y_CENTER), 3, 1, str);
+  strcat(cmd, str);
+  strcat_P(cmd, PSTR("Z"));
+  dtostrf(SHEET_THICKNESS, 3, 1, str);
+  strcat(cmd, str);
+  injectCommands(cmd);
+  // Show instructions for user.
+  AlertDialogBox::show(F("\nOn the next screen, adjust the Z Offset so that a sheet of paper can pass between the nozzle and bed with slight resistance.\n\nOnce the printer stops moving, press Okay to begin.\n"));
+  // Set the destination screen after the dialog box.
+  current_screen.forget();
+  PUSH_SCREEN(ZOffsetWizard);
+}
+
+bool ZOffsetWizard::onTouchEnd(uint8_t tag) {
+  switch (tag) {
+    case 1:
+      GOTO_PREVIOUS();
+      break;
+    case 4:
+    case 5:
+      return onTouchHeld(tag);
+    case 241 ... 243:
+      mydata.increment = tag;
+      break;
+    default:
+      return false;
+  }
+  return true;
+}
+
+bool ZOffsetWizard::onTouchHeld(uint8_t tag) {
+  const float increment = TERN(BABYSTEPPING,
+    mmFromWholeSteps(mmToWholeSteps(getIncrement(), Z), Z), // Round increment to nearest steps
+    getIncrement()
+  );
+  switch (tag) {
+    case 4: UI_DECREMENT(ZOffset_mm); UI_DECREMENT(AxisPosition_mm, Z); break;
+    case 5: UI_INCREMENT(ZOffset_mm); UI_INCREMENT(AxisPosition_mm, Z); break;
+    default:
+      return false;
+  }
+  SaveSettingsDialogBox::settingsChanged();
+  return true;
+}
+
+#endif // COCOA_Z_OFFSET_WIZARD
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_wizard.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_wizard.h
new file mode 100644
index 00000000000..5c02f9803b7
--- /dev/null
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/z_offset_wizard.h
@@ -0,0 +1,43 @@
+/***********************
+ * z_offset_screen.h *
+ ***********************/
+
+/****************************************************************************
+ *   Written By Mark Pelletier  2017 - Aleph Objects, Inc.                  *
+ *   Written By Marcio Teixeira 2018 - Aleph Objects, Inc.                  *
+ *                                                                          *
+ *   This program is free software: you can redistribute it and/or modify   *
+ *   it under the terms of the GNU General Public License as published by   *
+ *   the Free Software Foundation, either version 3 of the License, or      *
+ *   (at your option) any later version.                                    *
+ *                                                                          *
+ *   This program is distributed in the hope that it will be useful,        *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *   GNU General Public License for more details.                           *
+ *                                                                          *
+ *   To view a copy of the GNU General Public License, go to the following  *
+ *   location: <https://www.gnu.org/licenses/>.                             *
+ ****************************************************************************/
+
+#pragma once
+
+#define COCOA_Z_OFFSET_WIZARD
+#define COCOA_Z_OFFSET_WIZARD_CLASS ZOffsetWizard
+
+struct ZOffsetWizardData : public BaseNumericAdjustmentScreenData {
+  uint8_t increment;
+  bool softEndstopState;
+};
+
+class ZOffsetWizard : public BaseScreen, public UncachedScreen {
+  private:
+    static float getIncrement();
+  public:
+    static void runWizard();
+    static void onEntry();
+    static void onExit();
+    static void onRedraw(draw_mode_t);
+    static bool onTouchHeld(uint8_t tag);
+    static bool onTouchEnd(uint8_t tag);
+};
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp
index a796c8edcf5..24d99d7b45b 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp
@@ -177,6 +177,14 @@ void CLCD::mem_write_pgm(uint32_t reg_address, const void *data, uint16_t len, u
   spi_ftdi_deselect();
 }
 
+// Write 3-Byte Address, Multiple Bytes, plus padding bytes, from PROGMEM, reversing bytes (suitable for loading XBM images)
+void CLCD::mem_write_xbm(uint32_t reg_address, const void *data, uint16_t len, uint8_t padding) {
+  spi_ftdi_select();
+  spi_write_addr(reg_address);
+  spi_write_bulk<xbm_write>(data, len, padding);
+  spi_ftdi_deselect();
+}
+
 // Write 3-Byte Address, Multiple Bytes, plus padding bytes, from PROGMEM, reversing bytes (suitable for loading XBM images)
 void CLCD::mem_write_xbm(uint32_t reg_address, FSTR_P data, uint16_t len, uint8_t padding) {
   spi_ftdi_select();
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h
index 2e2657a83ee..80a2cece179 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h
@@ -118,6 +118,7 @@ class CLCD {
     static void     mem_write_fill (uint32_t reg_address, uint8_t w_data, uint16_t len);
     static void     mem_write_bulk (uint32_t reg_address, const void *data, uint16_t len, uint8_t padding = 0);
     static void     mem_write_pgm  (uint32_t reg_address, const void *data, uint16_t len, uint8_t padding = 0);
+    static void     mem_write_xbm  (uint32_t reg_address, const void *data, uint16_t len, uint8_t padding = 0);
     static void     mem_write_bulk (uint32_t reg_address, FSTR_P str, uint16_t len, uint8_t padding = 0);
     static void     mem_write_xbm  (uint32_t reg_address, FSTR_P str, uint16_t len, uint8_t padding = 0);
 
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp
index d7f4d31bdc1..c05d6577d04 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp
@@ -66,14 +66,6 @@
    *          character (this is not the unicode codepoint)
    */
 
-  utf8_char_t FTDI::get_utf8_char_and_inc(char *&c) {
-    utf8_char_t val = *(uint8_t*)c++;
-    if ((val & 0xC0) == 0xC0)
-      while ((*c & 0xC0) == 0x80)
-        val = (val << 8) | *(uint8_t*)c++;
-    return val;
-  }
-
   utf8_char_t FTDI::get_utf8_char_and_inc(const char *&c) {
     utf8_char_t val = *(uint8_t*)c++;
     if ((val & 0xC0) == 0xC0)
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h
index 7818957fcc2..83ab56df579 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h
@@ -47,7 +47,6 @@ namespace FTDI {
      * pointer to the next character */
 
     utf8_char_t get_utf8_char_and_inc(const char *&c);
-    utf8_char_t get_utf8_char_and_inc(char *&c);
 
     /* Returns the next character in a UTF8 string, without incrementing */
 
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/svg2cpp.py b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/svg2cpp.py
old mode 100644
new mode 100755
index f6e4a3e39ab..0f39932c6a9
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/svg2cpp.py
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/svg2cpp.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # Written By Marcio Teixeira 2018 - Aleph Objects, Inc.
 #
@@ -18,6 +18,8 @@
 from __future__ import print_function
 import argparse,re,sys
 
+from html.parser import HTMLParser
+
 usage = '''
 This program extracts line segments from a SVG file and writes
 them as coordinates in a C array. The x and y values will be
@@ -107,19 +109,16 @@ class ComputeBoundingBox:
     print("constexpr float y_max = %f;" % self.y_max)
     print()
 
-  def from_svg_view_box(self, svg):
-    s = re.search('<svg[^>]+>', svg);
-    if s:
-      m = re.search('viewBox="([0-9-.]+) ([0-9-.]+) ([0-9-.]+) ([0-9-.]+)"', svg)
-      if m:
-        self.x_min = float(m[1])
-        self.y_min = float(m[2])
-        self.x_max = float(m[3])
-        self.y_max = float(m[4])
-        return True
+  def from_svg_view_box(self, viewbox):
+    m = re.search('([0-9-.]+) ([0-9-.]+) ([0-9-.]+) ([0-9-.]+)', viewbox)
+    if m:
+      self.x_min = float(m[1])
+      self.y_min = float(m[2])
+      self.x_max = float(m[3])
+      self.y_max = float(m[4])
+      return True
     return False
 
-# op
 class WriteDataStructure:
   def __init__(self, bounding_box):
     self.bounds = bounding_box
@@ -143,19 +142,29 @@ class WriteDataStructure:
     print("const PROGMEM uint16_t", id + "[] = {" + ", ".join (self.hex_words) + "};")
     self.hex_words = []
 
-class Parser:
-  def __init__(self, op):
-    self.op = op
-    self.reset()
+class SVGParser(HTMLParser):
+  def __init__(self, args):
+    super().__init__()
+    self.args   = args
+    self.tags   = []
+    self.groups = []
+    self.op     = None
+    self.restart()
 
-  def reset(self):
+  def set_consumer(self, op):
+    self.op = op
+    if self.op:
+      self.op.reset()
+
+  def restart(self):
     self.last_x = 0
     self.last_y = 0
     self.initial_x = 0
     self.initial_y = 0
 
   def process_svg_path_L_or_M(self, cmd, x, y):
-    self.op.command(cmd, x, y)
+    if self.op:
+      self.op.command(cmd, x, y)
     self.last_x = x
     self.last_y = y
     if cmd == "M":
@@ -239,42 +248,71 @@ class Parser:
         print("Syntax error:", d, "in path", id, "\n", file=sys.stderr)
         quit()
 
-  def process_svg_paths(self, svg):
-    self.op.reset()
-    for path in re.findall('<path[^>]+>', svg):
-      id = "<none>"
-      m = re.search(' id="(.*)"', path)
-      if m:
-        id = m[1]
+  def find_attr(attrs, what):
+    for attr, value in attrs:
+      if attr == what:
+         return value
 
-      m = re.search(' transform="(.*)"', path)
-      if m:
+  def layer_matches(self):
+    """ Are we in the correct layer?"""
+    if not self.args.layer:
+        return True
+    for l in self.groups:
+      if l and l.find(self.args.layer) != -1:
+        return True
+    return False
+
+  def handle_starttag(self, tag, attrs):
+    self.tags.append(tag)
+    if tag == 'svg':
+      self.viewbox = SVGParser.find_attr(attrs, 'viewbox')
+    if tag == 'g':
+      label = SVGParser.find_attr(attrs, 'inkscape:label')
+      self.groups.append(label)
+      if label and self.layer_matches():
+        print("Reading layer:", label, file=sys.stderr)
+    if tag == 'path' and self.layer_matches():
+      id = SVGParser.find_attr(attrs, 'id')
+      transform = SVGParser.find_attr(attrs, 'transform')
+      if transform:
         print("Found transform in path", id, "! Cannot process file!", file=sys.stderr)
         quit()
+      d = SVGParser.find_attr(attrs, 'd')
+      if d:
+        self.process_svg_path_data(id, d)
+        if self.op:
+          self.op.path_finished(id)
+        self.restart()
 
-      m = re.search(' d="(.*)"', path)
-      if m:
-        self.process_svg_path_data(id, m[1])
-        self.op.path_finished(id)
-        self.reset()
+  def handle_endtag(self, tag):
+    if tag == 'g':
+      self.groups.pop()
+    if tag != self.tags.pop():
+      print("Error popping tag off list")
 
 if __name__ == "__main__":
   parser = argparse.ArgumentParser()
   parser.add_argument("filename")
+  parser.add_argument('--layer', help='only include layers which have this string in their names')
   args = parser.parse_args()
 
   f = open(args.filename, "r")
   data = f.read()
 
-  print(header)
+  # First pass to grab viewbox
+  p = SVGParser(args)
+  p.feed(data)
 
   b = ComputeBoundingBox()
-  if not b.from_svg_view_box(data):
+  if not b.from_svg_view_box(p.viewbox):
     # Can't find the view box, so use the bounding box of the elements themselves.
-    p = Parser(b)
-    p.process_svg_paths(data)
-  b.write()
+    p = SVGParser(args)
+    p.set_consumer(b)
+    p.feed(data)
+    b.write()
 
+  # Last pass to process paths
   w = WriteDataStructure(b)
-  p = Parser(w)
-  p.process_svg_paths(data)
+  p = SVGParser(args)
+  p.set_consumer(w)
+  p.feed(data)
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_edit_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_edit_screen.cpp
index ab6d8a89024..c894d017ebc 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_edit_screen.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_edit_screen.cpp
@@ -174,11 +174,11 @@ bool BedMeshEditScreen::onTouchEnd(uint8_t tag) {
     case 1:
       // On Cancel, reload saved mesh, discarding changes
       GOTO_PREVIOUS();
-      injectCommands(F("G29 L1"));
+      injectCommands(F(TERN(AUTO_BED_LEVELING_UBL, "G29 L1", "M501")));
       return true;
     case 2:
       saveAdjustedHighlightedValue();
-      injectCommands(F("G29 S1"));
+      injectCommands(F(TERN(AUTO_BED_LEVELING_UBL, "G29 S1", "M500")));
       mydata.needSave = false;
       return true;
     case 3:
@@ -191,7 +191,7 @@ bool BedMeshEditScreen::onTouchEnd(uint8_t tag) {
 
 void BedMeshEditScreen::show() {
   // On entry, always home (to account for possible Z offset changes) and save current mesh
-  SpinnerDialogBox::enqueueAndWait(F("G28\nG29 S1"));
+  SpinnerDialogBox::enqueueAndWait(F("G28\n" TERN(AUTO_BED_LEVELING_UBL, "G29 S1", "M500")));
   // After the spinner, go to this screen.
   current_screen.forget();
   PUSH_SCREEN(BedMeshEditScreen);
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_view_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_view_screen.cpp
index 86eab54d85b..c42d83420f2 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_view_screen.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_view_screen.cpp
@@ -53,10 +53,7 @@ constexpr static float gaugeThickness = 0.25;
 #endif
 
 static float meshGetter(uint8_t x, uint8_t y, void*) {
-  xy_uint8_t pos;
-  pos.x = x;
-  pos.y = y;
-  return ExtUI::getMeshPoint(pos);
+  return ExtUI::getMeshPoint(xy_uint8_t(x, y));
 }
 
 void BedMeshViewScreen::onEntry() {
@@ -158,7 +155,7 @@ void BedMeshViewScreen::doProbe() {
 }
 
 void BedMeshViewScreen::show() {
-  injectCommands(F("G29 L1"));
+  TERN_(AUTO_BED_LEVELING_UBL, injectCommands(F("G29 L1")));
   GOTO_SCREEN(BedMeshViewScreen);
 }
 
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/main_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/main_menu.cpp
index 001f97490b1..dcf4789593b 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/main_menu.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/main_menu.cpp
@@ -43,7 +43,7 @@ void MainMenu::onRedraw(draw_mode_t what) {
     #define ADVANCED_SETTINGS_POS BTN_POS(1,2), BTN_SIZE(2,1)
     #if ENABLED(CUSTOM_MENU_MAIN)
       #define FILAMENTCHANGE_POS  BTN_POS(1,3), BTN_SIZE(1,1)
-      #define CUSTOM_MENU_POS BTN_POS(2,3), BTN_SIZE(1,1)
+      #define CUSTOM_MENU_POS     BTN_POS(2,3), BTN_SIZE(1,1)
     #else
       #define FILAMENTCHANGE_POS  BTN_POS(1,3), BTN_SIZE(2,1)
     #endif
@@ -66,7 +66,7 @@ void MainMenu::onRedraw(draw_mode_t what) {
     #if ENABLED(CUSTOM_MENU_MAIN)
       #define TEMPERATURE_POS     BTN_POS(1,4), BTN_SIZE(2,1)
       #define FILAMENTCHANGE_POS  BTN_POS(3,4), BTN_SIZE(2,1)
-      #define CUSTOM_MENU_POS BTN_POS(5,4), BTN_SIZE(2,1)
+      #define CUSTOM_MENU_POS     BTN_POS(5,4), BTN_SIZE(2,1)
     #else
       #define TEMPERATURE_POS     BTN_POS(1,4), BTN_SIZE(3,1)
       #define FILAMENTCHANGE_POS  BTN_POS(4,4), BTN_SIZE(3,1)
@@ -92,7 +92,7 @@ void MainMenu::onRedraw(draw_mode_t what) {
        .tag( 9).button(LEVELING_POS,        GET_TEXT_F(MSG_LEVELING))
        .tag(10).button(ABOUT_PRINTER_POS,   GET_TEXT_F(MSG_INFO_MENU))
        #if ENABLED(CUSTOM_MENU_MAIN)
-        .tag(11).button(CUSTOM_MENU_POS, GET_TEXT_F(MSG_CUSTOM_COMMANDS))
+        .tag(11).button(CUSTOM_MENU_POS,    GET_TEXT_F(MSG_CUSTOM_COMMANDS))
        #endif
        .colors(action_btn)
        .tag(1).button(BACK_POS,             GET_TEXT_F(MSG_BUTTON_DONE));
@@ -103,22 +103,30 @@ bool MainMenu::onTouchEnd(uint8_t tag) {
   using namespace ExtUI;
 
   switch (tag) {
-    case 1:  SaveSettingsDialogBox::promptToSaveSettings();           break;
-    case 2:  SpinnerDialogBox::enqueueAndWait(F("G28"));            break;
+    case 1: SaveSettingsDialogBox::promptToSaveSettings(); break;
+    case 2: SpinnerDialogBox::enqueueAndWait(F("G28")); break;
     #if ENABLED(NOZZLE_CLEAN_FEATURE)
-      case 3: injectCommands(F("G12")); GOTO_SCREEN(StatusScreen); break;
+      case 3:
+        injectCommands(F("G12"));
+        GOTO_SCREEN(StatusScreen);             break;
     #endif
-    case 4:  GOTO_SCREEN(MoveAxisScreen);                             break;
-    case 5:  injectCommands(F("M84"));                           break;
-    case 6:  GOTO_SCREEN(TemperatureScreen);                          break;
-    case 7:  GOTO_SCREEN(ChangeFilamentScreen);                       break;
-    case 8:  GOTO_SCREEN(AdvancedSettingsMenu);                       break;
+    case 4: GOTO_SCREEN(MoveAxisScreen);       break;
+    case 5:
+      injectCommands(F("M84 E"
+        TERN_(DISABLE_INACTIVE_X, " X")
+        TERN_(DISABLE_INACTIVE_Y, " Y")
+        TERN_(DISABLE_INACTIVE_Z, " Z")
+      ));
+      break;
+    case 6: GOTO_SCREEN(TemperatureScreen);    break;
+    case 7: GOTO_SCREEN(ChangeFilamentScreen); break;
+    case 8: GOTO_SCREEN(AdvancedSettingsMenu); break;
     #if HAS_LEVELING
-      case 9:  GOTO_SCREEN(LevelingMenu);                             break;
+      case 9: GOTO_SCREEN(LevelingMenu);       break;
     #endif
-    case 10: GOTO_SCREEN(AboutScreen);                                break;
+    case 10: GOTO_SCREEN(AboutScreen);         break;
     #if ENABLED(CUSTOM_MENU_MAIN)
-      case 11: GOTO_SCREEN(CustomUserMenus);                          break;
+      case 11: GOTO_SCREEN(CustomUserMenus);   break;
     #endif
 
     default:
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/status_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/status_screen.cpp
index 738d8ee64f2..ea484344bd4 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/status_screen.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/status_screen.cpp
@@ -376,10 +376,10 @@ void StatusScreen::loadBitmaps() {
   // Load the bitmaps for the status screen
   using namespace Theme;
   constexpr uint32_t base = ftdi_memory_map::RAM_G;
-  CLCD::mem_write_pgm(base + TD_Icon_Info.RAMG_offset,       TD_Icon,       sizeof(TD_Icon));
-  CLCD::mem_write_pgm(base + Extruder_Icon_Info.RAMG_offset, Extruder_Icon, sizeof(Extruder_Icon));
-  CLCD::mem_write_pgm(base + Bed_Heat_Icon_Info.RAMG_offset, Bed_Heat_Icon, sizeof(Bed_Heat_Icon));
-  CLCD::mem_write_pgm(base + Fan_Icon_Info.RAMG_offset,      Fan_Icon,      sizeof(Fan_Icon));
+  CLCD::mem_write_xbm(base + TD_Icon_Info.RAMG_offset,       TD_Icon,       sizeof(TD_Icon));
+  CLCD::mem_write_xbm(base + Extruder_Icon_Info.RAMG_offset, Extruder_Icon, sizeof(Extruder_Icon));
+  CLCD::mem_write_xbm(base + Bed_Heat_Icon_Info.RAMG_offset, Bed_Heat_Icon, sizeof(Bed_Heat_Icon));
+  CLCD::mem_write_xbm(base + Fan_Icon_Info.RAMG_offset,      Fan_Icon,      sizeof(Fan_Icon));
 
   // Load fonts for internationalization
   #if ENABLED(TOUCH_UI_USE_UTF8)
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/temperature_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/temperature_screen.cpp
index 2dbf2d9f06a..04eb2acec6b 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/temperature_screen.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/temperature_screen.cpp
@@ -66,7 +66,7 @@ void TemperatureScreen::onRedraw(draw_mode_t what) {
   #if HAS_HEATED_CHAMBER
     w.adjuster(    22, GET_TEXT_F(MSG_CHAMBER), getTargetTemp_celsius(CHAMBER));
   #endif
-  #if HAS_FAN
+  #if HAS_FAN0
     w.color(fan_speed).units(GET_TEXT_F(MSG_UNITS_PERCENT));
     w.adjuster(    10, GET_TEXT_F(MSG_FAN_SPEED), getTargetFan_percent(FAN0));
   #endif
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language_en.h
index db37ccfd22e..6deb5b47587 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language_en.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language_en.h
@@ -171,8 +171,6 @@ namespace Language_en {
     LSTR MSG_PREHEAT_CHOCOLATE      = u8"Preheat Chocolate";
     LSTR MSG_PREHEAT_FINISHED       = u8"Preheat finished";
     LSTR MSG_PREHEAT                = u8"Preheat";
-    LSTR MSG_BUTTON_PAUSE           = u8"Pause";
-    LSTR MSG_BUTTON_RESUME          = u8"Resume";
     LSTR MSG_ELAPSED_PRINT          = u8"Elapsed Print";
     LSTR MSG_XYZ_MOVE               = u8"XYZ Move";
     LSTR MSG_E_MOVE                 = u8"Extrusion Move";
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screen_data.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screen_data.h
index 48a0c1a9644..7b0a0d25e9a 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screen_data.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screen_data.h
@@ -62,9 +62,11 @@ union screen_data_t {
   DECL_DATA_IF_INCLUDED(FTDI_Z_OFFSET_SCREEN)
   DECL_DATA_IF_INCLUDED(FTDI_BASE_NUMERIC_ADJ_SCREEN)
   DECL_DATA_IF_INCLUDED(FTDI_ALERT_DIALOG_BOX)
+  DECL_DATA_IF_INCLUDED(COCOA_STATUS_SCREEN)
   DECL_DATA_IF_INCLUDED(COCOA_PREHEAT_SCREEN)
   DECL_DATA_IF_INCLUDED(COCOA_LOAD_CHOCOLATE_SCREEN)
   DECL_DATA_IF_INCLUDED(COCOA_FILES_SCREEN)
+  DECL_DATA_IF_INCLUDED(COCOA_Z_OFFSET_WIZARD)
 };
 
 extern screen_data_t screen_data;
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screens.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screens.cpp
index ed210369c4f..c7607f71d07 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screens.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/screens.cpp
@@ -118,6 +118,10 @@ SCREEN_TABLE {
   DECL_SCREEN_IF_INCLUDED(COCOA_MOVE_E_SCREEN)
   DECL_SCREEN_IF_INCLUDED(COCOA_CONFIRM_START_PRINT)
   DECL_SCREEN_IF_INCLUDED(COCOA_FILES_SCREEN)
+  DECL_SCREEN_IF_INCLUDED(COCOA_Z_OFFSET_SCREEN)
+  DECL_SCREEN_IF_INCLUDED(COCOA_Z_OFFSET_WIZARD)
+  DECL_SCREEN_IF_INCLUDED(COCOA_ABOUT_SCREEN)
+  DECL_SCREEN_IF_INCLUDED(COCOA_STATISTICS_SCREEN)
 };
 
 SCREEN_TABLE_POST
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/bitmaps.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/bitmaps.h
index c194225d99a..a2729979c6b 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/bitmaps.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/bitmaps.h
@@ -37,25 +37,25 @@ namespace Theme {
   };
 
   constexpr PROGMEM unsigned char Extruder_Icon[69] = {
-    0x3F, 0xFF, 0xFC,
-    0x7F, 0xFF, 0xFE,
-    0xC0, 0x00, 0x03,
-    0xC0, 0x00, 0x03,
-    0xC0, 0x00, 0x03,
-    0xC0, 0x00, 0x03,
-    0x7F, 0xFF, 0xFE,
-    0x3F, 0xFF, 0xFC,
-    0x3F, 0xFF, 0xFC,
-    0x7F, 0xFF, 0xFE,
-    0xC0, 0x00, 0x03,
-    0xC0, 0x00, 0x03,
-    0xC0, 0x00, 0x03,
-    0xC0, 0x00, 0x03,
-    0x7F, 0xFF, 0xFE,
-    0x7F, 0xFF, 0xFE,
-    0x07, 0xFF, 0xE0,
-    0x03, 0xFF, 0xC0,
-    0x01, 0x81, 0x80,
+    0xFC, 0xFF, 0x3F,
+    0xFE, 0xFF, 0x7F,
+    0x03, 0x00, 0xC0,
+    0x03, 0x00, 0xC0,
+    0x03, 0x00, 0xC0,
+    0x03, 0x00, 0xC0,
+    0xFE, 0xFF, 0x7F,
+    0xFC, 0xFF, 0x3F,
+    0xFC, 0xFF, 0x3F,
+    0xFE, 0xFF, 0x7F,
+    0x03, 0x00, 0xC0,
+    0x03, 0x00, 0xC0,
+    0x03, 0x00, 0xC0,
+    0x03, 0x00, 0xC0,
+    0xFE, 0xFF, 0x7F,
+    0xFE, 0xFF, 0x7F,
+    0xE0, 0xFF, 0x07,
+    0xC0, 0xFF, 0x03,
+    0x80, 0x81, 0x01,
     0x00, 0xC3, 0x00,
     0x00, 0x66, 0x00,
     0x00, 0x3C, 0x00,
@@ -74,28 +74,28 @@ namespace Theme {
   };
 
   constexpr PROGMEM unsigned char Bed_Heat_Icon[92] = {
-    0x01, 0x81, 0x81, 0x80,
-    0x01, 0x81, 0x81, 0x80,
-    0x00, 0xC0, 0xC0, 0xC0,
-    0x00, 0xC0, 0xC0, 0xC0,
-    0x00, 0x60, 0x60, 0x60,
-    0x00, 0x60, 0x60, 0x60,
-    0x00, 0xC0, 0xC0, 0xC0,
-    0x00, 0xC0, 0xC0, 0xC0,
-    0x01, 0x81, 0x81, 0x80,
-    0x01, 0x81, 0x81, 0x80,
-    0x03, 0x03, 0x03, 0x00,
-    0x03, 0x03, 0x03, 0x00,
-    0x06, 0x06, 0x06, 0x00,
-    0x06, 0x06, 0x06, 0x00,
-    0x03, 0x03, 0x03, 0x00,
-    0x03, 0x03, 0x03, 0x00,
-    0x01, 0x81, 0x81, 0x80,
-    0x01, 0x81, 0x81, 0x80,
+    0x80, 0x81, 0x81, 0x01,
+    0x80, 0x81, 0x81, 0x01,
+    0x00, 0x03, 0x03, 0x03,
+    0x00, 0x03, 0x03, 0x03,
+    0x00, 0x06, 0x06, 0x06,
+    0x00, 0x06, 0x06, 0x06,
+    0x00, 0x03, 0x03, 0x03,
+    0x00, 0x03, 0x03, 0x03,
+    0x80, 0x81, 0x81, 0x01,
+    0x80, 0x81, 0x81, 0x01,
+    0xC0, 0xC0, 0xC0, 0x00,
+    0xC0, 0xC0, 0xC0, 0x00,
+    0x60, 0x60, 0x60, 0x00,
+    0x60, 0x60, 0x60, 0x00,
+    0xC0, 0xC0, 0xC0, 0x00,
+    0xC0, 0xC0, 0xC0, 0x00,
+    0x80, 0x81, 0x81, 0x01,
+    0x80, 0x81, 0x81, 0x01,
     0x00, 0x00, 0x00, 0x00,
     0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF,
-    0xC0, 0x00, 0x00, 0x03,
+    0x03, 0x00, 0x00, 0xC0,
     0xFF, 0xFF, 0xFF, 0xFF
   };
 
@@ -113,34 +113,34 @@ namespace Theme {
   constexpr PROGMEM unsigned char Fan_Icon[128] = {
     0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF,
-    0xF8, 0x00, 0x00, 0x1F,
-    0xF0, 0x03, 0xF8, 0x0F,
-    0xE0, 0x07, 0xF0, 0x07,
-    0xC0, 0x0F, 0xE0, 0x03,
-    0xC0, 0x1F, 0xE0, 0x03,
-    0xC0, 0x1F, 0xE0, 0x03,
-    0xC0, 0x0F, 0xE0, 0x03,
-    0xC0, 0x07, 0xE0, 0x03,
-    0xC0, 0x03, 0xC0, 0x03,
-    0xD0, 0x00, 0x00, 0xC3,
-    0xD8, 0x03, 0xC1, 0xE3,
-    0xDF, 0xC7, 0xE3, 0xF3,
-    0xDF, 0xEF, 0xF7, 0xFB,
-    0xDF, 0xEF, 0xF7, 0xFB,
-    0xDF, 0xEF, 0xF7, 0xFB,
-    0xDF, 0xEF, 0xF7, 0xFB,
-    0xCF, 0xC7, 0xE3, 0xFB,
-    0xC7, 0x83, 0xC0, 0x1B,
-    0xC3, 0x00, 0x00, 0x0B,
-    0xC0, 0x03, 0xC0, 0x03,
-    0xC0, 0x07, 0xE0, 0x03,
-    0xC0, 0x07, 0xF0, 0x03,
-    0xC0, 0x07, 0xF8, 0x03,
-    0xC0, 0x07, 0xF8, 0x03,
-    0xC0, 0x07, 0xF0, 0x03,
-    0xE0, 0x0F, 0xE0, 0x07,
-    0xF0, 0x1F, 0xC0, 0x0F,
-    0xF8, 0x00, 0x00, 0x1F,
+    0x1F, 0x00, 0x00, 0xF8,
+    0x0F, 0xC0, 0x1F, 0xF0,
+    0x07, 0xE0, 0x0F, 0xE0,
+    0x03, 0xF0, 0x07, 0xC0,
+    0x03, 0xF8, 0x07, 0xC0,
+    0x03, 0xF8, 0x07, 0xC0,
+    0x03, 0xF0, 0x07, 0xC0,
+    0x03, 0xE0, 0x07, 0xC0,
+    0x03, 0xC0, 0x03, 0xC0,
+    0x0B, 0x00, 0x00, 0xC3,
+    0x1B, 0xC0, 0x83, 0xC7,
+    0xFB, 0xE3, 0xC7, 0xCF,
+    0xFB, 0xF7, 0xEF, 0xDF,
+    0xFB, 0xF7, 0xEF, 0xDF,
+    0xFB, 0xF7, 0xEF, 0xDF,
+    0xFB, 0xF7, 0xEF, 0xDF,
+    0xF3, 0xE3, 0xC7, 0xDF,
+    0xE3, 0xC1, 0x03, 0xD8,
+    0xC3, 0x00, 0x00, 0xD0,
+    0x03, 0xC0, 0x03, 0xC0,
+    0x03, 0xE0, 0x07, 0xC0,
+    0x03, 0xE0, 0x0F, 0xC0,
+    0x03, 0xE0, 0x1F, 0xC0,
+    0x03, 0xE0, 0x1F, 0xC0,
+    0x03, 0xE0, 0x0F, 0xC0,
+    0x07, 0xF0, 0x07, 0xE0,
+    0x0F, 0xF8, 0x03, 0xF0,
+    0x1F, 0x00, 0x00, 0xF8,
     0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF
   };
@@ -157,26 +157,26 @@ namespace Theme {
   };
 
   constexpr PROGMEM unsigned char TD_Icon[140] = {
-    0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00,                    // Thumb Drive Widget
-    0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
-    0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x80,
-    0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
-    0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0,
-    0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0,
-    0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
-    0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
-    0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
-    0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
-    0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
-    0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
-    0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
-    0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
-    0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0,
-    0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0,
-    0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
-    0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x80,
-    0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
-    0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00
+    0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00,                    // Thumb Drive Widget
+    0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
+    0x00, 0x06, 0x00, 0x00, 0x00, 0xC0, 0x01,
+    0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0x00, 0x06, 0x00, 0x00, 0x00, 0xC0, 0x01,
+    0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
+    0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00
   };
 
   constexpr PROGMEM bitmap_info_t File_Icon_Info = {
@@ -191,17 +191,17 @@ namespace Theme {
   };
 
   const unsigned char File_Icon[128] PROGMEM = {
-    0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00,
-    0x40, 0x02, 0x80, 0x00, 0x40, 0x02, 0x40, 0x00, 0x40, 0x02, 0x20, 0x00,
-    0x40, 0x02, 0x10, 0x00, 0x40, 0x02, 0x08, 0x00, 0x40, 0x02, 0x04, 0x00,
-    0x40, 0x02, 0x02, 0x00, 0x40, 0x03, 0xFF, 0x00, 0x40, 0x00, 0x01, 0x00,
-    0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
-    0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
-    0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
-    0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
-    0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
-    0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00,
-    0x7F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
+    0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x00,
+    0x02, 0x40, 0x01, 0x00, 0x02, 0x40, 0x02, 0x00, 0x02, 0x40, 0x04, 0x00,
+    0x02, 0x40, 0x08, 0x00, 0x02, 0x40, 0x10, 0x00, 0x02, 0x40, 0x20, 0x00,
+    0x02, 0x40, 0x40, 0x00, 0x02, 0xC0, 0xFF, 0x00, 0x02, 0x00, 0x80, 0x00,
+    0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00,
+    0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00,
+    0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00,
+    0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00,
+    0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00,
+    0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00,
+    0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
   };
 
   constexpr PROGMEM bitmap_info_t Clock_Icon_Info = {
@@ -216,17 +216,17 @@ namespace Theme {
   };
 
   const unsigned char Clock_Icon[128] PROGMEM = {
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x7E, 0x7E, 0x00,
-    0x00, 0xE0, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x07, 0x01, 0x00, 0xE0,
-    0x0C, 0x01, 0x80, 0x70, 0x0C, 0x01, 0x80, 0x30, 0x18, 0x01, 0x80, 0x18,
-    0x30, 0x01, 0x80, 0x08, 0x30, 0x01, 0x80, 0x0C, 0x20, 0x01, 0x80, 0x0C,
-    0x60, 0x01, 0x80, 0x04, 0x60, 0x01, 0x80, 0x06, 0x60, 0x01, 0x80, 0x06,
-    0x60, 0x01, 0xFF, 0x06, 0x60, 0x01, 0xFF, 0x06, 0x60, 0x00, 0x00, 0x06,
-    0x60, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x0C,
-    0x30, 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x08, 0x18, 0x00, 0x00, 0x18,
-    0x0C, 0x00, 0x00, 0x30, 0x0E, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0xE0,
-    0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x7F, 0xFE, 0x00,
-    0x00, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x7E, 0x7E, 0x00,
+    0x00, 0x07, 0xE0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0xE0, 0x80, 0x00, 0x07,
+    0x30, 0x80, 0x01, 0x0E, 0x30, 0x80, 0x01, 0x0C, 0x18, 0x80, 0x01, 0x18,
+    0x0C, 0x80, 0x01, 0x10, 0x0C, 0x80, 0x01, 0x30, 0x04, 0x80, 0x01, 0x30,
+    0x06, 0x80, 0x01, 0x20, 0x06, 0x80, 0x01, 0x60, 0x06, 0x80, 0x01, 0x60,
+    0x06, 0x80, 0xFF, 0x60, 0x06, 0x80, 0xFF, 0x60, 0x06, 0x00, 0x00, 0x60,
+    0x06, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x30,
+    0x0C, 0x00, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x10, 0x18, 0x00, 0x00, 0x18,
+    0x30, 0x00, 0x00, 0x0C, 0x70, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x07,
+    0xC0, 0x01, 0x80, 0x03, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFE, 0x7F, 0x00,
+    0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00
   };
 
   constexpr PROGMEM bitmap_info_t Light_Bulb_Info = {
@@ -241,17 +241,42 @@ namespace Theme {
   };
 
   const unsigned char Light_Bulb[128] PROGMEM = {
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
-    0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40,
-    0x02, 0x00, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x00, 0x80, 0x02, 0x00,
-    0x00, 0x0F, 0xE0, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, 0x36, 0x18, 0x00,
-    0x00, 0x2C, 0x08, 0x00, 0x00, 0x58, 0x04, 0x00, 0x00, 0x50, 0x04, 0x00,
-    0x7C, 0x50, 0x04, 0x7C, 0x00, 0x40, 0x04, 0x00, 0x00, 0x40, 0x04, 0x00,
-    0x00, 0x60, 0x0C, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00,
-    0x00, 0x10, 0x10, 0x00, 0x00, 0x88, 0x22, 0x00, 0x01, 0x08, 0x21, 0x00,
-    0x02, 0x08, 0x20, 0x80, 0x04, 0x0F, 0xE0, 0x40, 0x00, 0x07, 0xC0, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
+    0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02,
+    0x40, 0x00, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0x00, 0x01, 0x40, 0x00,
+    0x00, 0xF0, 0x07, 0x00, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x6C, 0x18, 0x00,
+    0x00, 0x34, 0x10, 0x00, 0x00, 0x1A, 0x20, 0x00, 0x00, 0x0A, 0x20, 0x00,
+    0x3E, 0x0A, 0x20, 0x3E, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x20, 0x00,
+    0x00, 0x06, 0x30, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00,
+    0x00, 0x08, 0x08, 0x00, 0x00, 0x11, 0x44, 0x00, 0x80, 0x10, 0x84, 0x00,
+    0x40, 0x10, 0x04, 0x01, 0x20, 0xF0, 0x07, 0x02, 0x00, 0xE0, 0x03, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
+  };
+
+  constexpr PROGMEM bitmap_info_t Chamber_Icon_Info = {
+    .format       = L1,
+    .linestride   = 4,
+    .filter       = BILINEAR,
+    .wrapx        = BORDER,
+    .wrapy        = BORDER,
+    .RAMG_offset  = 8813,
+    .width        = 32,
+    .height       = 32,
+  };
+
+  const unsigned char Chamber_Icon[128] PROGMEM = {
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0xF8,
+    0x0F, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0xC0,
+    0x03, 0x00, 0x00, 0xC0, 0x83, 0x81, 0x81, 0xC1, 0x83, 0x81, 0x81, 0xC1,
+    0x03, 0x03, 0x03, 0xC3, 0x03, 0x03, 0x03, 0xC3, 0x03, 0x06, 0x06, 0xC6,
+    0x03, 0x06, 0x06, 0xC6, 0x03, 0x03, 0x03, 0xC3, 0x03, 0x03, 0x03, 0xC3,
+    0x83, 0x81, 0x81, 0xC1, 0x83, 0x81, 0x81, 0xC1, 0xC3, 0xC0, 0xC0, 0xC0,
+    0xC3, 0xC0, 0xC0, 0xC0, 0x63, 0x60, 0x60, 0xC0, 0x63, 0x60, 0x60, 0xC0,
+    0xC3, 0xC0, 0xC0, 0xC0, 0xC3, 0xC0, 0xC0, 0xC0, 0x83, 0x81, 0x81, 0xC1,
+    0x83, 0x81, 0x81, 0xC1, 0x03, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0xC0,
+    0x07, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0xF8,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
   };
 
   constexpr PROGMEM uint32_t UTF8_FONT_OFFSET  = 10000;
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/sounds.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/sounds.cpp
index efeed192011..d8407406a1e 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/sounds.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/sounds.cpp
@@ -300,6 +300,44 @@ namespace Theme {
     {SILENCE,      END_SONG, 0}
   };
 
+  const PROGMEM SoundPlayer::sound_t flagpole[] = {
+    {TRIANGLE_WAVE, NOTE_G3,  2},
+    {TRIANGLE_WAVE, NOTE_C4,  2},
+    {TRIANGLE_WAVE, NOTE_E4,  2},
+    {TRIANGLE_WAVE, NOTE_G4,  2},
+    {TRIANGLE_WAVE, NOTE_C5,  2},
+    {TRIANGLE_WAVE, NOTE_E5,  2},
+    {TRIANGLE_WAVE, NOTE_G5,  5},
+    {TRIANGLE_WAVE, NOTE_E5,  2},
+
+    {TRIANGLE_WAVE, NOTE_G3S, 2},
+    {TRIANGLE_WAVE, NOTE_C4,  2},
+    {TRIANGLE_WAVE, NOTE_D4S, 2},
+    {TRIANGLE_WAVE, NOTE_G4S, 2},
+    {TRIANGLE_WAVE, NOTE_C5,  2},
+    {TRIANGLE_WAVE, NOTE_D5S, 2},
+    {TRIANGLE_WAVE, NOTE_G5S, 5},
+    {TRIANGLE_WAVE, NOTE_D5S, 5},
+
+    {TRIANGLE_WAVE, NOTE_A3S, 2},
+    {TRIANGLE_WAVE, NOTE_D4,  2},
+    {TRIANGLE_WAVE, NOTE_F4,  2},
+    {TRIANGLE_WAVE, NOTE_A4S, 2},
+    {TRIANGLE_WAVE, NOTE_D5,  2},
+    {TRIANGLE_WAVE, NOTE_F5,  2},
+    {TRIANGLE_WAVE, NOTE_A5S, 5},
+
+    {SILENCE,       REST,     1},
+    {TRIANGLE_WAVE, NOTE_A5S, 1},
+    {SILENCE,       REST,     1},
+    {TRIANGLE_WAVE, NOTE_A5S, 1},
+    {SILENCE,       REST,     1},
+    {TRIANGLE_WAVE, NOTE_A5S, 1},
+    {SILENCE,       REST,     1},
+    {TRIANGLE_WAVE, NOTE_A5S, 8},
+    {SILENCE,       END_SONG, 0}
+  };
+
   const PROGMEM SoundPlayer::sound_t big_band[] = {
     {XYLOPHONE,    NOTE_F4,  3},
     {XYLOPHONE,    NOTE_G4,  3},
@@ -402,7 +440,8 @@ const SoundList::list_t SoundList::list[] = {
   {"Carousel",     Theme::carousel},
   {"Beats",        Theme::beats},
   {"Bach Joy",     Theme::js_bach_joy},
-  {"Bach Toccata", Theme::js_bach_toccata}
+  {"Bach Toccata", Theme::js_bach_toccata},
+  {"Flagpole",     Theme::flagpole}
 };
 
 const uint8_t SoundList::n = N_ELEMENTS(SoundList::list);
diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h
index 1b74fcbd860..70a9bf9de20 100644
--- a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h
+++ b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h
@@ -126,7 +126,7 @@
     #endif
     #ifndef E0_SLAVE_ADDRESS
       #define E0_SLAVE_ADDRESS 3
-    #endif  
+    #endif
  #else
   #define X_HARDWARE_SERIAL  Serial2
   #define Y_HARDWARE_SERIAL  Serial2